@nocobase/server 1.9.0-beta.9 → 2.0.0-alpha.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.
@@ -53,25 +53,25 @@ const _AesEncryptor = class _AesEncryptor {
53
53
  this.key = key;
54
54
  }
55
55
  async encrypt(text) {
56
- return new Promise((resolve, reject) => {
56
+ return new Promise((resolve2, reject) => {
57
57
  try {
58
58
  const iv = import_crypto.default.randomBytes(16);
59
59
  const cipher = import_crypto.default.createCipheriv("aes-256-cbc", this.key, iv);
60
60
  const encrypted = Buffer.concat([cipher.update(Buffer.from(text, "utf8")), cipher.final()]);
61
- resolve(iv.toString("hex") + encrypted.toString("hex"));
61
+ resolve2(iv.toString("hex") + encrypted.toString("hex"));
62
62
  } catch (error) {
63
63
  reject(error);
64
64
  }
65
65
  });
66
66
  }
67
67
  async decrypt(encryptedText) {
68
- return new Promise((resolve, reject) => {
68
+ return new Promise((resolve2, reject) => {
69
69
  try {
70
70
  const iv = Buffer.from(encryptedText.slice(0, 32), "hex");
71
71
  const encrypted = Buffer.from(encryptedText.slice(32), "hex");
72
72
  const decipher = import_crypto.default.createDecipheriv("aes-256-cbc", this.key, iv);
73
73
  const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
74
- resolve(decrypted.toString("utf8"));
74
+ resolve2(decrypted.toString("utf8"));
75
75
  } catch (error) {
76
76
  reject(error);
77
77
  }
@@ -109,11 +109,9 @@ const _AesEncryptor = class _AesEncryptor {
109
109
  return appKeyPath;
110
110
  }
111
111
  static async create(app) {
112
- let key = process.env.APP_AES_SECRET_KEY;
113
- if (!key) {
114
- const keyPath = await this.getKeyPath(app.name);
115
- key = await _AesEncryptor.getOrGenerateKey(keyPath);
116
- }
112
+ const KEY_PATH = process.env.APP_AES_SECRET_KEY_PATH;
113
+ const keyPath = KEY_PATH ? (0, import_path.resolve)(process.cwd(), KEY_PATH) : await this.getKeyPath(app.name);
114
+ const key = await _AesEncryptor.getOrGenerateKey(keyPath);
117
115
  return new _AesEncryptor(key);
118
116
  }
119
117
  };
@@ -8,14 +8,17 @@
8
8
  */
9
9
  /// <reference types="node" />
10
10
  /// <reference types="node" />
11
+ /// <reference types="node" />
12
+ /// <reference types="node" />
11
13
  import { SystemLogger } from '@nocobase/logger';
12
14
  import { Registry, Toposort, ToposortOptions } from '@nocobase/utils';
13
15
  import { EventEmitter } from 'events';
14
16
  import http, { IncomingMessage, ServerResponse } from 'http';
15
- import { ApplicationOptions } from '../application';
17
+ import { ApplicationOptions, Application } from '../application';
16
18
  import { IPCSocketClient } from './ipc-socket-client';
17
19
  import { IPCSocketServer } from './ipc-socket-server';
18
20
  import { WSServer } from './ws-server';
21
+ import { Duplex } from 'node:stream';
19
22
  export interface IncomingRequest {
20
23
  url: string;
21
24
  headers: any;
@@ -47,6 +50,8 @@ export declare class Gateway extends EventEmitter {
47
50
  private port;
48
51
  private host;
49
52
  private socketPath;
53
+ private terminating;
54
+ private onTerminate;
50
55
  private constructor();
51
56
  static getInstance(options?: any): Gateway;
52
57
  static getIPCSocketClient(): Promise<false | IPCSocketClient>;
@@ -76,5 +81,11 @@ export declare class Gateway extends EventEmitter {
76
81
  tryConnectToIPCServer(): Promise<false | IPCSocketClient>;
77
82
  getIPCSocketClient(): Promise<IPCSocketClient>;
78
83
  close(): void;
84
+ private static requestHandlers;
85
+ static registerRequestHandler(handler: (req: IncomingRequest, res: ServerResponse, app: Application) => boolean | void): void;
86
+ static unregisterRequestHandler(handler: (req: IncomingRequest, res: ServerResponse, app: Application) => boolean | void): void;
87
+ private static wsServers;
88
+ static registerWsHandler(wsServer: (req: IncomingMessage, socket: Duplex, head: Buffer, app: Application) => boolean | void): void;
89
+ static unregisterWsHandler(wsServer: (req: IncomingMessage, socket: Duplex, head: Buffer, app: Application) => boolean | void): void;
79
90
  }
80
91
  export {};
@@ -86,10 +86,37 @@ const _Gateway = class _Gateway extends import_events.EventEmitter {
86
86
  port = import_node_process.default.env.APP_PORT ? parseInt(import_node_process.default.env.APP_PORT) : null;
87
87
  host = "0.0.0.0";
88
88
  socketPath = (0, import_path.resolve)(import_node_process.default.cwd(), "storage", "gateway.sock");
89
+ terminating = false;
90
+ onTerminate = /* @__PURE__ */ __name(async (signal) => {
91
+ var _a;
92
+ if (this.terminating) {
93
+ return;
94
+ }
95
+ this.terminating = true;
96
+ const supervisor = import_app_supervisor.AppSupervisor.getInstance();
97
+ const apps = Object.values(supervisor.apps || {});
98
+ try {
99
+ for (const app of apps) {
100
+ try {
101
+ await app.destroy({ signal });
102
+ } catch (error) {
103
+ const logger = (app == null ? void 0 : app.log) ?? console;
104
+ (_a = logger.error) == null ? void 0 : _a.call(logger, error);
105
+ }
106
+ }
107
+ await supervisor.destroy();
108
+ } catch (error) {
109
+ console.error("Failed to shutdown applications gracefully", error);
110
+ } finally {
111
+ this.destroy();
112
+ }
113
+ }, "onTerminate");
89
114
  constructor() {
90
115
  super();
91
116
  this.reset();
92
117
  this.socketPath = getSocketPath();
118
+ import_node_process.default.once("SIGTERM", this.onTerminate);
119
+ import_node_process.default.once("SIGINT", this.onTerminate);
93
120
  }
94
121
  static getInstance(options = {}) {
95
122
  if (!_Gateway.instance) {
@@ -106,6 +133,8 @@ const _Gateway = class _Gateway extends import_events.EventEmitter {
106
133
  }
107
134
  }
108
135
  destroy() {
136
+ import_node_process.default.off("SIGTERM", this.onTerminate);
137
+ import_node_process.default.off("SIGINT", this.onTerminate);
109
138
  this.reset();
110
139
  _Gateway.instance = null;
111
140
  }
@@ -137,6 +166,10 @@ const _Gateway = class _Gateway extends import_events.EventEmitter {
137
166
  this.ipcSocketServer.close();
138
167
  this.ipcSocketServer = null;
139
168
  }
169
+ if (this.wsServer) {
170
+ this.wsServer.close();
171
+ this.wsServer = null;
172
+ }
140
173
  }
141
174
  addAppSelectorMiddleware(middleware, options) {
142
175
  if (this.selectorMiddlewares.nodes.some((existingFunc) => existingFunc.toString() === middleware.toString())) {
@@ -360,9 +393,29 @@ const _Gateway = class _Gateway extends import_events.EventEmitter {
360
393
  console.log("gateway port is not set, http server will not start");
361
394
  return;
362
395
  }
363
- this.server = import_http.default.createServer(this.getCallback());
396
+ this.server = import_http.default.createServer(async (req, res) => {
397
+ const appInstance = await import_app_supervisor.AppSupervisor.getInstance().getApp("main");
398
+ for (const handler2 of _Gateway.requestHandlers) {
399
+ try {
400
+ const result = await handler2(req, res, appInstance);
401
+ if (result !== false) {
402
+ return;
403
+ }
404
+ } catch (error) {
405
+ console.error("gateway request handler error:", error);
406
+ }
407
+ }
408
+ this.getCallback()(req, res);
409
+ });
364
410
  this.wsServer = new import_ws_server.WSServer();
365
- this.server.on("upgrade", (request, socket, head) => {
411
+ this.server.on("upgrade", async (request, socket, head) => {
412
+ const appInstance = await import_app_supervisor.AppSupervisor.getInstance().getApp("main");
413
+ for (const handle of _Gateway.wsServers) {
414
+ const result = await handle(request, socket, head, appInstance);
415
+ if (result !== false) {
416
+ return;
417
+ }
418
+ }
366
419
  const { pathname } = (0, import_url.parse)(request.url);
367
420
  if (pathname === import_node_process.default.env.WS_PATH) {
368
421
  this.wsServer.wss.handleUpgrade(request, socket, head, (ws) => {
@@ -395,9 +448,23 @@ const _Gateway = class _Gateway extends import_events.EventEmitter {
395
448
  (_a = this.server) == null ? void 0 : _a.close();
396
449
  (_b = this.wsServer) == null ? void 0 : _b.close();
397
450
  }
451
+ static registerRequestHandler(handler2) {
452
+ _Gateway.requestHandlers.push(handler2);
453
+ }
454
+ static unregisterRequestHandler(handler2) {
455
+ _Gateway.requestHandlers = _Gateway.requestHandlers.filter((h) => h !== handler2);
456
+ }
457
+ static registerWsHandler(wsServer) {
458
+ _Gateway.wsServers.push(wsServer);
459
+ }
460
+ static unregisterWsHandler(wsServer) {
461
+ _Gateway.wsServers = _Gateway.wsServers.filter((ws) => ws !== wsServer);
462
+ }
398
463
  };
399
464
  __name(_Gateway, "Gateway");
400
465
  __publicField(_Gateway, "instance");
466
+ __publicField(_Gateway, "requestHandlers", []);
467
+ __publicField(_Gateway, "wsServers", []);
401
468
  let Gateway = _Gateway;
402
469
  // Annotate the CommonJS export names for ESM import in node:
403
470
  0 && (module.exports = {
package/lib/index.d.ts CHANGED
@@ -9,6 +9,7 @@
9
9
  export * from './aes-encryptor';
10
10
  export * from './app-supervisor';
11
11
  export * from './application';
12
+ export * from './gateway/ws-server';
12
13
  export { Application as default } from './application';
13
14
  export * from './audit-manager';
14
15
  export * from './gateway';
package/lib/index.js CHANGED
@@ -51,6 +51,7 @@ module.exports = __toCommonJS(src_exports);
51
51
  __reExport(src_exports, require("./aes-encryptor"), module.exports);
52
52
  __reExport(src_exports, require("./app-supervisor"), module.exports);
53
53
  __reExport(src_exports, require("./application"), module.exports);
54
+ __reExport(src_exports, require("./gateway/ws-server"), module.exports);
54
55
  var import_application = require("./application");
55
56
  __reExport(src_exports, require("./audit-manager"), module.exports);
56
57
  __reExport(src_exports, require("./gateway"), module.exports);
@@ -79,6 +80,7 @@ const OFFICIAL_PLUGIN_PREFIX = "@nocobase/plugin-";
79
80
  ...require("./aes-encryptor"),
80
81
  ...require("./app-supervisor"),
81
82
  ...require("./application"),
83
+ ...require("./gateway/ws-server"),
82
84
  ...require("./audit-manager"),
83
85
  ...require("./gateway"),
84
86
  ...require("./migration"),
@@ -59,6 +59,13 @@ const getResource = /* @__PURE__ */ __name((packageName, lang, isPlugin = true)
59
59
  }
60
60
  } catch (error) {
61
61
  }
62
+ try {
63
+ require.resolve("@nocobase/flow-engine/src");
64
+ if (packageName === "@nocobase/plugin-flow-engine") {
65
+ packageName = "@nocobase/flow-engine";
66
+ }
67
+ } catch (error) {
68
+ }
62
69
  prefixes.unshift("src");
63
70
  }
64
71
  for (const prefix of prefixes) {
package/lib/plugin.js CHANGED
@@ -130,7 +130,11 @@ const _Plugin = class _Plugin {
130
130
  if (!this.name) {
131
131
  throw new Error(`plugin name invalid`);
132
132
  }
133
- await this.app.syncMessageManager.publish(this.name, message, options);
133
+ try {
134
+ await this.app.syncMessageManager.publish(this.name, message, options);
135
+ } catch (err) {
136
+ this.log.error(err);
137
+ }
134
138
  }
135
139
  /**
136
140
  * @deprecated
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/server",
3
- "version": "1.9.0-beta.9",
3
+ "version": "2.0.0-alpha.3",
4
4
  "main": "lib/index.js",
5
5
  "types": "./lib/index.d.ts",
6
6
  "license": "AGPL-3.0",
@@ -10,20 +10,20 @@
10
10
  "@koa/cors": "^5.0.0",
11
11
  "@koa/multer": "^3.1.0",
12
12
  "@koa/router": "^13.1.0",
13
- "@nocobase/acl": "1.9.0-beta.9",
14
- "@nocobase/actions": "1.9.0-beta.9",
15
- "@nocobase/auth": "1.9.0-beta.9",
16
- "@nocobase/cache": "1.9.0-beta.9",
17
- "@nocobase/data-source-manager": "1.9.0-beta.9",
18
- "@nocobase/database": "1.9.0-beta.9",
19
- "@nocobase/evaluators": "1.9.0-beta.9",
20
- "@nocobase/lock-manager": "1.9.0-beta.9",
21
- "@nocobase/logger": "1.9.0-beta.9",
22
- "@nocobase/resourcer": "1.9.0-beta.9",
23
- "@nocobase/sdk": "1.9.0-beta.9",
24
- "@nocobase/snowflake-id": "1.9.0-beta.9",
25
- "@nocobase/telemetry": "1.9.0-beta.9",
26
- "@nocobase/utils": "1.9.0-beta.9",
13
+ "@nocobase/acl": "2.0.0-alpha.3",
14
+ "@nocobase/actions": "2.0.0-alpha.3",
15
+ "@nocobase/auth": "2.0.0-alpha.3",
16
+ "@nocobase/cache": "2.0.0-alpha.3",
17
+ "@nocobase/data-source-manager": "2.0.0-alpha.3",
18
+ "@nocobase/database": "2.0.0-alpha.3",
19
+ "@nocobase/evaluators": "2.0.0-alpha.3",
20
+ "@nocobase/lock-manager": "2.0.0-alpha.3",
21
+ "@nocobase/logger": "2.0.0-alpha.3",
22
+ "@nocobase/resourcer": "2.0.0-alpha.3",
23
+ "@nocobase/sdk": "2.0.0-alpha.3",
24
+ "@nocobase/snowflake-id": "2.0.0-alpha.3",
25
+ "@nocobase/telemetry": "2.0.0-alpha.3",
26
+ "@nocobase/utils": "2.0.0-alpha.3",
27
27
  "@types/decompress": "4.2.7",
28
28
  "@types/ini": "^1.3.31",
29
29
  "@types/koa-send": "^4.1.3",
@@ -59,5 +59,5 @@
59
59
  "@types/serve-handler": "^6.1.1",
60
60
  "@types/ws": "^8.5.5"
61
61
  },
62
- "gitHead": "b44464f1d1bbc96022d0f622e0a2f1d7e8d7142f"
62
+ "gitHead": "8efc23aa78058d871e98a91419f3c4a61762cc15"
63
63
  }