@cloudbase/cli 1.12.7-alpha.2 → 2.0.0

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.
Files changed (317) hide show
  1. package/.editorconfig +9 -9
  2. package/.eslintignore +7 -7
  3. package/.eslintrc +35 -35
  4. package/.prettierrc.js +29 -29
  5. package/.vscode/launch.json +16 -16
  6. package/.vscode/settings.json +3 -0
  7. package/LICENSE +5 -5
  8. package/README.md +35 -35
  9. package/bin/cloudbase.js +5 -5
  10. package/bin/tcb.js +0 -0
  11. package/changelog.md +6 -6
  12. package/jest.config.js +17 -17
  13. package/lib/commands/account/login.js +18 -18
  14. package/lib/commands/run/create.js +6 -1
  15. package/lib/commands/run/delete.js +6 -1
  16. package/lib/commands/run/image/common.js +1 -1
  17. package/lib/commands/run/image/delete.js +5 -0
  18. package/lib/commands/run/image/download.js +5 -0
  19. package/lib/commands/run/image/list.js +5 -0
  20. package/lib/commands/run/image/upload.js +5 -0
  21. package/lib/commands/run/index.js +1 -0
  22. package/lib/commands/run/list.js +7 -1
  23. package/lib/commands/run/service/config.js +112 -0
  24. package/lib/commands/run/service/create.js +140 -0
  25. package/lib/commands/run/service/deploy.js +145 -0
  26. package/lib/commands/run/service/index.js +21 -0
  27. package/lib/commands/run/service/list.js +115 -0
  28. package/lib/commands/run/service/update.js +132 -0
  29. package/lib/commands/run/version/common.js +1 -1
  30. package/lib/commands/run/version/create.js +5 -0
  31. package/lib/commands/run/version/delete.js +5 -0
  32. package/lib/commands/run/version/list.js +5 -0
  33. package/lib/commands/run/version/modify.js +5 -0
  34. package/lib/commands/run/version/update.js +5 -0
  35. package/lib/commands/storage/storage.js +1 -1
  36. package/lib/constant.js +20 -1
  37. package/lib/env/login.js +7 -7
  38. package/lib/help.js +40 -38
  39. package/lib/run/index.js +1 -0
  40. package/lib/run/service/common.js +163 -0
  41. package/lib/run/service/config.js +70 -0
  42. package/lib/run/service/create.js +67 -0
  43. package/lib/run/service/deployPackage.js +87 -0
  44. package/lib/run/service/index.js +23 -0
  45. package/lib/run/service/list.js +31 -0
  46. package/lib/run/service/showLogs.js +116 -0
  47. package/lib/run/service/update.js +83 -0
  48. package/lib/utils/checkTcbrEnv.js +74 -0
  49. package/lib/utils/commonParamsCheck.js +48 -0
  50. package/lib/utils/index.js +3 -0
  51. package/lib/utils/tcbrApi/callTcbrApi.js +38 -0
  52. package/lib/utils/tcbrApi/index.js +17 -0
  53. package/lib/utils/tcbrApi/tcbr-cloud-api/cloud-api-service.js +268 -0
  54. package/lib/utils/tcbrApi/tcbr-cloud-api/error.js +17 -0
  55. package/lib/utils/tcbrApi/tcbr-cloud-api/index.js +17 -0
  56. package/lib/utils/tcbrApi/tcbr-cloud-api/request.js +40 -0
  57. package/lib/utils/tcbrApi/tcbr-cloud-api-request.js +61 -0
  58. package/lib/utils/validator.js +32 -1
  59. package/package.json +88 -88
  60. package/post-install.js +61 -61
  61. package/runtime/nodejs/bootstrap.js +255 -255
  62. package/runtime/nodejs/runtime.js +183 -183
  63. package/src/auth/index.ts +1 -1
  64. package/src/auth/login.ts +91 -91
  65. package/src/auth/logout.ts +7 -7
  66. package/src/commands/account/index.ts +2 -2
  67. package/src/commands/account/login.ts +192 -192
  68. package/src/commands/account/logout.ts +24 -24
  69. package/src/commands/common.ts +246 -246
  70. package/src/commands/env/base.ts +90 -90
  71. package/src/commands/env/create.ts +92 -92
  72. package/src/commands/env/domain.ts +186 -186
  73. package/src/commands/env/index.ts +4 -4
  74. package/src/commands/env/login.ts +235 -235
  75. package/src/commands/framework/index.ts +124 -124
  76. package/src/commands/functions/alias/getRoute.ts +76 -76
  77. package/src/commands/functions/alias/index.ts +2 -2
  78. package/src/commands/functions/alias/setRoute.ts +82 -82
  79. package/src/commands/functions/code-download.ts +100 -100
  80. package/src/commands/functions/code-update.ts +62 -62
  81. package/src/commands/functions/concurrency/delete.ts +45 -45
  82. package/src/commands/functions/concurrency/index.ts +2 -2
  83. package/src/commands/functions/concurrency/list.ts +58 -58
  84. package/src/commands/functions/concurrency/set.ts +47 -47
  85. package/src/commands/functions/config-update.ts +76 -76
  86. package/src/commands/functions/copy.ts +62 -62
  87. package/src/commands/functions/delete.ts +79 -79
  88. package/src/commands/functions/deploy.ts +293 -293
  89. package/src/commands/functions/detail.ts +138 -138
  90. package/src/commands/functions/index.ts +16 -16
  91. package/src/commands/functions/invoke.ts +121 -121
  92. package/src/commands/functions/layer/bind.ts +182 -182
  93. package/src/commands/functions/layer/common.ts +8 -8
  94. package/src/commands/functions/layer/create.ts +49 -49
  95. package/src/commands/functions/layer/delete.ts +73 -73
  96. package/src/commands/functions/layer/download.ts +92 -92
  97. package/src/commands/functions/layer/index.ts +7 -7
  98. package/src/commands/functions/layer/list.ts +94 -94
  99. package/src/commands/functions/layer/sort.ts +76 -76
  100. package/src/commands/functions/list.ts +68 -68
  101. package/src/commands/functions/log.ts +148 -148
  102. package/src/commands/functions/run.ts +249 -249
  103. package/src/commands/functions/trigger-create.ts +79 -79
  104. package/src/commands/functions/trigger-delete.ts +105 -105
  105. package/src/commands/functions/version/index.ts +1 -1
  106. package/src/commands/functions/version/list.ts +73 -73
  107. package/src/commands/functions/version/publish.ts +43 -43
  108. package/src/commands/gateway/create.ts +109 -109
  109. package/src/commands/gateway/delete.ts +81 -81
  110. package/src/commands/gateway/domain.ts +159 -159
  111. package/src/commands/gateway/index.ts +5 -5
  112. package/src/commands/gateway/list.ts +76 -76
  113. package/src/commands/gateway/switch.ts +107 -107
  114. package/src/commands/helpers/index.ts +2 -2
  115. package/src/commands/helpers/init.ts +431 -431
  116. package/src/commands/helpers/new.ts +117 -117
  117. package/src/commands/helpers/open.ts +67 -67
  118. package/src/commands/hosting/hosting.ts +360 -360
  119. package/src/commands/index.ts +13 -13
  120. package/src/commands/lowcode/app.ts +34 -34
  121. package/src/commands/lowcode/comps.ts +322 -322
  122. package/src/commands/lowcode/index.ts +1 -1
  123. package/src/commands/lowcode/utils.ts +24 -24
  124. package/src/commands/run/create.ts +9 -2
  125. package/src/commands/run/delete.ts +8 -2
  126. package/src/commands/run/image/common.ts +1 -1
  127. package/src/commands/run/image/delete.ts +8 -1
  128. package/src/commands/run/image/download.ts +7 -1
  129. package/src/commands/run/image/index.ts +4 -4
  130. package/src/commands/run/image/list.ts +7 -2
  131. package/src/commands/run/image/upload.ts +8 -1
  132. package/src/commands/run/index.ts +2 -1
  133. package/src/commands/run/list.ts +11 -3
  134. package/src/commands/run/service/config.ts +81 -0
  135. package/src/commands/run/service/create.ts +118 -0
  136. package/src/commands/run/service/deploy.ts +121 -0
  137. package/src/commands/run/service/index.ts +5 -0
  138. package/src/commands/run/service/list.ts +94 -0
  139. package/src/commands/run/service/update.ts +104 -0
  140. package/src/commands/run/standalonegateway/common.ts +7 -7
  141. package/src/commands/run/standalonegateway/create.ts +85 -85
  142. package/src/commands/run/standalonegateway/destroy.ts +59 -59
  143. package/src/commands/run/standalonegateway/index.ts +4 -4
  144. package/src/commands/run/standalonegateway/list.ts +53 -53
  145. package/src/commands/run/standalonegateway/package.ts +62 -62
  146. package/src/commands/run/standalonegateway/turn.ts +63 -63
  147. package/src/commands/run/version/common.ts +1 -1
  148. package/src/commands/run/version/create.ts +8 -1
  149. package/src/commands/run/version/delete.ts +8 -2
  150. package/src/commands/run/version/index.ts +4 -4
  151. package/src/commands/run/version/list.ts +7 -1
  152. package/src/commands/run/version/modify.ts +8 -1
  153. package/src/commands/run/version/update.ts +8 -1
  154. package/src/commands/smart.ts +132 -132
  155. package/src/commands/storage/storage.ts +464 -464
  156. package/src/commands/third/thirdAttach.ts +49 -49
  157. package/src/completion/index.ts +13 -13
  158. package/src/constant.ts +35 -1
  159. package/src/decorators/captureError.ts +25 -25
  160. package/src/decorators/constants.ts +12 -12
  161. package/src/decorators/deprecate.ts +25 -25
  162. package/src/decorators/guard.ts +42 -42
  163. package/src/decorators/index.ts +7 -7
  164. package/src/decorators/injectParams.ts +54 -54
  165. package/src/decorators/params/common.ts +28 -28
  166. package/src/decorators/params/index.ts +35 -35
  167. package/src/env/domain.ts +33 -33
  168. package/src/env/index.ts +63 -63
  169. package/src/env/login.ts +80 -80
  170. package/src/error.ts +36 -36
  171. package/src/function/alias.ts +43 -43
  172. package/src/function/base.ts +253 -253
  173. package/src/function/code.ts +55 -55
  174. package/src/function/concurrency.ts +57 -57
  175. package/src/function/create.ts +78 -78
  176. package/src/function/delete.ts +42 -42
  177. package/src/function/index.ts +10 -10
  178. package/src/function/layer/attach.ts +68 -68
  179. package/src/function/layer/create.ts +63 -63
  180. package/src/function/layer/delete.ts +21 -21
  181. package/src/function/layer/download.ts +54 -54
  182. package/src/function/layer/index.ts +7 -7
  183. package/src/function/layer/list.ts +32 -32
  184. package/src/function/layer/sort.ts +24 -24
  185. package/src/function/trigger.ts +97 -97
  186. package/src/function/update.ts +35 -35
  187. package/src/function/version.ts +38 -38
  188. package/src/function/vpc.ts +22 -22
  189. package/src/gateway/index.ts +137 -137
  190. package/src/help.ts +50 -48
  191. package/src/hosting.ts +212 -212
  192. package/src/index.ts +13 -13
  193. package/src/logger.ts +17 -17
  194. package/src/run/create.ts +23 -23
  195. package/src/run/delete.ts +15 -15
  196. package/src/run/image/build.ts +36 -36
  197. package/src/run/image/delete.ts +13 -13
  198. package/src/run/image/index.ts +3 -3
  199. package/src/run/image/info.ts +26 -26
  200. package/src/run/index.ts +2 -1
  201. package/src/run/list.ts +29 -29
  202. package/src/run/repo.ts +24 -24
  203. package/src/run/service/common.ts +206 -0
  204. package/src/run/service/config.ts +77 -0
  205. package/src/run/service/create.ts +52 -0
  206. package/src/run/service/deployPackage.ts +63 -0
  207. package/src/run/service/index.ts +7 -0
  208. package/src/run/service/list.ts +29 -0
  209. package/src/run/service/showLogs.ts +98 -0
  210. package/src/run/service/update.ts +81 -0
  211. package/src/run/standalonegateway/create.ts +24 -24
  212. package/src/run/standalonegateway/destroy.ts +19 -19
  213. package/src/run/standalonegateway/index.ts +4 -4
  214. package/src/run/standalonegateway/list.ts +74 -74
  215. package/src/run/standalonegateway/package/list.ts +24 -24
  216. package/src/run/standalonegateway/turn/index.ts +1 -1
  217. package/src/run/standalonegateway/turn/off.ts +19 -19
  218. package/src/run/standalonegateway/turn/on.ts +19 -19
  219. package/src/run/version/create.ts +68 -68
  220. package/src/run/version/delete.ts +15 -15
  221. package/src/run/version/index.ts +5 -5
  222. package/src/run/version/list.ts +16 -16
  223. package/src/run/version/modify.ts +16 -16
  224. package/src/run/version/repo.ts +27 -27
  225. package/src/run/version/update.ts +58 -58
  226. package/src/storage.ts +114 -114
  227. package/src/third/index.ts +12 -12
  228. package/src/types.ts +128 -2
  229. package/src/utils/auth.ts +15 -15
  230. package/src/utils/checkTcbrEnv.ts +67 -0
  231. package/src/utils/cli-table.ts +23 -23
  232. package/src/utils/commonParamsCheck.ts +65 -0
  233. package/src/utils/config.ts +39 -39
  234. package/src/utils/env.ts +244 -244
  235. package/src/utils/fs/del.ts +5 -5
  236. package/src/utils/fs/index.ts +71 -71
  237. package/src/utils/function-packer.ts +97 -97
  238. package/src/utils/index.ts +5 -1
  239. package/src/utils/log.ts +81 -81
  240. package/src/utils/net/cloud-api-request.ts +62 -62
  241. package/src/utils/net/credential.ts +53 -53
  242. package/src/utils/net/http-request.ts +84 -84
  243. package/src/utils/net/index.ts +4 -4
  244. package/src/utils/net/manager-service.ts +36 -36
  245. package/src/utils/net/proxy.ts +6 -6
  246. package/src/utils/notice.ts +28 -28
  247. package/src/utils/output/highlight.ts +5 -5
  248. package/src/utils/output/index.ts +2 -2
  249. package/src/utils/output/link.ts +10 -10
  250. package/src/utils/output/loading.ts +82 -82
  251. package/src/utils/parallel.ts +82 -82
  252. package/src/utils/platform/index.ts +2 -2
  253. package/src/utils/platform/mac.ts +21 -21
  254. package/src/utils/platform/os.ts +64 -64
  255. package/src/utils/platform/port.ts +10 -10
  256. package/src/utils/progress-bar.ts +38 -38
  257. package/src/utils/prompt/select.ts +59 -59
  258. package/src/utils/reporter/agree.ts +20 -20
  259. package/src/utils/reporter/download.ts +26 -26
  260. package/src/utils/reporter/index.ts +3 -3
  261. package/src/utils/reporter/usage.ts +20 -20
  262. package/src/utils/store/auth.ts +49 -49
  263. package/src/utils/store/common.ts +8 -8
  264. package/src/utils/store/db.ts +68 -68
  265. package/src/utils/store/index.ts +4 -4
  266. package/src/utils/store/usage.ts +12 -12
  267. package/src/utils/tcbrApi/callTcbrApi.ts +28 -0
  268. package/src/utils/tcbrApi/index.ts +1 -0
  269. package/src/utils/tcbrApi/tcbr-cloud-api/cloud-api-service.ts +363 -0
  270. package/src/utils/tcbrApi/tcbr-cloud-api/error.ts +30 -0
  271. package/src/utils/tcbrApi/tcbr-cloud-api/index.ts +1 -0
  272. package/src/utils/tcbrApi/tcbr-cloud-api/request.ts +28 -0
  273. package/src/utils/tcbrApi/tcbr-cloud-api-request.ts +66 -0
  274. package/src/utils/template.ts +170 -170
  275. package/src/utils/tools/encoding.ts +8 -8
  276. package/src/utils/tools/index.ts +4 -4
  277. package/src/utils/tools/object.ts +33 -33
  278. package/src/utils/tools/time.ts +38 -38
  279. package/src/utils/tools/uid.ts +19 -19
  280. package/src/utils/validator.ts +64 -32
  281. package/templates/html/loginFail.html +90 -90
  282. package/templates/html/loginSuccess.html +86 -86
  283. package/templates/server/node/_gitignore +54 -54
  284. package/templates/server/node/cloudbaserc.json +10 -10
  285. package/templates/server/node/index.js +5 -5
  286. package/templates/server/node/package.json +9 -9
  287. package/tsconfig.json +19 -19
  288. package/tsconfig.test.json +13 -13
  289. package/types/commands/run/index.d.ts +1 -0
  290. package/types/commands/run/service/config.d.ts +14 -0
  291. package/types/commands/run/service/create.d.ts +13 -0
  292. package/types/commands/run/service/deploy.d.ts +13 -0
  293. package/types/commands/run/service/index.d.ts +5 -0
  294. package/types/commands/run/service/list.d.ts +13 -0
  295. package/types/commands/run/service/update.d.ts +13 -0
  296. package/types/constant.d.ts +18 -0
  297. package/types/run/index.d.ts +1 -0
  298. package/types/run/service/common.d.ts +32 -0
  299. package/types/run/service/config.d.ts +23 -0
  300. package/types/run/service/create.d.ts +7 -0
  301. package/types/run/service/deployPackage.d.ts +11 -0
  302. package/types/run/service/index.d.ts +7 -0
  303. package/types/run/service/list.d.ts +2 -0
  304. package/types/run/service/showLogs.d.ts +2 -0
  305. package/types/run/service/update.d.ts +2 -0
  306. package/types/types.d.ts +116 -2
  307. package/types/utils/checkTcbrEnv.d.ts +3 -0
  308. package/types/utils/commonParamsCheck.d.ts +3 -0
  309. package/types/utils/index.d.ts +3 -0
  310. package/types/utils/tcbrApi/callTcbrApi.d.ts +1 -0
  311. package/types/utils/tcbrApi/index.d.ts +1 -0
  312. package/types/utils/tcbrApi/tcbr-cloud-api/cloud-api-service.d.ts +51 -0
  313. package/types/utils/tcbrApi/tcbr-cloud-api/error.d.ts +20 -0
  314. package/types/utils/tcbrApi/tcbr-cloud-api/index.d.ts +1 -0
  315. package/types/utils/tcbrApi/tcbr-cloud-api/request.d.ts +4 -0
  316. package/types/utils/tcbrApi/tcbr-cloud-api-request.d.ts +9 -0
  317. package/types/utils/validator.d.ts +4 -0
