@cloudbase/cli 2.0.3-alpha.1 → 2.0.3
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/.editorconfig +9 -9
- package/.eslintignore +7 -7
- package/.eslintrc +35 -35
- package/.prettierrc.js +29 -29
- package/.vscode/launch.json +16 -16
- package/.vscode/settings.json +3 -0
- package/LICENSE +5 -5
- package/README.md +35 -35
- package/bin/cloudbase.js +5 -5
- package/bin/tcb.js +0 -0
- package/changelog.md +6 -6
- package/jest.config.js +17 -17
- package/lib/commands/account/login.js +18 -18
- package/lib/commands/storage/storage.js +1 -1
- package/lib/env/login.js +7 -7
- package/lib/run/service/deployPackage.js +2 -2
- package/package.json +3 -3
- package/post-install.js +61 -61
- package/runtime/nodejs/bootstrap.js +255 -255
- package/runtime/nodejs/runtime.js +183 -183
- package/src/auth/index.ts +1 -1
- package/src/auth/login.ts +91 -91
- package/src/auth/logout.ts +7 -7
- package/src/commands/account/index.ts +2 -2
- package/src/commands/account/login.ts +192 -192
- package/src/commands/account/logout.ts +24 -24
- package/src/commands/env/base.ts +90 -90
- package/src/commands/env/create.ts +92 -92
- package/src/commands/env/domain.ts +186 -186
- package/src/commands/env/index.ts +4 -4
- package/src/commands/env/login.ts +235 -235
- package/src/commands/framework/index.ts +124 -124
- package/src/commands/functions/alias/getRoute.ts +76 -76
- package/src/commands/functions/alias/index.ts +2 -2
- package/src/commands/functions/alias/setRoute.ts +82 -82
- package/src/commands/functions/code-download.ts +100 -100
- package/src/commands/functions/code-update.ts +62 -62
- package/src/commands/functions/concurrency/delete.ts +45 -45
- package/src/commands/functions/concurrency/index.ts +2 -2
- package/src/commands/functions/concurrency/list.ts +58 -58
- package/src/commands/functions/concurrency/set.ts +47 -47
- package/src/commands/functions/config-update.ts +76 -76
- package/src/commands/functions/copy.ts +62 -62
- package/src/commands/functions/delete.ts +79 -79
- package/src/commands/functions/deploy.ts +293 -293
- package/src/commands/functions/detail.ts +138 -138
- package/src/commands/functions/index.ts +16 -16
- package/src/commands/functions/invoke.ts +121 -121
- package/src/commands/functions/layer/bind.ts +182 -182
- package/src/commands/functions/layer/common.ts +8 -8
- package/src/commands/functions/layer/create.ts +49 -49
- package/src/commands/functions/layer/delete.ts +73 -73
- package/src/commands/functions/layer/download.ts +92 -92
- package/src/commands/functions/layer/index.ts +7 -7
- package/src/commands/functions/layer/list.ts +94 -94
- package/src/commands/functions/layer/sort.ts +76 -76
- package/src/commands/functions/list.ts +68 -68
- package/src/commands/functions/log.ts +148 -148
- package/src/commands/functions/run.ts +249 -249
- package/src/commands/functions/trigger-create.ts +79 -79
- package/src/commands/functions/trigger-delete.ts +105 -105
- package/src/commands/functions/version/index.ts +1 -1
- package/src/commands/functions/version/list.ts +73 -73
- package/src/commands/functions/version/publish.ts +43 -43
- package/src/commands/gateway/create.ts +109 -109
- package/src/commands/gateway/delete.ts +81 -81
- package/src/commands/gateway/domain.ts +159 -159
- package/src/commands/gateway/index.ts +5 -5
- package/src/commands/gateway/list.ts +76 -76
- package/src/commands/gateway/switch.ts +107 -107
- package/src/commands/helpers/index.ts +2 -2
- package/src/commands/helpers/init.ts +431 -431
- package/src/commands/helpers/new.ts +117 -117
- package/src/commands/helpers/open.ts +67 -67
- package/src/commands/hosting/hosting.ts +360 -360
- package/src/commands/index.ts +13 -13
- package/src/commands/lowcode/app.ts +34 -34
- package/src/commands/lowcode/comps.ts +322 -322
- package/src/commands/lowcode/index.ts +1 -1
- package/src/commands/lowcode/utils.ts +24 -24
- package/src/commands/run/image/index.ts +4 -4
- package/src/commands/run/standalonegateway/common.ts +7 -7
- package/src/commands/run/standalonegateway/create.ts +85 -85
- package/src/commands/run/standalonegateway/destroy.ts +59 -59
- package/src/commands/run/standalonegateway/index.ts +4 -4
- package/src/commands/run/standalonegateway/list.ts +53 -53
- package/src/commands/run/standalonegateway/package.ts +62 -62
- package/src/commands/run/standalonegateway/turn.ts +63 -63
- package/src/commands/run/version/index.ts +4 -4
- package/src/commands/smart.ts +132 -132
- package/src/commands/storage/storage.ts +464 -464
- package/src/commands/third/thirdAttach.ts +49 -49
- package/src/completion/index.ts +13 -13
- package/src/decorators/captureError.ts +25 -25
- package/src/decorators/constants.ts +12 -12
- package/src/decorators/deprecate.ts +25 -25
- package/src/decorators/guard.ts +42 -42
- package/src/decorators/index.ts +7 -7
- package/src/decorators/injectParams.ts +54 -54
- package/src/decorators/params/common.ts +28 -28
- package/src/decorators/params/index.ts +35 -35
- package/src/env/domain.ts +33 -33
- package/src/env/index.ts +63 -63
- package/src/env/login.ts +80 -80
- package/src/error.ts +36 -36
- package/src/function/alias.ts +43 -43
- package/src/function/base.ts +253 -253
- package/src/function/code.ts +55 -55
- package/src/function/concurrency.ts +57 -57
- package/src/function/create.ts +78 -78
- package/src/function/delete.ts +42 -42
- package/src/function/index.ts +10 -10
- package/src/function/layer/attach.ts +68 -68
- package/src/function/layer/create.ts +63 -63
- package/src/function/layer/delete.ts +21 -21
- package/src/function/layer/download.ts +54 -54
- package/src/function/layer/index.ts +7 -7
- package/src/function/layer/list.ts +32 -32
- package/src/function/layer/sort.ts +24 -24
- package/src/function/trigger.ts +97 -97
- package/src/function/update.ts +35 -35
- package/src/function/version.ts +38 -38
- package/src/function/vpc.ts +22 -22
- package/src/gateway/index.ts +137 -137
- package/src/hosting.ts +212 -212
- package/src/index.ts +13 -13
- package/src/logger.ts +17 -17
- package/src/run/create.ts +23 -23
- package/src/run/delete.ts +15 -15
- package/src/run/image/build.ts +36 -36
- package/src/run/image/delete.ts +13 -13
- package/src/run/image/index.ts +3 -3
- package/src/run/image/info.ts +26 -26
- package/src/run/list.ts +29 -29
- package/src/run/repo.ts +24 -24
- package/src/run/service/deployPackage.ts +1 -1
- package/src/run/standalonegateway/create.ts +24 -24
- package/src/run/standalonegateway/destroy.ts +19 -19
- package/src/run/standalonegateway/index.ts +4 -4
- package/src/run/standalonegateway/list.ts +74 -74
- package/src/run/standalonegateway/package/list.ts +24 -24
- package/src/run/standalonegateway/turn/index.ts +1 -1
- package/src/run/standalonegateway/turn/off.ts +19 -19
- package/src/run/standalonegateway/turn/on.ts +19 -19
- package/src/run/version/create.ts +68 -68
- package/src/run/version/delete.ts +15 -15
- package/src/run/version/index.ts +5 -5
- package/src/run/version/list.ts +16 -16
- package/src/run/version/modify.ts +16 -16
- package/src/run/version/repo.ts +27 -27
- package/src/run/version/update.ts +58 -58
- package/src/storage.ts +114 -114
- package/src/third/index.ts +12 -12
- package/src/utils/auth.ts +15 -15
- package/src/utils/cli-table.ts +23 -23
- package/src/utils/config.ts +39 -39
- package/src/utils/env.ts +244 -244
- package/src/utils/fs/del.ts +5 -5
- package/src/utils/fs/index.ts +71 -71
- package/src/utils/function-packer.ts +97 -97
- package/src/utils/log.ts +81 -81
- package/src/utils/net/cloud-api-request.ts +62 -62
- package/src/utils/net/credential.ts +53 -53
- package/src/utils/net/index.ts +4 -4
- package/src/utils/net/manager-service.ts +36 -36
- package/src/utils/net/proxy.ts +6 -6
- package/src/utils/notice.ts +28 -28
- package/src/utils/output/highlight.ts +5 -5
- package/src/utils/output/index.ts +2 -2
- package/src/utils/output/link.ts +10 -10
- package/src/utils/output/loading.ts +82 -82
- package/src/utils/parallel.ts +82 -82
- package/src/utils/platform/index.ts +2 -2
- package/src/utils/platform/mac.ts +21 -21
- package/src/utils/platform/os.ts +64 -64
- package/src/utils/platform/port.ts +10 -10
- package/src/utils/progress-bar.ts +38 -38
- package/src/utils/prompt/select.ts +59 -59
- package/src/utils/reporter/agree.ts +20 -20
- package/src/utils/reporter/download.ts +26 -26
- package/src/utils/reporter/index.ts +3 -3
- package/src/utils/reporter/usage.ts +20 -20
- package/src/utils/store/auth.ts +49 -49
- package/src/utils/store/common.ts +8 -8
- package/src/utils/store/db.ts +68 -68
- package/src/utils/store/index.ts +4 -4
- package/src/utils/store/usage.ts +12 -12
- package/src/utils/template.ts +170 -170
- package/src/utils/tools/encoding.ts +8 -8
- package/src/utils/tools/index.ts +4 -4
- package/src/utils/tools/object.ts +33 -33
- package/src/utils/tools/time.ts +38 -38
- package/src/utils/tools/uid.ts +19 -19
- package/templates/html/loginFail.html +90 -90
- package/templates/html/loginSuccess.html +86 -86
- package/templates/server/node/_gitignore +54 -54
- package/templates/server/node/cloudbaserc.json +10 -10
- package/templates/server/node/index.js +5 -5
- package/templates/server/node/package.json +9 -9
- package/tsconfig.json +19 -19
- package/tsconfig.test.json +13 -13
package/src/function/base.ts
CHANGED
|
@@ -1,253 +1,253 @@
|
|
|
1
|
-
import CloudBase from '@cloudbase/manager-node'
|
|
2
|
-
import { CloudApiService, checkAndGetCredential, getProxy } from '../utils'
|
|
3
|
-
import { successLog } from '../logger'
|
|
4
|
-
import {
|
|
5
|
-
IListFunctionOptions,
|
|
6
|
-
IFunctionLogOptions,
|
|
7
|
-
IUpdateFunctionConfigOptions,
|
|
8
|
-
IFunctionBatchOptions,
|
|
9
|
-
InvokeFunctionOptions
|
|
10
|
-
} from '../types'
|
|
11
|
-
import { CloudBaseError } from '../error'
|
|
12
|
-
import { getVpcs, getSubnets } from './vpc'
|
|
13
|
-
import { getRegion } from '@cloudbase/toolbox'
|
|
14
|
-
|
|
15
|
-
export interface IBaseOptions {
|
|
16
|
-
envId: string
|
|
17
|
-
functionName: string
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface ICopyFunctionOptions {
|
|
21
|
-
envId: string
|
|
22
|
-
functionName: string
|
|
23
|
-
newFunctionName: string
|
|
24
|
-
targetEnvId: string
|
|
25
|
-
force?: boolean
|
|
26
|
-
copyConfig?: boolean
|
|
27
|
-
codeSecret?: string
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const scfService = CloudApiService.getInstance('scf')
|
|
31
|
-
export interface IDetailOptions extends IBaseOptions {
|
|
32
|
-
codeSecret?: string
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export async function getFunctionService(envId: string) {
|
|
36
|
-
const region = await getRegion()
|
|
37
|
-
const { secretId, secretKey, token } = await checkAndGetCredential(true)
|
|
38
|
-
|
|
39
|
-
const app = new CloudBase({
|
|
40
|
-
region,
|
|
41
|
-
token,
|
|
42
|
-
envId,
|
|
43
|
-
secretId,
|
|
44
|
-
secretKey,
|
|
45
|
-
proxy: getProxy()
|
|
46
|
-
})
|
|
47
|
-
return app.functions
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// 列出函数
|
|
51
|
-
export async function listFunction(
|
|
52
|
-
options: IListFunctionOptions
|
|
53
|
-
): Promise<Record<string, string>[]> {
|
|
54
|
-
const { limit = 20, offset = 0, envId } = options
|
|
55
|
-
const res: any = await scfService.request('ListFunctions', {
|
|
56
|
-
Namespace: envId,
|
|
57
|
-
Limit: limit,
|
|
58
|
-
Offset: offset
|
|
59
|
-
})
|
|
60
|
-
const { Functions = [] } = res
|
|
61
|
-
const data: Record<string, string>[] = []
|
|
62
|
-
Functions.forEach(func => {
|
|
63
|
-
const { FunctionId, FunctionName, Runtime, AddTime, ModTime, Status } = func
|
|
64
|
-
data.push({
|
|
65
|
-
FunctionId,
|
|
66
|
-
FunctionName,
|
|
67
|
-
Runtime,
|
|
68
|
-
AddTime,
|
|
69
|
-
ModTime,
|
|
70
|
-
Status
|
|
71
|
-
})
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
return data
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// 获取云函数详细信息
|
|
78
|
-
export async function getFunctionDetail(options: IDetailOptions): Promise<Record<string, any>> {
|
|
79
|
-
const { functionName, envId, codeSecret } = options
|
|
80
|
-
|
|
81
|
-
const res = await scfService.request('GetFunction', {
|
|
82
|
-
FunctionName: functionName,
|
|
83
|
-
Namespace: envId,
|
|
84
|
-
ShowCode: 'TRUE',
|
|
85
|
-
CodeSecret: codeSecret
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
const data: Record<string, any> = res
|
|
89
|
-
|
|
90
|
-
// 获取 VPC 信息
|
|
91
|
-
const { VpcId = '', SubnetId = '' } = data.VpcConfig || {}
|
|
92
|
-
if (VpcId && SubnetId) {
|
|
93
|
-
try {
|
|
94
|
-
const vpcs = await getVpcs()
|
|
95
|
-
const subnets = await getSubnets(VpcId)
|
|
96
|
-
const vpc = vpcs.find(item => item.VpcId === VpcId)
|
|
97
|
-
const subnet = subnets.find(item => item.SubnetId === SubnetId)
|
|
98
|
-
data.VpcConfig = {
|
|
99
|
-
vpc,
|
|
100
|
-
subnet
|
|
101
|
-
}
|
|
102
|
-
} catch (e) {
|
|
103
|
-
// 无法获取到 VPC 配置,只展示 id 信息
|
|
104
|
-
data.VpcConfig = {
|
|
105
|
-
vpc: VpcId,
|
|
106
|
-
subnet: SubnetId
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return data
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// 批量获取函数信息
|
|
114
|
-
export async function batchGetFunctionsDetail({
|
|
115
|
-
names,
|
|
116
|
-
envId,
|
|
117
|
-
codeSecret
|
|
118
|
-
}): Promise<Record<string, string>[]> {
|
|
119
|
-
const data: Record<string, string>[] = []
|
|
120
|
-
const promises = names.map(name =>
|
|
121
|
-
(async () => {
|
|
122
|
-
try {
|
|
123
|
-
const info = await getFunctionDetail({
|
|
124
|
-
envId,
|
|
125
|
-
codeSecret,
|
|
126
|
-
functionName: name
|
|
127
|
-
})
|
|
128
|
-
data.push(info)
|
|
129
|
-
} catch (e) {
|
|
130
|
-
throw new CloudBaseError(`${name} 获取信息失败:${e.message}`)
|
|
131
|
-
}
|
|
132
|
-
})()
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
await Promise.all(promises)
|
|
136
|
-
|
|
137
|
-
return data
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// 获取函数日志
|
|
141
|
-
export async function getFunctionLog(
|
|
142
|
-
options: IFunctionLogOptions
|
|
143
|
-
): Promise<Record<string, string>[]> {
|
|
144
|
-
const { envId } = options
|
|
145
|
-
|
|
146
|
-
const params = {
|
|
147
|
-
Namespace: envId
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
Object.keys(options).forEach(key => {
|
|
151
|
-
if (key === 'envId') return
|
|
152
|
-
const keyFirstCharUpperCase = key.charAt(0).toUpperCase() + key.slice(1)
|
|
153
|
-
params[keyFirstCharUpperCase] = options[key]
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
const { Data = [] }: any = await scfService.request('GetFunctionLogs', params)
|
|
157
|
-
return Data
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// 更新函数配置
|
|
161
|
-
export async function updateFunctionConfig(options: IUpdateFunctionConfigOptions): Promise<void> {
|
|
162
|
-
const { functionName, config, envId } = options
|
|
163
|
-
|
|
164
|
-
const functionService = await getFunctionService(envId)
|
|
165
|
-
await functionService.updateFunctionConfig({
|
|
166
|
-
name: functionName,
|
|
167
|
-
...config
|
|
168
|
-
})
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// 批量更新函数配置
|
|
172
|
-
export async function batchUpdateFunctionConfig(options: IFunctionBatchOptions): Promise<void> {
|
|
173
|
-
const { functions, envId, log } = options
|
|
174
|
-
const promises = functions.map(func =>
|
|
175
|
-
(async () => {
|
|
176
|
-
try {
|
|
177
|
-
await updateFunctionConfig({
|
|
178
|
-
functionName: func.name,
|
|
179
|
-
config: func,
|
|
180
|
-
envId
|
|
181
|
-
})
|
|
182
|
-
log && successLog(`[${func.name}] 更新云函数配置成功!`)
|
|
183
|
-
} catch (e) {
|
|
184
|
-
throw new CloudBaseError(`${func.name} 更新配置失败:${e.message}`)
|
|
185
|
-
}
|
|
186
|
-
})()
|
|
187
|
-
)
|
|
188
|
-
|
|
189
|
-
await Promise.all(promises)
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// 调用函数
|
|
193
|
-
export async function invokeFunction(options: InvokeFunctionOptions) {
|
|
194
|
-
const { functionName, envId, params = {} } = options
|
|
195
|
-
|
|
196
|
-
const _params = {
|
|
197
|
-
FunctionName: functionName,
|
|
198
|
-
Namespace: envId,
|
|
199
|
-
ClientContext: JSON.stringify(params),
|
|
200
|
-
LogType: 'Tail'
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
try {
|
|
204
|
-
const { Result } = await scfService.request('Invoke', _params)
|
|
205
|
-
return Result
|
|
206
|
-
} catch (e) {
|
|
207
|
-
throw new CloudBaseError(`[${functionName}] 调用失败:\n${e.message}`)
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// 批量触发云函数
|
|
212
|
-
export async function batchInvokeFunctions(options: IFunctionBatchOptions) {
|
|
213
|
-
const { functions, envId, log = false } = options
|
|
214
|
-
|
|
215
|
-
const promises = functions.map(func =>
|
|
216
|
-
(async () => {
|
|
217
|
-
try {
|
|
218
|
-
const result = await invokeFunction({
|
|
219
|
-
functionName: func.name,
|
|
220
|
-
params: func.params,
|
|
221
|
-
envId
|
|
222
|
-
})
|
|
223
|
-
if (log) {
|
|
224
|
-
successLog(`[${func.name}] 调用成功\n响应结果:\n`)
|
|
225
|
-
console.log(result)
|
|
226
|
-
}
|
|
227
|
-
return result
|
|
228
|
-
} catch (e) {
|
|
229
|
-
throw new CloudBaseError(`${func.name} 函数调用失败:${e.message}`)
|
|
230
|
-
}
|
|
231
|
-
})()
|
|
232
|
-
)
|
|
233
|
-
|
|
234
|
-
return Promise.all(promises)
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// 复制云函数
|
|
238
|
-
export async function copyFunction(options: ICopyFunctionOptions) {
|
|
239
|
-
const { envId, functionName, newFunctionName, targetEnvId, force, codeSecret } = options
|
|
240
|
-
|
|
241
|
-
if (!envId || !functionName || !newFunctionName) {
|
|
242
|
-
throw new CloudBaseError('参数缺失')
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
await scfService.request('CopyFunction', {
|
|
246
|
-
FunctionName: functionName,
|
|
247
|
-
NewFunctionName: newFunctionName,
|
|
248
|
-
Namespace: envId,
|
|
249
|
-
TargetNamespace: targetEnvId || envId,
|
|
250
|
-
Override: force ? true : false,
|
|
251
|
-
CodeSecret: codeSecret
|
|
252
|
-
})
|
|
253
|
-
}
|
|
1
|
+
import CloudBase from '@cloudbase/manager-node'
|
|
2
|
+
import { CloudApiService, checkAndGetCredential, getProxy } from '../utils'
|
|
3
|
+
import { successLog } from '../logger'
|
|
4
|
+
import {
|
|
5
|
+
IListFunctionOptions,
|
|
6
|
+
IFunctionLogOptions,
|
|
7
|
+
IUpdateFunctionConfigOptions,
|
|
8
|
+
IFunctionBatchOptions,
|
|
9
|
+
InvokeFunctionOptions
|
|
10
|
+
} from '../types'
|
|
11
|
+
import { CloudBaseError } from '../error'
|
|
12
|
+
import { getVpcs, getSubnets } from './vpc'
|
|
13
|
+
import { getRegion } from '@cloudbase/toolbox'
|
|
14
|
+
|
|
15
|
+
export interface IBaseOptions {
|
|
16
|
+
envId: string
|
|
17
|
+
functionName: string
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface ICopyFunctionOptions {
|
|
21
|
+
envId: string
|
|
22
|
+
functionName: string
|
|
23
|
+
newFunctionName: string
|
|
24
|
+
targetEnvId: string
|
|
25
|
+
force?: boolean
|
|
26
|
+
copyConfig?: boolean
|
|
27
|
+
codeSecret?: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const scfService = CloudApiService.getInstance('scf')
|
|
31
|
+
export interface IDetailOptions extends IBaseOptions {
|
|
32
|
+
codeSecret?: string
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export async function getFunctionService(envId: string) {
|
|
36
|
+
const region = await getRegion()
|
|
37
|
+
const { secretId, secretKey, token } = await checkAndGetCredential(true)
|
|
38
|
+
|
|
39
|
+
const app = new CloudBase({
|
|
40
|
+
region,
|
|
41
|
+
token,
|
|
42
|
+
envId,
|
|
43
|
+
secretId,
|
|
44
|
+
secretKey,
|
|
45
|
+
proxy: getProxy()
|
|
46
|
+
})
|
|
47
|
+
return app.functions
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// 列出函数
|
|
51
|
+
export async function listFunction(
|
|
52
|
+
options: IListFunctionOptions
|
|
53
|
+
): Promise<Record<string, string>[]> {
|
|
54
|
+
const { limit = 20, offset = 0, envId } = options
|
|
55
|
+
const res: any = await scfService.request('ListFunctions', {
|
|
56
|
+
Namespace: envId,
|
|
57
|
+
Limit: limit,
|
|
58
|
+
Offset: offset
|
|
59
|
+
})
|
|
60
|
+
const { Functions = [] } = res
|
|
61
|
+
const data: Record<string, string>[] = []
|
|
62
|
+
Functions.forEach(func => {
|
|
63
|
+
const { FunctionId, FunctionName, Runtime, AddTime, ModTime, Status } = func
|
|
64
|
+
data.push({
|
|
65
|
+
FunctionId,
|
|
66
|
+
FunctionName,
|
|
67
|
+
Runtime,
|
|
68
|
+
AddTime,
|
|
69
|
+
ModTime,
|
|
70
|
+
Status
|
|
71
|
+
})
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
return data
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// 获取云函数详细信息
|
|
78
|
+
export async function getFunctionDetail(options: IDetailOptions): Promise<Record<string, any>> {
|
|
79
|
+
const { functionName, envId, codeSecret } = options
|
|
80
|
+
|
|
81
|
+
const res = await scfService.request('GetFunction', {
|
|
82
|
+
FunctionName: functionName,
|
|
83
|
+
Namespace: envId,
|
|
84
|
+
ShowCode: 'TRUE',
|
|
85
|
+
CodeSecret: codeSecret
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
const data: Record<string, any> = res
|
|
89
|
+
|
|
90
|
+
// 获取 VPC 信息
|
|
91
|
+
const { VpcId = '', SubnetId = '' } = data.VpcConfig || {}
|
|
92
|
+
if (VpcId && SubnetId) {
|
|
93
|
+
try {
|
|
94
|
+
const vpcs = await getVpcs()
|
|
95
|
+
const subnets = await getSubnets(VpcId)
|
|
96
|
+
const vpc = vpcs.find(item => item.VpcId === VpcId)
|
|
97
|
+
const subnet = subnets.find(item => item.SubnetId === SubnetId)
|
|
98
|
+
data.VpcConfig = {
|
|
99
|
+
vpc,
|
|
100
|
+
subnet
|
|
101
|
+
}
|
|
102
|
+
} catch (e) {
|
|
103
|
+
// 无法获取到 VPC 配置,只展示 id 信息
|
|
104
|
+
data.VpcConfig = {
|
|
105
|
+
vpc: VpcId,
|
|
106
|
+
subnet: SubnetId
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return data
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// 批量获取函数信息
|
|
114
|
+
export async function batchGetFunctionsDetail({
|
|
115
|
+
names,
|
|
116
|
+
envId,
|
|
117
|
+
codeSecret
|
|
118
|
+
}): Promise<Record<string, string>[]> {
|
|
119
|
+
const data: Record<string, string>[] = []
|
|
120
|
+
const promises = names.map(name =>
|
|
121
|
+
(async () => {
|
|
122
|
+
try {
|
|
123
|
+
const info = await getFunctionDetail({
|
|
124
|
+
envId,
|
|
125
|
+
codeSecret,
|
|
126
|
+
functionName: name
|
|
127
|
+
})
|
|
128
|
+
data.push(info)
|
|
129
|
+
} catch (e) {
|
|
130
|
+
throw new CloudBaseError(`${name} 获取信息失败:${e.message}`)
|
|
131
|
+
}
|
|
132
|
+
})()
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
await Promise.all(promises)
|
|
136
|
+
|
|
137
|
+
return data
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// 获取函数日志
|
|
141
|
+
export async function getFunctionLog(
|
|
142
|
+
options: IFunctionLogOptions
|
|
143
|
+
): Promise<Record<string, string>[]> {
|
|
144
|
+
const { envId } = options
|
|
145
|
+
|
|
146
|
+
const params = {
|
|
147
|
+
Namespace: envId
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
Object.keys(options).forEach(key => {
|
|
151
|
+
if (key === 'envId') return
|
|
152
|
+
const keyFirstCharUpperCase = key.charAt(0).toUpperCase() + key.slice(1)
|
|
153
|
+
params[keyFirstCharUpperCase] = options[key]
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
const { Data = [] }: any = await scfService.request('GetFunctionLogs', params)
|
|
157
|
+
return Data
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// 更新函数配置
|
|
161
|
+
export async function updateFunctionConfig(options: IUpdateFunctionConfigOptions): Promise<void> {
|
|
162
|
+
const { functionName, config, envId } = options
|
|
163
|
+
|
|
164
|
+
const functionService = await getFunctionService(envId)
|
|
165
|
+
await functionService.updateFunctionConfig({
|
|
166
|
+
name: functionName,
|
|
167
|
+
...config
|
|
168
|
+
})
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// 批量更新函数配置
|
|
172
|
+
export async function batchUpdateFunctionConfig(options: IFunctionBatchOptions): Promise<void> {
|
|
173
|
+
const { functions, envId, log } = options
|
|
174
|
+
const promises = functions.map(func =>
|
|
175
|
+
(async () => {
|
|
176
|
+
try {
|
|
177
|
+
await updateFunctionConfig({
|
|
178
|
+
functionName: func.name,
|
|
179
|
+
config: func,
|
|
180
|
+
envId
|
|
181
|
+
})
|
|
182
|
+
log && successLog(`[${func.name}] 更新云函数配置成功!`)
|
|
183
|
+
} catch (e) {
|
|
184
|
+
throw new CloudBaseError(`${func.name} 更新配置失败:${e.message}`)
|
|
185
|
+
}
|
|
186
|
+
})()
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
await Promise.all(promises)
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// 调用函数
|
|
193
|
+
export async function invokeFunction(options: InvokeFunctionOptions) {
|
|
194
|
+
const { functionName, envId, params = {} } = options
|
|
195
|
+
|
|
196
|
+
const _params = {
|
|
197
|
+
FunctionName: functionName,
|
|
198
|
+
Namespace: envId,
|
|
199
|
+
ClientContext: JSON.stringify(params),
|
|
200
|
+
LogType: 'Tail'
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
try {
|
|
204
|
+
const { Result } = await scfService.request('Invoke', _params)
|
|
205
|
+
return Result
|
|
206
|
+
} catch (e) {
|
|
207
|
+
throw new CloudBaseError(`[${functionName}] 调用失败:\n${e.message}`)
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// 批量触发云函数
|
|
212
|
+
export async function batchInvokeFunctions(options: IFunctionBatchOptions) {
|
|
213
|
+
const { functions, envId, log = false } = options
|
|
214
|
+
|
|
215
|
+
const promises = functions.map(func =>
|
|
216
|
+
(async () => {
|
|
217
|
+
try {
|
|
218
|
+
const result = await invokeFunction({
|
|
219
|
+
functionName: func.name,
|
|
220
|
+
params: func.params,
|
|
221
|
+
envId
|
|
222
|
+
})
|
|
223
|
+
if (log) {
|
|
224
|
+
successLog(`[${func.name}] 调用成功\n响应结果:\n`)
|
|
225
|
+
console.log(result)
|
|
226
|
+
}
|
|
227
|
+
return result
|
|
228
|
+
} catch (e) {
|
|
229
|
+
throw new CloudBaseError(`${func.name} 函数调用失败:${e.message}`)
|
|
230
|
+
}
|
|
231
|
+
})()
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
return Promise.all(promises)
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// 复制云函数
|
|
238
|
+
export async function copyFunction(options: ICopyFunctionOptions) {
|
|
239
|
+
const { envId, functionName, newFunctionName, targetEnvId, force, codeSecret } = options
|
|
240
|
+
|
|
241
|
+
if (!envId || !functionName || !newFunctionName) {
|
|
242
|
+
throw new CloudBaseError('参数缺失')
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
await scfService.request('CopyFunction', {
|
|
246
|
+
FunctionName: functionName,
|
|
247
|
+
NewFunctionName: newFunctionName,
|
|
248
|
+
Namespace: envId,
|
|
249
|
+
TargetNamespace: targetEnvId || envId,
|
|
250
|
+
Override: force ? true : false,
|
|
251
|
+
CodeSecret: codeSecret
|
|
252
|
+
})
|
|
253
|
+
}
|
package/src/function/code.ts
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
import fs from 'fs'
|
|
2
|
-
import path from 'path'
|
|
3
|
-
import unzipper from 'unzipper'
|
|
4
|
-
import { CloudApiService, fetchStream, delSync, checkFullAccess } from '../utils'
|
|
5
|
-
|
|
6
|
-
interface IFunctionCodeOptions {
|
|
7
|
-
envId: string
|
|
8
|
-
destPath: string
|
|
9
|
-
functionName: string
|
|
10
|
-
codeSecret?: string
|
|
11
|
-
unzip?: boolean
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const scfService = CloudApiService.getInstance('scf')
|
|
15
|
-
|
|
16
|
-
// 下载函数代码
|
|
17
|
-
export async function downloadFunctionCode(options: IFunctionCodeOptions) {
|
|
18
|
-
const { destPath, envId, functionName, codeSecret, unzip = false } = options
|
|
19
|
-
|
|
20
|
-
// 检验路径是否存在
|
|
21
|
-
checkFullAccess(destPath, true)
|
|
22
|
-
|
|
23
|
-
// 获取下载链接
|
|
24
|
-
const { Url } = await scfService.request('GetFunctionAddress', {
|
|
25
|
-
FunctionName: functionName,
|
|
26
|
-
Namespace: envId,
|
|
27
|
-
CodeSecret: codeSecret
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
// 下载文件
|
|
31
|
-
const res = await fetchStream(Url)
|
|
32
|
-
const zipPath = path.join(destPath, `${functionName}.zip`)
|
|
33
|
-
const dest = fs.createWriteStream(zipPath)
|
|
34
|
-
res.body.pipe(dest)
|
|
35
|
-
return new Promise<void>(resolve => {
|
|
36
|
-
// 解压文件
|
|
37
|
-
dest.on('close', () => {
|
|
38
|
-
// 不解压 ZIP 文件
|
|
39
|
-
if (!unzip) {
|
|
40
|
-
resolve()
|
|
41
|
-
return
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const unzipStream = unzipper.Extract({
|
|
45
|
-
path: destPath
|
|
46
|
-
})
|
|
47
|
-
fs.createReadStream(zipPath).pipe(unzipStream)
|
|
48
|
-
unzipStream.on('close', () => {
|
|
49
|
-
// 删除 ZIP 文件
|
|
50
|
-
delSync([zipPath])
|
|
51
|
-
resolve()
|
|
52
|
-
})
|
|
53
|
-
})
|
|
54
|
-
})
|
|
55
|
-
}
|
|
1
|
+
import fs from 'fs'
|
|
2
|
+
import path from 'path'
|
|
3
|
+
import unzipper from 'unzipper'
|
|
4
|
+
import { CloudApiService, fetchStream, delSync, checkFullAccess } from '../utils'
|
|
5
|
+
|
|
6
|
+
interface IFunctionCodeOptions {
|
|
7
|
+
envId: string
|
|
8
|
+
destPath: string
|
|
9
|
+
functionName: string
|
|
10
|
+
codeSecret?: string
|
|
11
|
+
unzip?: boolean
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const scfService = CloudApiService.getInstance('scf')
|
|
15
|
+
|
|
16
|
+
// 下载函数代码
|
|
17
|
+
export async function downloadFunctionCode(options: IFunctionCodeOptions) {
|
|
18
|
+
const { destPath, envId, functionName, codeSecret, unzip = false } = options
|
|
19
|
+
|
|
20
|
+
// 检验路径是否存在
|
|
21
|
+
checkFullAccess(destPath, true)
|
|
22
|
+
|
|
23
|
+
// 获取下载链接
|
|
24
|
+
const { Url } = await scfService.request('GetFunctionAddress', {
|
|
25
|
+
FunctionName: functionName,
|
|
26
|
+
Namespace: envId,
|
|
27
|
+
CodeSecret: codeSecret
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
// 下载文件
|
|
31
|
+
const res = await fetchStream(Url)
|
|
32
|
+
const zipPath = path.join(destPath, `${functionName}.zip`)
|
|
33
|
+
const dest = fs.createWriteStream(zipPath)
|
|
34
|
+
res.body.pipe(dest)
|
|
35
|
+
return new Promise<void>(resolve => {
|
|
36
|
+
// 解压文件
|
|
37
|
+
dest.on('close', () => {
|
|
38
|
+
// 不解压 ZIP 文件
|
|
39
|
+
if (!unzip) {
|
|
40
|
+
resolve()
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const unzipStream = unzipper.Extract({
|
|
45
|
+
path: destPath
|
|
46
|
+
})
|
|
47
|
+
fs.createReadStream(zipPath).pipe(unzipStream)
|
|
48
|
+
unzipStream.on('close', () => {
|
|
49
|
+
// 删除 ZIP 文件
|
|
50
|
+
delSync([zipPath])
|
|
51
|
+
resolve()
|
|
52
|
+
})
|
|
53
|
+
})
|
|
54
|
+
})
|
|
55
|
+
}
|