oak-backend-base 4.1.17 → 4.1.18

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.
@@ -37,7 +37,10 @@ export declare class AppLoader<ED extends EntityDict & BaseEntityDict, Cxt exten
37
37
  }>;
38
38
  initialize(): Promise<void>;
39
39
  getStore(): DbStore<ED, Cxt>;
40
- getEndpoints(prefix: string): [string, "post" | "get" | "put" | "delete", string, (params: Record<string, string>, headers: IncomingHttpHeaders, req: IncomingMessage, body?: any) => Promise<any>][];
40
+ getEndpoints(prefix: string): [string, "post" | "get" | "put" | "delete", string, (params: Record<string, string>, headers: IncomingHttpHeaders, req: IncomingMessage, body?: any) => Promise<{
41
+ headers?: Record<string, string | string[]> | undefined;
42
+ data: any;
43
+ }>][];
41
44
  protected operateInWatcher<T extends keyof ED>(entity: T, operation: ED[T]['Update'], context: Cxt, singleton?: true): Promise<OperationResult<ED>>;
42
45
  protected selectInWatcher<T extends keyof ED>(entity: T, selection: ED[T]['Selection'], context: Cxt, forUpdate?: true, singleton?: true): Promise<Partial<ED[T]["Schema"]>[]>;
43
46
  protected execWatcher(watcher: Watcher<ED, keyof ED, Cxt>): Promise<OperationResult<ED> | undefined>;
