oak-domain 1.0.0

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 (89) hide show
  1. package/lib/OakError.d.ts +7 -0
  2. package/lib/OakError.js +29 -0
  3. package/lib/actions/action.d.ts +6 -0
  4. package/lib/actions/action.js +12 -0
  5. package/lib/actions/relation.d.ts +1 -0
  6. package/lib/actions/relation.js +2 -0
  7. package/lib/compiler/env.d.ts +10 -0
  8. package/lib/compiler/env.js +26 -0
  9. package/lib/compiler/schemalBuilder.d.ts +2 -0
  10. package/lib/compiler/schemalBuilder.js +2738 -0
  11. package/lib/compiler/uiBuilder.d.ts +1 -0
  12. package/lib/compiler/uiBuilder.js +3 -0
  13. package/lib/compiler/utils.d.ts +2 -0
  14. package/lib/compiler/utils.js +11 -0
  15. package/lib/store/CascadeStore.d.ts +38 -0
  16. package/lib/store/CascadeStore.js +681 -0
  17. package/lib/store/TriggerExecutor.d.ts +30 -0
  18. package/lib/store/TriggerExecutor.js +549 -0
  19. package/lib/store/UniversalContext.d.ts +26 -0
  20. package/lib/store/UniversalContext.js +208 -0
  21. package/lib/store/actionDef.d.ts +8 -0
  22. package/lib/store/actionDef.js +241 -0
  23. package/lib/store/filter.d.ts +36 -0
  24. package/lib/store/filter.js +121 -0
  25. package/lib/store/relation.d.ts +13 -0
  26. package/lib/store/relation.js +64 -0
  27. package/lib/store/watchers.d.ts +2 -0
  28. package/lib/store/watchers.js +32 -0
  29. package/lib/types/Action.d.ts +14 -0
  30. package/lib/types/Action.js +2 -0
  31. package/lib/types/AppLoader.d.ts +11 -0
  32. package/lib/types/AppLoader.js +10 -0
  33. package/lib/types/Aspect.d.ts +12 -0
  34. package/lib/types/Aspect.js +4 -0
  35. package/lib/types/Auth.d.ts +28 -0
  36. package/lib/types/Auth.js +2 -0
  37. package/lib/types/Connector.d.ts +26 -0
  38. package/lib/types/Connector.js +9 -0
  39. package/lib/types/Context.d.ts +14 -0
  40. package/lib/types/Context.js +3 -0
  41. package/lib/types/DataType.d.ts +17 -0
  42. package/lib/types/DataType.js +5 -0
  43. package/lib/types/Demand.d.ts +77 -0
  44. package/lib/types/Demand.js +9 -0
  45. package/lib/types/Entity.d.ts +138 -0
  46. package/lib/types/Entity.js +8 -0
  47. package/lib/types/Exception.d.ts +48 -0
  48. package/lib/types/Exception.js +178 -0
  49. package/lib/types/Expression.d.ts +132 -0
  50. package/lib/types/Expression.js +378 -0
  51. package/lib/types/Geo.d.ts +18 -0
  52. package/lib/types/Geo.js +2 -0
  53. package/lib/types/Locale.d.ts +24 -0
  54. package/lib/types/Locale.js +2 -0
  55. package/lib/types/Logger.d.ts +5 -0
  56. package/lib/types/Logger.js +3 -0
  57. package/lib/types/Polyfill.d.ts +23 -0
  58. package/lib/types/Polyfill.js +2 -0
  59. package/lib/types/RowStore.d.ts +22 -0
  60. package/lib/types/RowStore.js +33 -0
  61. package/lib/types/Storage.d.ts +48 -0
  62. package/lib/types/Storage.js +2 -0
  63. package/lib/types/Trigger.d.ts +105 -0
  64. package/lib/types/Trigger.js +24 -0
  65. package/lib/types/Txn.d.ts +2 -0
  66. package/lib/types/Txn.js +3 -0
  67. package/lib/types/Watcher.d.ts +19 -0
  68. package/lib/types/Watcher.js +4 -0
  69. package/lib/types/index.d.ts +18 -0
  70. package/lib/types/index.js +30 -0
  71. package/lib/types/schema/DataTypes.d.ts +32 -0
  72. package/lib/types/schema/DataTypes.js +3 -0
  73. package/lib/utils/SimpleConnector.d.ts +29 -0
  74. package/lib/utils/SimpleConnector.js +145 -0
  75. package/lib/utils/assert.d.ts +5 -0
  76. package/lib/utils/assert.js +11 -0
  77. package/lib/utils/concurrent.d.ts +15 -0
  78. package/lib/utils/concurrent.js +138 -0
  79. package/lib/utils/geo.d.ts +4 -0
  80. package/lib/utils/geo.js +24 -0
  81. package/lib/utils/lodash.d.ts +16 -0
  82. package/lib/utils/lodash.js +32 -0
  83. package/lib/utils/string.d.ts +2 -0
  84. package/lib/utils/string.js +11 -0
  85. package/lib/utils/uuid.d.ts +2 -0
  86. package/lib/utils/uuid.js +11 -0
  87. package/lib/utils/validator.d.ts +23 -0
  88. package/lib/utils/validator.js +123 -0
  89. package/package.json +38 -0
