oak-domain 2.3.2 → 2.4.1

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 -1
  4. package/lib/actions/relation.js +38 -2
  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 -148
  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 -164
  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 -146
  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 -180
  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 -130
  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 -13
  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 +3301 -3245
  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 +1594 -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 -508
  63. package/lib/store/actionDef.d.ts +9 -9
  64. package/lib/store/actionDef.js +135 -135
  65. package/lib/store/checker.d.ts +13 -7
  66. package/lib/store/checker.js +498 -391
  67. package/lib/store/filter.d.ts +109 -100
  68. package/lib/store/filter.js +893 -878
  69. package/lib/store/modi.d.ts +13 -13
  70. package/lib/store/modi.js +198 -206
  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 -14
  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 -0
  96. package/lib/types/Endpoint.js +3 -0
  97. package/lib/types/Entity.d.ts +176 -190
  98. package/lib/types/Entity.js +14 -15
  99. package/lib/types/Exception.d.ts +88 -83
  100. package/lib/types/Exception.js +267 -252
  101. package/lib/types/Expression.d.ts +163 -141
  102. package/lib/types/Expression.js +427 -402
  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 -0
  112. package/lib/types/Port.js +2 -0
  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 -19
  126. package/lib/types/index.js +24 -22
  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 -0
  138. package/lib/utils/date.js +18 -0
  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,508 +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 fn = (0, checker_1.translateCheckerInAsyncContext)(checker);