package/lib/AppLoader.js CHANGED
@@ -264,7 +264,7 @@ class AppLoader extends types_1.AppLoader {
264
264
  const endPointRouters = [];
265
265
  const endPointMap = {};
266
266
  const transformEndpointItem = (key, item) => {
267
- const { name, method, fn, params: itemParams } = item;
267
+ const { name, method, fn, params: itemParams, type } = item;
268
268
  const k = `${key}-${name}-${method}`;
269
269
  const makeEndpoint = async () => {
270
270
  endPointMap[k] = true;
@@ -275,16 +275,24 @@ class AppLoader extends types_1.AppLoader {
275
275
  }
276
276
  }
277
277
  endPointRouters.push([name, method, url, async (params, headers, req, body) => {
278
- const context = await this.makeContext(undefined, headers);
279
- try {
280
- const result = await fn(context, params, headers, req, body);
281
- await context.commit();
278
+ if (type == "free") {
279
+ const result = await fn(() => this.makeContext(undefined, headers), params, headers, req, body);
282
280
  return result;
283
281
  }
284
- catch (err) {
285
- await context.rollback();
286
- console.error(`endpoint「${key}」方法「${method}」出错`, err);
287
- throw err;
282
+ else {
283
+ const context = await this.makeContext(undefined, headers);
284
+ try {
285
+ const data = await fn(context, params, headers, req, body);
286
+ await context.commit();
287
+ return {
288
+ data,
289
+ };
290
+ }
291
+ catch (err) {
292
+ await context.rollback();
293
+ console.error(`endpoint「${key}」方法「${method}」出错`, err);
294
+ throw err;
295
+ }
288
296
  }
289
297
  }]);
290
298
  };
@@ -5,7 +5,7 @@ import { AppLoader } from './AppLoader';
5
5
  import { Namespace } from 'socket.io';
6
6
  import { Socket } from 'socket.io-client';
7
7
  export declare class ClusterAppLoader<ED extends EntityDict & BaseEntityDict, Cxt extends BackendRuntimeContext<ED>> extends AppLoader<ED, Cxt> {
8
- private csTriggers;
8
+ private commitTriggers;
9
9
  static VolatileTriggerEvent: string;
10
10
  protected socket: Socket;
11
11
  private connectServerSocket;
@@ -10,13 +10,13 @@ const AppLoader_1 = require("./AppLoader");
10
10
  const assert_1 = tslib_1.__importDefault(require("assert"));
11
11
  const socket_io_client_1 = require("socket.io-client");
12
12
  class ClusterAppLoader extends AppLoader_1.AppLoader {
13
- csTriggers;
13
+ commitTriggers;
14
14
  static VolatileTriggerEvent = 'vtEvent';
15
15
  socket;
16
16
  connectServerSocket() {
17
17
  const { instanceId } = (0, env_1.getClusterInfo)();
18
18
  this.socket.on('connect', () => {
19
- const csTriggerNames = Object.keys(this.csTriggers).map(ele => `${ele}-${instanceId}`);
19
+ const csTriggerNames = Object.keys(this.commitTriggers).filter(ele => this.commitTriggers[ele]).map(ele => `${ele}-${instanceId}`);
20
20
  if (csTriggerNames.length > 0) {
21
21
  this.socket.emit('sub', csTriggerNames);
22
22
  }
@@ -37,10 +37,8 @@ class ClusterAppLoader extends AppLoader_1.AppLoader {
37
37
  }
38
38
  });
39
39
  }
40
- sub(name, clusterSensative) {
40
+ sub(name) {
41
41
  const { instanceId } = (0, env_1.getClusterInfo)();
42
- (0, assert_1.default)(!this.csTriggers[name], `命名为${name}的trigger出现了多次,请检查`);
43
- this.csTriggers[name] = !!clusterSensative;
44
42
  if (this.socket.connected) {
45
43
  this.socket.emit('sub', [`${name}-${instanceId}`]);
46
44
  }
@@ -112,7 +110,7 @@ class ClusterAppLoader extends AppLoader_1.AppLoader {
112
110
  await execLocal(ids);
113
111
  }
114
112
  });
115
- this.csTriggers = {};
113
+ this.commitTriggers = {};
116
114
  const { name } = nsServer;
117
115
  // 本机pm2的socketio连接,在cli中连接到adaptor之后,会被自然推到redis,这边继续保持pm2的socketio连接即可
118
116
  const socketUrl = `http://localhost:${process.env.PM2_PORT || 8080}${name}`;
@@ -124,11 +122,14 @@ class ClusterAppLoader extends AppLoader_1.AppLoader {
124
122
  registerTrigger(trigger) {
125
123
  // 如果是cluster sensative的trigger,注册到socket事件上
126
124
  // 如果是singletone的trigger,只有0号实例注册
127
- const { when, cs, singleton } = trigger;
125
+ const { when, cs, singleton, name } = trigger;
128
126
  (0, assert_1.default)(!(cs && singleton));
129
- if (when === 'commit' && (cs || singleton && (0, env_1.getClusterInfo)().instanceId === 0)) {
130
- const { name } = trigger;
131
- this.sub(name, cs);
127
+ if (when === 'commit') {
128
+ (0, assert_1.default)(!this.commitTriggers[name], `命名为${name}trigger出现了多次,请检查`);
129
+ this.commitTriggers[name] = !!cs;
130
+ if (cs || singleton && (0, env_1.getClusterInfo)().instanceId === 0) {
131
+ this.sub(name);
132
+ }
132
133
  }
133
134
  this.dbStore.registerTrigger(trigger);
134
135
  }
@@ -175,8 +176,8 @@ class ClusterAppLoader extends AppLoader_1.AppLoader {
175
176
  async checkpoint() {
176
177
  const { instanceCount, instanceId } = (0, env_1.getClusterInfo)();
177
178
  let count = 0;
178
- for (const name in this.csTriggers) {
179
- if (this.csTriggers[name]) {
179
+ for (const name in this.commitTriggers) {
180
+ if (this.commitTriggers[name]) {
180
181
  count += await this.dbStore.independentCheckPoint(name, this.getCheckpointTs(), instanceCount, instanceId);
181
182
  }
182
183
  else {
@@ -566,7 +566,7 @@ class Synchronizer {
566
566
  }
567
567
  }
568
568
  if (!verify(publicKey, JSON.stringify(body), syncTs, syncNonce, syncSign)) {
569
- throw new Error('sync验签失败');
569
+ throw new types_1.OakSignatureVerificationException('同步验签失败');
570
570
  }
571
571
  const opers = body;
572
572
  const ids = opers.map(ele => ele.id);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oak-backend-base",
3
- "version": "4.1.17",
3
+ "version": "4.1.18",
4
4
  "description": "oak-backend-base",
5
5
  "main": "lib/index",
6
6
  "author": {
@@ -16,14 +16,15 @@
16
16
  "build": "tsc && npm run copy-files"
17
17
  },
18
18
  "dependencies": {
19
+ "@types/koa": "^2.15.0",
19
20
  "lodash": "^4.17.21",
20
21
  "mysql": "^2.18.1",
21
22
  "mysql2": "^2.3.3",
22
23
  "node-schedule": "^2.1.0",
23
24
  "oak-common-aspect": "^3.0.5",
24
25
  "oak-db": "^3.3.6",
25
- "oak-domain": "^5.1.21",
26
- "oak-frontend-base": "^5.3.29",
26
+ "oak-domain": "^5.1.22",
27
+ "oak-frontend-base": "^5.3.30",
27
28
  "socket.io": "^4.8.1",
28
29
  "socket.io-client": "^4.7.2",
29
30
  "uuid": "^8.3.2"