@@ -0,0 +1,363 @@
1
+ import crypto from 'crypto'
2
+ import { URL } from 'url'
3
+ import QueryString from 'query-string'
4
+
5
+ import { fetch as _fetch, fetchStream as _fetchStream, nodeFetch as _nodeFetch } from './request'
6
+ import { CloudBaseError } from './error'
7
+
8
+ function isObject(x) {
9
+ return typeof x === 'object' && !Array.isArray(x) && x !== null
10
+ }
11
+
12
+ // 移除对象中的空值,防止调用云 API 失败
13
+ function deepRemoveVoid(obj) {
14
+ if (Array.isArray(obj)) {
15
+ return obj.map(deepRemoveVoid)
16
+ } else if (isObject(obj)) {
17
+ let result = {}
18
+ for (const key in obj) {
19
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
20
+ const value = obj[key]
21
+ if (typeof value !== 'undefined' && value !== null) {
22
+ result[key] = deepRemoveVoid(value)
23
+ }
24
+ }
25
+ }
26
+ return result
27
+ } else {
28
+ return obj
29
+ }
30
+ }
31
+
32
+ type HexBase64Latin1Encoding = 'latin1' | 'hex' | 'base64';
33
+
34
+ function sha256(message: string, secret: string, encoding?: HexBase64Latin1Encoding) {
35
+ const hmac = crypto.createHmac('sha256', secret)
36
+ return hmac.update(message).digest(encoding)
37
+ }
38
+
39
+ function getHash(message: string): string {
40
+ const hash = crypto.createHash('sha256')
41
+ return hash.update(message).digest('hex')
42
+ }
43
+
44
+ function getDate(timestamp: number): string {
45
+ const date = new Date(timestamp * 1000)
46
+ const year = date.getUTCFullYear()
47
+ const month = ('0' + (date.getUTCMonth() + 1)).slice(-2)
48
+ // UTC 日期,非本地时间
49
+ const day = ('0' + date.getUTCDate()).slice(-2)
50
+ return `${year}-${month}-${day}`
51
+ }
52
+
53
+ const ServiceVersionMap = {
54
+ tcb: '2018-06-08',
55
+ scf: '2018-04-16',
56
+ flexdb: '2018-11-27',
57
+ cam: '2019-01-16',
58
+ vpc: '2017-03-12',
59
+ ssl: '2019-12-05',
60
+ tcbr: '2022-02-17',
61
+ }
62
+
63
+ export interface ServiceOptions {
64
+ service: string;
65
+ version?: string;
66
+ proxy?: string;
67
+ timeout?: number;
68
+ region?: string;
69
+ baseParams?: Record<string, any>;
70
+ credential?: Credential;
71
+ getCredential?: () => Promise<Credential> | Credential;
72
+ }
73
+
74
+ export interface Credential {
75
+ secretId: string;
76
+ secretKey: string;
77
+ token?: string;
78
+ tokenExpired?: number;
79
+ }
80
+
81
+ export interface RequestOptions {
82
+ action: string;
83
+ data?: Record<string, any>;
84
+ method?: 'POST' | 'GET';
85
+ region?: string;
86
+ }
87
+
88
+ export const fetch = _fetch
89
+ export const fetchStream = _fetchStream
90
+ export const nodeFetch = _nodeFetch
91
+
92
+ // token 将在 n 分钟内过期
93
+ const isTokenExpired = (credential: Credential, gap = 120) =>
94
+ credential.tokenExpired && Number(credential.tokenExpired) < Date.now() + gap * 1000
95
+
96
+ export class CloudApiService {
97
+ // 缓存请求实例
98
+ static serviceCacheMap: Record<string, CloudApiService> = {};
99
+
100
+ static getInstance(options: ServiceOptions) {
101
+ const { service } = options
102
+ if (CloudApiService.serviceCacheMap?.[service]) {
103
+ return CloudApiService.serviceCacheMap[service]
104
+ }
105
+ const apiService = new CloudApiService(options)
106
+ // 预防 serviceCacheMap 被置空导致的错误
107
+ CloudApiService.serviceCacheMap = {
108
+ ...CloudApiService.serviceCacheMap
109
+ }
110
+ CloudApiService.serviceCacheMap[service] = apiService
111
+ return apiService
112
+ }
113
+
114
+ service: string;
115
+ version: string;
116
+ proxy: string;
117
+ timeout: number;
118
+ region: string;
119
+ credential: Credential;
120
+ baseParams: Record<string, any>;
121
+ getCredential: () => Promise<Credential> | Credential;
122
+
123
+ url: string;
124
+ host: string;
125
+ action: string;
126
+ method: 'POST' | 'GET';
127
+ data: Record<string, any>;
128
+ payload: Record<string, any>;
129
+
130
+ constructor(options: ServiceOptions) {
131
+ if (!options) {
132
+ throw new CloudBaseError('Options cloud not be empty!')
133
+ }
134
+ const {
135
+ service,
136
+ baseParams,
137
+ version,
138
+ proxy,
139
+ region,
140
+ credential,
141
+ getCredential,
142
+ timeout = 60000
143
+ } = options
144
+
145
+ this.service = service
146
+ this.timeout = timeout
147
+
148
+ if (this.service === 'tcb' && process.env.CLOUDBASE_TCB_CLOUDAPI_PROXY) {
149
+ this.proxy = process.env.CLOUDBASE_TCB_CLOUDAPI_PROXY
150
+ } else {
151
+ this.proxy = proxy
152
+ }
153
+
154
+ if (this.service === 'tcb' && process.env.CLOUDBASE_TCB_CLOUDAPI_REGION) {
155
+ this.region = process.env.CLOUDBASE_TCB_CLOUDAPI_REGION
156
+ } else {
157
+ this.region = region || process.env.TENCENTCLOUD_REGION || 'ap-shanghai'
158
+ }
159
+
160
+ this.credential = credential
161
+ this.baseParams = baseParams || {}
162
+ this.getCredential = getCredential
163
+ this.version = ServiceVersionMap[service] || version
164
+ }
165
+
166
+ get baseUrl() {
167
+ const urlMap = {
168
+ tcb: 'https://tcb.tencentcloudapi.com',
169
+ flexdb: 'https://flexdb.tencentcloudapi.com',
170
+ lowcode: `${process.env.CLOUDBASE_LOWCODE_ENDPOINT || 'https://lcap.cloud.tencent.com' }/api/v1/cliapi`,
171
+ tcbr: 'https://tcbr.tencentcloudapi.com',
172
+ }
173
+
174
+ if (this.service === 'tcb' && process.env.CLOUDBASE_TCB_CLOUDAPI_HOST) {
175
+ return `http://${process.env.CLOUDBASE_TCB_CLOUDAPI_HOST}`
176
+ }
177
+
178
+ if (urlMap[this.service]) {
179
+ return urlMap[this.service]
180
+ } else {
181
+ return `https://${this.service}.tencentcloudapi.com`
182
+ }
183
+ }
184
+
185
+ // overload
186
+ async request(options: RequestOptions);
187
+ async request(action: string, data?: Record<string, any>, method?: 'POST' | 'GET');
188
+
189
+ async request(
190
+ actionOrOptions: string | RequestOptions,
191
+ assignData: Record<string, any> = {},
192
+ assignMethod: 'POST' | 'GET' = 'POST'
193
+ ) {
194
+ // 增加 region 参数,兼容之前的入参形式
195
+ let action
196
+ let data
197
+ let method
198
+ let region
199
+ if (typeof actionOrOptions === 'string') {
200
+ action = actionOrOptions
201
+ data = assignData
202
+ method = assignMethod
203
+ } else {
204
+ action = actionOrOptions?.action
205
+ data = actionOrOptions?.data || {}
206
+ method = actionOrOptions?.method || 'POST'
207
+ region = actionOrOptions?.region
208
+ }
209
+
210
+ this.action = action
211
+ this.data = deepRemoveVoid({ ...data, ...this.baseParams })
212
+ this.method = method
213
+
214
+ this.url = this.baseUrl
215
+
216
+ // 不存在密钥,或临时密钥过期
217
+ if (!this.credential?.secretId || isTokenExpired(this.credential)) {
218
+ if (!this.getCredential) {
219
+ throw new CloudBaseError('You must provide credential info!')
220
+ }
221
+
222
+ if (typeof this.getCredential !== 'function') {
223
+ throw new CloudBaseError('The getCredential option must be a function!')
224
+ }
225
+
226
+ const credential = await this.getCredential()
227
+
228
+ if (!credential) {
229
+ throw new CloudBaseError('Calling getCredential function get no credential info!')
230
+ }
231
+ this.credential = credential
232
+ }
233
+
234
+ try {
235
+ const data: Record<string, any> = await this.requestWithSign(region)
236
+ if (data.Response.Error) {
237
+ const tcError = new CloudBaseError(data.Response.Error.Message, {
238
+ action,
239
+ requestId: data.Response.RequestId,
240
+ code: data.Response.Error.Code,
241
+ original: data.Response.Error
242
+ })
243
+ throw tcError
244
+ } else {
245
+ return data.Response
246
+ }
247
+ } catch (e) {
248
+ // throw e
249
+ if (e.name === 'CloudBaseError') {
250
+ throw e
251
+ } else {
252
+ throw new CloudBaseError(e.message, {
253
+ action,
254
+ code: e.code,
255
+ type: e.type
256
+ })
257
+ }
258
+ }
259
+ }
260
+
261
+ async requestWithSign(region) {
262
+ // data 中可能带有 readStream,由于需要计算整个 body 的 hash,
263
+ // 所以这里把 readStream 转为 Buffer
264
+ // await convertReadStreamToBuffer(data)
265
+ const timestamp = Math.floor(Date.now() / 1000)
266
+
267
+ const { method, timeout, data } = this
268
+
269
+ if (method === 'GET') {
270
+ this.url += '?' + QueryString.stringify(data)
271
+ }
272
+
273
+ if (method === 'POST') {
274
+ this.payload = data
275
+ }
276
+
277
+ const { CLOUDBASE_TCB_CLOUDAPI_HOST } = process.env
278
+
279
+ if (this.service === 'tcb' && CLOUDBASE_TCB_CLOUDAPI_HOST) {
280
+ this.host = CLOUDBASE_TCB_CLOUDAPI_HOST
281
+ } else {
282
+ this.host = new URL(this.url).host
283
+ }
284
+
285
+ const config: any = {
286
+ method,
287
+ timeout,
288
+ headers: {
289
+ Host: this.host,
290
+ 'X-TC-Action': this.action,
291
+ 'X-TC-Region': region || this.region,
292
+ 'X-TC-Timestamp': timestamp,
293
+ 'X-TC-Version': this.version
294
+ }
295
+ }
296
+
297
+ if (this.credential.token) {
298
+ config.headers['X-TC-Token'] = this.credential.token
299
+ }
300
+
301
+ if (method === 'GET') {
302
+ config.headers['Content-Type'] = 'application/x-www-form-urlencoded'
303
+ }
304
+ if (method === 'POST') {
305
+ config.body = JSON.stringify(data)
306
+ config.headers['Content-Type'] = 'application/json'
307
+ }
308
+
309
+ const sign = this.getRequestSign(timestamp)
310
+
311
+ config.headers['Authorization'] = sign
312
+ return fetch(this.url, config, this.proxy)
313
+ }
314
+
315
+ getRequestSign(timestamp: number) {
316
+ const { method, url, service } = this
317
+ const { secretId, secretKey } = this.credential
318
+ const urlObj = new URL(url)
319
+
320
+ // 通用头部
321
+ let headers = ''
322
+ const signedHeaders = 'content-type;host'
323
+ if (method === 'GET') {
324
+ headers = 'content-type:application/x-www-form-urlencoded\n'
325
+ }
326
+
327
+ if (method === 'POST') {
328
+ headers = 'content-type:application/json\n'
329
+ }
330
+
331
+ let path = urlObj.pathname
332
+ if (path === '/api/v1/cliapi' && service === 'lowcode') {
333
+ path = '//lcap.cloud.tencent.com/api/v1/cliapi'
334
+ headers += 'host:lcap.cloud.tencent.com\n'
335
+ } else {
336
+ headers += `host:${this.host}\n`
337
+ }
338
+
339
+
340
+ const querystring = urlObj.search.slice(1)
341
+
342
+ const payloadHash = this.payload ? getHash(JSON.stringify(this.payload)) : getHash('')
343
+
344
+ const canonicalRequest = `${method}\n${path}\n${querystring}\n${headers}\n${signedHeaders}\n${payloadHash}`
345
+
346
+ const date = getDate(timestamp)
347
+
348
+ const StringToSign = `TC3-HMAC-SHA256\n${timestamp}\n${date}/${service}/tc3_request\n${getHash(
349
+ canonicalRequest
350
+ )}`
351
+
352
+ const kDate = sha256(date, `TC3${secretKey}`)
353
+ const kService = sha256(service, kDate)
354
+ const kSigning = sha256('tc3_request', kService)
355
+ const signature = sha256(StringToSign, kSigning, 'hex')
356
+
357
+ return `TC3-HMAC-SHA256 Credential=${secretId}/${date}/${service}/tc3_request, SignedHeaders=${signedHeaders}, Signature=${signature}`
358
+ }
359
+
360
+ clearCredentialCache() {
361
+ this.credential = null
362
+ }
363
+ }
@@ -0,0 +1,30 @@
1
+ interface Options {
2
+ exit?: number;
3
+ original?: Error | undefined;
4
+ code?: string | number;
5
+ requestId?: string;
6
+ action?: string;
7
+ type?: string;
8
+ }
9
+
10
+ export class CloudBaseError extends Error {
11
+ readonly exit: number;
12
+ readonly message: string;
13
+ readonly name = 'CloudBaseError';
14
+ readonly original: Error | undefined;
15
+ readonly code: string | number;
16
+ readonly requestId: string;
17
+ readonly action: string;
18
+ readonly type: string;
19
+
20
+ constructor(message: string, options: Options = {}) {
21
+ super()
22
+ const { code = '', action = '', original = null, requestId = '', type } = options
23
+ this.message = `[${action}]\nRequestId:${requestId}\n${message}`
24
+ this.original = original
25
+ this.code = code
26
+ this.requestId = requestId
27
+ this.action = action
28
+ this.type = type
29
+ }
30
+ }
@@ -0,0 +1 @@
1
+ export * from './cloud-api-service'
@@ -0,0 +1,28 @@
1
+ import { URL } from 'url'
2
+ import _fetch, { RequestInit } from 'node-fetch'
3
+ import HttpsProxyAgent from 'https-proxy-agent'
4
+
5
+ export const nodeFetch = _fetch
6
+
7
+ // 使用 fetch + 代理
8
+ export async function fetch(url: string, config: RequestInit = {}, proxy = '') {
9
+ if (proxy) {
10
+ config.agent = new HttpsProxyAgent(proxy)
11
+ }
12
+
13
+ // 解决中文编码问题
14
+ const escapeUrl = new URL(url).toString()
15
+
16
+ const res = await _fetch(escapeUrl, config)
17
+ return res.json()
18
+ }
19
+
20
+ export async function fetchStream(url: string, config: RequestInit = {}, proxy = '') {
21
+ if (proxy) {
22
+ config.agent = new HttpsProxyAgent(proxy)
23
+ }
24
+
25
+ const escapeUrl = new URL(url).toString()
26
+
27
+ return _fetch(escapeUrl, config)
28
+ }
@@ -0,0 +1,66 @@
1
+ import { getCredentialWithoutCheck, getRegion, Credential, getProxy } from '@cloudbase/toolbox'
2
+ import { CloudApiService as _CloudApiService } from './tcbr-cloud-api/index'
3
+ import { CloudBaseError } from '../../error'
4
+ import { REQUEST_TIMEOUT } from '../../constant'
5
+
6
+ let commonCredential: Credential
7
+
8
+ // token 将在 n 分钟内过期
9
+ const isTokenExpired = (credential: Credential, gap = 120) =>
10
+ credential.accessTokenExpired && Number(credential.accessTokenExpired) < Date.now() + gap * 1000
11
+
12
+ export class CloudApiService {
13
+ // 缓存请求实例
14
+ static serviceCacheMap: Record<string, CloudApiService> = {}
15
+
16
+ // 单例模式
17
+ static getInstance(service: string) {
18
+ if (CloudApiService.serviceCacheMap?.[service]) {
19
+ return CloudApiService.serviceCacheMap[service]
20
+ }
21
+ const apiService = new CloudApiService(service)
22
+ CloudApiService.serviceCacheMap[service] = apiService
23
+ return apiService
24
+ }
25
+
26
+ region: string
27
+ apiService: _CloudApiService
28
+
29
+ constructor(service: string, baseParams?: Record<string, any>, version = '') {
30
+ // 初始化 API 实例
31
+ this.apiService = new _CloudApiService({
32
+ service,
33
+ version: service === 'tcr'
34
+ ? version
35
+ : service === 'tcbr'
36
+ ? '2022-02-17'
37
+ :'2019-09-24',
38
+ baseParams,
39
+ proxy: getProxy(),
40
+ timeout: REQUEST_TIMEOUT,
41
+ getCredential: async () => {
42
+ // 存在未过期的 token
43
+ if (commonCredential?.secretId && !isTokenExpired(commonCredential)) {
44
+ return commonCredential
45
+ }
46
+
47
+ const credential = await getCredentialWithoutCheck()
48
+ if (!credential) {
49
+ throw new CloudBaseError('无有效身份信息,请使用 cloudbase login 登录')
50
+ }
51
+
52
+ commonCredential = credential
53
+
54
+ return {
55
+ ...credential,
56
+ tokenExpired: Number(credential.accessTokenExpired)
57
+ }
58
+ }
59
+ })
60
+ }
61
+
62
+ async request(action: string, data: Record<string, any> = {}, method: 'POST' | 'GET' = 'POST') {
63
+ const region = this.region || (await getRegion())
64
+ return this.apiService.request({ action, data, method, region })
65
+ }
66
+ }