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