@@ -0,0 +1,30 @@
1
+ import { EntityDict, OperateOption, SelectOption, SelectRowShape } from "../types/Entity";
2
+ import { Logger } from "../types/Logger";
3
+ import { Checker } from '../types/Auth';
4
+ import { Context } from '../types/Context';
5
+ import { Trigger, Executor } from "../types/Trigger";
6
+ /**
7
+ * update可能会传入多种不同的action,此时都需要检查update trigger
8
+ */
9
+ export declare class TriggerExecutor<ED extends EntityDict, Cxt extends Context<ED>> extends Executor<ED, Cxt> {
10
+ private counter;
11
+ private triggerMap;
12
+ private triggerNameMap;
13
+ private volatileEntities;
14
+ private logger;
15
+ private contextBuilder;
16
+ constructor(contextBuilder: (cxtString: string) => Promise<Cxt>, logger?: Logger);
17
+ registerChecker<T extends keyof ED>(checker: Checker<ED, T, Cxt>): void;
18
+ registerTrigger<T extends keyof ED>(trigger: Trigger<ED, T, Cxt>): void;
19
+ unregisterTrigger<T extends keyof ED>(trigger: Trigger<ED, T, Cxt>): void;
20
+ private preCommitTrigger;
21
+ preOperation<T extends keyof ED>(entity: T, operation: ED[T]['Operation'] | ED[T]['Selection'] & {
22
+ action: 'select';
23
+ }, context: Cxt, option?: OperateOption | SelectOption): Promise<void>;
24
+ private onCommit;
25
+ private postCommitTrigger;
26
+ postOperation<T extends keyof ED>(entity: T, operation: ED[T]['Operation'] | ED[T]['Selection'] & {
27
+ action: 'select';
28
+ }, context: Cxt, option?: OperateOption | SelectOption, result?: SelectRowShape<ED[T]['Schema'], ED[T]['Selection']['data']>[]): Promise<void>;
29
+ checkpoint(context: Cxt, timestamp: number): Promise<number>;
30
+ }
@@ -0,0 +1,549 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __assign = (this && this.__assign) || function () {
18
+ __assign = Object.assign || function(t) {
19
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
20
+ s = arguments[i];
21
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
+ t[p] = s[p];
23
+ }
24
+ return t;
25
+ };
26
+ return __assign.apply(this, arguments);
27
+ };
28
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
29
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
30
+ return new (P || (P = Promise))(function (resolve, reject) {
31
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
32
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
33
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
34
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
35
+ });
36
+ };
37
+ var __generator = (this && this.__generator) || function (thisArg, body) {
38
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
39
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
40
+ function verb(n) { return function (v) { return step([n, v]); }; }
41
+ function step(op) {
42
+ if (f) throw new TypeError("Generator is already executing.");
43
+ while (_) try {
44
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
45
+ if (y = 0, t) op = [op[0] & 2, t.value];
46
+ switch (op[0]) {
47
+ case 0: case 1: t = op; break;
48
+ case 4: _.label++; return { value: op[1], done: false };
49
+ case 5: _.label++; y = op[1]; op = [0]; continue;
50
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
51
+ default:
52
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
53
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
54
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
55
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
56
+ if (t[2]) _.ops.pop();
57
+ _.trys.pop(); continue;
58
+ }
59
+ op = body.call(thisArg, _);
60
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
61
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
62
+ }
63
+ };
64
+ var __values = (this && this.__values) || function(o) {
65
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
66
+ if (m) return m.call(o);
67
+ if (o && typeof o.length === "number") return {
68
+ next: function () {
69
+ if (o && i >= o.length) o = void 0;
70
+ return { value: o && o[i++], done: !o };
71
+ }
72
+ };
73
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
74
+ };
75
+ var __importDefault = (this && this.__importDefault) || function (mod) {
76
+ return (mod && mod.__esModule) ? mod : { "default": mod };
77
+ };
78
+ Object.defineProperty(exports, "__esModule", { value: true });
79
+ exports.TriggerExecutor = void 0;
80
+ var assert_1 = __importDefault(require("assert"));
81
+ var lodash_1 = require("../utils/lodash");
82
+ var filter_1 = require("../store/filter");
83
+ var Trigger_1 = require("../types/Trigger");
84
+ /**
85
+ * update可能会传入多种不同的action,此时都需要检查update trigger
86
+ */
87
+ /* const UnifiedActionMatrix: Record<string, string> = {
88
+ 'create': 'create',
89
+ 'remove': 'remove',
90
+ 'select': 'select',
91
+ 'download': 'select',
92
+ 'count': 'select',
93
+ 'stat': 'select',
94
+ }; */
95
+ var TriggerExecutor = /** @class */ (function (_super) {
96
+ __extends(TriggerExecutor, _super);
97
+ function TriggerExecutor(contextBuilder, logger) {
98
+ if (logger === void 0) { logger = console; }
99
+ var _this = _super.call(this) || this;
100
+ _this.contextBuilder = contextBuilder;
101
+ _this.logger = logger;
102
+ _this.triggerMap = {};
103
+ _this.triggerNameMap = {};
104
+ _this.volatileEntities = [];
105
+ _this.counter = 0;
106
+ return _this;
107
+ }
108
+ TriggerExecutor.prototype.registerChecker = function (checker) {
109
+ var entity = checker.entity, action = checker.action, checkFn = checker.checker, type = checker.type;
110
+ var triggerName = "".concat(entity).concat(action, "\u6743\u9650\u68C0\u67E5-").concat(this.counter++);
111
+ var trigger = {
112
+ checkerType: type,
113
+ name: triggerName,
114
+ entity: entity,
115
+ action: action,
116
+ fn: checkFn,
117
+ when: 'before',
118
+ };
119
+ this.registerTrigger(trigger);
120
+ };
121
+ TriggerExecutor.prototype.registerTrigger = function (trigger) {
122
+ var _a;
123
+ var _this = this;
124
+ // trigger的两种访问方式: by name, by entity/action
125
+ if (this.triggerNameMap.hasOwnProperty(trigger.name)) {
126
+ throw new Error("\u4E0D\u53EF\u6709\u540C\u540D\u7684\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D"));
127
+ }
128
+ Object.assign(this.triggerNameMap, (_a = {},
129
+ _a[trigger.name] = trigger,
130
+ _a));
131
+ var addTrigger = function (action) {
132
+ var _a, _b, _c;
133
+ var triggers = _this.triggerMap[trigger.entity] && _this.triggerMap[trigger.entity][action];
134
+ if (triggers) {
135
+ triggers.push(trigger);
136
+ }
137
+ else if (_this.triggerMap[trigger.entity]) {
138
+ Object.assign(_this.triggerMap[trigger.entity], (_a = {},
139
+ _a[action] = [trigger],
140
+ _a));
141
+ }
142
+ else {
143
+ Object.assign(_this.triggerMap, (_b = {},
144
+ _b[trigger.entity] = (_c = {},
145
+ _c[action] = [trigger],
146
+ _c),
147
+ _b));
148
+ }
149
+ };
150
+ if (typeof trigger.action === 'string') {
151
+ addTrigger(trigger.action);
152
+ }
153
+ else {
154
+ trigger.action.forEach(function (ele) { return addTrigger(ele); });
155
+ }
156
+ if (trigger.when === 'commit' && trigger.strict === 'makeSure') {
157
+ if (this.volatileEntities.indexOf(trigger.entity) === -1) {
158
+ this.volatileEntities.push(trigger.entity);
159
+ }
160
+ }
161
+ };
162
+ TriggerExecutor.prototype.unregisterTrigger = function (trigger) {
163
+ var _this = this;
164
+ (0, assert_1.default)(trigger.when !== 'commit' || trigger.strict !== 'makeSure', 'could not remove strict volatile triggers');
165
+ var removeTrigger = function (action) {
166
+ var triggers = _this.triggerMap[trigger.entity] && _this.triggerMap[trigger.entity][action];
167
+ if (triggers) {
168
+ (0, lodash_1.pull)(triggers, trigger);
169
+ (0, lodash_1.unset)(_this.triggerNameMap, trigger.name);
170
+ }
171
+ };
172
+ if (typeof trigger.action === 'string') {
173
+ removeTrigger(trigger.action);
174
+ }
175
+ else {
176
+ trigger.action.forEach(function (ele) { return removeTrigger(ele); });
177
+ }
178
+ };
179
+ TriggerExecutor.prototype.preCommitTrigger = function (entity, operation, trigger, context, option) {
180
+ return __awaiter(this, void 0, void 0, function () {
181
+ var _a, filter, filter2, rowStore, count, _b, _c, _d, _e;
182
+ var _f, _g;
183
+ return __generator(this, function (_h) {
184
+ switch (_h.label) {
185
+ case 0:
186
+ (0, assert_1.default)(trigger.action !== 'select');
187
+ if (!(trigger.strict === 'makeSure')) return [3 /*break*/, 6];
188
+ _a = operation.action;
189
+ switch (_a) {
190
+ case 'create': return [3 /*break*/, 1];
191
+ }
192
+ return [3 /*break*/, 2];
193
+ case 1:
194
+ {
195
+ if (operation.data.hasOwnProperty(Trigger_1.Executor.dataAttr) || operation.data.hasOwnProperty(Trigger_1.Executor.timestampAttr)) {
196
+ throw new Error('同一行数据上不能存在两个跨事务约束');
197
+ }
198
+ return [3 /*break*/, 4];
199
+ }
200
+ _h.label = 2;
201
+ case 2:
202
+ filter = operation.filter;
203
+ filter2 = (0, filter_1.addFilterSegment)({
204
+ $or: [
205
+ {
206
+ $$triggerData$$: {
207
+ $exists: true,
208
+ },
209
+ },
210
+ {
211
+ $$triggerTimestamp$$: {
212
+ $exists: true,
213
+ },
214
+ }
215
+ ],
216
+ }, filter);
217
+ rowStore = context.rowStore;
218
+ return [4 /*yield*/, rowStore.count(entity, {
219
+ filter: filter2
220
+ }, context)];
221
+ case 3:
222
+ count = _h.sent();
223
+ if (count > 0) {
224
+ throw new Error("\u5BF9\u8C61".concat(entity, "\u7684\u884C\u300C").concat(JSON.stringify(operation), "\u300D\u4E0A\u5DF2\u7ECF\u5B58\u5728\u672A\u5B8C\u6210\u7684\u8DE8\u4E8B\u52A1\u7EA6\u675F"));
225
+ }
226
+ return [3 /*break*/, 4];
227
+ case 4:
228
+ _c = (_b = Object).assign;
229
+ _d = [operation.data];
230
+ _f = {};
231
+ _e = Trigger_1.Executor.dataAttr;
232
+ _g = {
233
+ name: trigger.name,
234
+ operation: operation
235
+ };
236
+ return [4 /*yield*/, context.toString()];
237
+ case 5:
238
+ _c.apply(_b, _d.concat([(_f[_e] = (_g.cxtStr = _h.sent(),
239
+ _g.params = option,
240
+ _g),
241
+ _f[Trigger_1.Executor.timestampAttr] = Date.now(),
242
+ _f)]));
243
+ _h.label = 6;
244
+ case 6: return [2 /*return*/];
245
+ }
246
+ });
247
+ });
248
+ };
249
+ TriggerExecutor.prototype.preOperation = function (entity, operation, context, option) {
250
+ var _a;
251
+ return __awaiter(this, void 0, void 0, function () {
252
+ var action, triggers, preTriggers, preTriggers_1, preTriggers_1_1, trigger, number, e_1_1, commitTriggers, commitTriggers_1, commitTriggers_1_1, trigger, e_2_1;
253
+ var e_1, _b, e_2, _c;
254
+ return __generator(this, function (_d) {
255
+ switch (_d.label) {
256
+ case 0:
257
+ action = operation.action;
258
+ 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 === operation.action || (trigger.action).includes(operation.action); }));
259
+ if (!triggers) return [3 /*break*/, 16];
260
+ preTriggers = triggers.filter(function (ele) { return ele.when === 'before' && (!ele.check || ele.check(operation)); });
261
+ _d.label = 1;
262
+ case 1:
263
+ _d.trys.push([1, 6, 7, 8]);
264
+ preTriggers_1 = __values(preTriggers), preTriggers_1_1 = preTriggers_1.next();
265
+ _d.label = 2;
266
+ case 2:
267
+ if (!!preTriggers_1_1.done) return [3 /*break*/, 5];
268
+ trigger = preTriggers_1_1.value;
269
+ return [4 /*yield*/, trigger.fn({ operation: operation }, context, option)];
270
+ case 3:
271
+ number = _d.sent();
272
+ if (number > 0) {
273
+ 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"));
274
+ }
275
+ _d.label = 4;
276
+ case 4:
277
+ preTriggers_1_1 = preTriggers_1.next();
278
+ return [3 /*break*/, 2];
279
+ case 5: return [3 /*break*/, 8];
280
+ case 6:
281
+ e_1_1 = _d.sent();
282
+ e_1 = { error: e_1_1 };
283
+ return [3 /*break*/, 8];
284
+ case 7:
285
+ try {
286
+ if (preTriggers_1_1 && !preTriggers_1_1.done && (_b = preTriggers_1.return)) _b.call(preTriggers_1);
287
+ }
288
+ finally { if (e_1) throw e_1.error; }
289
+ return [7 /*endfinally*/];
290
+ case 8:
291
+ commitTriggers = triggers.filter(function (ele) { return ele.when === 'commit' && (!ele.check || ele.check(operation)); });
292
+ _d.label = 9;
293
+ case 9:
294
+ _d.trys.push([9, 14, 15, 16]);
295
+ commitTriggers_1 = __values(commitTriggers), commitTriggers_1_1 = commitTriggers_1.next();
296
+ _d.label = 10;
297
+ case 10:
298
+ if (!!commitTriggers_1_1.done) return [3 /*break*/, 13];
299
+ trigger = commitTriggers_1_1.value;
300
+ return [4 /*yield*/, this.preCommitTrigger(entity, operation, trigger, context, option)];
301
+ case 11:
302
+ _d.sent();
303
+ _d.label = 12;
304
+ case 12:
305
+ commitTriggers_1_1 = commitTriggers_1.next();
306
+ return [3 /*break*/, 10];
307
+ case 13: return [3 /*break*/, 16];
308
+ case 14:
309
+ e_2_1 = _d.sent();
310
+ e_2 = { error: e_2_1 };
311
+ return [3 /*break*/, 16];
312
+ case 15:
313
+ try {
314
+ if (commitTriggers_1_1 && !commitTriggers_1_1.done && (_c = commitTriggers_1.return)) _c.call(commitTriggers_1);
315
+ }
316
+ finally { if (e_2) throw e_2.error; }
317
+ return [7 /*endfinally*/];
318
+ case 16: return [2 /*return*/];
319
+ }
320
+ });
321
+ });
322
+ };
323
+ TriggerExecutor.prototype.onCommit = function (trigger, operation, cxtStr, option) {
324
+ var _this = this;
325
+ return function () { return __awaiter(_this, void 0, void 0, function () {
326
+ var context, number, rowStore, filter;
327
+ return __generator(this, function (_a) {
328
+ switch (_a.label) {
329
+ case 0: return [4 /*yield*/, this.contextBuilder(cxtStr)];
330
+ case 1:
331
+ context = _a.sent();
332
+ return [4 /*yield*/, context.begin()];
333
+ case 2:
334
+ _a.sent();
335
+ return [4 /*yield*/, trigger.fn({
336
+ operation: operation,
337
+ }, context, option)];
338
+ case 3:
339
+ number = _a.sent();
340
+ rowStore = context.rowStore;
341
+ if (!(trigger.strict === 'makeSure')) return [3 /*break*/, 5];
342
+ filter = {};
343
+ if (operation.action === 'create') {
344
+ filter = operation.data instanceof Array ? {
345
+ filter: {
346
+ id: {
347
+ $in: operation.data.map(function (ele) { return ele.id; }),
348
+ },
349
+ },
350
+ } : {
351
+ filter: {
352
+ id: operation.data.id,
353
+ }
354
+ };
355
+ }
356
+ else if (operation.filter) {
357
+ Object.assign(filter, { filter: operation.filter });
358
+ }
359
+ return [4 /*yield*/, rowStore.operate(trigger.entity, __assign({ action: 'update', data: {
360
+ $$triggerTimestamp$$: null,
361
+ $$triggerData$$: null,
362
+ } }, filter /** as Filter<'update', DeduceFilter<ED[T]['Schema']>> */), context)];
363
+ case 4:
364
+ _a.sent();
365
+ _a.label = 5;
366
+ case 5: return [4 /*yield*/, context.commit()];
367
+ case 6:
368
+ _a.sent();
369
+ return [2 /*return*/];
370
+ }
371
+ });
372
+ }); };
373
+ };
374
+ TriggerExecutor.prototype.postCommitTrigger = function (operation, trigger, context, option) {
375
+ return __awaiter(this, void 0, void 0, function () {
376
+ var _a, _b, _c, _d, _e;
377
+ return __generator(this, function (_f) {
378
+ switch (_f.label) {
379
+ case 0:
380
+ _b = (_a = context).on;
381
+ _c = ['commit'];
382
+ _d = this.onCommit;
383
+ _e = [trigger, operation];
384
+ return [4 /*yield*/, context.toString()];
385
+ case 1:
386
+ _b.apply(_a, _c.concat([_d.apply(this, _e.concat([_f.sent(), option]))]));
387
+ return [2 /*return*/];
388
+ }
389
+ });
390
+ });
391
+ };
392
+ TriggerExecutor.prototype.postOperation = function (entity, operation, context, option, result) {
393
+ var _a;
394
+ return __awaiter(this, void 0, void 0, function () {
395
+ var action, triggers, postTriggers, postTriggers_1, postTriggers_1_1, trigger, number, e_3_1, commitTriggers, commitTriggers_2, commitTriggers_2_1, trigger, e_4_1;
396
+ var e_3, _b, e_4, _c;
397
+ return __generator(this, function (_d) {
398
+ switch (_d.label) {
399
+ case 0:
400
+ action = operation.action;
401
+ 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 === operation.action || (trigger.action).includes(operation.action); }));
402
+ if (!triggers) return [3 /*break*/, 16];
403
+ postTriggers = triggers.filter(function (ele) { return ele.when === 'after' && (!ele.check || ele.check(operation)); });
404
+ _d.label = 1;
405
+ case 1:
406
+ _d.trys.push([1, 6, 7, 8]);
407
+ postTriggers_1 = __values(postTriggers), postTriggers_1_1 = postTriggers_1.next();
408
+ _d.label = 2;
409
+ case 2:
410
+ if (!!postTriggers_1_1.done) return [3 /*break*/, 5];
411
+ trigger = postTriggers_1_1.value;
412
+ return [4 /*yield*/, trigger.fn({
413
+ operation: operation,
414
+ result: result,
415
+ }, context, option)];
416
+ case 3:
417
+ number = _d.sent();
418
+ if (number > 0) {
419
+ 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"));
420
+ }
421
+ _d.label = 4;
422
+ case 4:
423
+ postTriggers_1_1 = postTriggers_1.next();
424
+ return [3 /*break*/, 2];
425
+ case 5: return [3 /*break*/, 8];
426
+ case 6:
427
+ e_3_1 = _d.sent();
428
+ e_3 = { error: e_3_1 };
429
+ return [3 /*break*/, 8];
430
+ case 7:
431
+ try {
432
+ if (postTriggers_1_1 && !postTriggers_1_1.done && (_b = postTriggers_1.return)) _b.call(postTriggers_1);
433
+ }
434
+ finally { if (e_3) throw e_3.error; }
435
+ return [7 /*endfinally*/];
436
+ case 8:
437
+ commitTriggers = triggers.filter(function (ele) { return ele.when === 'commit' && (!ele.check || ele.check(operation)); });
438
+ _d.label = 9;
439
+ case 9:
440
+ _d.trys.push([9, 14, 15, 16]);
441
+ commitTriggers_2 = __values(commitTriggers), commitTriggers_2_1 = commitTriggers_2.next();
442
+ _d.label = 10;
443
+ case 10:
444
+ if (!!commitTriggers_2_1.done) return [3 /*break*/, 13];
445
+ trigger = commitTriggers_2_1.value;
446
+ return [4 /*yield*/, this.postCommitTrigger(operation, trigger, context, option)];
447
+ case 11:
448
+ _d.sent();
449
+ _d.label = 12;
450
+ case 12:
451
+ commitTriggers_2_1 = commitTriggers_2.next();
452
+ return [3 /*break*/, 10];
453
+ case 13: return [3 /*break*/, 16];
454
+ case 14:
455
+ e_4_1 = _d.sent();
456
+ e_4 = { error: e_4_1 };
457
+ return [3 /*break*/, 16];
458
+ case 15:
459
+ try {
460
+ if (commitTriggers_2_1 && !commitTriggers_2_1.done && (_c = commitTriggers_2.return)) _c.call(commitTriggers_2);
461
+ }
462
+ finally { if (e_4) throw e_4.error; }
463
+ return [7 /*endfinally*/];
464
+ case 16: return [2 /*return*/];
465
+ }
466
+ });
467
+ });
468
+ };
469
+ TriggerExecutor.prototype.checkpoint = function (context, timestamp) {
470
+ return __awaiter(this, void 0, void 0, function () {
471
+ var result, rowStore, _a, _b, entity, rows, rows_1, rows_1_1, row, $$triggerData$$, _c, name_1, operation, cxtStr, params, trigger, e_5_1, e_6_1;
472
+ var e_6, _d, e_5, _e;
473
+ return __generator(this, function (_f) {
474
+ switch (_f.label) {
475
+ case 0:
476
+ result = 0;
477
+ rowStore = context.rowStore;
478
+ _f.label = 1;
479
+ case 1:
480
+ _f.trys.push([1, 13, 14, 15]);
481
+ _a = __values(this.volatileEntities), _b = _a.next();
482
+ _f.label = 2;
483
+ case 2:
484
+ if (!!_b.done) return [3 /*break*/, 12];
485
+ entity = _b.value;
486
+ return [4 /*yield*/, rowStore.select(entity, {
487
+ data: {
488
+ id: 1,
489
+ $$triggerData$$: 1,
490
+ },
491
+ filter: {
492
+ $$triggerTimestamp$$: {
493
+ $gt: timestamp,
494
+ }
495
+ },
496
+ }, context)];
497
+ case 3:
498
+ rows = (_f.sent()).result;
499
+ _f.label = 4;
500
+ case 4:
501
+ _f.trys.push([4, 9, 10, 11]);
502
+ rows_1 = (e_5 = void 0, __values(rows)), rows_1_1 = rows_1.next();
503
+ _f.label = 5;
504
+ case 5:
505
+ if (!!rows_1_1.done) return [3 /*break*/, 8];
506
+ row = rows_1_1.value;
507
+ $$triggerData$$ = row.$$triggerData$$;
508
+ _c = $$triggerData$$, name_1 = _c.name, operation = _c.operation, cxtStr = _c.cxtStr, params = _c.params;
509
+ trigger = this.triggerNameMap[name_1];
510
+ return [4 /*yield*/, this.onCommit(trigger, operation, cxtStr, params)()];
511
+ case 6:
512
+ _f.sent();
513
+ _f.label = 7;
514
+ case 7:
515
+ rows_1_1 = rows_1.next();
516
+ return [3 /*break*/, 5];
517
+ case 8: return [3 /*break*/, 11];
518
+ case 9:
519
+ e_5_1 = _f.sent();
520
+ e_5 = { error: e_5_1 };
521
+ return [3 /*break*/, 11];
522
+ case 10:
523
+ try {
524
+ if (rows_1_1 && !rows_1_1.done && (_e = rows_1.return)) _e.call(rows_1);
525
+ }
526
+ finally { if (e_5) throw e_5.error; }
527
+ return [7 /*endfinally*/];
528
+ case 11:
529
+ _b = _a.next();
530
+ return [3 /*break*/, 2];
531
+ case 12: return [3 /*break*/, 15];
532
+ case 13:
533
+ e_6_1 = _f.sent();
534
+ e_6 = { error: e_6_1 };
535
+ return [3 /*break*/, 15];
536
+ case 14:
537
+ try {
538
+ if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
539
+ }
540
+ finally { if (e_6) throw e_6.error; }
541
+ return [7 /*endfinally*/];
542
+ case 15: return [2 /*return*/, result];
543
+ }
544
+ });
545
+ });
546
+ };
547
+ return TriggerExecutor;
548
+ }(Trigger_1.Executor));
549
+ exports.TriggerExecutor = TriggerExecutor;
@@ -0,0 +1,26 @@
1
+ import { EntityDict, OpRecord, RowStore, TxnOption, Context } from "../types";
2
+ export declare abstract class UniversalContext<ED extends EntityDict> implements Context<ED> {
3
+ rowStore: RowStore<ED, this>;
4
+ uuid?: string;
5
+ opRecords: OpRecord<ED>[];
6
+ private scene?;
7
+ private rwLock;
8
+ events: {
9
+ commit: Array<() => Promise<void>>;
10
+ rollback: Array<() => Promise<void>>;
11
+ };
12
+ constructor(store: RowStore<ED, UniversalContext<ED>>);
13
+ getScene(): string | undefined;
14
+ setScene(scene?: string): void;
15
+ private resetEvents;
16
+ on(event: 'commit' | 'rollback', callback: () => Promise<void>): void;
17
+ /**
18
+ * 一个context中不应该有并发的事务,这里将事务串行化,使用的时候千万要注意不要自己等自己
19
+ * @param options
20
+ */
21
+ begin(options?: TxnOption): Promise<void>;
22
+ commit(): Promise<void>;
23
+ rollback(): Promise<void>;
24
+ getCurrentTxnId(): string | undefined;
25
+ abstract toString(): Promise<string>;
26
+ }