UNPKG

16.9 kBJavaScriptView Raw
1"use strict";
2var __extends = (this && this.__extends) || (function () {
3 var extendStatics = function (d, b) {
4 extendStatics = Object.setPrototypeOf ||
5 ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6 function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
7 return extendStatics(d, b);
8 };
9 return function (d, b) {
10 extendStatics(d, b);
11 function __() { this.constructor = d; }
12 d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
13 };
14})();
15var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
16 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
17 return new (P || (P = Promise))(function (resolve, reject) {
18 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
19 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
20 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
21 step((generator = generator.apply(thisArg, _arguments || [])).next());
22 });
23};
24var __generator = (this && this.__generator) || function (thisArg, body) {
25 var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
26 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
27 function verb(n) { return function (v) { return step([n, v]); }; }
28 function step(op) {
29 if (f) throw new TypeError("Generator is already executing.");
30 while (_) try {
31 if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
32 if (y = 0, t) op = [op[0] & 2, t.value];
33 switch (op[0]) {
34 case 0: case 1: t = op; break;
35 case 4: _.label++; return { value: op[1], done: false };
36 case 5: _.label++; y = op[1]; op = [0]; continue;
37 case 7: op = _.ops.pop(); _.trys.pop(); continue;
38 default:
39 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
40 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
41 if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
42 if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
43 if (t[2]) _.ops.pop();
44 _.trys.pop(); continue;
45 }
46 op = body.call(thisArg, _);
47 } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
48 if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
49 }
50};
51var __importStar = (this && this.__importStar) || function (mod) {
52 if (mod && mod.__esModule) return mod;
53 var result = {};
54 if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
55 result["default"] = mod;
56 return result;
57};
58Object.defineProperty(exports, "__esModule", { value: true });
59var querystring = __importStar(require("querystring"));
60var stream_1 = require("stream");
61var httpx = __importStar(require("httpx"));
62var url_1 = require("url");
63var BytesReadable = /** @class */ (function (_super) {
64 __extends(BytesReadable, _super);
65 function BytesReadable(value) {
66 var _this = _super.call(this) || this;
67 if (typeof value === 'string') {
68 _this.value = Buffer.from(value);
69 }
70 else if (Buffer.isBuffer(value)) {
71 _this.value = value;
72 }
73 return _this;
74 }
75 BytesReadable.prototype._read = function () {
76 this.push(this.value);
77 this.push(null);
78 };
79 return BytesReadable;
80}(stream_1.Readable));
81exports.BytesReadable = BytesReadable;
82var Request = /** @class */ (function () {
83 function Request() {
84 this.headers = {};
85 this.query = {};
86 }
87 return Request;
88}());
89exports.Request = Request;
90var Response = /** @class */ (function () {
91 function Response(httpResponse) {
92 this.statusCode = httpResponse.statusCode;
93 this.statusMessage = httpResponse.statusMessage;
94 this.headers = this.convertHeaders(httpResponse.headers);
95 this.body = httpResponse;
96 }
97 Response.prototype.convertHeaders = function (headers) {
98 var results = {};
99 var keys = Object.keys(headers);
100 for (var index = 0; index < keys.length; index++) {
101 var key = keys[index];
102 results[key] = headers[key];
103 }
104 return results;
105 };
106 Response.prototype.readBytes = function () {
107 return __awaiter(this, void 0, void 0, function () {
108 var buff;
109 return __generator(this, function (_a) {
110 switch (_a.label) {
111 case 0: return [4 /*yield*/, httpx.read(this.body, '')];
112 case 1:
113 buff = _a.sent();
114 return [2 /*return*/, buff];
115 }
116 });
117 });
118 };
119 return Response;
120}());
121exports.Response = Response;
122function buildURL(request) {
123 var url = request.protocol + "://" + request.headers['host'];
124 if (request.port) {
125 url += ":" + request.port;
126 }
127 url += "" + request.pathname;
128 var urlInfo = url_1.parse(url);
129 if (request.query && Object.keys(request.query).length > 0) {
130 if (urlInfo.query) {
131 url += "&" + querystring.stringify(request.query);
132 }
133 else {
134 url += "?" + querystring.stringify(request.query);
135 }
136 }
137 return url;
138}
139function isModelClass(t) {
140 if (!t) {
141 return false;
142 }
143 return typeof t.types === 'function' && typeof t.names === 'function';
144}
145function doAction(request, runtime) {
146 if (runtime === void 0) { runtime = null; }
147 return __awaiter(this, void 0, void 0, function () {
148 var url, method, options, response;
149 return __generator(this, function (_a) {
150 switch (_a.label) {
151 case 0:
152 url = buildURL(request);
153 method = (request.method || 'GET').toUpperCase();
154 options = {
155 method: method,
156 headers: request.headers
157 };
158 if (method !== 'GET' && method !== 'HEAD') {
159 options.data = request.body;
160 }
161 if (runtime) {
162 if (typeof runtime.timeout !== 'undefined') {
163 options.timeout = Number(runtime.timeout);
164 }
165 if (typeof runtime.readTimeout !== 'undefined') {
166 options.readTimeout = Number(runtime.readTimeout);
167 }
168 if (typeof runtime.connectTimeout !== 'undefined') {
169 options.connectTimeout = Number(runtime.connectTimeout);
170 }
171 if (typeof runtime.ignoreSSL !== 'undefined') {
172 options.rejectUnauthorized = !runtime.ignoreSSL;
173 }
174 if (typeof runtime.key !== 'undefined') {
175 options.key = String(runtime.key);
176 }
177 if (typeof runtime.cert !== 'undefined') {
178 options.cert = String(runtime.cert);
179 }
180 if (typeof runtime.ca !== 'undefined') {
181 options.ca = String(runtime.ca);
182 }
183 }
184 return [4 /*yield*/, httpx.request(url, options)];
185 case 1:
186 response = _a.sent();
187 return [2 /*return*/, new Response(response)];
188 }
189 });
190 });
191}
192exports.doAction = doAction;
193function newError(data) {
194 var message = data.code + ": " + data.message;
195 return new Error(message);
196}
197exports.newError = newError;
198function getValue(type, value) {
199 if (typeof type === 'string') {
200 // basic type
201 return value;
202 }
203 if (type.type === 'array') {
204 if (!Array.isArray(value)) {
205 throw new Error("expect: array, actual: " + typeof value);
206 }
207 return value.map(function (item) {
208 return getValue(type.itemType, item);
209 });
210 }
211 if (typeof type === 'function') {
212 if (isModelClass(type)) {
213 return new type(value);
214 }
215 return value;
216 }
217 return value;
218}
219function toMap(value) {
220 if (value === void 0) { value = undefined; }
221 if (typeof value === 'undefined' || value == null) {
222 return null;
223 }
224 if (value instanceof Model) {
225 return value.toMap();
226 }
227 // 如果是另一个版本的 tea-typescript 创建的 model,instanceof 会判断不通过
228 // 这里做一下处理
229 if (typeof value.toMap === 'function') {
230 return value.toMap();
231 }
232 if (Array.isArray(value)) {
233 return value.map(function (item) {
234 return toMap(item);
235 });
236 }
237 return value;
238}
239exports.toMap = toMap;
240var Model = /** @class */ (function () {
241 function Model(map) {
242 var _this = this;
243 if (map == null) {
244 return;
245 }
246 var clz = this.constructor;
247 var names = clz.names();
248 var types = clz.types();
249 Object.keys(names).forEach((function (name) {
250 var value = map[name];
251 if (value === undefined || value === null) {
252 return;
253 }
254 var type = types[name];
255 _this[name] = getValue(type, value);
256 }));
257 }
258 Model.prototype.toMap = function () {
259 var _this = this;
260 var map = {};
261 var clz = this.constructor;
262 var names = clz.names();
263 Object.keys(names).forEach((function (name) {
264 var originName = names[name];
265 var value = _this[name];
266 if (typeof value === 'undefined' || value == null) {
267 return;
268 }
269 map[originName] = toMap(value);
270 }));
271 return map;
272 };
273 return Model;
274}());
275exports.Model = Model;
276function cast(obj, t) {
277 if (!obj) {
278 throw new Error('can not cast to Map');
279 }
280 if (typeof obj !== 'object') {
281 throw new Error('can not cast to Map');
282 }
283 var map = obj;
284 var clz = t.constructor;
285 var names = clz.names();
286 var types = clz.types();
287 Object.keys(names).forEach(function (key) {
288 var originName = names[key];
289 var value = map[originName];
290 var type = types[key];
291 if (typeof value === 'undefined' || value == null) {
292 return;
293 }
294 if (typeof type === 'string') {
295 if (type === 'Readable' ||
296 type === 'map' ||
297 type === 'Buffer' ||
298 type === 'any' ||
299 typeof value === type) {
300 t[key] = value;
301 return;
302 }
303 if (type === 'string' &&
304 (typeof value === 'number' ||
305 typeof value === 'boolean')) {
306 t[key] = value.toString();
307 return;
308 }
309 if (type === 'boolean') {
310 if (value === 1 || value === 0) {
311 t[key] = !!value;
312 return;
313 }
314 if (value === 'true' || value === 'false') {
315 t[key] = value === 'true';
316 return;
317 }
318 }
319 if (type === 'number' && typeof value === 'string') {
320 if (value.match(/^\d*$/)) {
321 t[key] = parseInt(value);
322 return;
323 }
324 if (value.match(/^[\.\d]*$/)) {
325 t[key] = parseFloat(value);
326 return;
327 }
328 }
329 throw new Error("type of " + key + " is mismatch, expect " + type + ", but " + typeof value);
330 }
331 else if (type.type === 'map') {
332 if (!(value instanceof Object)) {
333 throw new Error("type of " + key + " is mismatch, expect object, but " + typeof value);
334 }
335 t[key] = value;
336 }
337 else if (type.type === 'array') {
338 if (!Array.isArray(value)) {
339 throw new Error("type of " + key + " is mismatch, expect array, but " + typeof value);
340 }
341 if (typeof type.itemType === 'function') {
342 t[key] = value.map(function (d) {
343 if (isModelClass(type.itemType)) {
344 return cast(d, new type.itemType({}));
345 }
346 return d;
347 });
348 }
349 else {
350 t[key] = value;
351 }
352 }
353 else if (typeof type === 'function') {
354 if (!(value instanceof Object)) {
355 throw new Error("type of " + key + " is mismatch, expect object, but " + typeof value);
356 }
357 if (isModelClass(type)) {
358 t[key] = cast(value, new type({}));
359 return;
360 }
361 t[key] = value;
362 }
363 else {
364 }
365 });
366 return t;
367}
368exports.cast = cast;
369function sleep(ms) {
370 return new Promise(function (resolve) {
371 setTimeout(resolve, ms);
372 });
373}
374exports.sleep = sleep;
375function allowRetry(retry, retryTimes, startTime) {
376 // 还未重试
377 if (retryTimes === 0) {
378 return true;
379 }
380 if (retry.retryable !== true) {
381 return false;
382 }
383 if (retry.policy === 'never') {
384 return false;
385 }
386 if (retry.policy === 'always') {
387 return true;
388 }
389 if (retry.policy === 'simple') {
390 return (retryTimes < retry['maxAttempts']);
391 }
392 if (retry.policy === 'timeout') {
393 return Date.now() - startTime < retry.timeout;
394 }
395 // 默认不重试
396 return false;
397}
398exports.allowRetry = allowRetry;
399function getBackoffTime(backoff, retryTimes) {
400 if (retryTimes === 0) {
401 // 首次调用,不使用退避策略
402 return 0;
403 }
404 if (backoff.policy === 'no') {
405 // 不退避
406 return 0;
407 }
408 if (backoff.policy === 'fixed') {
409 // 固定退避
410 return backoff.period;
411 }
412 if (backoff.policy === 'random') {
413 // 随机退避
414 var min = backoff['minPeriod'];
415 var max = backoff['maxPeriod'];
416 return min + (max - min) * Math.random();
417 }
418 if (backoff.policy === 'exponential') {
419 // 指数退避
420 var init = backoff.initial;
421 var multiplier = backoff.multiplier;
422 var time = init * Math.pow(1 + multiplier, retryTimes - 1);
423 var max = backoff.max;
424 return Math.min(time, max);
425 }
426 if (backoff.policy === 'exponential_random') {
427 // 指数随机退避
428 var init = backoff.initial;
429 var multiplier = backoff.multiplier;
430 var time = init * Math.pow(1 + multiplier, retryTimes - 1);
431 var max = backoff.max;
432 return Math.min(time * (0.5 + Math.random()), max);
433 }
434 return 0;
435}
436exports.getBackoffTime = getBackoffTime;
437var UnretryableError = /** @class */ (function (_super) {
438 __extends(UnretryableError, _super);
439 function UnretryableError(message) {
440 var _this = _super.call(this, message) || this;
441 _this.name = 'UnretryableError';
442 return _this;
443 }
444 return UnretryableError;
445}(Error));
446function newUnretryableError(request) {
447 var e = new UnretryableError('');
448 e.data = {
449 lastRequest: request
450 };
451 return e;
452}
453exports.newUnretryableError = newUnretryableError;
454var RetryError = /** @class */ (function (_super) {
455 __extends(RetryError, _super);
456 function RetryError(message) {
457 var _this = _super.call(this, message) || this;
458 _this.name = 'RetryError';
459 return _this;
460 }
461 return RetryError;
462}(Error));
463function retryError(request, response) {
464 var e = new RetryError('');
465 e.data = {
466 request: request,
467 response: response
468 };
469 return e;
470}
471exports.retryError = retryError;
472function isRetryable(err) {
473 if (typeof err === 'undefined' || err === null) {
474 return false;
475 }
476 return err.name === 'RetryError';
477}
478exports.isRetryable = isRetryable;
479//# sourceMappingURL=tea.js.map
\No newline at end of file