36
- var trigger = {
37
- checkerType: type,
38
- name: triggerName,
39
- priority: checker.priority || 2,
40
- entity: entity,
41
- action: action,
42
- fn: fn,
43
- when: 'before',
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 = 1; // 默认最低
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
- var filterRepelled = (0, filter_1.checkFilterRepel)(entity, context, filterr, operation.filter);
209
- if (filterRepelled) {
210
- continue;
211
- }
212
- }
213
- var number = trigger.fn({ operation: operation }, context, option);
214
- if (number > 0) {
215
- 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"));
216
- }
217
- }
218
- }
219
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
220
- finally {
221
- try {
222
- if (preTriggers_1_1 && !preTriggers_1_1.done && (_a = preTriggers_1.return)) _a.call(preTriggers_1);
223
- }
224
- finally { if (e_1) throw e_1.error; }
225
- }
226
- (0, assert_1.default)(commitTriggers_1.length === 0, "\u524D\u53F0\u4E0D\u5E94\u6709commitTrigger");
227
- }
228
- else {
229
- // 异步context
230
- var execPreTrigger_1 = function (idx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
231
- var trigger, filter, filterr, filterRepelled, number;
232
- return tslib_1.__generator(this, function (_a) {
233
- switch (_a.label) {
234
- case 0:
235
- if (idx >= preTriggers_2.length) {
236
- return [2 /*return*/];
237
- }
238
- trigger = preTriggers_2[idx];
239
- if (!trigger.filter) return [3 /*break*/, 2];
240
- (0, assert_1.default)(operation.action !== 'create');
241
- filter = trigger.filter;
242
- filterr = typeof filter === 'function' ? filter(operation, context, option) : filter;
243
- return [4 /*yield*/, (0, filter_1.checkFilterRepel)(entity, context, filterr, operation.filter)];
244
- case 1:
245
- filterRepelled = _a.sent();
246
- if (filterRepelled) {
247
- return [2 /*return*/, execPreTrigger_1(idx + 1)];
248
- }
249
- _a.label = 2;
250
- case 2: return [4 /*yield*/, trigger.fn({ operation: operation }, context, option)];
251
- case 3:
252
- number = _a.sent();
253
- if (number > 0) {
254
- 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"));
255
- }
256
- return [2 /*return*/, execPreTrigger_1(idx + 1)];
257
- }
258
- });
259
- }); };
260
- var execCommitTrigger_1 = function (idx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
261
- var trigger, filter, filterr, filterRepelled;
262
- return tslib_1.__generator(this, function (_a) {
263
- switch (_a.label) {
264
- case 0:
265
- if (idx >= commitTriggers_1.length) {
266
- return [2 /*return*/];
267
- }
268
- trigger = commitTriggers_1[idx];
269
- if (!trigger.filter) return [3 /*break*/, 2];
270
- (0, assert_1.default)(operation.action !== 'create');
271
- filter = trigger.filter;
272
- filterr = typeof filter === 'function' ? filter(operation, context, option) : filter;
273
- return [4 /*yield*/, (0, filter_1.checkFilterRepel)(entity, context, filterr, operation.filter)];
274
- case 1:
275
- filterRepelled = _a.sent();
276
- if (filterRepelled) {
277
- return [2 /*return*/, execCommitTrigger_1(idx + 1)];
278
- }
279
- _a.label = 2;
280
- case 2: return [4 /*yield*/, this.preCommitTrigger(entity, operation, trigger, context, option)];
281
- case 3:
282
- _a.sent();
283
- return [2 /*return*/, execCommitTrigger_1(idx + 1)];
284
- }
285
- });
286
- }); };
287
- return execPreTrigger_1(0)
288
- .then(function () { return execCommitTrigger_1(0); });
289
- }
290
- }
291
- };
292
- TriggerExecutor.prototype.onCommit = function (trigger, operation, context, option) {
293
- var _this = this;
294
- return function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
295
- var number, filter;
296
- return tslib_1.__generator(this, function (_a) {
297
- switch (_a.label) {
298
- case 0: return [4 /*yield*/, context.begin()];
299
- case 1:
300
- _a.sent();
301
- return [4 /*yield*/, trigger.fn({
302
- operation: operation,
303
- }, context, option)];
304
- case 2:
305
- number = _a.sent();
306
- if (!(trigger.strict === 'makeSure')) return [3 /*break*/, 4];
307
- filter = {};
308
- if (operation.action === 'create') {
309
- filter = operation.data instanceof Array ? {
310
- filter: {
311
- id: {
312
- $in: operation.data.map(function (ele) { return ele.id; }),
313
- },
314
- },
315
- } : {
316
- filter: {
317
- id: operation.data.id,
318
- }
319
- };
320
- }
321
- else if (operation.filter) {
322
- Object.assign(filter, { filter: operation.filter });
323
- }
324
- return [4 /*yield*/, context.operate(trigger.entity, tslib_1.__assign({ id: 'aaa', action: 'update', data: {
325
- $$triggerTimestamp$$: null,
326
- $$triggerData$$: null,
327
- } }, filter /** as Filter<'update', DeduceFilter<ED[T]['Schema']>> */), {})];
328
- case 3:
329
- _a.sent();
330
- _a.label = 4;
331
- case 4: return [4 /*yield*/, context.commit()];
332
- case 5:
333
- _a.sent();
334
- return [2 /*return*/];
335
- }
336
- });
337
- }); };
338
- };
339
- TriggerExecutor.prototype.postCommitTrigger = function (operation, trigger, context, option) {
340
- return tslib_1.__awaiter(this, void 0, void 0, function () {
341
- return tslib_1.__generator(this, function (_a) {
342
- context.on('commit', this.onCommit(trigger, operation, context, option));
343
- return [2 /*return*/];
344
- });
345
- });
346
- };
347
- TriggerExecutor.prototype.postOperation = function (entity, operation, context, option, result) {
348
- var e_2, _a;
349
- var _this = this;
350
- var _b;
351
- var action = operation.action;
352
- 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); }));
353
- if (triggers) {
354
- var postTriggers_2 = triggers.filter(function (ele) { return ele.when === 'after' && (!ele.check || ele.check(operation)); });
355
- var commitTriggers_2 = triggers.filter(function (ele) { return ele.when === 'commit' && (!ele.check || ele.check(operation)); });
356
- if (context instanceof SyncRowStore_1.SyncContext) {
357
- try {
358
- 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()) {
359
- var trigger = postTriggers_1_1.value;
360
- var number = trigger.fn({
361
- operation: operation,
362
- result: result,
363
- }, context, option);
364
- if (number > 0) {
365
- 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"));
366
- }
367
- }
368
- }
369
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
370
- finally {
371
- try {
372
- if (postTriggers_1_1 && !postTriggers_1_1.done && (_a = postTriggers_1.return)) _a.call(postTriggers_1);
373
- }
374
- finally { if (e_2) throw e_2.error; }
375
- }
376
- (0, assert_1.default)(commitTriggers_2.length === 0, '前台目前应当没有commitTrigger');
377
- }
378
- else {
379
- // 异步context
380
- var execPostTrigger_1 = function (idx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
381
- var trigger, number;
382
- return tslib_1.__generator(this, function (_a) {
383
- switch (_a.label) {
384
- case 0:
385
- if (idx >= postTriggers_2.length) {
386
- return [2 /*return*/];
387
- }
388
- trigger = postTriggers_2[idx];
389
- return [4 /*yield*/, trigger.fn({
390
- operation: operation,
391
- result: result,
392
- }, context, option)];
393
- case 1:
394
- number = _a.sent();
395
- if (number > 0) {
396
- 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"));
397
- }
398
- return [2 /*return*/, execPostTrigger_1(idx + 1)];
399
- }
400
- });
401
- }); };
402
- var execCommitTrigger_2 = function (idx) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
403
- var trigger;
404
- return tslib_1.__generator(this, function (_a) {
405
- switch (_a.label) {
406
- case 0:
407
- if (idx >= commitTriggers_2.length) {
408
- return [2 /*return*/];
409
- }
410
- trigger = commitTriggers_2[idx];
411
- return [4 /*yield*/, this.postCommitTrigger(operation, trigger, context, option)];
412
- case 1:
413
- _a.sent();
414
- return [2 /*return*/, execCommitTrigger_2(idx + 1)];
415
- }
416
- });
417
- }); };
418
- return execPostTrigger_1(0)
419
- .then(function () { return execCommitTrigger_2(0); });
420
- }
421
- }
422
- };
423
- TriggerExecutor.prototype.checkpoint = function (context, timestamp) {
424
- return tslib_1.__awaiter(this, void 0, void 0, function () {
425
- 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;
426
- var e_4, _d, e_3, _e;
427
- return tslib_1.__generator(this, function (_f) {
428
- switch (_f.label) {
429
- case 0:
430
- result = 0;
431
- _f.label = 1;
432
- case 1:
433
- _f.trys.push([1, 14, 15, 16]);
434
- _a = tslib_1.__values(this.volatileEntities), _b = _a.next();
435
- _f.label = 2;
436
- case 2:
437
- if (!!_b.done) return [3 /*break*/, 13];
438
- entity = _b.value;
439
- return [4 /*yield*/, context.select(entity, {
440
- data: {
441
- id: 1,
442
- $$triggerData$$: 1,
443
- },
444
- filter: {
445
- $$triggerTimestamp$$: {
446
- $gt: timestamp,
447
- }
448
- },
449
- }, {
450
- dontCollect: true,
451
- forUpdate: true,
452
- })];
453
- case 3:
454
- rows = _f.sent();
455
- _f.label = 4;
456
- case 4:
457
- _f.trys.push([4, 10, 11, 12]);
458
- rows_1 = (e_3 = void 0, tslib_1.__values(rows)), rows_1_1 = rows_1.next();
459
- _f.label = 5;
460
- case 5:
461
- if (!!rows_1_1.done) return [3 /*break*/, 9];
462
- row = rows_1_1.value;
463
- $$triggerData$$ = row.$$triggerData$$;
464
- _c = $$triggerData$$, name_1 = _c.name, operation = _c.operation, cxtStr = _c.cxtStr, params = _c.params;
465
- trigger = this.triggerNameMap[name_1];
466
- return [4 /*yield*/, this.contextBuilder(cxtStr)];
467
- case 6:
468
- context_1 = _f.sent();
469
- return [4 /*yield*/, this.onCommit(trigger, operation, context_1, params)()];
470
- case 7:
471
- _f.sent();
472
- _f.label = 8;
473
- case 8:
474
- rows_1_1 = rows_1.next();
475
- return [3 /*break*/, 5];
476
- case 9: return [3 /*break*/, 12];
477
- case 10:
478
- e_3_1 = _f.sent();
479
- e_3 = { error: e_3_1 };
480
- return [3 /*break*/, 12];
481
- case 11:
482
- try {
483
- if (rows_1_1 && !rows_1_1.done && (_e = rows_1.return)) _e.call(rows_1);
484
- }
485
- finally { if (e_3) throw e_3.error; }
486
- return [7 /*endfinally*/];
487
- case 12:
488
- _b = _a.next();
489
- return [3 /*break*/, 2];
490
- case 13: return [3 /*break*/, 16];
491
- case 14:
492
- e_4_1 = _f.sent();
493
- e_4 = { error: e_4_1 };
494
- return [3 /*break*/, 16];
495
- case 15:
496
- try {
497
- if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
498
- }
499
- finally { if (e_4) throw e_4.error; }
500
- return [7 /*endfinally*/];
501
- case 16: return [2 /*return*/, result];
502
- }
503
- });
504
- });
505
- };
506
- return TriggerExecutor;
507
- }());
508
- 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;