@cloudbase/cli 2.0.0 → 2.0.3-alpha.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.
- package/.editorconfig +9 -9
- package/.eslintignore +7 -7
- package/.eslintrc +35 -35
- package/.prettierrc.js +29 -29
- package/.vscode/launch.json +16 -16
- package/LICENSE +5 -5
- package/README.md +35 -35
- package/bin/cloudbase.js +5 -5
- package/bin/tcb.js +6 -4
- 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 +6 -4
- package/lib/utils/net/http-request.js +4 -4
- package/lib/utils/tcbrApi/tcbr-cloud-api/request.js +3 -3
- package/package.json +17 -17
- 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/common.ts +246 -246
- 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 +6 -4
- 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/http-request.ts +84 -84
- 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/tcbrApi/tcbr-cloud-api/request.ts +13 -13
- 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/.vscode/settings.json +0 -3
package/post-install.js
CHANGED
|
@@ -1,61 +1,61 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
const chalk = require('chalk')
|
|
3
|
-
const { execSync } = require('child_process')
|
|
4
|
-
|
|
5
|
-
const isWin32 = process.platform === 'win32'
|
|
6
|
-
|
|
7
|
-
const print = (color = null) => (str = '') => {
|
|
8
|
-
const terminalCols = retrieveCols()
|
|
9
|
-
const strLength = str.replace(/\u001B\[[0-9]{2}m/g, '').length
|
|
10
|
-
const leftPaddingLength = Math.floor((terminalCols - strLength) / 2)
|
|
11
|
-
const leftPadding = ' '.repeat(Math.max(leftPaddingLength, 0))
|
|
12
|
-
if (color) {
|
|
13
|
-
str = chalk[color](str)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
console.log(leftPadding, str)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const retrieveCols = (() => {
|
|
20
|
-
let result = false
|
|
21
|
-
|
|
22
|
-
return () => {
|
|
23
|
-
if (result) {
|
|
24
|
-
return result
|
|
25
|
-
}
|
|
26
|
-
const defaultCols = 80
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
const terminalCols = execSync('tput cols', { stdio: ['pipe', 'pipe', 'ignore'] })
|
|
30
|
-
result = parseInt(terminalCols.toString()) || defaultCols
|
|
31
|
-
} catch (e) {
|
|
32
|
-
result = defaultCols
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return result
|
|
36
|
-
}
|
|
37
|
-
})()
|
|
38
|
-
|
|
39
|
-
// 只在 osx 系统上展示 emoji
|
|
40
|
-
const emoji = (emoji) => (process.stdout.isTTY && !isWin32 ? emoji : '')
|
|
41
|
-
|
|
42
|
-
function printFooter() {
|
|
43
|
-
const yellow = print('yellow')
|
|
44
|
-
// const yellow = str => console.log(chalk.yellow(str))
|
|
45
|
-
const emptyLine = print()
|
|
46
|
-
|
|
47
|
-
emptyLine()
|
|
48
|
-
|
|
49
|
-
yellow('了解如何使用 CloudBase CLI')
|
|
50
|
-
yellow('请查看使用文档')
|
|
51
|
-
|
|
52
|
-
print()(
|
|
53
|
-
' '.repeat(15) +
|
|
54
|
-
`${chalk.bold(emoji('👉'))} ${chalk.underline(
|
|
55
|
-
'https://docs.cloudbase.net/cli-v1/quick-start.html'
|
|
56
|
-
)}`
|
|
57
|
-
)
|
|
58
|
-
emptyLine()
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
printFooter()
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
const chalk = require('chalk')
|
|
3
|
+
const { execSync } = require('child_process')
|
|
4
|
+
|
|
5
|
+
const isWin32 = process.platform === 'win32'
|
|
6
|
+
|
|
7
|
+
const print = (color = null) => (str = '') => {
|
|
8
|
+
const terminalCols = retrieveCols()
|
|
9
|
+
const strLength = str.replace(/\u001B\[[0-9]{2}m/g, '').length
|
|
10
|
+
const leftPaddingLength = Math.floor((terminalCols - strLength) / 2)
|
|
11
|
+
const leftPadding = ' '.repeat(Math.max(leftPaddingLength, 0))
|
|
12
|
+
if (color) {
|
|
13
|
+
str = chalk[color](str)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
console.log(leftPadding, str)
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const retrieveCols = (() => {
|
|
20
|
+
let result = false
|
|
21
|
+
|
|
22
|
+
return () => {
|
|
23
|
+
if (result) {
|
|
24
|
+
return result
|
|
25
|
+
}
|
|
26
|
+
const defaultCols = 80
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
const terminalCols = execSync('tput cols', { stdio: ['pipe', 'pipe', 'ignore'] })
|
|
30
|
+
result = parseInt(terminalCols.toString()) || defaultCols
|
|
31
|
+
} catch (e) {
|
|
32
|
+
result = defaultCols
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return result
|
|
36
|
+
}
|
|
37
|
+
})()
|
|
38
|
+
|
|
39
|
+
// 只在 osx 系统上展示 emoji
|
|
40
|
+
const emoji = (emoji) => (process.stdout.isTTY && !isWin32 ? emoji : '')
|
|
41
|
+
|
|
42
|
+
function printFooter() {
|
|
43
|
+
const yellow = print('yellow')
|
|
44
|
+
// const yellow = str => console.log(chalk.yellow(str))
|
|
45
|
+
const emptyLine = print()
|
|
46
|
+
|
|
47
|
+
emptyLine()
|
|
48
|
+
|
|
49
|
+
yellow('了解如何使用 CloudBase CLI')
|
|
50
|
+
yellow('请查看使用文档')
|
|
51
|
+
|
|
52
|
+
print()(
|
|
53
|
+
' '.repeat(15) +
|
|
54
|
+
`${chalk.bold(emoji('👉'))} ${chalk.underline(
|
|
55
|
+
'https://docs.cloudbase.net/cli-v1/quick-start.html'
|
|
56
|
+
)}`
|
|
57
|
+
)
|
|
58
|
+
emptyLine()
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
printFooter()
|
|
@@ -1,255 +1,255 @@
|
|
|
1
|
-
/* eslint-disable */
|
|
2
|
-
var runtime = require('./runtime')
|
|
3
|
-
var util = require('util')
|
|
4
|
-
|
|
5
|
-
var initHandlerFault = 'function initialization failed'
|
|
6
|
-
var maxRetMsgLen = 6 * 1024 * 1024 // byte
|
|
7
|
-
var maxRetMsgLenExceedError = 'body size is too long'
|
|
8
|
-
var httpHandler, eventHandler
|
|
9
|
-
|
|
10
|
-
var _result, _fault
|
|
11
|
-
var _user_exception = false
|
|
12
|
-
|
|
13
|
-
function wrapLog(invokeId) {
|
|
14
|
-
console.log = console.info = function prettyConsoleLog() {
|
|
15
|
-
var message = `${util.format.apply(this, arguments)}`
|
|
16
|
-
runtime.console_log(message)
|
|
17
|
-
}
|
|
18
|
-
console.error = console.warn = function prettyConsoleLogErr() {
|
|
19
|
-
var message = `${util.format.apply(this, arguments)}`
|
|
20
|
-
runtime.console_log(message, (err = true))
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function main() {
|
|
25
|
-
if (0 != runtime.init()) {
|
|
26
|
-
console.log('runtime init failed')
|
|
27
|
-
return
|
|
28
|
-
}
|
|
29
|
-
runtime.log('init succ')
|
|
30
|
-
|
|
31
|
-
cleanEnv()
|
|
32
|
-
|
|
33
|
-
process.on('beforeExit', () => {
|
|
34
|
-
runtime.log('catch exit')
|
|
35
|
-
finish(null, null, false)
|
|
36
|
-
})
|
|
37
|
-
process.on('uncaughtException', err => {
|
|
38
|
-
runtime.log('catch exception')
|
|
39
|
-
finish(err, null, false)
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
waitForInvoke()
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function cleanEnv() {
|
|
46
|
-
var envToDelete = ['SOCKETPATH', 'CONTAINERID']
|
|
47
|
-
for (var k in process.env) {
|
|
48
|
-
if (k.startsWith('KUBERNETES')) {
|
|
49
|
-
envToDelete.push(k)
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
envToDelete.forEach(e => {
|
|
54
|
-
delete process.env[e]
|
|
55
|
-
})
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function waitForInvoke() {
|
|
59
|
-
runtime.log('wait for invoke')
|
|
60
|
-
var invokeInfo = runtime.wait_for_invoke()
|
|
61
|
-
setTimeout(() => {
|
|
62
|
-
runtime.log('timed out, invoke')
|
|
63
|
-
invoke(invokeInfo)
|
|
64
|
-
}, 0)
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function invoke(invokeInfo) {
|
|
68
|
-
if (invokeInfo.cmd === 'RELOAD') {
|
|
69
|
-
runtime.log(`get reload request: ${invokeInfo.context}`)
|
|
70
|
-
// 路径中可能包含 . 符号
|
|
71
|
-
var ff = invokeInfo.globalHandler.split('.')
|
|
72
|
-
initHandler(invokeInfo.filePath + ff[0], ff[1])
|
|
73
|
-
runtime.log('handlers reloaded')
|
|
74
|
-
_result = 'reload'
|
|
75
|
-
finish(null, null, false)
|
|
76
|
-
return
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
_result = undefined
|
|
80
|
-
_fault = undefined
|
|
81
|
-
|
|
82
|
-
runtime.report_running()
|
|
83
|
-
|
|
84
|
-
var ev, ctx
|
|
85
|
-
if (invokeInfo.event || invokeInfo.context) {
|
|
86
|
-
try {
|
|
87
|
-
ev = JSON.parse(invokeInfo.event)
|
|
88
|
-
ctx = JSON.parse(invokeInfo.context)
|
|
89
|
-
} catch (err) {
|
|
90
|
-
_fault = `eval event[${invokeInfo.event}] or context [${invokeInfo.context}] failed\n${err}`
|
|
91
|
-
return
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
ctx['environ'].split(';').forEach(e => {
|
|
96
|
-
if (e == '') return
|
|
97
|
-
var kv = e.split('=', 2)
|
|
98
|
-
process.env[kv[0]] = kv[1]
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
runtime.log(`request[${ctx['request_id']}] invoked`)
|
|
102
|
-
|
|
103
|
-
if (!httpHandler && !eventHandler) {
|
|
104
|
-
_fault = initHandlerFault
|
|
105
|
-
return
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
wrapLog(ctx['request_id'])
|
|
109
|
-
if (invokeInfo.cmd === 'HTTP') {
|
|
110
|
-
httpHandler.handle(invokeInfo.sockfd)
|
|
111
|
-
} else if (invokeInfo.cmd === 'EVENT') {
|
|
112
|
-
eventHandler.handle(ev, ctx)
|
|
113
|
-
} else {
|
|
114
|
-
_fault = `recv unknown task type: ${invokeInfo.cmd}`
|
|
115
|
-
runtime.log(`recv unknown task type: ${invokeInfo.cmd}`)
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
runtime.log('process finished')
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function initHandler(file, func) {
|
|
122
|
-
try {
|
|
123
|
-
var path = require('path')
|
|
124
|
-
var current_path = path.dirname(file)
|
|
125
|
-
process.chdir(current_path)
|
|
126
|
-
runtime.log(`working directory: ${process.cwd()}`)
|
|
127
|
-
|
|
128
|
-
for (var item in require.cache) {
|
|
129
|
-
delete require.cache[item]
|
|
130
|
-
}
|
|
131
|
-
var usermod = require(file)
|
|
132
|
-
httpHandler = new HttpHandler(usermod[func])
|
|
133
|
-
eventHandler = new EventHandler(usermod[func])
|
|
134
|
-
} catch (err) {
|
|
135
|
-
runtime.log(`get user function[${file}:${func}] failed`)
|
|
136
|
-
runtime.log(err.stack)
|
|
137
|
-
initHandlerFault = err.message
|
|
138
|
-
_user_exception = true
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
function finish(err, data, wait) {
|
|
143
|
-
runtime.log('finish')
|
|
144
|
-
runtime.log(wait ? 'wait' : 'not wait')
|
|
145
|
-
|
|
146
|
-
if (_result === undefined) {
|
|
147
|
-
if (err == null) {
|
|
148
|
-
try {
|
|
149
|
-
_result = JSON.stringify(data === undefined ? null : data)
|
|
150
|
-
} catch (err) {
|
|
151
|
-
_result = 'faulted'
|
|
152
|
-
_fault = `stringify response to json failed: ${err.message}`
|
|
153
|
-
return
|
|
154
|
-
}
|
|
155
|
-
} else {
|
|
156
|
-
_result = 'faulted'
|
|
157
|
-
if (err instanceof Error) {
|
|
158
|
-
runtime.console_log(err.stack, true)
|
|
159
|
-
_fault = err.message
|
|
160
|
-
} else {
|
|
161
|
-
var errStr = String(err)
|
|
162
|
-
_fault = `${errStr}(callback err is not instance of Error)`
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
if (wait) {
|
|
168
|
-
return
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
runtime.log(_result)
|
|
172
|
-
process.nextTick(() => {
|
|
173
|
-
if (_result == 'reload') {
|
|
174
|
-
// reload response, do nothing
|
|
175
|
-
} else if (_fault !== undefined) {
|
|
176
|
-
_user_exception = true
|
|
177
|
-
var errType = _user_exception ? 2 : 1
|
|
178
|
-
runtime.report_fail(_fault, 0, errType)
|
|
179
|
-
} else if (_result.length > maxRetMsgLen) {
|
|
180
|
-
runtime.report_fail(maxRetMsgLenExceedError, 0, 1)
|
|
181
|
-
} else {
|
|
182
|
-
runtime.report_done(_result, 0)
|
|
183
|
-
}
|
|
184
|
-
waitForInvoke()
|
|
185
|
-
})
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
class HttpHandler {
|
|
189
|
-
constructor(func) {
|
|
190
|
-
this.realHandler = func
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
handle(fd) {}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
class EventHandler {
|
|
197
|
-
constructor(func) {
|
|
198
|
-
this.realHandler = func
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
handle(ev, ctx) {
|
|
202
|
-
var called = false
|
|
203
|
-
var wait = true
|
|
204
|
-
var callback = (err, data) => {
|
|
205
|
-
if (called) {
|
|
206
|
-
return
|
|
207
|
-
}
|
|
208
|
-
called = true
|
|
209
|
-
finish(err, data, wait)
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
var ctxx = Object.assign(
|
|
213
|
-
{
|
|
214
|
-
set callbackWaitsForEmptyEventLoop(value) {
|
|
215
|
-
wait = value
|
|
216
|
-
},
|
|
217
|
-
get callbackWaitsForEmptyEventLoop() {
|
|
218
|
-
return wait
|
|
219
|
-
},
|
|
220
|
-
getContext() {
|
|
221
|
-
return ctx
|
|
222
|
-
},
|
|
223
|
-
done: function(err, data) {
|
|
224
|
-
wait = false
|
|
225
|
-
callback(err, data)
|
|
226
|
-
},
|
|
227
|
-
succeed: function(data) {
|
|
228
|
-
ctxx.done(null, data)
|
|
229
|
-
},
|
|
230
|
-
fail: function(err) {
|
|
231
|
-
ctxx.done(err, null)
|
|
232
|
-
}
|
|
233
|
-
},
|
|
234
|
-
ctx
|
|
235
|
-
)
|
|
236
|
-
|
|
237
|
-
try {
|
|
238
|
-
_user_exception = false
|
|
239
|
-
var ret = this.realHandler(ev, ctxx, callback)
|
|
240
|
-
if (
|
|
241
|
-
ret &&
|
|
242
|
-
ret.then !== undefined &&
|
|
243
|
-
typeof ret.then === 'function'
|
|
244
|
-
) {
|
|
245
|
-
ret.then(ctxx.succeed, ctxx.fail)
|
|
246
|
-
}
|
|
247
|
-
} catch (err) {
|
|
248
|
-
runtime.console_log(err.stack, true)
|
|
249
|
-
_fault = err.stack
|
|
250
|
-
_user_exception = true
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
main()
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
var runtime = require('./runtime')
|
|
3
|
+
var util = require('util')
|
|
4
|
+
|
|
5
|
+
var initHandlerFault = 'function initialization failed'
|
|
6
|
+
var maxRetMsgLen = 6 * 1024 * 1024 // byte
|
|
7
|
+
var maxRetMsgLenExceedError = 'body size is too long'
|
|
8
|
+
var httpHandler, eventHandler
|
|
9
|
+
|
|
10
|
+
var _result, _fault
|
|
11
|
+
var _user_exception = false
|
|
12
|
+
|
|
13
|
+
function wrapLog(invokeId) {
|
|
14
|
+
console.log = console.info = function prettyConsoleLog() {
|
|
15
|
+
var message = `${util.format.apply(this, arguments)}`
|
|
16
|
+
runtime.console_log(message)
|
|
17
|
+
}
|
|
18
|
+
console.error = console.warn = function prettyConsoleLogErr() {
|
|
19
|
+
var message = `${util.format.apply(this, arguments)}`
|
|
20
|
+
runtime.console_log(message, (err = true))
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function main() {
|
|
25
|
+
if (0 != runtime.init()) {
|
|
26
|
+
console.log('runtime init failed')
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
runtime.log('init succ')
|
|
30
|
+
|
|
31
|
+
cleanEnv()
|
|
32
|
+
|
|
33
|
+
process.on('beforeExit', () => {
|
|
34
|
+
runtime.log('catch exit')
|
|
35
|
+
finish(null, null, false)
|
|
36
|
+
})
|
|
37
|
+
process.on('uncaughtException', err => {
|
|
38
|
+
runtime.log('catch exception')
|
|
39
|
+
finish(err, null, false)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
waitForInvoke()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function cleanEnv() {
|
|
46
|
+
var envToDelete = ['SOCKETPATH', 'CONTAINERID']
|
|
47
|
+
for (var k in process.env) {
|
|
48
|
+
if (k.startsWith('KUBERNETES')) {
|
|
49
|
+
envToDelete.push(k)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
envToDelete.forEach(e => {
|
|
54
|
+
delete process.env[e]
|
|
55
|
+
})
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function waitForInvoke() {
|
|
59
|
+
runtime.log('wait for invoke')
|
|
60
|
+
var invokeInfo = runtime.wait_for_invoke()
|
|
61
|
+
setTimeout(() => {
|
|
62
|
+
runtime.log('timed out, invoke')
|
|
63
|
+
invoke(invokeInfo)
|
|
64
|
+
}, 0)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function invoke(invokeInfo) {
|
|
68
|
+
if (invokeInfo.cmd === 'RELOAD') {
|
|
69
|
+
runtime.log(`get reload request: ${invokeInfo.context}`)
|
|
70
|
+
// 路径中可能包含 . 符号
|
|
71
|
+
var ff = invokeInfo.globalHandler.split('.')
|
|
72
|
+
initHandler(invokeInfo.filePath + ff[0], ff[1])
|
|
73
|
+
runtime.log('handlers reloaded')
|
|
74
|
+
_result = 'reload'
|
|
75
|
+
finish(null, null, false)
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
_result = undefined
|
|
80
|
+
_fault = undefined
|
|
81
|
+
|
|
82
|
+
runtime.report_running()
|
|
83
|
+
|
|
84
|
+
var ev, ctx
|
|
85
|
+
if (invokeInfo.event || invokeInfo.context) {
|
|
86
|
+
try {
|
|
87
|
+
ev = JSON.parse(invokeInfo.event)
|
|
88
|
+
ctx = JSON.parse(invokeInfo.context)
|
|
89
|
+
} catch (err) {
|
|
90
|
+
_fault = `eval event[${invokeInfo.event}] or context [${invokeInfo.context}] failed\n${err}`
|
|
91
|
+
return
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
ctx['environ'].split(';').forEach(e => {
|
|
96
|
+
if (e == '') return
|
|
97
|
+
var kv = e.split('=', 2)
|
|
98
|
+
process.env[kv[0]] = kv[1]
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
runtime.log(`request[${ctx['request_id']}] invoked`)
|
|
102
|
+
|
|
103
|
+
if (!httpHandler && !eventHandler) {
|
|
104
|
+
_fault = initHandlerFault
|
|
105
|
+
return
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
wrapLog(ctx['request_id'])
|
|
109
|
+
if (invokeInfo.cmd === 'HTTP') {
|
|
110
|
+
httpHandler.handle(invokeInfo.sockfd)
|
|
111
|
+
} else if (invokeInfo.cmd === 'EVENT') {
|
|
112
|
+
eventHandler.handle(ev, ctx)
|
|
113
|
+
} else {
|
|
114
|
+
_fault = `recv unknown task type: ${invokeInfo.cmd}`
|
|
115
|
+
runtime.log(`recv unknown task type: ${invokeInfo.cmd}`)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
runtime.log('process finished')
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function initHandler(file, func) {
|
|
122
|
+
try {
|
|
123
|
+
var path = require('path')
|
|
124
|
+
var current_path = path.dirname(file)
|
|
125
|
+
process.chdir(current_path)
|
|
126
|
+
runtime.log(`working directory: ${process.cwd()}`)
|
|
127
|
+
|
|
128
|
+
for (var item in require.cache) {
|
|
129
|
+
delete require.cache[item]
|
|
130
|
+
}
|
|
131
|
+
var usermod = require(file)
|
|
132
|
+
httpHandler = new HttpHandler(usermod[func])
|
|
133
|
+
eventHandler = new EventHandler(usermod[func])
|
|
134
|
+
} catch (err) {
|
|
135
|
+
runtime.log(`get user function[${file}:${func}] failed`)
|
|
136
|
+
runtime.log(err.stack)
|
|
137
|
+
initHandlerFault = err.message
|
|
138
|
+
_user_exception = true
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function finish(err, data, wait) {
|
|
143
|
+
runtime.log('finish')
|
|
144
|
+
runtime.log(wait ? 'wait' : 'not wait')
|
|
145
|
+
|
|
146
|
+
if (_result === undefined) {
|
|
147
|
+
if (err == null) {
|
|
148
|
+
try {
|
|
149
|
+
_result = JSON.stringify(data === undefined ? null : data)
|
|
150
|
+
} catch (err) {
|
|
151
|
+
_result = 'faulted'
|
|
152
|
+
_fault = `stringify response to json failed: ${err.message}`
|
|
153
|
+
return
|
|
154
|
+
}
|
|
155
|
+
} else {
|
|
156
|
+
_result = 'faulted'
|
|
157
|
+
if (err instanceof Error) {
|
|
158
|
+
runtime.console_log(err.stack, true)
|
|
159
|
+
_fault = err.message
|
|
160
|
+
} else {
|
|
161
|
+
var errStr = String(err)
|
|
162
|
+
_fault = `${errStr}(callback err is not instance of Error)`
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (wait) {
|
|
168
|
+
return
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
runtime.log(_result)
|
|
172
|
+
process.nextTick(() => {
|
|
173
|
+
if (_result == 'reload') {
|
|
174
|
+
// reload response, do nothing
|
|
175
|
+
} else if (_fault !== undefined) {
|
|
176
|
+
_user_exception = true
|
|
177
|
+
var errType = _user_exception ? 2 : 1
|
|
178
|
+
runtime.report_fail(_fault, 0, errType)
|
|
179
|
+
} else if (_result.length > maxRetMsgLen) {
|
|
180
|
+
runtime.report_fail(maxRetMsgLenExceedError, 0, 1)
|
|
181
|
+
} else {
|
|
182
|
+
runtime.report_done(_result, 0)
|
|
183
|
+
}
|
|
184
|
+
waitForInvoke()
|
|
185
|
+
})
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
class HttpHandler {
|
|
189
|
+
constructor(func) {
|
|
190
|
+
this.realHandler = func
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
handle(fd) {}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
class EventHandler {
|
|
197
|
+
constructor(func) {
|
|
198
|
+
this.realHandler = func
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
handle(ev, ctx) {
|
|
202
|
+
var called = false
|
|
203
|
+
var wait = true
|
|
204
|
+
var callback = (err, data) => {
|
|
205
|
+
if (called) {
|
|
206
|
+
return
|
|
207
|
+
}
|
|
208
|
+
called = true
|
|
209
|
+
finish(err, data, wait)
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
var ctxx = Object.assign(
|
|
213
|
+
{
|
|
214
|
+
set callbackWaitsForEmptyEventLoop(value) {
|
|
215
|
+
wait = value
|
|
216
|
+
},
|
|
217
|
+
get callbackWaitsForEmptyEventLoop() {
|
|
218
|
+
return wait
|
|
219
|
+
},
|
|
220
|
+
getContext() {
|
|
221
|
+
return ctx
|
|
222
|
+
},
|
|
223
|
+
done: function(err, data) {
|
|
224
|
+
wait = false
|
|
225
|
+
callback(err, data)
|
|
226
|
+
},
|
|
227
|
+
succeed: function(data) {
|
|
228
|
+
ctxx.done(null, data)
|
|
229
|
+
},
|
|
230
|
+
fail: function(err) {
|
|
231
|
+
ctxx.done(err, null)
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
ctx
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
try {
|
|
238
|
+
_user_exception = false
|
|
239
|
+
var ret = this.realHandler(ev, ctxx, callback)
|
|
240
|
+
if (
|
|
241
|
+
ret &&
|
|
242
|
+
ret.then !== undefined &&
|
|
243
|
+
typeof ret.then === 'function'
|
|
244
|
+
) {
|
|
245
|
+
ret.then(ctxx.succeed, ctxx.fail)
|
|
246
|
+
}
|
|
247
|
+
} catch (err) {
|
|
248
|
+
runtime.console_log(err.stack, true)
|
|
249
|
+
_fault = err.stack
|
|
250
|
+
_user_exception = true
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
main()
|