src/openApiService/lib/client.ts (272 lines of code) (raw):
"use strict";
import { getUserAgent } from "../../utils";
const { default: OpenApiUtil } = require("@alicloud/openapi-util");
const { default: Util } = require("@alicloud/tea-util");
const $Credential = require("@alicloud/credentials");
const $tea = require("@alicloud/tea-typescript");
const { default: Credential } = require("@alicloud/credentials");
const vscode = require("vscode");
const os = require("os");
export class OpenAPIClient {
private _credential: any;
private _endpoint: any;
private _endpointType: any;
private _protocol: any;
private _regionId: any;
private _userAgent: any;
private _readTimeout: any;
private _connectTimeout: any;
private _httpsProxy: any;
private _httpProxy: any;
private _noProxy: any;
private _socks5Proxy: any;
private _socks5NetWork: any;
private _maxIdleConns: any;
private _signatureAlgorithm: any;
constructor(config) {
if (Util.isUnset($tea.toMap(config))) {
throw $tea.newError({
code: "ParameterMissing",
message: "'config' can not be unset",
});
}
if (!Util.isUnset(config.credential)) {
this._credential = config.credential;
} else if (!Util.empty(config.accessKeyId) && !Util.empty(config.accessKeySecret)) {
if (!Util.empty(config.securityToken)) {
config.type = "sts";
} else {
config.type = "access_key";
}
let credentialConfig = new $Credential.Config({
accessKeyId: config.accessKeyId,
type: config.type,
accessKeySecret: config.accessKeySecret,
securityToken: config.securityToken,
});
this._credential = new Credential(credentialConfig);
}
this._endpoint = config.endpoint;
this._endpointType = config.endpointType;
this._protocol = config.protocol;
this._regionId = config.regionId;
this._userAgent = config.userAgent;
this._readTimeout = config.readTimeout;
this._connectTimeout = config.connectTimeout;
this._httpProxy = config.httpProxy;
this._httpsProxy = config.httpsProxy;
this._noProxy = config.noProxy;
this._socks5Proxy = config.socks5Proxy;
this._socks5NetWork = config.socks5NetWork;
this._maxIdleConns = config.maxIdleConns;
this._signatureAlgorithm = config.signatureAlgorithm;
}
async getAccessKeyId() {
if (Util.isUnset(this._credential)) {
return "";
}
let accessKeyId = await this._credential.getAccessKeyId();
return accessKeyId;
}
/**
* Get accesskey secret by using credential
* @return accesskey secret
*/
async getAccessKeySecret() {
if (Util.isUnset(this._credential)) {
return "";
}
let secret = await this._credential.getAccessKeySecret();
return secret;
}
async getSecurityToken() {
if (Util.isUnset(this._credential)) {
return "";
}
let token = await this._credential.getSecurityToken();
return token;
}
defaultAny(inputValue, defaultValue) {
if (Util.isUnset(inputValue)) {
return defaultValue;
}
return inputValue;
}
async doRequest(params, request, runtime) {
let _runtime = {
timeouted: "retry",
readTimeout: Util.defaultNumber(runtime.readTimeout, this._readTimeout),
connectTimeout: Util.defaultNumber(runtime.connectTimeout, this._connectTimeout),
httpProxy: Util.defaultString(runtime.httpProxy, this._httpProxy),
httpsProxy: Util.defaultString(runtime.httpsProxy, this._httpsProxy),
noProxy: Util.defaultString(runtime.noProxy, this._noProxy),
maxIdleConns: Util.defaultNumber(runtime.maxIdleConns, this._maxIdleConns),
retry: {
retryable: runtime.autoretry,
maxAttempts: Util.defaultNumber(runtime.maxAttempts, 3),
},
backoff: {
policy: Util.defaultString(runtime.backoffPolicy, "no"),
period: Util.defaultNumber(runtime.backoffPeriod, 1),
},
ignoreSSL: runtime.ignoreSSL,
};
let _lastRequest = null;
let _now = Date.now();
let _retryTimes = 0;
while ($tea.allowRetry(_runtime["retry"], _retryTimes, _now)) {
if (_retryTimes > 0) {
let _backoffTime = $tea.getBackoffTime(_runtime["backoff"], _retryTimes);
if (_backoffTime > 0) {
await $tea.sleep(_backoffTime);
}
}
_retryTimes = _retryTimes + 1;
let entry;
try {
let request_ = new $tea.Request();
request_.protocol = Util.defaultString(this._protocol, params.protocol);
request_.method = params.method;
request_.pathname = OpenApiUtil.getEncodePath(params.pathname);
request_.query = OpenApiUtil.query(request.query);
// endpoint is setted in product client
request_.headers = {
host: this._endpoint,
"x-acs-version": params.version,
"x-acs-action": params.action,
"user-agent": getUserAgent(),
"x-acs-date": OpenApiUtil.getTimestamp(),
"x-acs-signature-nonce": Util.getNonce(),
accept: "application/json",
...request.headers,
};
if (request.headers && request.headers["Host"]) {
delete request_.headers["Host"];
request_.headers["host"] = request.headers["Host"];
}
let signatureAlgorithm = Util.defaultString(this._signatureAlgorithm, "ACS3-HMAC-SHA256");
let hashedRequestPayload = OpenApiUtil.hexEncode(OpenApiUtil.hash(Util.toBytes(""), signatureAlgorithm));
if (!Util.isUnset(request.stream)) {
let tmp = await Util.readAsBytes(request.stream);
hashedRequestPayload = OpenApiUtil.hexEncode(OpenApiUtil.hash(tmp, signatureAlgorithm));
request_.body = new $tea.BytesReadable(tmp);
request_.headers["content-type"] = "application/octet-stream";
} else {
if (!Util.isUnset(request.body)) {
if (Util.equalString(params.reqBodyType, "json")) {
let jsonObj = Util.toJSONString(request.body);
hashedRequestPayload = OpenApiUtil.hexEncode(OpenApiUtil.hash(Util.toBytes(jsonObj), signatureAlgorithm));
request_.body = new $tea.BytesReadable(jsonObj);
request_.headers["content-type"] = "application/json; charset=utf-8";
} else {
let m = Util.assertAsMap(request.body);
let formObj = OpenApiUtil.toForm(m);
hashedRequestPayload = OpenApiUtil.hexEncode(OpenApiUtil.hash(Util.toBytes(formObj), signatureAlgorithm));
request_.body = new $tea.BytesReadable(formObj);
request_.headers["content-type"] = "application/x-www-form-urlencoded";
}
}
}
request_.headers["x-acs-content-sha256"] = hashedRequestPayload;
if (!Util.equalString(params.authType, "Anonymous")) {
let accessKeyId = await this.getAccessKeyId();
let accessKeySecret = await this.getAccessKeySecret();
let securityToken = await this.getSecurityToken();
if (!Util.empty(securityToken)) {
request_.headers["x-acs-accesskey-id"] = accessKeyId;
request_.headers["x-acs-security-token"] = securityToken;
}
request_.headers["Authorization"] = OpenApiUtil.getAuthorization(
request_,
signatureAlgorithm,
hashedRequestPayload,
accessKeyId,
accessKeySecret,
);
}
request_.headers["host"] = this._endpoint;
if (request.headers && request.headers["Host"]) {
request_.headers["Host"] = request.headers["Host"];
}
_lastRequest = request_;
console.log("_lastRequest", _lastRequest);
let response_ = await $tea.doAction(request_, _runtime);
entry = {
request: {
headers: request_.headers,
},
response: {
statusCode: response_.statusCode,
headers: response_.headers,
},
};
if (Util.is4xx(response_.statusCode) || Util.is5xx(response_.statusCode)) {
let _res = await Util.readAsJSON(response_.body);
let err = Util.assertAsMap(_res);
return {
format: "json",
result: err,
entry,
};
}
if (
response_.statusCode === 204 &&
(Util.isUnset(response_.headers["content-type"]) || Util.isUnset(response_.headers["content-length"]))
) {
let str = await Util.readAsString(response_.body);
return {
format: "string",
result: str,
entry,
};
}
if (Util.equalString(params.bodyType, "binary")) {
return {
format: "binary",
result: response_.body,
entry,
};
} else if (Util.equalString(params.bodyType, "byte")) {
let byt = await Util.readAsBytes(response_.body);
return {
format: "byte",
result: byt,
entry,
};
} else if (Util.equalString(params.bodyType, "string")) {
let str = await Util.readAsString(response_.body);
return {
format: "string",
result: str,
entry,
};
} else if (Util.equalString(params.bodyType, "json")) {
let obj = await Util.readAsJSON(response_.body);
let res = Util.assertAsMap(obj);
return {
format: "json",
result: res,
entry,
};
} else if (Util.equalString(params.bodyType, "array")) {
let arr = await Util.readAsJSON(response_.body);
return {
format: "json",
result: arr,
entry,
};
}
let str = await Util.readAsString(response_.body);
return {
format: "string",
result: str,
entry,
};
} catch (ex) {
if ($tea.isRetryable(ex)) {
continue;
}
ex.entry = entry;
throw ex;
}
}
throw $tea.newUnretryableError(_lastRequest);
}
}
exports.Client = OpenAPIClient;
export default OpenAPIClient;