zcatalyst-cli 1.17.6 → 1.18.0-beta.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.
Files changed (124) hide show
  1. package/docs/commands/event/generate/job.toml +7 -0
  2. package/docs/commands/functions/shell.toml +4 -0
  3. package/docs/endpoints/lib/job-scheduling.toml +3 -0
  4. package/docs/internal/command.toml +5 -0
  5. package/docs/shell/dependencies/tunnel-server.toml +4 -0
  6. package/docs/shell/index.toml +7 -0
  7. package/lib/appsail-utils.js +3 -3
  8. package/lib/authentication/index.js +1 -0
  9. package/lib/command_needs/rc.js +1 -1
  10. package/lib/commands/appsail/add.js +1 -0
  11. package/lib/commands/client/setup.js +1 -0
  12. package/lib/commands/event/generate/job.js +82 -0
  13. package/lib/commands/functions/add.js +1 -0
  14. package/lib/commands/functions/delete.js +2 -4
  15. package/lib/commands/functions/setup.js +1 -0
  16. package/lib/commands/functions/shell.js +98 -1
  17. package/lib/commands/index.js +1 -0
  18. package/lib/commands/init.js +2 -6
  19. package/lib/commands/login.js +1 -0
  20. package/lib/commands/logout.js +1 -0
  21. package/lib/commands/pull.js +1 -0
  22. package/lib/commands/serve.js +2 -8
  23. package/lib/commands/whoami.js +1 -0
  24. package/lib/deploy/features/appsail/index.js +19 -17
  25. package/lib/deploy/features/appsail/utils.js +4 -5
  26. package/lib/endpoints/index.js +15 -1
  27. package/lib/endpoints/lib/appsail.js +7 -1
  28. package/lib/endpoints/lib/job-scheduling.js +61 -0
  29. package/lib/endpoints/lib/sdk.js +2 -2
  30. package/lib/endpoints/lib/tunnel.js +66 -0
  31. package/lib/express_middlewares/logger.js +2 -4
  32. package/lib/fn-utils/lib/common.js +2 -3
  33. package/lib/fn-utils/lib/java.js +1 -1
  34. package/lib/fn-utils/lib/python.js +2 -2
  35. package/lib/fn-watcher.js +1 -1
  36. package/lib/init/dependencies/python/ensure-python.js +6 -8
  37. package/lib/init/features/appsail/index.js +14 -10
  38. package/lib/init/features/functions/index.js +4 -0
  39. package/lib/init/features/functions/languages/python.js +21 -5
  40. package/lib/internal/api.js +17 -1
  41. package/lib/internal/command.js +28 -5
  42. package/lib/port-resolver.js +1 -1
  43. package/lib/repl-server.js +9 -0
  44. package/lib/serve/features/appsail.js +2 -3
  45. package/lib/serve/index.js +1 -2
  46. package/lib/serve/server/index.js +8 -9
  47. package/lib/serve/server/lib/appsail/index.js +24 -34
  48. package/lib/serve/server/lib/java/aio_server/lib/catalyst-cli-java-runtime-1.0.0.jar +0 -0
  49. package/lib/serve/server/lib/java/aio_server/lib/catalyst-function-sdk-1.0.0.jar +0 -0
  50. package/lib/serve/server/lib/java/aio_server/lib/catalyst-java-runtime-1.0.0.jar +0 -0
  51. package/lib/serve/server/lib/java/index.js +2 -2
  52. package/lib/serve/server/lib/master/appsail.js +53 -0
  53. package/lib/serve/server/lib/master/functions.js +34 -0
  54. package/lib/serve/server/lib/master/index.js +155 -0
  55. package/lib/{express_middlewares/unknownReqProxy.js → serve/server/lib/master/unknown-req-proxy.js} +4 -7
  56. package/lib/serve/server/lib/master/utils.js +130 -0
  57. package/lib/serve/server/lib/master/web-client.js +39 -0
  58. package/lib/serve/server/lib/node/index.js +3 -3
  59. package/lib/serve/server/lib/python/index.js +6 -3
  60. package/lib/shell/dependencies/http-functions.js +21 -8
  61. package/lib/shell/dependencies/invoker/bio/java/JavabioInvoker.java +28 -32
  62. package/lib/shell/dependencies/invoker/bio/java/lib/catalyst-function-sdk-1.0.0.jar +0 -0
  63. package/lib/shell/dependencies/invoker/bio/node.mjs +2 -2
  64. package/lib/shell/dependencies/invoker/cron/java/JavacronInvoker.java +62 -13
  65. package/lib/shell/dependencies/invoker/cron/java/lib/catalyst-function-sdk-1.0.0.jar +0 -0
  66. package/lib/shell/dependencies/invoker/cron/node.mjs +28 -24
  67. package/lib/shell/dependencies/invoker/event/java/JavaeventInvoker.java +41 -6
  68. package/lib/shell/dependencies/invoker/event/java/lib/catalyst-function-sdk-1.0.0.jar +0 -0
  69. package/lib/shell/dependencies/invoker/event/node.mjs +23 -9
  70. package/lib/shell/dependencies/invoker/integ/java/JavaintegInvoker.java +3 -3
  71. package/lib/shell/dependencies/invoker/integ/java/lib/catalyst-function-sdk-1.0.0.jar +0 -0
  72. package/lib/shell/dependencies/invoker/integ/node.mjs +6 -6
  73. package/lib/shell/dependencies/invoker/job/java/JavajobInvoker.java +254 -0
  74. package/lib/shell/dependencies/invoker/job/java/lib/catalyst-function-sdk-1.0.0.jar +0 -0
  75. package/lib/shell/dependencies/invoker/job/java/lib/org.json.jar +0 -0
  76. package/lib/shell/dependencies/invoker/job/node.mjs +93 -0
  77. package/lib/shell/dependencies/local-function.js +399 -200
  78. package/lib/shell/dependencies/tunnel-server.js +173 -0
  79. package/lib/shell/index.js +62 -2
  80. package/lib/shell/prepare/languages/index.js +4 -4
  81. package/lib/shell/prepare/languages/java.js +1 -2
  82. package/lib/shell/prepare/languages/python.js +10 -16
  83. package/lib/throbber/index.js +6 -1
  84. package/lib/userConfig.js +7 -1
  85. package/lib/util_modules/config/index.js +1 -1
  86. package/lib/util_modules/config/lib/{appSail.js → appsail.js} +61 -9
  87. package/lib/util_modules/config/lib/client.js +6 -8
  88. package/lib/util_modules/config/lib/functions.js +6 -8
  89. package/lib/util_modules/constants/index.js +3 -1
  90. package/lib/util_modules/constants/lib/default.js +1 -1
  91. package/lib/util_modules/constants/lib/fn-type.js +2 -1
  92. package/lib/util_modules/constants/lib/needed-scopes.js +61 -0
  93. package/lib/util_modules/constants/lib/placeholders.js +6 -0
  94. package/lib/util_modules/constants/lib/ref-mapping.js +2 -1
  95. package/lib/util_modules/constants/lib/remote-mapping.js +2 -1
  96. package/lib/util_modules/constants/lib/scopes.js +9 -1
  97. package/lib/util_modules/constants/lib/template.js +9 -4
  98. package/lib/util_modules/constants/lib/urls.js +16 -0
  99. package/lib/util_modules/fs/lib/async.js +7 -2
  100. package/lib/util_modules/fs/lib/sync.js +12 -1
  101. package/lib/util_modules/server.js +2 -4
  102. package/lib/winston.js +17 -11
  103. package/package.json +1 -1
  104. package/templates/event/job.json +30 -0
  105. package/templates/init/functions/java/job/.classpath +6 -0
  106. package/templates/init/functions/java/job/.project +17 -0
  107. package/templates/init/functions/java/job/catalyst-config.json +11 -0
  108. package/templates/init/functions/java/job/sample.java +34 -0
  109. package/templates/init/functions/node/aio/package.json +1 -1
  110. package/templates/init/functions/node/bio/package.json +1 -1
  111. package/templates/init/functions/node/cron/package.json +1 -1
  112. package/templates/init/functions/node/event/package.json +1 -1
  113. package/templates/init/functions/node/integ/cliq/package.json +1 -1
  114. package/templates/init/functions/node/integ/convokraft/package.json +1 -1
  115. package/templates/init/functions/node/{stream → job}/catalyst-config.json +3 -2
  116. package/templates/init/functions/node/{stream → job}/package.json +1 -1
  117. package/templates/init/functions/node/job/sample.js +28 -0
  118. package/templates/init/functions/node/job/types/job.d.ts +66 -0
  119. package/templates/init/functions/python/job/catalyst-config.json +11 -0
  120. package/templates/init/functions/python/job/requirements.txt +1 -0
  121. package/templates/init/functions/python/job/sample.py +23 -0
  122. package/templates/init.txt +13 -0
  123. package/lib/serve/server/lib/master.js +0 -317
  124. package/templates/init/functions/node/stream/sample.js +0 -15
