oak-backend-base 4.1.5 → 4.1.7
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/ClusterAppLoader.js +3 -3
- package/lib/Synchronizer.js +33 -23
- package/lib/types/Sync.d.ts +16 -16
- package/lib/types/Sync.js +5 -5
- package/package.json +3 -3
package/lib/ClusterAppLoader.js
CHANGED
|
@@ -72,7 +72,7 @@ class ClusterAppLoader extends AppLoader_1.AppLoader {
|
|
|
72
72
|
if (trigger.cs) {
|
|
73
73
|
// 如果是cluster sensative的触发器,需要发送到相应的instance上被处理
|
|
74
74
|
const context = await this.makeContext();
|
|
75
|
-
const rows = await context.select(entity, {
|
|
75
|
+
const rows = !!(ids.length) ? await context.select(entity, {
|
|
76
76
|
data: {
|
|
77
77
|
id: 1,
|
|
78
78
|
$$seq$$: 1,
|
|
@@ -80,7 +80,7 @@ class ClusterAppLoader extends AppLoader_1.AppLoader {
|
|
|
80
80
|
filter: {
|
|
81
81
|
id: { $in: ids },
|
|
82
82
|
}
|
|
83
|
-
}, { dontCollect: true });
|
|
83
|
+
}, { dontCollect: true }) : [];
|
|
84
84
|
await context.commit();
|
|
85
85
|
const { instanceCount, instanceId } = (0, env_1.getClusterInfo)();
|
|
86
86
|
const grouped = (0, lodash_1.groupBy)(rows, (ele) => ele.$$seq$$ % instanceCount);
|
|
@@ -101,7 +101,7 @@ class ClusterAppLoader extends AppLoader_1.AppLoader {
|
|
|
101
101
|
if ((0, env_1.getClusterInfo)().instanceId === 0) {
|
|
102
102
|
await execLocal(ids);
|
|
103
103
|
}
|
|
104
|
-
else {
|
|
104
|
+
else if (ids.length) {
|
|
105
105
|
if (process.env.NODE_ENV === 'development') {
|
|
106
106
|
console.log(`在trigger「${trigger.name}」上,因为singleton原因,数据「${ids.join(',')}」将被推送到「0」号进程操作(当前进程号是「${(0, env_1.getClusterInfo)().instanceId}」)`);
|
|
107
107
|
}
|
package/lib/Synchronizer.js
CHANGED
|
@@ -10,7 +10,7 @@ const filter_1 = require("oak-domain/lib/store/filter");
|
|
|
10
10
|
const uuid_1 = require("oak-domain/lib/utils/uuid");
|
|
11
11
|
const lodash_2 = require("lodash");
|
|
12
12
|
const OAK_SYNC_HEADER_ENTITY = 'oak-sync-entity';
|
|
13
|
-
const
|
|
13
|
+
const OAK_SYNC_HEADER_ENTITY_ID = 'oak-sync-entity-id';
|
|
14
14
|
class Synchronizer {
|
|
15
15
|
config;
|
|
16
16
|
schema;
|
|
@@ -36,7 +36,7 @@ class Synchronizer {
|
|
|
36
36
|
headers: {
|
|
37
37
|
'Content-Type': 'application/json',
|
|
38
38
|
[OAK_SYNC_HEADER_ENTITY]: entity,
|
|
39
|
-
[
|
|
39
|
+
[OAK_SYNC_HEADER_ENTITY_ID]: entityId,
|
|
40
40
|
},
|
|
41
41
|
body: JSON.stringify(opers),
|
|
42
42
|
});
|
|
@@ -50,17 +50,27 @@ class Synchronizer {
|
|
|
50
50
|
}
|
|
51
51
|
catch (err) {
|
|
52
52
|
if (onFailed) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
53
|
+
context.on('rollback', async () => {
|
|
54
|
+
const context2 = this.contextBuilder();
|
|
55
|
+
context2.begin();
|
|
56
|
+
try {
|
|
57
|
+
await onFailed({
|
|
58
|
+
remoteEntity: entity,
|
|
59
|
+
remoteEntityId: entityId,
|
|
60
|
+
data: queue.map((ele) => ({
|
|
61
|
+
entity: ele.oper.targetEntity,
|
|
62
|
+
rowIds: ele.oper.filter.id.$in,
|
|
63
|
+
action: ele.oper.action,
|
|
64
|
+
data: ele.oper.data,
|
|
65
|
+
})),
|
|
66
|
+
reason: err,
|
|
67
|
+
}, context2);
|
|
68
|
+
context2.commit();
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
context2.rollback();
|
|
72
|
+
}
|
|
73
|
+
});
|
|
64
74
|
}
|
|
65
75
|
throw err;
|
|
66
76
|
}
|
|
@@ -79,11 +89,12 @@ class Synchronizer {
|
|
|
79
89
|
}
|
|
80
90
|
}, {});
|
|
81
91
|
const entityIds = operEntityArr.map(ele => ele.entityId);
|
|
82
|
-
return onSynchronized
|
|
92
|
+
return onSynchronized({
|
|
83
93
|
action: oper.action,
|
|
84
94
|
data: oper.data,
|
|
85
|
-
|
|
86
|
-
|
|
95
|
+
rowIds: entityIds,
|
|
96
|
+
remoteEntity: entity,
|
|
97
|
+
remoteEntityId: entityId,
|
|
87
98
|
}, context);
|
|
88
99
|
}
|
|
89
100
|
}
|
|
@@ -144,7 +155,7 @@ class Synchronizer {
|
|
|
144
155
|
(0, assert_1.default)(channel.entity === remoteEntity);
|
|
145
156
|
(0, assert_1.default)(channel.entityId === remoteEntityId);
|
|
146
157
|
if (channel.queue.find(ele => ele.oper.id === oper.id)) {
|
|
147
|
-
console.error('
|
|
158
|
+
console.error('channel.queue找到相同的需推送的oper');
|
|
148
159
|
}
|
|
149
160
|
channel.queue.push({
|
|
150
161
|
oper,
|
|
@@ -172,7 +183,6 @@ class Synchronizer {
|
|
|
172
183
|
async dispatchOperToChannels(oper, context) {
|
|
173
184
|
const { operatorId, targetEntity, filter, action, data, operEntity$oper } = oper;
|
|
174
185
|
const entityIds = operEntity$oper?.map(ele => ele.entityId);
|
|
175
|
-
// const entityIds = getRelevantIds(filter!);
|
|
176
186
|
(0, assert_1.default)(entityIds && entityIds.length > 0);
|
|
177
187
|
const pushEntityNodes = this.pushAccessMap[targetEntity];
|
|
178
188
|
let pushed = false;
|
|
@@ -282,17 +292,17 @@ class Synchronizer {
|
|
|
282
292
|
(0, assert_1.default)(this.channelDict[c].queue.length === 0);
|
|
283
293
|
}
|
|
284
294
|
const pushedIds = [];
|
|
285
|
-
const
|
|
295
|
+
const unPushedIds = [];
|
|
286
296
|
await Promise.all(dirtyOpers.map(async (oper) => {
|
|
287
297
|
const result = await this.dispatchOperToChannels(oper, context);
|
|
288
298
|
if (result) {
|
|
289
299
|
pushedIds.push(oper.id);
|
|
290
300
|
}
|
|
291
301
|
else {
|
|
292
|
-
|
|
302
|
+
unPushedIds.push(oper.id);
|
|
293
303
|
}
|
|
294
304
|
}));
|
|
295
|
-
if (
|
|
305
|
+
if (unPushedIds.length > 0) {
|
|
296
306
|
await context.operate('oper', {
|
|
297
307
|
id: await (0, uuid_1.generateNewIdAsync)(),
|
|
298
308
|
action: 'update',
|
|
@@ -302,7 +312,7 @@ class Synchronizer {
|
|
|
302
312
|
},
|
|
303
313
|
filter: {
|
|
304
314
|
id: {
|
|
305
|
-
$in:
|
|
315
|
+
$in: unPushedIds,
|
|
306
316
|
}
|
|
307
317
|
}
|
|
308
318
|
}, {});
|
|
@@ -452,7 +462,7 @@ class Synchronizer {
|
|
|
452
462
|
fn: async (context, params, headers, req, body) => {
|
|
453
463
|
// body中是传过来的oper数组信息
|
|
454
464
|
const { entity, entityId } = params;
|
|
455
|
-
const { [OAK_SYNC_HEADER_ENTITY]: meEntity, [
|
|
465
|
+
const { [OAK_SYNC_HEADER_ENTITY]: meEntity, [OAK_SYNC_HEADER_ENTITY_ID]: meEntityId } = headers;
|
|
456
466
|
if (process.env.NODE_ENV === 'development') {
|
|
457
467
|
console.log('接收到来自远端的sync数据', entity, JSON.stringify(body));
|
|
458
468
|
}
|
package/lib/types/Sync.d.ts
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { EntityDict } from 'oak-domain/lib/types';
|
|
2
|
-
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain';
|
|
3
|
-
import { BackendRuntimeContext } from 'oak-frontend-base/lib/context/BackendRuntimeContext';
|
|
4
|
-
import { RemotePushInfo, RemotePullInfo, SelfEncryptInfo, SyncRemoteConfigBase, SyncSelfConfigBase, SyncConfig } from 'oak-domain/lib/types/Sync';
|
|
5
|
-
interface SyncRemoteConfigWrapper<ED extends EntityDict & BaseEntityDict, Cxt extends BackendRuntimeContext<ED>> extends SyncRemoteConfigBase<ED, Cxt> {
|
|
6
|
-
getRemotePushInfo: (userId: string) => Promise<RemotePushInfo>;
|
|
7
|
-
getRemotePullInfo: (id: string) => Promise<RemotePullInfo>;
|
|
8
|
-
}
|
|
9
|
-
interface SyncSelfConfigWrapper<ED extends EntityDict & BaseEntityDict> extends SyncSelfConfigBase<ED> {
|
|
10
|
-
getSelfEncryptInfo: () => Promise<SelfEncryptInfo>;
|
|
11
|
-
}
|
|
12
|
-
export interface SyncConfigWrapper<ED extends EntityDict & BaseEntityDict, Cxt extends BackendRuntimeContext<ED>> {
|
|
13
|
-
self: SyncSelfConfigWrapper<ED>;
|
|
14
|
-
remotes: Array<SyncRemoteConfigWrapper<ED, Cxt>>;
|
|
15
|
-
}
|
|
16
|
-
export { RemotePushInfo, RemotePullInfo, SelfEncryptInfo, SyncConfig, };
|
|
1
|
+
import { EntityDict } from 'oak-domain/lib/types';
|
|
2
|
+
import { EntityDict as BaseEntityDict } from 'oak-domain/lib/base-app-domain';
|
|
3
|
+
import { BackendRuntimeContext } from 'oak-frontend-base/lib/context/BackendRuntimeContext';
|
|
4
|
+
import { RemotePushInfo, RemotePullInfo, SelfEncryptInfo, SyncRemoteConfigBase, SyncSelfConfigBase, SyncConfig } from 'oak-domain/lib/types/Sync';
|
|
5
|
+
interface SyncRemoteConfigWrapper<ED extends EntityDict & BaseEntityDict, Cxt extends BackendRuntimeContext<ED>> extends SyncRemoteConfigBase<ED, Cxt> {
|
|
6
|
+
getRemotePushInfo: (userId: string) => Promise<RemotePushInfo>;
|
|
7
|
+
getRemotePullInfo: (id: string) => Promise<RemotePullInfo>;
|
|
8
|
+
}
|
|
9
|
+
interface SyncSelfConfigWrapper<ED extends EntityDict & BaseEntityDict> extends SyncSelfConfigBase<ED> {
|
|
10
|
+
getSelfEncryptInfo: () => Promise<SelfEncryptInfo>;
|
|
11
|
+
}
|
|
12
|
+
export interface SyncConfigWrapper<ED extends EntityDict & BaseEntityDict, Cxt extends BackendRuntimeContext<ED>> {
|
|
13
|
+
self: SyncSelfConfigWrapper<ED>;
|
|
14
|
+
remotes: Array<SyncRemoteConfigWrapper<ED, Cxt>>;
|
|
15
|
+
}
|
|
16
|
+
export { RemotePushInfo, RemotePullInfo, SelfEncryptInfo, SyncConfig, };
|
package/lib/types/Sync.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
;
|
|
4
|
-
;
|
|
5
|
-
;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
;
|
|
4
|
+
;
|
|
5
|
+
;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oak-backend-base",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.7",
|
|
4
4
|
"description": "oak-backend-base",
|
|
5
5
|
"main": "lib/index",
|
|
6
6
|
"author": {
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"node-schedule": "^2.1.0",
|
|
23
23
|
"oak-common-aspect": "^3.0.2",
|
|
24
24
|
"oak-db": "^3.3.2",
|
|
25
|
-
"oak-domain": "^5.1.
|
|
26
|
-
"oak-frontend-base": "^5.3.
|
|
25
|
+
"oak-domain": "^5.1.7",
|
|
26
|
+
"oak-frontend-base": "^5.3.15",
|
|
27
27
|
"socket.io": "^4.7.2",
|
|
28
28
|
"socket.io-client": "^4.7.2",
|
|
29
29
|
"uuid": "^8.3.2"
|