oak-domain 2.4.0 → 2.4.2

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 (160) hide show
  1. package/lib/actions/action.d.ts +16 -16
  2. package/lib/actions/action.js +17 -17
  3. package/lib/actions/relation.d.ts +5 -5
  4. package/lib/actions/relation.js +38 -38
  5. package/lib/base-app-domain/ActionDefDict.d.ts +5 -5
  6. package/lib/base-app-domain/ActionDefDict.js +7 -7
  7. package/lib/base-app-domain/EntityDict.d.ts +12 -12
  8. package/lib/base-app-domain/EntityDict.js +2 -2
  9. package/lib/base-app-domain/Modi/Action.d.ts +10 -10
  10. package/lib/base-app-domain/Modi/Action.js +14 -14
  11. package/lib/base-app-domain/Modi/Schema.d.ts +146 -146
  12. package/lib/base-app-domain/Modi/Schema.js +2 -2
  13. package/lib/base-app-domain/Modi/Storage.d.ts +3 -3
  14. package/lib/base-app-domain/Modi/Storage.js +60 -60
  15. package/lib/base-app-domain/ModiEntity/Schema.d.ts +162 -162
  16. package/lib/base-app-domain/ModiEntity/Schema.js +2 -2
  17. package/lib/base-app-domain/ModiEntity/Storage.d.ts +3 -3
  18. package/lib/base-app-domain/ModiEntity/Storage.js +26 -26
  19. package/lib/base-app-domain/Oper/Schema.d.ts +144 -144
  20. package/lib/base-app-domain/Oper/Schema.js +2 -2
  21. package/lib/base-app-domain/Oper/Storage.d.ts +3 -3
  22. package/lib/base-app-domain/Oper/Storage.js +29 -29
  23. package/lib/base-app-domain/OperEntity/Schema.d.ts +178 -178
  24. package/lib/base-app-domain/OperEntity/Schema.js +2 -2
  25. package/lib/base-app-domain/OperEntity/Storage.d.ts +3 -3
  26. package/lib/base-app-domain/OperEntity/Storage.js +26 -26
  27. package/lib/base-app-domain/Storage.d.ts +3 -3
  28. package/lib/base-app-domain/Storage.js +15 -15
  29. package/lib/base-app-domain/User/Schema.d.ts +128 -128
  30. package/lib/base-app-domain/User/Schema.js +2 -2
  31. package/lib/base-app-domain/User/Storage.d.ts +3 -3
  32. package/lib/base-app-domain/User/Storage.js +25 -25
  33. package/lib/base-app-domain/_SubQuery.d.ts +36 -36
  34. package/lib/base-app-domain/_SubQuery.js +2 -2
  35. package/lib/base-app-domain/index.d.ts +3 -3
  36. package/lib/base-app-domain/index.js +6 -6
  37. package/lib/checkers/index.d.ts +5 -5
  38. package/lib/checkers/index.js +15 -15
  39. package/lib/compiler/env.d.ts +11 -11
  40. package/lib/compiler/env.js +39 -39
  41. package/lib/compiler/schemalBuilder.d.ts +2 -2
  42. package/lib/compiler/schemalBuilder.js +3303 -3301
  43. package/lib/compiler/uiBuilder.d.ts +1 -1
  44. package/lib/compiler/uiBuilder.js +3 -3
  45. package/lib/entities/Modi.d.ts +11 -11
  46. package/lib/entities/Modi.js +46 -46
  47. package/lib/entities/ModiEntity.d.ts +8 -8
  48. package/lib/entities/ModiEntity.js +15 -15
  49. package/lib/entities/Oper.d.ts +10 -10
  50. package/lib/entities/Oper.js +17 -17
  51. package/lib/entities/OperEntity.d.ts +8 -8
  52. package/lib/entities/OperEntity.js +15 -15
  53. package/lib/entities/User.d.ts +7 -7
  54. package/lib/entities/User.js +12 -12
  55. package/lib/store/AsyncRowStore.d.ts +48 -48
  56. package/lib/store/AsyncRowStore.js +183 -183
  57. package/lib/store/CascadeStore.d.ts +91 -91
  58. package/lib/store/CascadeStore.js +1590 -1594
  59. package/lib/store/SyncRowStore.d.ts +29 -29
  60. package/lib/store/SyncRowStore.js +48 -48
  61. package/lib/store/TriggerExecutor.d.ts +32 -32
  62. package/lib/store/TriggerExecutor.js +527 -527
  63. package/lib/store/actionDef.d.ts +9 -9
  64. package/lib/store/actionDef.js +333 -135
  65. package/lib/store/checker.d.ts +13 -13
  66. package/lib/store/checker.js +498 -498
  67. package/lib/store/filter.d.ts +109 -109
  68. package/lib/store/filter.js +893 -893
  69. package/lib/store/modi.d.ts +13 -13
  70. package/lib/store/modi.js +198 -198
  71. package/lib/store/relation.d.ts +13 -13
  72. package/lib/store/relation.js +66 -66
  73. package/lib/store/selection.d.ts +7 -7
  74. package/lib/store/selection.js +235 -235
  75. package/lib/triggers/index.d.ts +6 -6
  76. package/lib/triggers/index.js +11 -11
  77. package/lib/triggers/modi.d.ts +5 -5
  78. package/lib/triggers/modi.js +72 -72
  79. package/lib/types/Action.d.ts +18 -18
  80. package/lib/types/Action.js +2 -2
  81. package/lib/types/AppLoader.d.ts +11 -11
  82. package/lib/types/AppLoader.js +10 -10
  83. package/lib/types/Aspect.d.ts +12 -12
  84. package/lib/types/Aspect.js +4 -4
  85. package/lib/types/Auth.d.ts +66 -66
  86. package/lib/types/Auth.js +2 -2
  87. package/lib/types/Connector.d.ts +26 -26
  88. package/lib/types/Connector.js +9 -9
  89. package/lib/types/Context.d.ts +7 -7
  90. package/lib/types/Context.js +3 -3
  91. package/lib/types/DataType.d.ts +18 -18
  92. package/lib/types/DataType.js +5 -5
  93. package/lib/types/Demand.d.ts +77 -77
  94. package/lib/types/Demand.js +9 -9
  95. package/lib/types/Endpoint.d.ts +11 -10
  96. package/lib/types/Endpoint.js +3 -3
  97. package/lib/types/Entity.d.ts +183 -176
  98. package/lib/types/Entity.js +14 -14
  99. package/lib/types/Exception.d.ts +98 -88
  100. package/lib/types/Exception.js +283 -267
  101. package/lib/types/Expression.d.ts +163 -163
  102. package/lib/types/Expression.js +427 -427
  103. package/lib/types/Geo.d.ts +18 -18
  104. package/lib/types/Geo.js +2 -2
  105. package/lib/types/Locale.d.ts +24 -24
  106. package/lib/types/Locale.js +2 -2
  107. package/lib/types/Logger.d.ts +5 -5
  108. package/lib/types/Logger.js +3 -3
  109. package/lib/types/Polyfill.d.ts +23 -23
  110. package/lib/types/Polyfill.js +2 -2
  111. package/lib/types/Port.d.ts +17 -17
  112. package/lib/types/Port.js +2 -2
  113. package/lib/types/RowStore.d.ts +12 -12
  114. package/lib/types/RowStore.js +34 -34
  115. package/lib/types/Storage.d.ts +56 -56
  116. package/lib/types/Storage.js +2 -2
  117. package/lib/types/Timer.d.ts +13 -13
  118. package/lib/types/Timer.js +2 -2
  119. package/lib/types/Trigger.d.ts +100 -100
  120. package/lib/types/Trigger.js +39 -39
  121. package/lib/types/Txn.d.ts +2 -2
  122. package/lib/types/Txn.js +3 -3
  123. package/lib/types/Watcher.d.ts +19 -19
  124. package/lib/types/Watcher.js +4 -4
  125. package/lib/types/index.d.ts +21 -21
  126. package/lib/types/index.js +24 -24
  127. package/lib/types/schema/DataTypes.d.ts +32 -32
  128. package/lib/types/schema/DataTypes.js +3 -3
  129. package/lib/utils/SimpleConnector.d.ts +30 -30
  130. package/lib/utils/SimpleConnector.js +117 -117
  131. package/lib/utils/assert.d.ts +5 -5
  132. package/lib/utils/assert.js +9 -9
  133. package/lib/utils/concurrent.d.ts +15 -15
  134. package/lib/utils/concurrent.js +89 -89
  135. package/lib/utils/cron.d.ts +1 -1
  136. package/lib/utils/cron.js +18 -18
  137. package/lib/utils/date.d.ts +1 -1
  138. package/lib/utils/date.js +18 -18
  139. package/lib/utils/geo.d.ts +4 -4
  140. package/lib/utils/geo.js +24 -24
  141. package/lib/utils/lodash.d.ts +20 -20
  142. package/lib/utils/lodash.js +55 -55
  143. package/lib/utils/random/random.d.ts +1 -1
  144. package/lib/utils/random/random.js +24 -24
  145. package/lib/utils/random/random.mp.d.ts +1 -1
  146. package/lib/utils/random/random.mp.js +25 -25
  147. package/lib/utils/random/random.web.d.ts +1 -1
  148. package/lib/utils/random/random.web.js +17 -17
  149. package/lib/utils/string.d.ts +22 -22
  150. package/lib/utils/string.js +70 -70
  151. package/lib/utils/uuid.d.ts +12 -12
  152. package/lib/utils/uuid.js +194 -194
  153. package/lib/utils/validator.d.ts +23 -23
  154. package/lib/utils/validator.js +123 -123
  155. package/package.json +48 -48
  156. package/src/entities/Modi.ts +68 -68
  157. package/src/entities/ModiEntity.ts +24 -24
  158. package/src/entities/Oper.ts +28 -28
  159. package/src/entities/OperEntity.ts +24 -24
  160. package/src/entities/User.ts +19 -19