@@ -1,4 +1,27 @@
1
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
26
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
27
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -13,7 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
36
  };
14
37
  Object.defineProperty(exports, "__esModule", { value: true });
15
38
  const path_1 = require("path");
16
- const http_1 = __importDefault(require("http"));
39
+ const http_1 = __importStar(require("http"));
17
40
  const error_1 = __importDefault(require("../../error"));
18
41
  const fn_utils_1 = require("../../fn-utils");
19
42
  const credential_1 = __importDefault(require("../../internal/credential"));
@@ -28,10 +51,375 @@ const logger_1 = require("../../util_modules/logger");
28
51
  const project_1 = require("../../util_modules/project");
29
52
  const shell_1 = require("../../util_modules/shell");
30
53
  const http_functions_1 = require("../dependencies/http-functions");
54
+ const events_1 = __importDefault(require("events"));
31
55
  const ensure_java_userconfig_1 = require("../../fn-utils/lib/ensure-java-userconfig");
56
+ const server_1 = require("../../util_modules/server");
32
57
  class LocalFunction {
33
58
  constructor(repl, target) {
34
59
  var _a, _b, _c;
60
+ this.localFnEvents = new events_1.default();
61
+ this.killed = false;
62
+ this._call = (shell = true) => (rawData = {}) => {
63
+ let data;
64
+ try {
65
+ if (shell) {
66
+ if (typeof rawData === 'string') {
67
+ const content = fs_1.SYNC.readJSONFile((0, path_1.resolve)(runtime_store_1.default.get('cwd'), rawData));
68
+ if (content === undefined) {
69
+ return new error_1.default('content is undefined for provided file path');
70
+ }
71
+ rawData = content;
72
+ }
73
+ switch (this.target.type) {
74
+ case constants_1.FN_TYPE.cron: {
75
+ data = { data: rawData };
76
+ break;
77
+ }
78
+ case constants_1.FN_TYPE.event:
79
+ if (!('event_bus_details' in rawData)) {
80
+ (0, logger_1.info)('For event function kindly use event:generate command to generate the input json.');
81
+ (0, logger_1.info)('You can also provide event details as per documentation.');
82
+ return new error_1.default('Event bus details missing');
83
+ }
84
+ data = rawData;
85
+ break;
86
+ default: {
87
+ data = rawData;
88
+ }
89
+ }
90
+ }
91
+ else {
92
+ data = rawData;
93
+ }
94
+ }
95
+ catch (e) {
96
+ (0, logger_1.info)('the input must be in the form of json or a path to a file containing json data.');
97
+ return new error_1.default('Invalid input');
98
+ }
99
+ return (() => __awaiter(this, void 0, void 0, function* () {
100
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
101
+ const projectRoot = runtime_store_1.default.get('project.root');
102
+ const accessToken = yield credential_1.default.getAccessToken();
103
+ const slaveOptions = [];
104
+ const debugPort = runtime_store_1.default.get('context.port.debug.' + constants_1.FN_TYPE.basic, null);
105
+ yield fs_1.ASYNC.ensureFile(this.responseFile, true);
106
+ yield fs_1.ASYNC.ensureFile(this.metaFile, true);
107
+ if (this.target.type === constants_1.FN_TYPE.job) {
108
+ const jobDetails = data;
109
+ const jobMetaDetails = {
110
+ headers: Object.assign(Object.assign({}, (_a = jobDetails.job_meta_details) === null || _a === void 0 ? void 0 : _a.headers), {
111
+ 'x-zc-projectid': (0, project_1.getProjectId)(),
112
+ 'x-zc-project-domain': (0, project_1.getDomainPrefix)() + '.' + constants_1.ORIGIN.app.replace('https://', ''),
113
+ 'x-zc-project-key': (0, project_1.getDomainKey)(),
114
+ 'x-zc-environment': (0, project_1.getEnvName)(),
115
+ 'x-zc-user-cred-type': 'token',
116
+ 'x-zc-user-cred-token': accessToken,
117
+ 'x-zc-admin-cred-type': 'token',
118
+ 'x-zc-admin-cred-token': accessToken,
119
+ 'x-zc-user-type': 'admin'
120
+ }),
121
+ params: ((_b = jobDetails.job_meta_details) === null || _b === void 0 ? void 0 : _b.params) || {},
122
+ jobpool_details: ((_c = jobDetails.job_meta_details) === null || _c === void 0 ? void 0 : _c.jobpool_details) || {
123
+ type: 'Function',
124
+ project_details: {
125
+ project_name: (0, project_1.getProjectName)(),
126
+ id: (0, project_1.getProjectId)()
127
+ }
128
+ }
129
+ };
130
+ jobDetails.job_meta_details = jobMetaDetails;
131
+ jobDetails.capacity = jobDetails.capacity || {
132
+ memory: '256'
133
+ };
134
+ data = jobDetails;
135
+ }
136
+ const slaveFnTarget = { index: this.target.index, name: this.target.name };
137
+ if ((_d = this.target.stack) === null || _d === void 0 ? void 0 : _d.startsWith(runtime_1.default.language.node.value)) {
138
+ if (debugPort !== null) {
139
+ slaveOptions.push('--inspect-brk=' + debugPort);
140
+ }
141
+ slaveOptions.push(this.nodeInvoker);
142
+ slaveOptions.push(JSON.stringify(slaveFnTarget));
143
+ slaveOptions.push(JSON.stringify(data));
144
+ slaveOptions.push(JSON.stringify({
145
+ 'x-zc-projectid': (0, project_1.getProjectId)(),
146
+ 'x-zc-project-domain': (0, project_1.getDomainPrefix)() + '.' + constants_1.ORIGIN.app.replace('https://', ''),
147
+ 'x-zc-project-key': (0, project_1.getDomainKey)(),
148
+ 'x-zc-environment': (0, project_1.getEnvName)()
149
+ }));
150
+ slaveOptions.push(JSON.stringify({
151
+ 'x-zc-user-cred-type': 'token',
152
+ 'x-zc-user-cred-token': accessToken,
153
+ 'x-zc-admin-cred-type': 'token',
154
+ 'x-zc-admin-cred-token': accessToken,
155
+ 'x-zc-user-type': 'admin'
156
+ }));
157
+ slaveOptions.push(JSON.stringify((0, path_1.join)(projectRoot, constants_1.FOLDERNAME.build)));
158
+ this.slave = (0, shell_1.spawn)('node', slaveOptions, {
159
+ cwd: (0, path_1.join)(projectRoot, constants_1.FOLDERNAME.build, constants_1.FOLDERNAME.functions, this.target.name),
160
+ stdio: 'pipe',
161
+ env: Object.assign({ X_ZOHO_CATALYST_IS_LOCAL: 'true', X_ZOHO_CATALYST_FUNCTION_LOADED: 'true', X_ZOHO_CATALYST_ACCOUNTS_URL: constants_1.ORIGIN.auth, X_ZOHO_CATALYST_CONSOLE_URL: constants_1.ORIGIN.admin, X_ZOHO_CATALYST_RESOURCE_ID: (_e = this.target) === null || _e === void 0 ? void 0 : _e.id, CATALYST_PROJECT_TIMEZONE: (0, project_1.getProjectTimezone)(Intl.DateTimeFormat().resolvedOptions().timeZone) }, this.target.env_var)
162
+ }).RAW();
163
+ }
164
+ else if ((_f = this.target.stack) === null || _f === void 0 ? void 0 : _f.startsWith(runtime_1.default.language.java.value)) {
165
+ const javaInvokerDir = (0, path_1.parse)(this.javaInvoker).dir;
166
+ slaveOptions.push('-cp');
167
+ slaveOptions.push(javaInvokerDir +
168
+ fn_utils_1.fnUtils.java.classPathSep +
169
+ (0, path_1.join)(javaInvokerDir, 'lib', '*'));
170
+ if (debugPort !== null) {
171
+ slaveOptions.push('-Xdebug');
172
+ slaveOptions.push('-Xrunjdwp:transport=dt_socket,address=' +
173
+ debugPort +
174
+ ',server=y,suspend=y');
175
+ }
176
+ slaveOptions.push((0, path_1.basename)(this.javaInvoker));
177
+ slaveOptions.push(javaInvokerDir);
178
+ slaveOptions.push(JSON.stringify(slaveFnTarget));
179
+ slaveOptions.push(JSON.stringify(data));
180
+ slaveOptions.push(JSON.stringify({
181
+ 'x-zc-projectid': (0, project_1.getProjectId)(),
182
+ 'x-zc-project-domain': (0, project_1.getDomainPrefix)() + '.' + constants_1.ORIGIN.app.replace('https://', ''),
183
+ 'x-zc-project-key': (0, project_1.getDomainKey)(),
184
+ 'x-zc-environment': (0, project_1.getEnvName)()
185
+ }));
186
+ slaveOptions.push(JSON.stringify({
187
+ 'x-zc-user-cred-type': 'token',
188
+ 'x-zc-user-cred-token': accessToken,
189
+ 'x-zc-admin-cred-type': 'token',
190
+ 'x-zc-admin-cred-token': accessToken,
191
+ 'x-zc-user-type': 'admin'
192
+ }));
193
+ const configKey = `${this.target.stack}.bin`;
194
+ const userConfigCmd = userConfig_1.default.get(configKey);
195
+ const spawnCommand = (0, ensure_java_userconfig_1.getJavaSpawnCommand)(userConfigCmd, 'java', this.target.stack);
196
+ this.slave = (0, shell_1.spawn)(spawnCommand, slaveOptions, {
197
+ cwd: (0, path_1.join)(projectRoot, constants_1.FOLDERNAME.build, constants_1.FOLDERNAME.functions, this.target.name),
198
+ stdio: 'pipe',
199
+ env: Object.assign({ X_ZOHO_CATALYST_IS_LOCAL: 'true', X_ZOHO_CATALYST_FUNCTION_LOADED: 'true', X_ZOHO_CATALYST_ACCOUNTS_URL: constants_1.ORIGIN.auth, X_ZOHO_CATALYST_CONSOLE_URL: constants_1.ORIGIN.admin, X_ZOHO_CATALYST_RESOURCE_ID: (_g = this.target) === null || _g === void 0 ? void 0 : _g.id, CATALYST_PROJECT_TIMEZONE: (0, project_1.getProjectTimezone)(Intl.DateTimeFormat().resolvedOptions().timeZone) }, this.target.env_var)
200
+ }).RAW();
201
+ }
202
+ else if ((_h = this.target.stack) === null || _h === void 0 ? void 0 : _h.startsWith(runtime_1.default.language.python.value)) {
203
+ const stackVersion = (_j = this.target.stack) === null || _j === void 0 ? void 0 : _j.replace('python_', '');
204
+ const runtimesDir = constants_1.ENVPATH.runtimes.data;
205
+ const httpPort = parseInt(runtime_store_1.default.get('context.port.http.' + constants_1.REMOTE_REF.functions.type[constants_1.FN_TYPE.basic]), 10);
206
+ const runTimePort = yield port_resolver_1.default.getFreePort(httpPort, 20, false);
207
+ yield fs_1.ASYNC.ensureFile(this.responseFile, true);
208
+ yield fs_1.ASYNC.ensureFile(this.metaFile, true);
209
+ slaveOptions.push('-u');
210
+ slaveOptions.push((0, path_1.join)(runtimesDir, runtime_1.default.language.python.value, `zcatalyst_runtime_${stackVersion.replace('_', '')}`, 'main.py'));
211
+ this.slave = (0, shell_1.spawn)(userConfig_1.default.get(`python${stackVersion}.bin`), slaveOptions, {
212
+ cwd: (0, path_1.join)(projectRoot, constants_1.FOLDERNAME.build, constants_1.FOLDERNAME.functions, this.target.name),
213
+ stdio: 'pipe',
214
+ env: Object.assign({ X_ZOHO_CATALYST_IS_LOCAL: 'true', X_ZOHO_CATALYST_FUNCTION_LOADED: 'true', X_ZOHO_CATALYST_ACCOUNTS_URL: constants_1.ORIGIN.auth, X_ZOHO_CATALYST_CONSOLE_URL: constants_1.ORIGIN.admin, X_ZOHO_CATALYST_RESOURCE_ID: (_k = this.target) === null || _k === void 0 ? void 0 : _k.id, X_ZOHO_CATALYST_CODE_LOCATION: (0, path_1.join)(projectRoot, constants_1.FOLDERNAME.build, constants_1.FOLDERNAME.functions, this.target.name), X_ZOHO_CATALYST_SERVER_LISTEN_PORT: runTimePort.toString(), X_ZOHO_DATA_URL: `http://localhost:${runTimePort}/data`, X_ZOHO_CALLBACK_URL: `http://localhost:${runTimePort}/callback`, CATALYST_PROJECT_TIMEZONE: (0, project_1.getProjectTimezone)(Intl.DateTimeFormat().resolvedOptions().timeZone), X_ZOHO_ADMIN_CRED_TOKEN: 'dummy', X_ZOHO_PROJECT_SECRET_KEY: 'dummy', X_ZOHO_CATALYST_ORG: (0, project_1.getEnvId)(), X_ZOHO_CATALYST_ENVIRONMENT: 'Local', X_ZOHO_JOBMETA_JOBID: 'dummy', CATALYST_FUNCTION_TYPE: constants_1.REMOTE_REF.functions.type[this.target.type] }, this.target.env_var)
215
+ }).RAW();
216
+ this.slave.once('spawn', () => __awaiter(this, void 0, void 0, function* () {
217
+ var _o;
218
+ const jsonData = data;
219
+ jsonData.timestamp = Date.now();
220
+ const writeResponse = (response, status) => {
221
+ fs_1.SYNC.writeFile(this.responseFile, response);
222
+ fs_1.SYNC.writeFile(this.metaFile, JSON.stringify({ response: { statusCode: status } }));
223
+ };
224
+ if (this.target.type === constants_1.FN_TYPE.job) {
225
+ const jobDetailsServer = new http_1.Server((serverReq, serverRes) => __awaiter(this, void 0, void 0, function* () {
226
+ var _p, _q, _r;
227
+ if ((_p = serverReq.url) === null || _p === void 0 ? void 0 : _p.includes('data')) {
228
+ serverRes.writeHead(200);
229
+ serverRes.write(JSON.stringify({
230
+ data: jsonData
231
+ }));
232
+ serverRes.end();
233
+ }
234
+ else if ((_q = serverReq.url) === null || _q === void 0 ? void 0 : _q.includes('callback')) {
235
+ const reqData = yield new Promise((resolve) => {
236
+ const data = [];
237
+ serverReq.on('data', (chunk) => data.push(chunk));
238
+ serverReq.on('end', () => resolve(JSON.parse(Buffer.concat(data).toString())));
239
+ });
240
+ switch (reqData.job_status) {
241
+ case 200: {
242
+ writeResponse('SUCCESS', 200);
243
+ break;
244
+ }
245
+ case 532: {
246
+ writeResponse('CODE_EXCEPTION', 532);
247
+ break;
248
+ }
249
+ case 530: {
250
+ writeResponse('FAILURE', 530);
251
+ break;
252
+ }
253
+ case 500: {
254
+ writeResponse('INTERNAL_SERVER_ERROR', 500);
255
+ break;
256
+ }
257
+ }
258
+ serverRes.writeHead(200);
259
+ serverRes.end();
260
+ return;
261
+ }
262
+ else {
263
+ (0, logger_1.debug)(`Invalid request: (${serverReq.method}) ${serverReq.url}`);
264
+ writeResponse('INTERNAL_SERVER_ERROR', 500);
265
+ (_r = this.slave) === null || _r === void 0 ? void 0 : _r.kill('SIGINT');
266
+ return;
267
+ }
268
+ }));
269
+ const jobConnDestroyer = new server_1.ConnectionDestroyer(jobDetailsServer);
270
+ jobDetailsServer.listen(runTimePort, () => {
271
+ (0, logger_1.debug)('server listening on port :' + runTimePort);
272
+ });
273
+ (_o = this.slave) === null || _o === void 0 ? void 0 : _o.once('exit', () => {
274
+ jobConnDestroyer.destroy();
275
+ });
276
+ return;
277
+ }
278
+ const reqJson = JSON.stringify(jsonData);
279
+ yield (0, http_functions_1.checkIfRuntimeServerRunning)(runTimePort.toString());
280
+ const req = http_1.default
281
+ .request(`http://127.0.0.1:${runTimePort}`, {
282
+ headers: {
283
+ 'x-zc-projectid': (0, project_1.getProjectId)(),
284
+ 'x-zc-project-domain': (0, project_1.getDomainPrefix)() +
285
+ '.' +
286
+ constants_1.ORIGIN.app.replace('https://', ''),
287
+ 'x-zc-project-key': (0, project_1.getDomainKey)(),
288
+ 'x-zc-environment': (0, project_1.getEnvName)(),
289
+ 'x-zc-user-cred-type': 'token',
290
+ 'x-zc-user-cred-token': accessToken,
291
+ 'x-zc-admin-cred-type': 'token',
292
+ 'x-zc-admin-cred-token': accessToken,
293
+ 'x-zc-user-type': 'admin',
294
+ 'Content-Length': reqJson.length
295
+ }
296
+ }, (resp) => {
297
+ var _a;
298
+ if ([
299
+ constants_1.REMOTE_REF.functions.type.cron,
300
+ constants_1.REMOTE_REF.functions.type.event
301
+ ].includes(this.target.type + '')) {
302
+ switch (resp.statusCode) {
303
+ case 200: {
304
+ writeResponse('SUCCESS', 200);
305
+ break;
306
+ }
307
+ case 532: {
308
+ writeResponse('CODE_EXCEPTION', 532);
309
+ break;
310
+ }
311
+ case 530: {
312
+ writeResponse('FAILURE', 530);
313
+ break;
314
+ }
315
+ case 500: {
316
+ writeResponse('INTERNAL_SERVER_ERROR', 500);
317
+ break;
318
+ }
319
+ }
320
+ (_a = this.slave) === null || _a === void 0 ? void 0 : _a.kill('SIGTERM');
321
+ return;
322
+ }
323
+ resp.on('data', (data) => {
324
+ const respStr = data.toString();
325
+ fs_1.SYNC.writeFile(this.responseFile, respStr);
326
+ });
327
+ resp.on('close', () => {
328
+ var _a;
329
+ const metaJson = {
330
+ response: { statusCode: resp.statusCode }
331
+ };
332
+ fs_1.SYNC.writeFile(this.metaFile, JSON.stringify(metaJson));
333
+ (_a = this.slave) === null || _a === void 0 ? void 0 : _a.kill('SIGTERM');
334
+ });
335
+ })
336
+ .on('error', (err) => {
337
+ var _a;
338
+ (0, logger_1.debug)(err);
339
+ (_a = this.slave) === null || _a === void 0 ? void 0 : _a.kill('SIGTERM');
340
+ });
341
+ req.write(reqJson);
342
+ req.end();
343
+ }));
344
+ }
345
+ if (this.slave === null) {
346
+ throw new error_1.default('Slave listening started before initializing', {
347
+ exit: 2
348
+ });
349
+ }
350
+ (_l = this.slave.stdout) === null || _l === void 0 ? void 0 : _l.on('data', (message) => {
351
+ (0, shell_1.clearLine)(process.stdout);
352
+ (0, logger_1.info)(message.toString());
353
+ });
354
+ (_m = this.slave.stderr) === null || _m === void 0 ? void 0 : _m.on('data', (message) => {
355
+ const errorStr = js_1.JS.trim(message.toString());
356
+ (0, shell_1.clearLine)(process.stdout);
357
+ (0, logger_1.info)(errorStr);
358
+ });
359
+ this.slave.on('exit', (code, sig) => __awaiter(this, void 0, void 0, function* () {
360
+ (0, logger_1.debug)(`local fn slave exit: ${code}, ${sig}`);
361
+ if (code === 0) {
362
+ (0, logger_1.info)(`[CLI] Function ${this.target.name} execution complete`);
363
+ (0, logger_1.info)();
364
+ const response = yield fs_1.ASYNC.readFile(this.responseFile);
365
+ let meta;
366
+ try {
367
+ meta = JSON.parse((yield fs_1.ASYNC.readFile(this.metaFile))).response;
368
+ }
369
+ catch (err) {
370
+ meta = {};
371
+ }
372
+ switch (this.target.type) {
373
+ case constants_1.FN_TYPE.basic:
374
+ (0, logger_1.info)(`[response - ${this.target.name}] ${response + ''}`);
375
+ (0, logger_1.info)(`[status - ${this.target.name}] ${(meta.statusCode || 200) + ''}`);
376
+ this.localFnEvents.emit('response', {
377
+ data: response,
378
+ status: meta.statsCode
379
+ });
380
+ break;
381
+ case constants_1.FN_TYPE.cron:
382
+ case constants_1.FN_TYPE.event:
383
+ (0, logger_1.info)(`[status - ${this.target.name}] ${response || 'Unknown'}`);
384
+ if (!response) {
385
+ (0, logger_1.info)(`[CLI] Make sure to close the ${this.target.name} (${this.target.type}) function.`);
386
+ }
387
+ this.localFnEvents.emit('response', {
388
+ status: meta.statusCode
389
+ });
390
+ break;
391
+ case constants_1.FN_TYPE.integration:
392
+ (0, logger_1.info)(`[response - ${this.target.name}] ${response + ''}`);
393
+ try {
394
+ this.localFnEvents.emit('response', JSON.parse(response || ''));
395
+ }
396
+ catch (er) {
397
+ (0, logger_1.debug)('Invalid integration response: ', er);
398
+ }
399
+ break;
400
+ }
401
+ }
402
+ else {
403
+ (code === 130 || sig === 'SIGINT') &&
404
+ (0, logger_1.info)(`[CLI] Function ${this.target.name} interrupted`);
405
+ (code === 143 ||
406
+ sig === 'SIGTERM' ||
407
+ sig === 'SIGQUIT' ||
408
+ sig === 'SIGKILL') &&
409
+ (0, logger_1.info)(`[CLI] Function ${this.target.name} process killed`);
410
+ this.localFnEvents.listenerCount('error') > 0 &&
411
+ this.localFnEvents.emit('error', new error_1.default(`Function(${this.target.name}) process exited with ${code ? 'status: ' + code : 'signal: ' + sig}`, {
412
+ skipHelp: true
413
+ }));
414
+ }
415
+ this.repl.showPrompt();
416
+ }));
417
+ this.slave.on('error', (err) => {
418
+ this.localFnEvents.emit('error', err);
419
+ });
420
+ return this.slave;
421
+ }))();
422
+ };
35
423
  if (target.type === undefined ||
36
424
  !Object.values(constants_1.FN_TYPE).includes(target.type)) {
37
425
  throw new error_1.default('target type is not defined', { exit: 2 });
@@ -66,209 +454,12 @@ class LocalFunction {
66
454
  }, 1000);
67
455
  });
