oak-backend-base 4.1.16 → 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.
- package/lib/AppLoader.d.ts +4 -1
- package/lib/AppLoader.js +17 -9
- package/lib/ClusterAppLoader.d.ts +1 -1
- package/lib/ClusterAppLoader.js +13 -12
- package/lib/Synchronizer.js +4 -3
- package/package.json +5 -4
package/lib/AppLoader.d.ts
CHANGED
|
@@ -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<
|
|
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
|
-
|
|
279
|
-
|
|
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
|
-
|
|
285
|
-
await
|
|
286
|
-
|
|
287
|
-
|
|
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
|
|
8
|
+
private commitTriggers;
|
|
9
9
|
static VolatileTriggerEvent: string;
|
|
10
10
|
protected socket: Socket;
|
|
11
11
|
private connectServerSocket;
|
package/lib/ClusterAppLoader.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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
|
|
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.
|
|
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'
|
|
130
|
-
|
|
131
|
-
this.
|
|
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.
|
|
179
|
-
if (this.
|
|
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 {
|
package/lib/Synchronizer.js
CHANGED
|
@@ -306,7 +306,7 @@ class Synchronizer {
|
|
|
306
306
|
id: 1,
|
|
307
307
|
},
|
|
308
308
|
filter: {
|
|
309
|
-
[types_1.
|
|
309
|
+
[types_1.TriggerUuidAttribute]: {
|
|
310
310
|
$exists: true,
|
|
311
311
|
},
|
|
312
312
|
}
|
|
@@ -322,6 +322,7 @@ class Synchronizer {
|
|
|
322
322
|
targetEntity: 1,
|
|
323
323
|
operatorId: 1,
|
|
324
324
|
[types_1.TriggerDataAttribute]: 1,
|
|
325
|
+
[types_1.TriggerUuidAttribute]: 1,
|
|
325
326
|
bornAt: 1,
|
|
326
327
|
$$createAt$$: 1,
|
|
327
328
|
$$seq$$: 1,
|
|
@@ -340,7 +341,7 @@ class Synchronizer {
|
|
|
340
341
|
id: { $in: ids },
|
|
341
342
|
},
|
|
342
343
|
}, { dontCollect: true, forUpdate: true });
|
|
343
|
-
dirtyOpers = dirtyOpers.filter(ele => !!ele[types_1.
|
|
344
|
+
dirtyOpers = dirtyOpers.filter(ele => !!ele[types_1.TriggerUuidAttribute]);
|
|
344
345
|
if (dirtyOpers.length > 0) {
|
|
345
346
|
for (const c in this.channelDict) {
|
|
346
347
|
(0, assert_1.default)(this.channelDict[c].queue.length === 0);
|
|
@@ -565,7 +566,7 @@ class Synchronizer {
|
|
|
565
566
|
}
|
|
566
567
|
}
|
|
567
568
|
if (!verify(publicKey, JSON.stringify(body), syncTs, syncNonce, syncSign)) {
|
|
568
|
-
throw new
|
|
569
|
+
throw new types_1.OakSignatureVerificationException('同步验签失败');
|
|
569
570
|
}
|
|
570
571
|
const opers = body;
|
|
571
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.
|
|
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
|
-
"oak-db": "^3.3.
|
|
25
|
-
"oak-domain": "^5.1.
|
|
26
|
-
"oak-frontend-base": "^5.3.
|
|
25
|
+
"oak-db": "^3.3.6",
|
|
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"
|