@@ -1,527 +1,527 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TriggerExecutor = void 0;
4
- var tslib_1 = require("tslib");
5
- var assert_1 = tslib_1.__importDefault(require("assert"));
6
- var lodash_1 = require("../utils/lodash");
7
- var filter_1 = require("../store/filter");
8
- var Entity_1 = require("../types/Entity");
9
- var SyncRowStore_1 = require("./SyncRowStore");
10
- var checker_1 = require("./checker");
11
- /**
12
- * update可能会传入多种不同的action,此时都需要检查update trigger
13
- */
14
- /* const UnifiedActionMatrix: Record<string, string> = {
15
- 'create': 'create',
16
- 'remove': 'remove',
17
- 'select': 'select',
18
- 'download': 'select',
19
- 'count': 'select',
20
- 'stat': 'select',
21
- }; */
22
- var TriggerExecutor = /** @class */ (function () {
23
- function TriggerExecutor(contextBuilder, logger) {
24
- if (logger === void 0) { logger = console; }
25
- this.contextBuilder = contextBuilder;
26
- this.logger = logger;
27
- this.triggerMap = {};
28
- this.triggerNameMap = {};
29
- this.volatileEntities = [];
30
- this.counter = 0;
31
- }
32
- TriggerExecutor.prototype.registerChecker = function (checker) {
33
- var entity = checker.entity, action = checker.action, type = checker.type, conditionalFilter = checker.conditionalFilter;
34
- var triggerName = "".concat(String(entity)).concat(action, "\u6743\u9650\u68C0\u67E5-").concat(this.counter++);
35
- var _a = (0, checker_1.translateCheckerInAsyncContext)(checker), fn = _a.fn, when = _a.when;
36
- var trigger = {
37
- checkerType: type,
38
- name: triggerName,
39
- priority: checker.priority || 20,
40
- entity: entity,
41
- action: action,
42
- fn: fn,
43
- when: when,
44
- filter: conditionalFilter,
45
- };
46
- this.registerTrigger(trigger);
47
- };
48
- TriggerExecutor.prototype.getCheckers = function (entity, action, checkerTypes) {
49
- var _a;
50
- var triggers = this.triggerMap[entity] && ((_a = this.triggerMap[entity][action]) === null || _a === void 0 ? void 0 : _a.filter(function (trigger) { return (typeof trigger.action === 'string' && trigger.action === action || trigger.action instanceof Array && trigger.action.includes(action)
51
- && (!checkerTypes || trigger.checkerType && checkerTypes.includes(trigger.checkerType))); }));
52
- return triggers;
53
- };
54
- TriggerExecutor.prototype.registerTrigger = function (trigger) {
55
- var _a;
56
- var _this = this;
57
- // trigger的两种访问方式: by name, by entity/action
58
- if (this.triggerNameMap.hasOwnProperty(trigger.name)) {
59
- throw new Error("\u4E0D\u53EF\u6709\u540C\u540D\u7684\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D"));
60
- }
61
- if (typeof trigger.priority !== 'number') {
62
- trigger.priority = 10; // 默认值
63
- }
64
- if (trigger.filter) {
65
- (0, assert_1.default)(typeof trigger.action === 'string' && trigger.action !== 'create'
66
- || trigger.action instanceof Array && !trigger.action.includes('create'), "trigger\u3010".concat(trigger.name, "\u3011\u662Fcreate\u7C7B\u578B\u4F46\u5374\u5E26\u6709filter"));
67
- (0, assert_1.default)(trigger.when === 'before' || trigger.when === 'commit', "\u5B9A\u4E49\u4E86filter\u7684trigger\u3010".concat(trigger.name, "\u3011\u7684when\u53EA\u80FD\u662Fbefore\u6216\u8005commit"));
68
- }
69
- Object.assign(this.triggerNameMap, (_a = {},
70
- _a[trigger.name] = trigger,
71
- _a));
72
- var addTrigger = function (action) {
73
- var _a, _b, _c;
74
- var triggers = _this.triggerMap[trigger.entity] && _this.triggerMap[trigger.entity][action];
75
- if (triggers) {
76
- var idx = void 0;
77
- // 这里可以保持有序插入,后面取trigger的时候就不用排序了
78
- for (idx = 0; idx < triggers.length; idx++) {
79
- if (triggers[idx].priority > trigger.priority) {
80
- break;
81
- }
82
- }
83
- triggers.splice(idx, 0, trigger);
84
- }
85
- else if (_this.triggerMap[trigger.entity]) {
86
- Object.assign(_this.triggerMap[trigger.entity], (_a = {},
87
- _a[action] = [trigger],
88
- _a));
89
- }
90
- else {
91
- Object.assign(_this.triggerMap, (_b = {},
92
- _b[trigger.entity] = (_c = {},
93
- _c[action] = [trigger],
94
- _c),
95
- _b));
96
- }
97
- };
98
- if (typeof trigger.action === 'string') {
99
- addTrigger(trigger.action);
100
- }
101
- else {
102
- trigger.action.forEach(function (ele) { return addTrigger(ele); });
103
- }
104
- if (trigger.when === 'commit' && trigger.strict === 'makeSure') {
105
- if (this.volatileEntities.indexOf(trigger.entity) === -1) {
106
- this.volatileEntities.push(trigger.entity);
107
- }
108
- }
109
- };
110
- TriggerExecutor.prototype.unregisterTrigger = function (trigger) {
111
- var _this = this;
112
- (0, assert_1.default)(trigger.when !== 'commit' || trigger.strict !== 'makeSure', 'could not remove strict volatile triggers');
113
- var removeTrigger = function (action) {
114
- var triggers = _this.triggerMap[trigger.entity] && _this.triggerMap[trigger.entity][action];
115
- if (triggers) {
116
- (0, lodash_1.pull)(triggers, trigger);
117
- (0, lodash_1.unset)(_this.triggerNameMap, trigger.name);
118
- }
119
- };
120
- if (typeof trigger.action === 'string') {
121
- removeTrigger(trigger.action);
122
- }
123
- else {
124
- trigger.action.forEach(function (ele) { return removeTrigger(ele); });
125
- }
126
- };
127
- TriggerExecutor.prototype.preCommitTrigger = function (entity, operation, trigger, context, option) {
128
- return tslib_1.__awaiter(this, void 0, void 0, function () {
129
- var _a, filter, filter2, count;
130
- var _b;
131
- return tslib_1.__generator(this, function (_c) {
132
- switch (_c.label) {
133
- case 0:
134
- (0, assert_1.default)(trigger.action !== 'select');
135
- if (!(trigger.strict === 'makeSure')) return [3 /*break*/, 5];
136
- _a = operation.action;
137
- switch (_a) {
138
- case 'create': return [3 /*break*/, 1];
139
- }
140
- return [3 /*break*/, 2];
141
- case 1:
142
- {
143
- if (operation.data.hasOwnProperty(Entity_1.TriggerDataAttribute) || operation.data.hasOwnProperty(Entity_1.TriggerTimestampAttribute)) {
144
- throw new Error('同一行数据上不能存在两个跨事务约束');
145
- }
146
- return [3 /*break*/, 4];
147
- }
148
- _c.label = 2;
149
- case 2:
150
- filter = operation.filter;
151
- filter2 = (0, filter_1.addFilterSegment)({
152
- $or: [
153
- {
154
- $$triggerData$$: {
155
- $exists: true,
156
- },
157
- },
158
- {
159
- $$triggerTimestamp$$: {
160
- $exists: true,
161
- },
162
- }
163
- ],
164
- }, filter);
165
- return [4 /*yield*/, context.count(entity, {
166
- filter: filter2
167
- }, {})];
168
- case 3:
169
- count = _c.sent();
170
- if (count > 0) {
171
- throw new Error("\u5BF9\u8C61".concat(String(entity), "\u7684\u884C\u300C").concat(JSON.stringify(operation), "\u300D\u4E0A\u5DF2\u7ECF\u5B58\u5728\u672A\u5B8C\u6210\u7684\u8DE8\u4E8B\u52A1\u7EA6\u675F"));
172
- }
173
- return [3 /*break*/, 4];
174
- case 4:
175
- Object.assign(operation.data, (_b = {},
176
- _b[Entity_1.TriggerDataAttribute] = {
177
- name: trigger.name,
178
- operation: operation,
179
- cxtStr: context.toString(),
180
- params: option,
181
- },
182
- _b[Entity_1.TriggerTimestampAttribute] = Date.now(),
183
- _b));
184
- _c.label = 5;
185
- case 5: return [2 /*return*/];
186
- }
187
- });
188
- });
189
- };
190
- TriggerExecutor.prototype.preOperation = function (entity, operation, context, option) {
191
- var e_1, _a;
192
- var _this = this;
193
- var _b;
194
- var action = operation.action;
195
- var triggers = this.triggerMap[entity] && ((_b = this.triggerMap[entity][action]) === null || _b === void 0 ? void 0 : _b.filter(function (trigger) { return typeof trigger.action === 'string' && trigger.action === operation.action || (trigger.action).includes(operation.action); }));
196
- if (triggers) {
197
- var preTriggers_2 = triggers.filter(function (ele) { return ele.when === 'before' && (!ele.check || ele.check(operation)); });
198
- var commitTriggers_1 = triggers.filter(function (ele) { return ele.when === 'commit' && (!ele.check || ele.check(operation)); });
199
- if (context instanceof SyncRowStore_1.SyncContext) {
200
- try {
201
- for (var preTriggers_1 = tslib_1.__values(preTriggers_2), preTriggers_1_1 = preTriggers_1.next(); !preTriggers_1_1.done; preTriggers_1_1 = preTriggers_1.next()) {
202
- var trigger = preTriggers_1_1.value;
203
- if (trigger.filter) {
204
- // trigger只对满足条件的前项进行判断,如果确定不满足可以pass
205
- (0, assert_1.default)(operation.action !== 'create');
206
- var filter = trigger.filter;
207
- var filterr = typeof filter === 'function' ? filter(operation, context, option) : filter;
208
- (0, assert_1.default)(!(filterr instanceof Promise));
209
- var filterRepelled = (0, filter_1.checkFilterRepel)(entity, context, filterr, operation.filter);
210
- if (filterRepelled) {
211
- continue;
212
- }
213
- }
214
- var number = trigger.fn({ operation: operation }, context, option);
215
- if (number > 0) {
216
- this.logger.info("\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D\u6210\u529F\u89E6\u53D1\u4E86\u300C").concat(number, "\u300D\u884C\u6570\u636E\u66F4\u6539"));
217
- }
218
- }
219
- }
220
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
221
- finally {
222
- try {
223
- if (preTriggers_1_1 && !preTriggers_1_1.done && (_a = preTriggers_1.return)) _a.call(preTriggers_1);
224
- }
225
- finally { if (e_1) throw e_1.error; }
226
- }
227
- (0, assert_1.default)(commitTriggers_1.length === 0, "\u524D\u53F0\u4E0D\u5E94\u6709commitTrigger");
228
- }
229
- else {
230
- // 异步context
231
- var execPreTrigger_1 = function (idx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
232
- var trigger, filter, filterr, _a, filterRepelled, number;
233
- return tslib_1.__generator(this, function (_b) {
234
- switch (_b.label) {
235
- case 0:
236
- if (idx >= preTriggers_2.length) {
237
- return [2 /*return*/];
238
- }
239
- trigger = preTriggers_2[idx];
240
- if (!trigger.filter) return [3 /*break*/, 5];
241
- (0, assert_1.default)(operation.action !== 'create');
242
- filter = trigger.filter;
243
- if (!(typeof filter === 'function')) return [3 /*break*/, 2];
244
- return [4 /*yield*/, filter(operation, context, option)];
245
- case 1:
246
- _a = _b.sent();
247
- return [3 /*break*/, 3];
248
- case 2:
249
- _a = filter;
250
- _b.label = 3;
251
- case 3:
252
- filterr = _a;
253
- return [4 /*yield*/, (0, filter_1.checkFilterRepel)(entity, context, filterr, operation.filter)];
254
- case 4:
255
- filterRepelled = _b.sent();
256
- if (filterRepelled) {
257
- return [2 /*return*/, execPreTrigger_1(idx + 1)];
258
- }
259
- _b.label = 5;
260
- case 5: return [4 /*yield*/, trigger.fn({ operation: operation }, context, option)];
261
- case 6:
262
- number = _b.sent();
263
- if (number > 0) {
264
- this.logger.info("\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D\u6210\u529F\u89E6\u53D1\u4E86\u300C").concat(number, "\u300D\u884C\u6570\u636E\u66F4\u6539"));
265
- }
266
- return [2 /*return*/, execPreTrigger_1(idx + 1)];
267
- }
268
- });
269
- }); };
270
- var execCommitTrigger_1 = function (idx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
271
- var trigger, filter, filterr, _a, filterRepelled;
272
- return tslib_1.__generator(this, function (_b) {
273
- switch (_b.label) {
274
- case 0:
275
- if (idx >= commitTriggers_1.length) {
276
- return [2 /*return*/];
277
- }
278
- trigger = commitTriggers_1[idx];
279
- if (!trigger.filter) return [3 /*break*/, 5];
280
- (0, assert_1.default)(operation.action !== 'create');
281
- filter = trigger.filter;
282
- if (!(typeof filter === 'function')) return [3 /*break*/, 2];
283
- return [4 /*yield*/, filter(operation, context, option)];
284
- case 1:
285
- _a = _b.sent();
286
- return [3 /*break*/, 3];
287
- case 2:
288
- _a = filter;
289
- _b.label = 3;
290
- case 3:
291
- filterr = _a;
292
- return [4 /*yield*/, (0, filter_1.checkFilterRepel)(entity, context, filterr, operation.filter)];
293
- case 4:
294
- filterRepelled = _b.sent();
295
- if (filterRepelled) {
296
- return [2 /*return*/, execCommitTrigger_1(idx + 1)];
297
- }
298
- _b.label = 5;
299
- case 5: return [4 /*yield*/, this.preCommitTrigger(entity, operation, trigger, context, option)];
300
- case 6:
301
- _b.sent();
302
- return [2 /*return*/, execCommitTrigger_1(idx + 1)];
303
- }
304
- });
305
- }); };
306
- return execPreTrigger_1(0)
307
- .then(function () { return execCommitTrigger_1(0); });
308
- }
309
- }
310
- };
311
- TriggerExecutor.prototype.onCommit = function (trigger, operation, context, option) {
312
- var _this = this;
313
- return function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
314
- var number, filter;
315
- return tslib_1.__generator(this, function (_a) {
316
- switch (_a.label) {
317
- case 0: return [4 /*yield*/, context.begin()];
318
- case 1:
319
- _a.sent();
320
- return [4 /*yield*/, trigger.fn({
321
- operation: operation,
322
- }, context, option)];
323
- case 2:
324
- number = _a.sent();
325
- if (!(trigger.strict === 'makeSure')) return [3 /*break*/, 4];
326
- filter = {};
327
- if (operation.action === 'create') {
328
- filter = operation.data instanceof Array ? {
329
- filter: {
330
- id: {
331
- $in: operation.data.map(function (ele) { return ele.id; }),
332
- },
333
- },
334
- } : {
335
- filter: {
336
- id: operation.data.id,
337
- }
338
- };
339
- }
340
- else if (operation.filter) {
341
- Object.assign(filter, { filter: operation.filter });
342
- }
343
- return [4 /*yield*/, context.operate(trigger.entity, tslib_1.__assign({ id: 'aaa', action: 'update', data: {
344
- $$triggerTimestamp$$: null,
345
- $$triggerData$$: null,
346
- } }, filter /** as Filter<'update', DeduceFilter<ED[T]['Schema']>> */), {})];
347
- case 3:
348
- _a.sent();
349
- _a.label = 4;
350
- case 4: return [4 /*yield*/, context.commit()];
351
- case 5:
352
- _a.sent();
353
- return [2 /*return*/];
354
- }
355
- });
356
- }); };
357
- };
358
- TriggerExecutor.prototype.postCommitTrigger = function (operation, trigger, context, option) {
359
- return tslib_1.__awaiter(this, void 0, void 0, function () {
360
- return tslib_1.__generator(this, function (_a) {
361
- context.on('commit', this.onCommit(trigger, operation, context, option));
362
- return [2 /*return*/];
363
- });
364
- });
365
- };
366
- TriggerExecutor.prototype.postOperation = function (entity, operation, context, option, result) {
367
- var e_2, _a;
368
- var _this = this;
369
- var _b;
370
- var action = operation.action;
371
- var triggers = this.triggerMap[entity] && ((_b = this.triggerMap[entity][action]) === null || _b === void 0 ? void 0 : _b.filter(function (trigger) { return typeof trigger.action === 'string' && trigger.action === operation.action || (trigger.action).includes(operation.action); }));
372
- if (triggers) {
373
- var postTriggers_2 = triggers.filter(function (ele) { return ele.when === 'after' && (!ele.check || ele.check(operation)); });
374
- var commitTriggers_2 = triggers.filter(function (ele) { return ele.when === 'commit' && (!ele.check || ele.check(operation)); });
375
- if (context instanceof SyncRowStore_1.SyncContext) {
376
- try {
377
- for (var postTriggers_1 = tslib_1.__values(postTriggers_2), postTriggers_1_1 = postTriggers_1.next(); !postTriggers_1_1.done; postTriggers_1_1 = postTriggers_1.next()) {
378
- var trigger = postTriggers_1_1.value;
379
- var number = trigger.fn({
380
- operation: operation,
381
- result: result,
382
- }, context, option);
383
- if (number > 0) {
384
- this.logger.info("\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D\u6210\u529F\u89E6\u53D1\u4E86\u300C").concat(number, "\u300D\u884C\u6570\u636E\u66F4\u6539"));
385
- }
386
- }
387
- }
388
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
389
- finally {
390
- try {
391
- if (postTriggers_1_1 && !postTriggers_1_1.done && (_a = postTriggers_1.return)) _a.call(postTriggers_1);
392
- }
393
- finally { if (e_2) throw e_2.error; }
394
- }
395
- (0, assert_1.default)(commitTriggers_2.length === 0, '前台目前应当没有commitTrigger');
396
- }
397
- else {
398
- // 异步context
399
- var execPostTrigger_1 = function (idx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
400
- var trigger, number;
401
- return tslib_1.__generator(this, function (_a) {
402
- switch (_a.label) {
403
- case 0:
404
- if (idx >= postTriggers_2.length) {
405
- return [2 /*return*/];
406
- }
407
- trigger = postTriggers_2[idx];
408
- return [4 /*yield*/, trigger.fn({
409
- operation: operation,
410
- result: result,
411
- }, context, option)];
412
- case 1:
413
- number = _a.sent();
414
- if (number > 0) {
415
- this.logger.info("\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D\u6210\u529F\u89E6\u53D1\u4E86\u300C").concat(number, "\u300D\u884C\u6570\u636E\u66F4\u6539"));
416
- }
417
- return [2 /*return*/, execPostTrigger_1(idx + 1)];
418
- }
419
- });
420
- }); };
421
- var execCommitTrigger_2 = function (idx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
422
- var trigger;
423
- return tslib_1.__generator(this, function (_a) {
424
- switch (_a.label) {
425
- case 0:
426
- if (idx >= commitTriggers_2.length) {
427
- return [2 /*return*/];
428
- }
429
- trigger = commitTriggers_2[idx];
430
- return [4 /*yield*/, this.postCommitTrigger(operation, trigger, context, option)];
431
- case 1:
432
- _a.sent();
433
- return [2 /*return*/, execCommitTrigger_2(idx + 1)];
434
- }
435
- });
436
- }); };
437
- return execPostTrigger_1(0)
438
- .then(function () { return execCommitTrigger_2(0); });
439
- }
440
- }
441
- };
442
- TriggerExecutor.prototype.checkpoint = function (context, timestamp) {
443
- return tslib_1.__awaiter(this, void 0, void 0, function () {
444
- var result, _a, _b, entity, rows, rows_1, rows_1_1, row, $$triggerData$$, _c, name_1, operation, cxtStr, params, trigger, context_1, e_3_1, e_4_1;
445
- var e_4, _d, e_3, _e;
446
- return tslib_1.__generator(this, function (_f) {
447
- switch (_f.label) {
448
- case 0:
449
- result = 0;
450
- _f.label = 1;
451
- case 1:
452
- _f.trys.push([1, 14, 15, 16]);
453
- _a = tslib_1.__values(this.volatileEntities), _b = _a.next();
454
- _f.label = 2;
455
- case 2:
456
- if (!!_b.done) return [3 /*break*/, 13];
457
- entity = _b.value;
458
- return [4 /*yield*/, context.select(entity, {
459
- data: {
460
- id: 1,
461
- $$triggerData$$: 1,
462
- },
463
- filter: {
464
- $$triggerTimestamp$$: {
465
- $gt: timestamp,
466
- }
467
- },
468
- }, {
469
- dontCollect: true,
470
- forUpdate: true,
471
- })];
472
- case 3:
473
- rows = _f.sent();
474
- _f.label = 4;
475
- case 4:
476
- _f.trys.push([4, 10, 11, 12]);
477
- rows_1 = (e_3 = void 0, tslib_1.__values(rows)), rows_1_1 = rows_1.next();
478
- _f.label = 5;
479
- case 5:
480
- if (!!rows_1_1.done) return [3 /*break*/, 9];
481
- row = rows_1_1.value;
482
- $$triggerData$$ = row.$$triggerData$$;
483
- _c = $$triggerData$$, name_1 = _c.name, operation = _c.operation, cxtStr = _c.cxtStr, params = _c.params;
484
- trigger = this.triggerNameMap[name_1];
485
- return [4 /*yield*/, this.contextBuilder(cxtStr)];
486
- case 6:
487
- context_1 = _f.sent();
488
- return [4 /*yield*/, this.onCommit(trigger, operation, context_1, params)()];
489
- case 7:
490
- _f.sent();
491
- _f.label = 8;
492
- case 8:
493
- rows_1_1 = rows_1.next();
494
- return [3 /*break*/, 5];
495
- case 9: return [3 /*break*/, 12];
496
- case 10:
497
- e_3_1 = _f.sent();
498
- e_3 = { error: e_3_1 };
499
- return [3 /*break*/, 12];
500
- case 11:
501
- try {
502
- if (rows_1_1 && !rows_1_1.done && (_e = rows_1.return)) _e.call(rows_1);
503
- }
504
- finally { if (e_3) throw e_3.error; }
505
- return [7 /*endfinally*/];
506
- case 12:
507
- _b = _a.next();
508
- return [3 /*break*/, 2];
509
- case 13: return [3 /*break*/, 16];
510
- case 14:
511
- e_4_1 = _f.sent();
512
- e_4 = { error: e_4_1 };
513
- return [3 /*break*/, 16];
514
- case 15:
515
- try {
516
- if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
517
- }
518
- finally { if (e_4) throw e_4.error; }
519
- return [7 /*endfinally*/];
520
- case 16: return [2 /*return*/, result];
521
- }
522
- });
523
- });
524
- };
525
- return TriggerExecutor;
526
- }());
527
- exports.TriggerExecutor = TriggerExecutor;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TriggerExecutor = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var assert_1 = tslib_1.__importDefault(require("assert"));
6
+ var lodash_1 = require("../utils/lodash");
7
+ var filter_1 = require("../store/filter");
8
+ var Entity_1 = require("../types/Entity");
9
+ var SyncRowStore_1 = require("./SyncRowStore");
10
+ var checker_1 = require("./checker");
11
+ /**
12
+ * update可能会传入多种不同的action,此时都需要检查update trigger
13
+ */
14
+ /* const UnifiedActionMatrix: Record<string, string> = {
15
+ 'create': 'create',
16
+ 'remove': 'remove',
17
+ 'select': 'select',
18
+ 'download': 'select',
19
+ 'count': 'select',
20
+ 'stat': 'select',
21
+ }; */
22
+ var TriggerExecutor = /** @class */ (function () {
23
+ function TriggerExecutor(contextBuilder, logger) {
24
+ if (logger === void 0) { logger = console; }
25
+ this.contextBuilder = contextBuilder;
26
+ this.logger = logger;
27
+ this.triggerMap = {};
28
+ this.triggerNameMap = {};
29
+ this.volatileEntities = [];
30
+ this.counter = 0;
31
+ }
32
+ TriggerExecutor.prototype.registerChecker = function (checker) {
33
+ var entity = checker.entity, action = checker.action, type = checker.type, conditionalFilter = checker.conditionalFilter;
34
+ var triggerName = "".concat(String(entity)).concat(action, "\u6743\u9650\u68C0\u67E5-").concat(this.counter++);
35
+ var _a = (0, checker_1.translateCheckerInAsyncContext)(checker), fn = _a.fn, when = _a.when;
36
+ var trigger = {
37
+ checkerType: type,
38
+ name: triggerName,
39
+ priority: checker.priority || 20,
40
+ entity: entity,
41
+ action: action,
42
+ fn: fn,
43
+ when: when,
44
+ filter: conditionalFilter,
45
+ };
46
+ this.registerTrigger(trigger);
47
+ };
48
+ TriggerExecutor.prototype.getCheckers = function (entity, action, checkerTypes) {
49
+ var _a;
50
+ var triggers = this.triggerMap[entity] && ((_a = this.triggerMap[entity][action]) === null || _a === void 0 ? void 0 : _a.filter(function (trigger) { return (typeof trigger.action === 'string' && trigger.action === action || trigger.action instanceof Array && trigger.action.includes(action)
51
+ && (!checkerTypes || trigger.checkerType && checkerTypes.includes(trigger.checkerType))); }));
52
+ return triggers;
53
+ };
54
+ TriggerExecutor.prototype.registerTrigger = function (trigger) {
55
+ var _a;
56
+ var _this = this;
57
+ // trigger的两种访问方式: by name, by entity/action
58
+ if (this.triggerNameMap.hasOwnProperty(trigger.name)) {
59
+ throw new Error("\u4E0D\u53EF\u6709\u540C\u540D\u7684\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D"));
60
+ }
61
+ if (typeof trigger.priority !== 'number') {
62
+ trigger.priority = 10; // 默认值
63
+ }
64
+ if (trigger.filter) {
65
+ (0, assert_1.default)(typeof trigger.action === 'string' && trigger.action !== 'create'
66
+ || trigger.action instanceof Array && !trigger.action.includes('create'), "trigger\u3010".concat(trigger.name, "\u3011\u662Fcreate\u7C7B\u578B\u4F46\u5374\u5E26\u6709filter"));
67
+ (0, assert_1.default)(trigger.when === 'before' || trigger.when === 'commit', "\u5B9A\u4E49\u4E86filter\u7684trigger\u3010".concat(trigger.name, "\u3011\u7684when\u53EA\u80FD\u662Fbefore\u6216\u8005commit"));
68
+ }
69
+ Object.assign(this.triggerNameMap, (_a = {},
70
+ _a[trigger.name] = trigger,
71
+ _a));
72
+ var addTrigger = function (action) {
73
+ var _a, _b, _c;
74
+ var triggers = _this.triggerMap[trigger.entity] && _this.triggerMap[trigger.entity][action];
75
+ if (triggers) {
76
+ var idx = void 0;
77
+ // 这里可以保持有序插入,后面取trigger的时候就不用排序了
78
+ for (idx = 0; idx < triggers.length; idx++) {
79
+ if (triggers[idx].priority > trigger.priority) {
80
+ break;
81
+ }
82
+ }
83
+ triggers.splice(idx, 0, trigger);
84
+ }
85
+ else if (_this.triggerMap[trigger.entity]) {
86
+ Object.assign(_this.triggerMap[trigger.entity], (_a = {},
87
+ _a[action] = [trigger],
88
+ _a));
89
+ }
90
+ else {
91
+ Object.assign(_this.triggerMap, (_b = {},
92
+ _b[trigger.entity] = (_c = {},
93
+ _c[action] = [trigger],
94
+ _c),
95
+ _b));
96
+ }
97
+ };
98
+ if (typeof trigger.action === 'string') {
99
+ addTrigger(trigger.action);
100
+ }
101
+ else {
102
+ trigger.action.forEach(function (ele) { return addTrigger(ele); });
103
+ }
104
+ if (trigger.when === 'commit' && trigger.strict === 'makeSure') {
105
+ if (this.volatileEntities.indexOf(trigger.entity) === -1) {
106
+ this.volatileEntities.push(trigger.entity);
107
+ }
108
+ }
109
+ };
110
+ TriggerExecutor.prototype.unregisterTrigger = function (trigger) {
111
+ var _this = this;
112
+ (0, assert_1.default)(trigger.when !== 'commit' || trigger.strict !== 'makeSure', 'could not remove strict volatile triggers');
113
+ var removeTrigger = function (action) {
114
+ var triggers = _this.triggerMap[trigger.entity] && _this.triggerMap[trigger.entity][action];
115
+ if (triggers) {
116
+ (0, lodash_1.pull)(triggers, trigger);
117
+ (0, lodash_1.unset)(_this.triggerNameMap, trigger.name);
118
+ }
119
+ };
120
+ if (typeof trigger.action === 'string') {
121
+ removeTrigger(trigger.action);
122
+ }
123
+ else {
124
+ trigger.action.forEach(function (ele) { return removeTrigger(ele); });
125
+ }
126
+ };
127
+ TriggerExecutor.prototype.preCommitTrigger = function (entity, operation, trigger, context, option) {
128
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
129
+ var _a, filter, filter2, count;
130
+ var _b;
131
+ return tslib_1.__generator(this, function (_c) {
132
+ switch (_c.label) {
133
+ case 0:
134
+ (0, assert_1.default)(trigger.action !== 'select');
135
+ if (!(trigger.strict === 'makeSure')) return [3 /*break*/, 5];
136
+ _a = operation.action;
137
+ switch (_a) {
138
+ case 'create': return [3 /*break*/, 1];
139
+ }
140
+ return [3 /*break*/, 2];
141
+ case 1:
142
+ {
143
+ if (operation.data.hasOwnProperty(Entity_1.TriggerDataAttribute) || operation.data.hasOwnProperty(Entity_1.TriggerTimestampAttribute)) {
144
+ throw new Error('同一行数据上不能存在两个跨事务约束');
145
+ }
146
+ return [3 /*break*/, 4];
147
+ }
148
+ _c.label = 2;
149
+ case 2:
150
+ filter = operation.filter;
151
+ filter2 = (0, filter_1.addFilterSegment)({
152
+ $or: [
153
+ {
154
+ $$triggerData$$: {
155
+ $exists: true,
156
+ },
157
+ },
158
+ {
159
+ $$triggerTimestamp$$: {
160
+ $exists: true,
161
+ },
162
+ }
163
+ ],
164
+ }, filter);
165
+ return [4 /*yield*/, context.count(entity, {
166
+ filter: filter2
167
+ }, {})];
168
+ case 3:
169
+ count = _c.sent();
170
+ if (count > 0) {
171
+ throw new Error("\u5BF9\u8C61".concat(String(entity), "\u7684\u884C\u300C").concat(JSON.stringify(operation), "\u300D\u4E0A\u5DF2\u7ECF\u5B58\u5728\u672A\u5B8C\u6210\u7684\u8DE8\u4E8B\u52A1\u7EA6\u675F"));
172
+ }
173
+ return [3 /*break*/, 4];
174
+ case 4:
175
+ Object.assign(operation.data, (_b = {},
176
+ _b[Entity_1.TriggerDataAttribute] = {
177
+ name: trigger.name,
178
+ operation: operation,
179
+ cxtStr: context.toString(),
180
+ params: option,
181
+ },
182
+ _b[Entity_1.TriggerTimestampAttribute] = Date.now(),
183
+ _b));
184
+ _c.label = 5;
185
+ case 5: return [2 /*return*/];
186
+ }
187
+ });
188
+ });
189
+ };
190
+ TriggerExecutor.prototype.preOperation = function (entity, operation, context, option) {
191
+ var e_1, _a;
192
+ var _this = this;
193
+ var _b;
194
+ var action = operation.action;
195
+ var triggers = this.triggerMap[entity] && ((_b = this.triggerMap[entity][action]) === null || _b === void 0 ? void 0 : _b.filter(function (trigger) { return typeof trigger.action === 'string' && trigger.action === operation.action || (trigger.action).includes(operation.action); }));
196
+ if (triggers) {
197
+ var preTriggers_2 = triggers.filter(function (ele) { return ele.when === 'before' && (!ele.check || ele.check(operation)); });
198
+ var commitTriggers_1 = triggers.filter(function (ele) { return ele.when === 'commit' && (!ele.check || ele.check(operation)); });
199
+ if (context instanceof SyncRowStore_1.SyncContext) {
200
+ try {
201
+ for (var preTriggers_1 = tslib_1.__values(preTriggers_2), preTriggers_1_1 = preTriggers_1.next(); !preTriggers_1_1.done; preTriggers_1_1 = preTriggers_1.next()) {
202
+ var trigger = preTriggers_1_1.value;
203
+ if (trigger.filter) {
204
+ // trigger只对满足条件的前项进行判断,如果确定不满足可以pass
205
+ (0, assert_1.default)(operation.action !== 'create');
206
+ var filter = trigger.filter;
207
+ var filterr = typeof filter === 'function' ? filter(operation, context, option) : filter;
208
+ (0, assert_1.default)(!(filterr instanceof Promise));
209
+ var filterRepelled = (0, filter_1.checkFilterRepel)(entity, context, filterr, operation.filter);
210
+ if (filterRepelled) {
211
+ continue;
212
+ }
213
+ }
214
+ var number = trigger.fn({ operation: operation }, context, option);
215
+ if (number > 0) {
216
+ this.logger.info("\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D\u6210\u529F\u89E6\u53D1\u4E86\u300C").concat(number, "\u300D\u884C\u6570\u636E\u66F4\u6539"));
217
+ }
218
+ }
219
+ }
220
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
221
+ finally {
222
+ try {
223
+ if (preTriggers_1_1 && !preTriggers_1_1.done && (_a = preTriggers_1.return)) _a.call(preTriggers_1);
224
+ }
225
+ finally { if (e_1) throw e_1.error; }
226
+ }
227
+ (0, assert_1.default)(commitTriggers_1.length === 0, "\u524D\u53F0\u4E0D\u5E94\u6709commitTrigger");
228
+ }
229
+ else {
230
+ // 异步context
231
+ var execPreTrigger_1 = function (idx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
232
+ var trigger, filter, filterr, _a, filterRepelled, number;
233
+ return tslib_1.__generator(this, function (_b) {
234
+ switch (_b.label) {
235
+ case 0:
236
+ if (idx >= preTriggers_2.length) {
237
+ return [2 /*return*/];
238
+ }
239
+ trigger = preTriggers_2[idx];
240
+ if (!trigger.filter) return [3 /*break*/, 5];
241
+ (0, assert_1.default)(operation.action !== 'create');
242
+ filter = trigger.filter;
243
+ if (!(typeof filter === 'function')) return [3 /*break*/, 2];
244
+ return [4 /*yield*/, filter(operation, context, option)];
245
+ case 1:
246
+ _a = _b.sent();
247
+ return [3 /*break*/, 3];
248
+ case 2:
249
+ _a = filter;
250
+ _b.label = 3;
251
+ case 3:
252
+ filterr = _a;
253
+ return [4 /*yield*/, (0, filter_1.checkFilterRepel)(entity, context, filterr, operation.filter)];
254
+ case 4:
255
+ filterRepelled = _b.sent();
256
+ if (filterRepelled) {
257
+ return [2 /*return*/, execPreTrigger_1(idx + 1)];
258
+ }
259
+ _b.label = 5;
260
+ case 5: return [4 /*yield*/, trigger.fn({ operation: operation }, context, option)];
261
+ case 6:
262
+ number = _b.sent();
263
+ if (number > 0) {
264
+ this.logger.info("\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D\u6210\u529F\u89E6\u53D1\u4E86\u300C").concat(number, "\u300D\u884C\u6570\u636E\u66F4\u6539"));
265
+ }
266
+ return [2 /*return*/, execPreTrigger_1(idx + 1)];
267
+ }
268
+ });
269
+ }); };
270
+ var execCommitTrigger_1 = function (idx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
271
+ var trigger, filter, filterr, _a, filterRepelled;
272
+ return tslib_1.__generator(this, function (_b) {
273
+ switch (_b.label) {
274
+ case 0:
275
+ if (idx >= commitTriggers_1.length) {
276
+ return [2 /*return*/];
277
+ }
278
+ trigger = commitTriggers_1[idx];
279
+ if (!trigger.filter) return [3 /*break*/, 5];
280
+ (0, assert_1.default)(operation.action !== 'create');
281
+ filter = trigger.filter;
282
+ if (!(typeof filter === 'function')) return [3 /*break*/, 2];
283
+ return [4 /*yield*/, filter(operation, context, option)];
284
+ case 1:
285
+ _a = _b.sent();
286
+ return [3 /*break*/, 3];
287
+ case 2:
288
+ _a = filter;
289
+ _b.label = 3;
290
+ case 3:
291
+ filterr = _a;
292
+ return [4 /*yield*/, (0, filter_1.checkFilterRepel)(entity, context, filterr, operation.filter)];
293
+ case 4:
294
+ filterRepelled = _b.sent();
295
+ if (filterRepelled) {
296
+ return [2 /*return*/, execCommitTrigger_1(idx + 1)];
297
+ }
298
+ _b.label = 5;
299
+ case 5: return [4 /*yield*/, this.preCommitTrigger(entity, operation, trigger, context, option)];
300
+ case 6:
301
+ _b.sent();
302
+ return [2 /*return*/, execCommitTrigger_1(idx + 1)];
303
+ }
304
+ });
305
+ }); };
306
+ return execPreTrigger_1(0)
307
+ .then(function () { return execCommitTrigger_1(0); });
308
+ }
309
+ }
310
+ };
311
+ TriggerExecutor.prototype.onCommit = function (trigger, operation, context, option) {
312
+ var _this = this;
313
+ return function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
314
+ var number, filter;
315
+ return tslib_1.__generator(this, function (_a) {
316
+ switch (_a.label) {
317
+ case 0: return [4 /*yield*/, context.begin()];
318
+ case 1:
319
+ _a.sent();
320
+ return [4 /*yield*/, trigger.fn({
321
+ operation: operation,
322
+ }, context, option)];
323
+ case 2:
324
+ number = _a.sent();
325
+ if (!(trigger.strict === 'makeSure')) return [3 /*break*/, 4];
326
+ filter = {};
327
+ if (operation.action === 'create') {
328
+ filter = operation.data instanceof Array ? {
329
+ filter: {
330
+ id: {
331
+ $in: operation.data.map(function (ele) { return ele.id; }),
332
+ },
333
+ },
334
+ } : {
335
+ filter: {
336
+ id: operation.data.id,
337
+ }
338
+ };
339
+ }
340
+ else if (operation.filter) {
341
+ Object.assign(filter, { filter: operation.filter });
342
+ }
343
+ return [4 /*yield*/, context.operate(trigger.entity, tslib_1.__assign({ id: 'aaa', action: 'update', data: {
344
+ $$triggerTimestamp$$: null,
345
+ $$triggerData$$: null,
346
+ } }, filter /** as Filter<'update', DeduceFilter<ED[T]['Schema']>> */), {})];
347
+ case 3:
348
+ _a.sent();
349
+ _a.label = 4;
350
+ case 4: return [4 /*yield*/, context.commit()];
351
+ case 5:
352
+ _a.sent();
353
+ return [2 /*return*/];
354
+ }
355
+ });
356
+ }); };
357
+ };
358
+ TriggerExecutor.prototype.postCommitTrigger = function (operation, trigger, context, option) {
359
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
360
+ return tslib_1.__generator(this, function (_a) {
361
+ context.on('commit', this.onCommit(trigger, operation, context, option));
362
+ return [2 /*return*/];
363
+ });
364
+ });
365
+ };
366
+ TriggerExecutor.prototype.postOperation = function (entity, operation, context, option, result) {
367
+ var e_2, _a;
368
+ var _this = this;
369
+ var _b;
370
+ var action = operation.action;
371
+ var triggers = this.triggerMap[entity] && ((_b = this.triggerMap[entity][action]) === null || _b === void 0 ? void 0 : _b.filter(function (trigger) { return typeof trigger.action === 'string' && trigger.action === operation.action || (trigger.action).includes(operation.action); }));
372
+ if (triggers) {
373
+ var postTriggers_2 = triggers.filter(function (ele) { return ele.when === 'after' && (!ele.check || ele.check(operation)); });
374
+ var commitTriggers_2 = triggers.filter(function (ele) { return ele.when === 'commit' && (!ele.check || ele.check(operation)); });
375
+ if (context instanceof SyncRowStore_1.SyncContext) {
376
+ try {
377
+ for (var postTriggers_1 = tslib_1.__values(postTriggers_2), postTriggers_1_1 = postTriggers_1.next(); !postTriggers_1_1.done; postTriggers_1_1 = postTriggers_1.next()) {
378
+ var trigger = postTriggers_1_1.value;
379
+ var number = trigger.fn({
380
+ operation: operation,
381
+ result: result,
382
+ }, context, option);
383
+ if (number > 0) {
384
+ this.logger.info("\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D\u6210\u529F\u89E6\u53D1\u4E86\u300C").concat(number, "\u300D\u884C\u6570\u636E\u66F4\u6539"));
385
+ }
386
+ }
387
+ }
388
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
389
+ finally {
390
+ try {
391
+ if (postTriggers_1_1 && !postTriggers_1_1.done && (_a = postTriggers_1.return)) _a.call(postTriggers_1);
392
+ }
393
+ finally { if (e_2) throw e_2.error; }
394
+ }
395
+ (0, assert_1.default)(commitTriggers_2.length === 0, '前台目前应当没有commitTrigger');
396
+ }
397
+ else {
398
+ // 异步context
399
+ var execPostTrigger_1 = function (idx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
400
+ var trigger, number;
401
+ return tslib_1.__generator(this, function (_a) {
402
+ switch (_a.label) {
403
+ case 0:
404
+ if (idx >= postTriggers_2.length) {
405
+ return [2 /*return*/];
406
+ }
407
+ trigger = postTriggers_2[idx];
408
+ return [4 /*yield*/, trigger.fn({
409
+ operation: operation,
410
+ result: result,
411
+ }, context, option)];
412
+ case 1:
413
+ number = _a.sent();
414
+ if (number > 0) {
415
+ this.logger.info("\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D\u6210\u529F\u89E6\u53D1\u4E86\u300C").concat(number, "\u300D\u884C\u6570\u636E\u66F4\u6539"));
416
+ }
417
+ return [2 /*return*/, execPostTrigger_1(idx + 1)];
418
+ }
419
+ });
420
+ }); };
421
+ var execCommitTrigger_2 = function (idx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
422
+ var trigger;
423
+ return tslib_1.__generator(this, function (_a) {
424
+ switch (_a.label) {
425
+ case 0:
426
+ if (idx >= commitTriggers_2.length) {
427
+ return [2 /*return*/];
428
+ }
429
+ trigger = commitTriggers_2[idx];
430
+ return [4 /*yield*/, this.postCommitTrigger(operation, trigger, context, option)];
431
+ case 1:
432
+ _a.sent();
433
+ return [2 /*return*/, execCommitTrigger_2(idx + 1)];
434
+ }
435
+ });
436
+ }); };
437
+ return execPostTrigger_1(0)
438
+ .then(function () { return execCommitTrigger_2(0); });
439
+ }
440
+ }
441
+ };
442
+ TriggerExecutor.prototype.checkpoint = function (context, timestamp) {
443
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
444
+ var result, _a, _b, entity, rows, rows_1, rows_1_1, row, $$triggerData$$, _c, name_1, operation, cxtStr, params, trigger, context_1, e_3_1, e_4_1;
445
+ var e_4, _d, e_3, _e;
446
+ return tslib_1.__generator(this, function (_f) {
447
+ switch (_f.label) {
448
+ case 0:
449
+ result = 0;
450
+ _f.label = 1;
451
+ case 1:
452
+ _f.trys.push([1, 14, 15, 16]);
453
+ _a = tslib_1.__values(this.volatileEntities), _b = _a.next();
454
+ _f.label = 2;
455
+ case 2:
456
+ if (!!_b.done) return [3 /*break*/, 13];
457
+ entity = _b.value;
458
+ return [4 /*yield*/, context.select(entity, {
459
+ data: {
460
+ id: 1,
461
+ $$triggerData$$: 1,
462
+ },
463
+ filter: {
464
+ $$triggerTimestamp$$: {
465
+ $gt: timestamp,
466
+ }
467
+ },
468
+ }, {
469
+ dontCollect: true,
470
+ forUpdate: true,
471
+ })];
472
+ case 3:
473
+ rows = _f.sent();
474
+ _f.label = 4;
475
+ case 4:
476
+ _f.trys.push([4, 10, 11, 12]);
477
+ rows_1 = (e_3 = void 0, tslib_1.__values(rows)), rows_1_1 = rows_1.next();
478
+ _f.label = 5;
479
+ case 5:
480
+ if (!!rows_1_1.done) return [3 /*break*/, 9];
481
+ row = rows_1_1.value;
482
+ $$triggerData$$ = row.$$triggerData$$;
483
+ _c = $$triggerData$$, name_1 = _c.name, operation = _c.operation, cxtStr = _c.cxtStr, params = _c.params;
484
+ trigger = this.triggerNameMap[name_1];
485
+ return [4 /*yield*/, this.contextBuilder(cxtStr)];
486
+ case 6:
487
+ context_1 = _f.sent();
488
+ return [4 /*yield*/, this.onCommit(trigger, operation, context_1, params)()];
489
+ case 7:
490
+ _f.sent();
491
+ _f.label = 8;
492
+ case 8:
493
+ rows_1_1 = rows_1.next();
494
+ return [3 /*break*/, 5];
495
+ case 9: return [3 /*break*/, 12];
496
+ case 10:
497
+ e_3_1 = _f.sent();
498
+ e_3 = { error: e_3_1 };
499
+ return [3 /*break*/, 12];
500
+ case 11:
501
+ try {
502
+ if (rows_1_1 && !rows_1_1.done && (_e = rows_1.return)) _e.call(rows_1);
503
+ }
504
+ finally { if (e_3) throw e_3.error; }
505
+ return [7 /*endfinally*/];
506
+ case 12:
507
+ _b = _a.next();
508
+ return [3 /*break*/, 2];
509
+ case 13: return [3 /*break*/, 16];
510
+ case 14:
511
+ e_4_1 = _f.sent();
512
+ e_4 = { error: e_4_1 };
513
+ return [3 /*break*/, 16];
514
+ case 15:
515
+ try {
516
+ if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
517
+ }
518
+ finally { if (e_4) throw e_4.error; }
519
+ return [7 /*endfinally*/];
520
+ case 16: return [2 /*return*/, result];
521
+ }
522
+ });
523
+ });
524
+ };
525
+ return TriggerExecutor;
526
+ }());
527
+ exports.TriggerExecutor = TriggerExecutor;