68
456
  }
69
- _call(rawData = {}) {
70
- let data;
71
- try {
72
- data = JSON.stringify(rawData);
73
- if (!data.startsWith('{') || !data.endsWith('}')) {
74
- const content = fs_1.SYNC.readFile((0, path_1.resolve)(runtime_store_1.default.get('cwd'), data.slice(1, data.length - 1)));
75
- if (content === undefined) {
76
- return new error_1.default('content is undefined for provided file path');
77
- }
78
- data = content;
79
- }
80
- }
81
- catch (e) {
82
- (0, logger_1.info)('the input must be in the form of json or a path to a file containing json data.');
83
- return new error_1.default('Invalid input');
84
- }
85
- if (this.target.type === constants_1.FN_TYPE.event && !data.includes('event_bus_details')) {
86
- (0, logger_1.info)('For event function kindly use event:generate command to generate the input json.');
87
- (0, logger_1.info)('You can also provide event details as per documentation.');
88
- return new error_1.default('Event bus details missing');
89
- }
90
- return (() => __awaiter(this, void 0, void 0, function* () {
91
- var _a, _b, _c, _d, _e, _f;
92
- const projectRoot = runtime_store_1.default.get('project.root');
93
- const accessToken = yield credential_1.default.getAccessToken();
94
- const slaveOptions = [];
95
- const debugPort = runtime_store_1.default.get('context.port.debug.' + constants_1.FN_TYPE.basic, null);
96
- yield fs_1.ASYNC.ensureFile(this.responseFile, true);
97
- yield fs_1.ASYNC.ensureFile(this.metaFile, true);
98
- const slaveFnTarget = { index: this.target.index, name: this.target.name };
99
- if ((_a = this.target.stack) === null || _a === void 0 ? void 0 : _a.startsWith(runtime_1.default.language.node.value)) {
100
- if (debugPort !== null) {
101
- slaveOptions.push('--inspect-brk=' + debugPort);
102
- }
103
- slaveOptions.push(this.nodeInvoker);
104
- slaveOptions.push(JSON.stringify(slaveFnTarget));
105
- slaveOptions.push(data);
106
- slaveOptions.push(JSON.stringify({
107
- 'x-zc-projectid': (0, project_1.getProjectId)(),
108
- 'x-zc-project-domain': (0, project_1.getDomainPrefix)() + '.' + constants_1.ORIGIN.app.replace('https://', ''),
109
- 'x-zc-project-key': (0, project_1.getDomainKey)(),
110
- 'x-zc-environment': (0, project_1.getEnvName)()
111
- }));
112
- slaveOptions.push(JSON.stringify({
113
- 'x-zc-user-cred-type': 'token',
114
- 'x-zc-user-cred-token': accessToken,
115
- 'x-zc-admin-cred-type': 'token',
116
- 'x-zc-admin-cred-token': accessToken,
117
- 'x-zc-user-type': 'admin'
118
- }));
119
- slaveOptions.push(JSON.stringify((0, path_1.join)(projectRoot, constants_1.FOLDERNAME.build)));
120
- this.slave = (0, shell_1.spawn)('node', slaveOptions, {
121
- cwd: (0, path_1.join)(projectRoot, constants_1.FOLDERNAME.build, constants_1.FOLDERNAME.functions, this.target.name),
122
- stdio: 'pipe',
123
- env: Object.assign({ X_ZOHO_CATALYST_IS_LOCAL: 'true', X_ZOHO_CATALYST_FUNCTION_LOADED: 'true', X_ZOHO_CATALYST_ACCOUNTS_URL: constants_1.ORIGIN.auth, X_ZOHO_CATALYST_CONSOLE_URL: constants_1.ORIGIN.admin, CATALYST_PROJECT_TIMEZONE: (0, project_1.getProjectTimezone)(Intl.DateTimeFormat().resolvedOptions().timeZone) }, this.target.env_var)
124
- }).RAW();
125
- }
126
- else if ((_b = this.target.stack) === null || _b === void 0 ? void 0 : _b.startsWith(runtime_1.default.language.java.value)) {
127
- const javaInvokerDir = (0, path_1.parse)(this.javaInvoker).dir;
128
- slaveOptions.push('-cp');
129
- slaveOptions.push(javaInvokerDir + fn_utils_1.fnUtils.java.classPathSep + (0, path_1.join)(javaInvokerDir, 'lib', '*'));
130
- if (debugPort !== null) {
131
- slaveOptions.push('-Xdebug');
132
- slaveOptions.push('-Xrunjdwp:transport=dt_socket,address=' + debugPort + ',server=y,suspend=y');
133
- }
134
- slaveOptions.push((0, path_1.basename)(this.javaInvoker));
135
- slaveOptions.push(javaInvokerDir);
136
- slaveOptions.push(JSON.stringify(slaveFnTarget));
137
- slaveOptions.push(data);
138
- slaveOptions.push(JSON.stringify({
139
- 'x-zc-projectid': (0, project_1.getProjectId)(),
140
- 'x-zc-project-domain': (0, project_1.getDomainPrefix)() + '.' + constants_1.ORIGIN.app.replace('https://', ''),
141
- 'x-zc-project-key': (0, project_1.getDomainKey)(),
142
- 'x-zc-environment': (0, project_1.getEnvName)()
143
- }));
144
- slaveOptions.push(JSON.stringify({
145
- 'x-zc-user-cred-type': 'token',
146
- 'x-zc-user-cred-token': accessToken,
147
- 'x-zc-admin-cred-type': 'token',
148
- 'x-zc-admin-cred-token': accessToken,
149
- 'x-zc-user-type': 'admin'
150
- }));
151
- const configKey = `${this.target.stack}.bin`;
152
- const userConfigCmd = userConfig_1.default.get(configKey);
153
- const spawnCommand = (0, ensure_java_userconfig_1.getJavaSpawnCommand)(userConfigCmd, 'java', this.target.stack);
154
- this.slave = (0, shell_1.spawn)(spawnCommand, slaveOptions, {
155
- cwd: (0, path_1.join)(projectRoot, constants_1.FOLDERNAME.build, constants_1.FOLDERNAME.functions, this.target.name),
156
- stdio: 'pipe',
157
- env: Object.assign({ X_ZOHO_CATALYST_IS_LOCAL: 'true', X_ZOHO_CATALYST_FUNCTION_LOADED: 'true', X_ZOHO_CATALYST_ACCOUNTS_URL: constants_1.ORIGIN.auth, X_ZOHO_CATALYST_CONSOLE_URL: constants_1.ORIGIN.admin, CATALYST_PROJECT_TIMEZONE: (0, project_1.getProjectTimezone)(Intl.DateTimeFormat().resolvedOptions().timeZone) }, this.target.env_var)
158
- }).RAW();
159
- }
160
- else if ((_c = this.target.stack) === null || _c === void 0 ? void 0 : _c.startsWith(runtime_1.default.language.python.value)) {
161
- const stackVersion = (_d = this.target.stack) === null || _d === void 0 ? void 0 : _d.replace('python_', '');
162
- const runtimesDir = constants_1.ENVPATH.runtimes.data;
163
- const httpPort = parseInt(runtime_store_1.default.get('context.port.http.' + constants_1.REMOTE_REF.functions.type[constants_1.FN_TYPE.basic]), 10);
164
- const runTimePort = yield port_resolver_1.default.getFreePort(httpPort, 20, false);
165
- yield fs_1.ASYNC.ensureFile(this.responseFile, true);
166
- yield fs_1.ASYNC.ensureFile(this.metaFile, true);
167
- slaveOptions.push('-u');
168
- slaveOptions.push((0, path_1.join)(runtimesDir, runtime_1.default.language.python.value, `zcatalyst_runtime_${stackVersion.replace('_', '')}`, 'main.py'));
169
- this.slave = (0, shell_1.spawn)(userConfig_1.default.get(`python${stackVersion}.bin`), slaveOptions, {
170
- cwd: (0, path_1.join)(projectRoot, constants_1.FOLDERNAME.build, constants_1.FOLDERNAME.functions, this.target.name),
171
- stdio: 'pipe',
172
- env: Object.assign({ X_ZOHO_CATALYST_IS_LOCAL: 'true', X_ZOHO_CATALYST_FUNCTION_LOADED: 'true', X_ZOHO_CATALYST_ACCOUNTS_URL: constants_1.ORIGIN.auth, X_ZOHO_CATALYST_CONSOLE_URL: constants_1.ORIGIN.admin, X_ZOHO_CATALYST_CODE_LOCATION: (0, path_1.join)(projectRoot, constants_1.FOLDERNAME.build, constants_1.FOLDERNAME.functions, this.target.name), X_ZOHO_CATALYST_SERVER_LISTEN_PORT: runTimePort.toString(), CATALYST_PROJECT_TIMEZONE: (0, project_1.getProjectTimezone)(Intl.DateTimeFormat().resolvedOptions().timeZone) }, this.target.env_var)
173
- }).RAW();
174
- this.slave.on('spawn', () => __awaiter(this, void 0, void 0, function* () {
175
- const jsonData = JSON.parse(data);
176
- jsonData.timestamp = Date.now();
177
- const reqJson = JSON.stringify(jsonData);
178
- yield (0, http_functions_1.checkIfRuntimeServerRunning)(runTimePort.toString());
179
- const req = http_1.default
180
- .request(`http://127.0.0.1:${runTimePort}`, {
181
- headers: {
182
- 'x-zc-projectid': (0, project_1.getProjectId)(),
183
- 'x-zc-project-domain': (0, project_1.getDomainPrefix)() +
184
- '.' +
185
- constants_1.ORIGIN.app.replace('https://', ''),
186
- 'x-zc-project-key': (0, project_1.getDomainKey)(),
187
- 'x-zc-environment': (0, project_1.getEnvName)(),
188
- 'x-zc-user-cred-type': 'token',
189
- 'x-zc-user-cred-token': accessToken,
190
- 'x-zc-admin-cred-type': 'token',
191
- 'x-zc-admin-cred-token': accessToken,
192
- 'x-zc-user-type': 'admin',
193
- 'Content-Length': reqJson.length
194
- }
195
- }, (resp) => {
196
- resp.on('data', (data) => {
197
- const respStr = data.toString();
198
- fs_1.SYNC.writeFile(this.responseFile, respStr);
199
- });
200
- resp.on('close', () => {
201
- var _a;
202
- const metaJson = { response: { statusCode: resp.statusCode } };
203
- fs_1.SYNC.writeFile(this.metaFile, JSON.stringify(metaJson));
204
- (_a = this.slave) === null || _a === void 0 ? void 0 : _a.kill('SIGINT');
205
- });
206
- })
207
- .on('error', (err) => {
208
- var _a;
209
- console.log(err);
210
- (_a = this.slave) === null || _a === void 0 ? void 0 : _a.kill('SIGINT');
211
- });
212
- req.write(reqJson);
213
- req.end();
214
- }));
215
- }
216
- if (this.slave === null) {
217
- throw new error_1.default('Slave listening started before initialising', {
218
- exit: 2
219
- });
220
- }
221
- (_e = this.slave.stdout) === null || _e === void 0 ? void 0 : _e.on('data', (message) => {
222
- (0, shell_1.clearLine)(process.stdout);
223
- (0, logger_1.info)(message.toString());
224
- });
225
- (_f = this.slave.stderr) === null || _f === void 0 ? void 0 : _f.on('data', (message) => {
226
- const errorStr = js_1.JS.trim(message.toString());
227
- (0, shell_1.clearLine)(process.stdout);
228
- (0, logger_1.info)(errorStr);
229
- });
230
- this.slave.on('exit', (code) => __awaiter(this, void 0, void 0, function* () {
231
- if (code !== null && code !== 130) {
232
- (0, logger_1.info)('[cli] Function execution complete');
233
- (0, logger_1.info)();
234
- const response = yield fs_1.ASYNC.readFile(this.responseFile);
235
- let meta;
236
- try {
237
- meta = JSON.parse((yield fs_1.ASYNC.readFile(this.metaFile))).response;
238
- }
239
- catch (err) {
240
- meta = {};
241
- }
242
- switch (this.target.type) {
243
- case constants_1.FN_TYPE.basic:
244
- (0, logger_1.info)('[response]');
245
- (0, logger_1.info)(response);
246
- (0, logger_1.info)('[status]');
247
- (0, logger_1.info)(meta.statusCode || 200);
248
- break;
249
- case constants_1.FN_TYPE.cron:
250
- case constants_1.FN_TYPE.event:
251
- (0, logger_1.info)('[status]');
252
- (0, logger_1.info)(response);
253
- break;
254
- case constants_1.FN_TYPE.integration:
255
- (0, logger_1.info)('[response]');
256
- (0, logger_1.info)(response);
257
- break;
258
- default:
259
- break;
260
- }
261
- }
262
- this.repl.showPrompt();
263
- }));
264
- return this.slave;
265
- }))();
266
- }
267
457
  shutdown() {
268
458
  return __awaiter(this, void 0, void 0, function* () {
269
459
  return new Promise((res) => {
270
460
  if (this.slave) {
271
- this.slave.kill('SIGINT');
461
+ this.killed = true;
462
+ this.slave.kill('SIGTERM');
272
463
  }
273
464
  if (this.watcher) {
274
465
  this.watcher.close().then(res).catch(res);
@@ -279,5 +470,13 @@ class LocalFunction {
279
470
  });
280
471
  });
281
472
  }
473
+ once(event, fn) {
474
+ this.localFnEvents.once(event, fn);
475
+ return this;
476
+ }
477
+ removeListener(event, fn) {
478
+ this.localFnEvents.removeListener(event, fn);
479
+ return this;
480
+ }
282
481
  }
283
482
  exports.default = LocalFunction;