@cloudbase/cli 1.12.7-alpha.3 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/tcb.js +6 -4
- package/lib/commands/run/create.js +6 -1
- package/lib/commands/run/delete.js +6 -1
- package/lib/commands/run/image/common.js +1 -1
- package/lib/commands/run/image/delete.js +5 -0
- package/lib/commands/run/image/download.js +5 -0
- package/lib/commands/run/image/list.js +5 -0
- package/lib/commands/run/image/upload.js +5 -0
- package/lib/commands/run/index.js +1 -0
- package/lib/commands/run/list.js +7 -1
- package/lib/commands/run/service/config.js +112 -0
- package/lib/commands/run/service/create.js +140 -0
- package/lib/commands/run/service/deploy.js +145 -0
- package/lib/commands/run/service/index.js +21 -0
- package/lib/commands/run/service/list.js +115 -0
- package/lib/commands/run/service/update.js +132 -0
- package/lib/commands/run/version/common.js +1 -1
- package/lib/commands/run/version/create.js +5 -0
- package/lib/commands/run/version/delete.js +5 -0
- package/lib/commands/run/version/list.js +5 -0
- package/lib/commands/run/version/modify.js +5 -0
- package/lib/commands/run/version/update.js +5 -0
- package/lib/constant.js +20 -1
- package/lib/help.js +40 -38
- package/lib/run/index.js +1 -0
- package/lib/run/service/common.js +163 -0
- package/lib/run/service/config.js +70 -0
- package/lib/run/service/create.js +67 -0
- package/lib/run/service/deployPackage.js +89 -0
- package/lib/run/service/index.js +23 -0
- package/lib/run/service/list.js +31 -0
- package/lib/run/service/showLogs.js +116 -0
- package/lib/run/service/update.js +83 -0
- package/lib/utils/checkTcbrEnv.js +74 -0
- package/lib/utils/commonParamsCheck.js +48 -0
- package/lib/utils/index.js +3 -0
- package/lib/utils/net/http-request.js +4 -4
- package/lib/utils/tcbrApi/callTcbrApi.js +38 -0
- package/lib/utils/tcbrApi/index.js +17 -0
- package/lib/utils/tcbrApi/tcbr-cloud-api/cloud-api-service.js +268 -0
- package/lib/utils/tcbrApi/tcbr-cloud-api/error.js +17 -0
- package/lib/utils/tcbrApi/tcbr-cloud-api/index.js +17 -0
- package/lib/utils/tcbrApi/tcbr-cloud-api/request.js +40 -0
- package/lib/utils/tcbrApi/tcbr-cloud-api-request.js +61 -0
- package/lib/utils/validator.js +32 -1
- package/package.json +88 -88
- package/src/commands/run/create.ts +9 -2
- package/src/commands/run/delete.ts +8 -2
- package/src/commands/run/image/common.ts +1 -1
- package/src/commands/run/image/delete.ts +8 -1
- package/src/commands/run/image/download.ts +7 -1
- package/src/commands/run/image/list.ts +7 -2
- package/src/commands/run/image/upload.ts +8 -1
- package/src/commands/run/index.ts +2 -1
- package/src/commands/run/list.ts +11 -3
- package/src/commands/run/service/config.ts +81 -0
- package/src/commands/run/service/create.ts +118 -0
- package/src/commands/run/service/deploy.ts +121 -0
- package/src/commands/run/service/index.ts +5 -0
- package/src/commands/run/service/list.ts +94 -0
- package/src/commands/run/service/update.ts +104 -0
- package/src/commands/run/version/common.ts +1 -1
- package/src/commands/run/version/create.ts +8 -1
- package/src/commands/run/version/delete.ts +8 -2
- package/src/commands/run/version/list.ts +7 -1
- package/src/commands/run/version/modify.ts +8 -1
- package/src/commands/run/version/update.ts +8 -1
- package/src/constant.ts +35 -1
- package/src/help.ts +50 -48
- package/src/run/index.ts +2 -1
- package/src/run/service/common.ts +206 -0
- package/src/run/service/config.ts +77 -0
- package/src/run/service/create.ts +52 -0
- package/src/run/service/deployPackage.ts +65 -0
- package/src/run/service/index.ts +7 -0
- package/src/run/service/list.ts +29 -0
- package/src/run/service/showLogs.ts +98 -0
- package/src/run/service/update.ts +81 -0
- package/src/types.ts +128 -2
- package/src/utils/checkTcbrEnv.ts +67 -0
- package/src/utils/commonParamsCheck.ts +65 -0
- package/src/utils/index.ts +5 -1
- package/src/utils/net/http-request.ts +1 -1
- package/src/utils/tcbrApi/callTcbrApi.ts +28 -0
- package/src/utils/tcbrApi/index.ts +1 -0
- package/src/utils/tcbrApi/tcbr-cloud-api/cloud-api-service.ts +363 -0
- package/src/utils/tcbrApi/tcbr-cloud-api/error.ts +30 -0
- package/src/utils/tcbrApi/tcbr-cloud-api/index.ts +1 -0
- package/src/utils/tcbrApi/tcbr-cloud-api/request.ts +28 -0
- package/src/utils/tcbrApi/tcbr-cloud-api-request.ts +66 -0
- package/src/utils/validator.ts +64 -32
- package/types/commands/run/index.d.ts +1 -0
- package/types/commands/run/service/config.d.ts +14 -0
- package/types/commands/run/service/create.d.ts +13 -0
- package/types/commands/run/service/deploy.d.ts +13 -0
- package/types/commands/run/service/index.d.ts +5 -0
- package/types/commands/run/service/list.d.ts +13 -0
- package/types/commands/run/service/update.d.ts +13 -0
- package/types/constant.d.ts +18 -0
- package/types/run/index.d.ts +1 -0
- package/types/run/service/common.d.ts +32 -0
- package/types/run/service/config.d.ts +23 -0
- package/types/run/service/create.d.ts +7 -0
- package/types/run/service/deployPackage.d.ts +11 -0
- package/types/run/service/index.d.ts +7 -0
- package/types/run/service/list.d.ts +2 -0
- package/types/run/service/showLogs.d.ts +2 -0
- package/types/run/service/update.d.ts +2 -0
- package/types/types.d.ts +116 -2
- package/types/utils/checkTcbrEnv.d.ts +3 -0
- package/types/utils/commonParamsCheck.d.ts +3 -0
- package/types/utils/index.d.ts +3 -0
- package/types/utils/tcbrApi/callTcbrApi.d.ts +1 -0
- package/types/utils/tcbrApi/index.d.ts +1 -0
- package/types/utils/tcbrApi/tcbr-cloud-api/cloud-api-service.d.ts +51 -0
- package/types/utils/tcbrApi/tcbr-cloud-api/error.d.ts +20 -0
- package/types/utils/tcbrApi/tcbr-cloud-api/index.d.ts +1 -0
- package/types/utils/tcbrApi/tcbr-cloud-api/request.d.ts +4 -0
- package/types/utils/tcbrApi/tcbr-cloud-api-request.d.ts +9 -0
- package/types/utils/validator.d.ts +4 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.callTcbrApi = void 0;
|
|
13
|
+
const toolbox_1 = require("@cloudbase/toolbox");
|
|
14
|
+
const tcbr_cloud_api_request_1 = require("./tcbr-cloud-api-request");
|
|
15
|
+
const tcbrService = tcbr_cloud_api_request_1.CloudApiService.getInstance('tcbr');
|
|
16
|
+
function callTcbrApi(action, data) {
|
|
17
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
18
|
+
try {
|
|
19
|
+
const res = yield tcbrService.request(action, data);
|
|
20
|
+
return {
|
|
21
|
+
code: 0,
|
|
22
|
+
errmsg: 'success',
|
|
23
|
+
data: Object.assign({}, res)
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
if (e.code === 'AuthFailure.UnauthorizedOperation') {
|
|
28
|
+
console.log('\n', `requestId: ${e.requestId}`);
|
|
29
|
+
throw new toolbox_1.CloudBaseError('您没有权限执行此操作,请检查 CAM 策略\n');
|
|
30
|
+
}
|
|
31
|
+
else if (e.code === 'LimitExceeded') {
|
|
32
|
+
throw new toolbox_1.CloudBaseError(`${e.original.Message}\n`);
|
|
33
|
+
}
|
|
34
|
+
return e;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
exports.callTcbrApi = callTcbrApi;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./callTcbrApi"), exports);
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.CloudApiService = exports.nodeFetch = exports.fetchStream = exports.fetch = void 0;
|
|
16
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
17
|
+
const url_1 = require("url");
|
|
18
|
+
const query_string_1 = __importDefault(require("query-string"));
|
|
19
|
+
const request_1 = require("./request");
|
|
20
|
+
const error_1 = require("./error");
|
|
21
|
+
function isObject(x) {
|
|
22
|
+
return typeof x === 'object' && !Array.isArray(x) && x !== null;
|
|
23
|
+
}
|
|
24
|
+
function deepRemoveVoid(obj) {
|
|
25
|
+
if (Array.isArray(obj)) {
|
|
26
|
+
return obj.map(deepRemoveVoid);
|
|
27
|
+
}
|
|
28
|
+
else if (isObject(obj)) {
|
|
29
|
+
let result = {};
|
|
30
|
+
for (const key in obj) {
|
|
31
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
32
|
+
const value = obj[key];
|
|
33
|
+
if (typeof value !== 'undefined' && value !== null) {
|
|
34
|
+
result[key] = deepRemoveVoid(value);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
return obj;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function sha256(message, secret, encoding) {
|
|
45
|
+
const hmac = crypto_1.default.createHmac('sha256', secret);
|
|
46
|
+
return hmac.update(message).digest(encoding);
|
|
47
|
+
}
|
|
48
|
+
function getHash(message) {
|
|
49
|
+
const hash = crypto_1.default.createHash('sha256');
|
|
50
|
+
return hash.update(message).digest('hex');
|
|
51
|
+
}
|
|
52
|
+
function getDate(timestamp) {
|
|
53
|
+
const date = new Date(timestamp * 1000);
|
|
54
|
+
const year = date.getUTCFullYear();
|
|
55
|
+
const month = ('0' + (date.getUTCMonth() + 1)).slice(-2);
|
|
56
|
+
const day = ('0' + date.getUTCDate()).slice(-2);
|
|
57
|
+
return `${year}-${month}-${day}`;
|
|
58
|
+
}
|
|
59
|
+
const ServiceVersionMap = {
|
|
60
|
+
tcb: '2018-06-08',
|
|
61
|
+
scf: '2018-04-16',
|
|
62
|
+
flexdb: '2018-11-27',
|
|
63
|
+
cam: '2019-01-16',
|
|
64
|
+
vpc: '2017-03-12',
|
|
65
|
+
ssl: '2019-12-05',
|
|
66
|
+
tcbr: '2022-02-17',
|
|
67
|
+
};
|
|
68
|
+
exports.fetch = request_1.fetch;
|
|
69
|
+
exports.fetchStream = request_1.fetchStream;
|
|
70
|
+
exports.nodeFetch = request_1.nodeFetch;
|
|
71
|
+
const isTokenExpired = (credential, gap = 120) => credential.tokenExpired && Number(credential.tokenExpired) < Date.now() + gap * 1000;
|
|
72
|
+
class CloudApiService {
|
|
73
|
+
constructor(options) {
|
|
74
|
+
if (!options) {
|
|
75
|
+
throw new error_1.CloudBaseError('Options cloud not be empty!');
|
|
76
|
+
}
|
|
77
|
+
const { service, baseParams, version, proxy, region, credential, getCredential, timeout = 60000 } = options;
|
|
78
|
+
this.service = service;
|
|
79
|
+
this.timeout = timeout;
|
|
80
|
+
if (this.service === 'tcb' && process.env.CLOUDBASE_TCB_CLOUDAPI_PROXY) {
|
|
81
|
+
this.proxy = process.env.CLOUDBASE_TCB_CLOUDAPI_PROXY;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
this.proxy = proxy;
|
|
85
|
+
}
|
|
86
|
+
if (this.service === 'tcb' && process.env.CLOUDBASE_TCB_CLOUDAPI_REGION) {
|
|
87
|
+
this.region = process.env.CLOUDBASE_TCB_CLOUDAPI_REGION;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
this.region = region || process.env.TENCENTCLOUD_REGION || 'ap-shanghai';
|
|
91
|
+
}
|
|
92
|
+
this.credential = credential;
|
|
93
|
+
this.baseParams = baseParams || {};
|
|
94
|
+
this.getCredential = getCredential;
|
|
95
|
+
this.version = ServiceVersionMap[service] || version;
|
|
96
|
+
}
|
|
97
|
+
static getInstance(options) {
|
|
98
|
+
var _a;
|
|
99
|
+
const { service } = options;
|
|
100
|
+
if ((_a = CloudApiService.serviceCacheMap) === null || _a === void 0 ? void 0 : _a[service]) {
|
|
101
|
+
return CloudApiService.serviceCacheMap[service];
|
|
102
|
+
}
|
|
103
|
+
const apiService = new CloudApiService(options);
|
|
104
|
+
CloudApiService.serviceCacheMap = Object.assign({}, CloudApiService.serviceCacheMap);
|
|
105
|
+
CloudApiService.serviceCacheMap[service] = apiService;
|
|
106
|
+
return apiService;
|
|
107
|
+
}
|
|
108
|
+
get baseUrl() {
|
|
109
|
+
const urlMap = {
|
|
110
|
+
tcb: 'https://tcb.tencentcloudapi.com',
|
|
111
|
+
flexdb: 'https://flexdb.tencentcloudapi.com',
|
|
112
|
+
lowcode: `${process.env.CLOUDBASE_LOWCODE_ENDPOINT || 'https://lcap.cloud.tencent.com'}/api/v1/cliapi`,
|
|
113
|
+
tcbr: 'https://tcbr.tencentcloudapi.com',
|
|
114
|
+
};
|
|
115
|
+
if (this.service === 'tcb' && process.env.CLOUDBASE_TCB_CLOUDAPI_HOST) {
|
|
116
|
+
return `http://${process.env.CLOUDBASE_TCB_CLOUDAPI_HOST}`;
|
|
117
|
+
}
|
|
118
|
+
if (urlMap[this.service]) {
|
|
119
|
+
return urlMap[this.service];
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
return `https://${this.service}.tencentcloudapi.com`;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
request(actionOrOptions, assignData = {}, assignMethod = 'POST') {
|
|
126
|
+
var _a;
|
|
127
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
128
|
+
let action;
|
|
129
|
+
let data;
|
|
130
|
+
let method;
|
|
131
|
+
let region;
|
|
132
|
+
if (typeof actionOrOptions === 'string') {
|
|
133
|
+
action = actionOrOptions;
|
|
134
|
+
data = assignData;
|
|
135
|
+
method = assignMethod;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
action = actionOrOptions === null || actionOrOptions === void 0 ? void 0 : actionOrOptions.action;
|
|
139
|
+
data = (actionOrOptions === null || actionOrOptions === void 0 ? void 0 : actionOrOptions.data) || {};
|
|
140
|
+
method = (actionOrOptions === null || actionOrOptions === void 0 ? void 0 : actionOrOptions.method) || 'POST';
|
|
141
|
+
region = actionOrOptions === null || actionOrOptions === void 0 ? void 0 : actionOrOptions.region;
|
|
142
|
+
}
|
|
143
|
+
this.action = action;
|
|
144
|
+
this.data = deepRemoveVoid(Object.assign(Object.assign({}, data), this.baseParams));
|
|
145
|
+
this.method = method;
|
|
146
|
+
this.url = this.baseUrl;
|
|
147
|
+
if (!((_a = this.credential) === null || _a === void 0 ? void 0 : _a.secretId) || isTokenExpired(this.credential)) {
|
|
148
|
+
if (!this.getCredential) {
|
|
149
|
+
throw new error_1.CloudBaseError('You must provide credential info!');
|
|
150
|
+
}
|
|
151
|
+
if (typeof this.getCredential !== 'function') {
|
|
152
|
+
throw new error_1.CloudBaseError('The getCredential option must be a function!');
|
|
153
|
+
}
|
|
154
|
+
const credential = yield this.getCredential();
|
|
155
|
+
if (!credential) {
|
|
156
|
+
throw new error_1.CloudBaseError('Calling getCredential function get no credential info!');
|
|
157
|
+
}
|
|
158
|
+
this.credential = credential;
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
const data = yield this.requestWithSign(region);
|
|
162
|
+
if (data.Response.Error) {
|
|
163
|
+
const tcError = new error_1.CloudBaseError(data.Response.Error.Message, {
|
|
164
|
+
action,
|
|
165
|
+
requestId: data.Response.RequestId,
|
|
166
|
+
code: data.Response.Error.Code,
|
|
167
|
+
original: data.Response.Error
|
|
168
|
+
});
|
|
169
|
+
throw tcError;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
return data.Response;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (e) {
|
|
176
|
+
if (e.name === 'CloudBaseError') {
|
|
177
|
+
throw e;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
throw new error_1.CloudBaseError(e.message, {
|
|
181
|
+
action,
|
|
182
|
+
code: e.code,
|
|
183
|
+
type: e.type
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
requestWithSign(region) {
|
|
190
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
191
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
192
|
+
const { method, timeout, data } = this;
|
|
193
|
+
if (method === 'GET') {
|
|
194
|
+
this.url += '?' + query_string_1.default.stringify(data);
|
|
195
|
+
}
|
|
196
|
+
if (method === 'POST') {
|
|
197
|
+
this.payload = data;
|
|
198
|
+
}
|
|
199
|
+
const { CLOUDBASE_TCB_CLOUDAPI_HOST } = process.env;
|
|
200
|
+
if (this.service === 'tcb' && CLOUDBASE_TCB_CLOUDAPI_HOST) {
|
|
201
|
+
this.host = CLOUDBASE_TCB_CLOUDAPI_HOST;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.host = new url_1.URL(this.url).host;
|
|
205
|
+
}
|
|
206
|
+
const config = {
|
|
207
|
+
method,
|
|
208
|
+
timeout,
|
|
209
|
+
headers: {
|
|
210
|
+
Host: this.host,
|
|
211
|
+
'X-TC-Action': this.action,
|
|
212
|
+
'X-TC-Region': region || this.region,
|
|
213
|
+
'X-TC-Timestamp': timestamp,
|
|
214
|
+
'X-TC-Version': this.version
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
if (this.credential.token) {
|
|
218
|
+
config.headers['X-TC-Token'] = this.credential.token;
|
|
219
|
+
}
|
|
220
|
+
if (method === 'GET') {
|
|
221
|
+
config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
222
|
+
}
|
|
223
|
+
if (method === 'POST') {
|
|
224
|
+
config.body = JSON.stringify(data);
|
|
225
|
+
config.headers['Content-Type'] = 'application/json';
|
|
226
|
+
}
|
|
227
|
+
const sign = this.getRequestSign(timestamp);
|
|
228
|
+
config.headers['Authorization'] = sign;
|
|
229
|
+
return (0, exports.fetch)(this.url, config, this.proxy);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
getRequestSign(timestamp) {
|
|
233
|
+
const { method, url, service } = this;
|
|
234
|
+
const { secretId, secretKey } = this.credential;
|
|
235
|
+
const urlObj = new url_1.URL(url);
|
|
236
|
+
let headers = '';
|
|
237
|
+
const signedHeaders = 'content-type;host';
|
|
238
|
+
if (method === 'GET') {
|
|
239
|
+
headers = 'content-type:application/x-www-form-urlencoded\n';
|
|
240
|
+
}
|
|
241
|
+
if (method === 'POST') {
|
|
242
|
+
headers = 'content-type:application/json\n';
|
|
243
|
+
}
|
|
244
|
+
let path = urlObj.pathname;
|
|
245
|
+
if (path === '/api/v1/cliapi' && service === 'lowcode') {
|
|
246
|
+
path = '//lcap.cloud.tencent.com/api/v1/cliapi';
|
|
247
|
+
headers += 'host:lcap.cloud.tencent.com\n';
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
headers += `host:${this.host}\n`;
|
|
251
|
+
}
|
|
252
|
+
const querystring = urlObj.search.slice(1);
|
|
253
|
+
const payloadHash = this.payload ? getHash(JSON.stringify(this.payload)) : getHash('');
|
|
254
|
+
const canonicalRequest = `${method}\n${path}\n${querystring}\n${headers}\n${signedHeaders}\n${payloadHash}`;
|
|
255
|
+
const date = getDate(timestamp);
|
|
256
|
+
const StringToSign = `TC3-HMAC-SHA256\n${timestamp}\n${date}/${service}/tc3_request\n${getHash(canonicalRequest)}`;
|
|
257
|
+
const kDate = sha256(date, `TC3${secretKey}`);
|
|
258
|
+
const kService = sha256(service, kDate);
|
|
259
|
+
const kSigning = sha256('tc3_request', kService);
|
|
260
|
+
const signature = sha256(StringToSign, kSigning, 'hex');
|
|
261
|
+
return `TC3-HMAC-SHA256 Credential=${secretId}/${date}/${service}/tc3_request, SignedHeaders=${signedHeaders}, Signature=${signature}`;
|
|
262
|
+
}
|
|
263
|
+
clearCredentialCache() {
|
|
264
|
+
this.credential = null;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
exports.CloudApiService = CloudApiService;
|
|
268
|
+
CloudApiService.serviceCacheMap = {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CloudBaseError = void 0;
|
|
4
|
+
class CloudBaseError extends Error {
|
|
5
|
+
constructor(message, options = {}) {
|
|
6
|
+
super();
|
|
7
|
+
this.name = 'CloudBaseError';
|
|
8
|
+
const { code = '', action = '', original = null, requestId = '', type } = options;
|
|
9
|
+
this.message = `[${action}]\nRequestId:${requestId}\n${message}`;
|
|
10
|
+
this.original = original;
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.requestId = requestId;
|
|
13
|
+
this.action = action;
|
|
14
|
+
this.type = type;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.CloudBaseError = CloudBaseError;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./cloud-api-service"), exports);
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.fetchStream = exports.fetch = exports.nodeFetch = void 0;
|
|
16
|
+
const url_1 = require("url");
|
|
17
|
+
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
18
|
+
const https_proxy_agent_1 = require("https-proxy-agent");
|
|
19
|
+
exports.nodeFetch = node_fetch_1.default;
|
|
20
|
+
function fetch(url, config = {}, proxy = '') {
|
|
21
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
+
if (proxy) {
|
|
23
|
+
config.agent = new https_proxy_agent_1.HttpsProxyAgent(proxy);
|
|
24
|
+
}
|
|
25
|
+
const escapeUrl = new url_1.URL(url).toString();
|
|
26
|
+
const res = yield (0, node_fetch_1.default)(escapeUrl, config);
|
|
27
|
+
return res.json();
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
exports.fetch = fetch;
|
|
31
|
+
function fetchStream(url, config = {}, proxy = '') {
|
|
32
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
if (proxy) {
|
|
34
|
+
config.agent = new https_proxy_agent_1.HttpsProxyAgent(proxy);
|
|
35
|
+
}
|
|
36
|
+
const escapeUrl = new url_1.URL(url).toString();
|
|
37
|
+
return (0, node_fetch_1.default)(escapeUrl, config);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
exports.fetchStream = fetchStream;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.CloudApiService = void 0;
|
|
13
|
+
const toolbox_1 = require("@cloudbase/toolbox");
|
|
14
|
+
const index_1 = require("./tcbr-cloud-api/index");
|
|
15
|
+
const error_1 = require("../../error");
|
|
16
|
+
const constant_1 = require("../../constant");
|
|
17
|
+
let commonCredential;
|
|
18
|
+
const isTokenExpired = (credential, gap = 120) => credential.accessTokenExpired && Number(credential.accessTokenExpired) < Date.now() + gap * 1000;
|
|
19
|
+
class CloudApiService {
|
|
20
|
+
constructor(service, baseParams, version = '') {
|
|
21
|
+
this.apiService = new index_1.CloudApiService({
|
|
22
|
+
service,
|
|
23
|
+
version: service === 'tcr'
|
|
24
|
+
? version
|
|
25
|
+
: service === 'tcbr'
|
|
26
|
+
? '2022-02-17'
|
|
27
|
+
: '2019-09-24',
|
|
28
|
+
baseParams,
|
|
29
|
+
proxy: (0, toolbox_1.getProxy)(),
|
|
30
|
+
timeout: constant_1.REQUEST_TIMEOUT,
|
|
31
|
+
getCredential: () => __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
if ((commonCredential === null || commonCredential === void 0 ? void 0 : commonCredential.secretId) && !isTokenExpired(commonCredential)) {
|
|
33
|
+
return commonCredential;
|
|
34
|
+
}
|
|
35
|
+
const credential = yield (0, toolbox_1.getCredentialWithoutCheck)();
|
|
36
|
+
if (!credential) {
|
|
37
|
+
throw new error_1.CloudBaseError('无有效身份信息,请使用 cloudbase login 登录');
|
|
38
|
+
}
|
|
39
|
+
commonCredential = credential;
|
|
40
|
+
return Object.assign(Object.assign({}, credential), { tokenExpired: Number(credential.accessTokenExpired) });
|
|
41
|
+
})
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
static getInstance(service) {
|
|
45
|
+
var _a;
|
|
46
|
+
if ((_a = CloudApiService.serviceCacheMap) === null || _a === void 0 ? void 0 : _a[service]) {
|
|
47
|
+
return CloudApiService.serviceCacheMap[service];
|
|
48
|
+
}
|
|
49
|
+
const apiService = new CloudApiService(service);
|
|
50
|
+
CloudApiService.serviceCacheMap[service] = apiService;
|
|
51
|
+
return apiService;
|
|
52
|
+
}
|
|
53
|
+
request(action, data = {}, method = 'POST') {
|
|
54
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
55
|
+
const region = this.region || (yield (0, toolbox_1.getRegion)());
|
|
56
|
+
return this.apiService.request({ action, data, method, region });
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.CloudApiService = CloudApiService;
|
|
61
|
+
CloudApiService.serviceCacheMap = {};
|
package/lib/utils/validator.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.validateIp = exports.assertHas = exports.assertTruthy = void 0;
|
|
3
|
+
exports.validateCpuMem = exports.validateIp = exports.assertHas = exports.assertTruthy = void 0;
|
|
4
4
|
const error_1 = require("../error");
|
|
5
|
+
const constant_1 = require("../constant");
|
|
6
|
+
const run_1 = require("../run");
|
|
5
7
|
function assertTruthy(val, errMsg) {
|
|
6
8
|
let ok;
|
|
7
9
|
if (Array.isArray(val)) {
|
|
@@ -31,3 +33,32 @@ const validateIp = (ip) => {
|
|
|
31
33
|
return true;
|
|
32
34
|
};
|
|
33
35
|
exports.validateIp = validateIp;
|
|
36
|
+
const validateCpuMem = (cpuInput, memInput) => {
|
|
37
|
+
if (cpuInput !== undefined && memInput !== undefined) {
|
|
38
|
+
let cpuSet = (0, run_1.convertNumber)(cpuInput);
|
|
39
|
+
let memSet = (0, run_1.convertNumber)(memInput);
|
|
40
|
+
let validMemSet = constant_1.CPU_MEM_OPTS.find(({ cpu }) => cpu === cpuSet);
|
|
41
|
+
if (!validMemSet || !validMemSet.mems.length || !validMemSet.mems.includes(memSet)) {
|
|
42
|
+
throw new error_1.CloudBaseError(`cpu 与 mem 规格不匹配,当前规格:cpu: ${cpuInput}, mem: ${memInput}
|
|
43
|
+
请使用下列规格组合之一:${constant_1.CPU_MEM_OPTS.map(({ cpu, mems }) => `${cpu}-${mems.join('/')}`).join(',')}`);
|
|
44
|
+
}
|
|
45
|
+
return { cpuOutput: cpuSet, memOutput: memSet };
|
|
46
|
+
}
|
|
47
|
+
if (cpuInput) {
|
|
48
|
+
let cpuSet = (0, run_1.convertNumber)(cpuInput);
|
|
49
|
+
let validSet = constant_1.CPU_MEM_OPTS.find(({ cpu }) => cpu === cpuSet);
|
|
50
|
+
if (!validSet) {
|
|
51
|
+
throw new error_1.CloudBaseError(`不支持当前 cpu 规格,请使用下列 cpu 规格之一:${constant_1.CPU_MEM_OPTS.map(({ cpu }) => cpu).join(',')}`);
|
|
52
|
+
}
|
|
53
|
+
return { cpuOutput: cpuSet, memOutput: constant_1.CPU_MEM_OPTS.find(({ cpu }) => cpu === cpuSet).mems[0] };
|
|
54
|
+
}
|
|
55
|
+
if (memInput) {
|
|
56
|
+
let memSet = (0, run_1.convertNumber)(memInput);
|
|
57
|
+
let validSet = constant_1.CPU_MEM_OPTS.find(({ mems }) => mems.includes(memSet));
|
|
58
|
+
if (!validSet) {
|
|
59
|
+
throw new error_1.CloudBaseError(`不支持当前 mem 规格,请使用下列 mem 规格之一:${constant_1.CPU_MEM_OPTS.map(({ mems }) => mems.join('/')).join(',')}`);
|
|
60
|
+
}
|
|
61
|
+
return { cpuOutput: validSet.cpu, memOutput: memSet };
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
exports.validateCpuMem = validateCpuMem;
|