@logicflow/engine 0.0.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 (67) hide show
  1. package/README.md +22 -0
  2. package/cjs/EventEmitter.js +70 -0
  3. package/cjs/FlowModel.js +252 -0
  4. package/cjs/Scheduler.js +278 -0
  5. package/cjs/constant/LogCode.js +31 -0
  6. package/cjs/constant/constant.js +23 -0
  7. package/cjs/expression/browserVm.js +69 -0
  8. package/cjs/expression/index.js +63 -0
  9. package/cjs/expression/nodeVm.js +53 -0
  10. package/cjs/index.js +161 -0
  11. package/cjs/nodes/BaseNode.js +243 -0
  12. package/cjs/nodes/StartNode.js +27 -0
  13. package/cjs/nodes/TaskNode.js +27 -0
  14. package/cjs/recorder/index.js +112 -0
  15. package/cjs/util/ID.js +12 -0
  16. package/cjs/util/global.js +32 -0
  17. package/cjs/util/storage.js +41 -0
  18. package/es/EventEmitter.d.ts +7 -0
  19. package/es/EventEmitter.js +68 -0
  20. package/es/FlowModel.d.ts +104 -0
  21. package/es/FlowModel.js +250 -0
  22. package/es/Scheduler.d.ts +51 -0
  23. package/es/Scheduler.js +276 -0
  24. package/es/constant/LogCode.d.ts +12 -0
  25. package/es/constant/LogCode.js +28 -0
  26. package/es/constant/constant.d.ts +14 -0
  27. package/es/constant/constant.js +20 -0
  28. package/es/expression/browserVm.d.ts +2 -0
  29. package/es/expression/browserVm.js +66 -0
  30. package/es/expression/index.d.ts +2 -0
  31. package/es/expression/index.js +60 -0
  32. package/es/expression/nodeVm.d.ts +2 -0
  33. package/es/expression/nodeVm.js +50 -0
  34. package/es/index.d.ts +47 -0
  35. package/es/index.js +156 -0
  36. package/es/nodes/BaseNode.d.ts +109 -0
  37. package/es/nodes/BaseNode.js +241 -0
  38. package/es/nodes/StartNode.d.ts +5 -0
  39. package/es/nodes/StartNode.js +25 -0
  40. package/es/nodes/TaskNode.d.ts +5 -0
  41. package/es/nodes/TaskNode.js +25 -0
  42. package/es/recorder/index.d.ts +9 -0
  43. package/es/recorder/index.js +110 -0
  44. package/es/util/ID.d.ts +2 -0
  45. package/es/util/ID.js +9 -0
  46. package/es/util/global.d.ts +5 -0
  47. package/es/util/global.js +26 -0
  48. package/es/util/storage.d.ts +6 -0
  49. package/es/util/storage.js +39 -0
  50. package/lib/main.js +1 -0
  51. package/package.json +87 -0
  52. package/types/EventEmitter.d.ts +7 -0
  53. package/types/FlowModel.d.ts +104 -0
  54. package/types/Scheduler.d.ts +51 -0
  55. package/types/constant/LogCode.d.ts +12 -0
  56. package/types/constant/constant.d.ts +14 -0
  57. package/types/expression/browserVm.d.ts +2 -0
  58. package/types/expression/index.d.ts +2 -0
  59. package/types/expression/nodeVm.d.ts +2 -0
  60. package/types/index.d.ts +47 -0
  61. package/types/nodes/BaseNode.d.ts +109 -0
  62. package/types/nodes/StartNode.d.ts +5 -0
  63. package/types/nodes/TaskNode.d.ts +5 -0
  64. package/types/recorder/index.d.ts +9 -0
  65. package/types/util/ID.d.ts +2 -0
  66. package/types/util/global.d.ts +5 -0
  67. package/types/util/storage.d.ts +6 -0
@@ -0,0 +1,276 @@
1
+ var __extends = (this && this.__extends) || (function () {
2
+ var extendStatics = function (d, b) {
3
+ extendStatics = Object.setPrototypeOf ||
4
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
5
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
6
+ return extendStatics(d, b);
7
+ };
8
+ return function (d, b) {
9
+ extendStatics(d, b);
10
+ function __() { this.constructor = d; }
11
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
12
+ };
13
+ })();
14
+ var __assign = (this && this.__assign) || function () {
15
+ __assign = Object.assign || function(t) {
16
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
17
+ s = arguments[i];
18
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
19
+ t[p] = s[p];
20
+ }
21
+ return t;
22
+ };
23
+ return __assign.apply(this, arguments);
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __generator = (this && this.__generator) || function (thisArg, body) {
35
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
+ function verb(n) { return function (v) { return step([n, v]); }; }
38
+ function step(op) {
39
+ if (f) throw new TypeError("Generator is already executing.");
40
+ while (_) try {
41
+ 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;
42
+ if (y = 0, t) op = [op[0] & 2, t.value];
43
+ switch (op[0]) {
44
+ case 0: case 1: t = op; break;
45
+ case 4: _.label++; return { value: op[1], done: false };
46
+ case 5: _.label++; y = op[1]; op = [0]; continue;
47
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
+ default:
49
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
+ if (t[2]) _.ops.pop();
54
+ _.trys.pop(); continue;
55
+ }
56
+ op = body.call(thisArg, _);
57
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
+ }
60
+ };
61
+ import EventEmitter from './EventEmitter';
62
+ import { EVENT_INSTANCE_COMPLETE, EVENT_INSTANCE_INTERRUPTED, FlowStatus, } from './constant/constant';
63
+ import { createTaskId } from './util/ID';
64
+ /**
65
+ * 调度器
66
+ * 通过一个队列维护需要执行的节点,一个集合维护正在执行的节点
67
+ */
68
+ var Scheduler = /** @class */ (function (_super) {
69
+ __extends(Scheduler, _super);
70
+ function Scheduler(config) {
71
+ var _this = _super.call(this) || this;
72
+ _this.nodeQueueMap = new Map();
73
+ _this.taskRunningMap = new Map();
74
+ _this.flowModel = config.flowModel;
75
+ _this.recorder = config.recorder;
76
+ _this.currentTask = null;
77
+ return _this;
78
+ }
79
+ /**
80
+ * 添加一个任务到队列中。
81
+ * 1. 由流程模型将所有的开始节点添加到队列中。
82
+ * 2. 当一个节点执行完成后,将后续的节点添加到队列中。
83
+ */
84
+ Scheduler.prototype.addTask = function (nodeParam) {
85
+ var executionId = nodeParam.executionId;
86
+ if (!this.nodeQueueMap.has(executionId)) {
87
+ this.nodeQueueMap.set(executionId, []);
88
+ }
89
+ var currentTaskQueue = this.nodeQueueMap.get(executionId);
90
+ currentTaskQueue.push(nodeParam);
91
+ };
92
+ /**
93
+ * 调度器执行下一个任务
94
+ * 1. 提供给流程模型,用户开始执行第一个任务。
95
+ * 2. 内部任务执行完成后,调用此方法继续执行下一个任务。
96
+ * 3. 当判断没有可以继续执行的任务后,触发流程结束事件。
97
+ */
98
+ Scheduler.prototype.run = function (runParams) {
99
+ var nodeQueue = this.nodeQueueMap.get(runParams.executionId);
100
+ if (nodeQueue.length > 0) {
101
+ this.nodeQueueMap.set(runParams.executionId, []);
102
+ for (var i = 0; i < nodeQueue.length; i++) {
103
+ var currentNode = nodeQueue[i];
104
+ var taskId = createTaskId();
105
+ var taskParam = __assign(__assign({}, currentNode), { taskId: taskId });
106
+ this.pushTaskToRunningMap(taskParam);
107
+ this.exec(taskParam);
108
+ }
109
+ }
110
+ else if (!this.hasRunningTask(runParams.executionId)) {
111
+ // 当一个流程在nodeQueueMap和taskRunningMap中都不存在执行的节点时,说明这个流程已经执行完成。
112
+ this.emit(EVENT_INSTANCE_COMPLETE, {
113
+ executionId: runParams.executionId,
114
+ nodeId: runParams.nodeId,
115
+ taskId: runParams.taskId,
116
+ status: FlowStatus.COMPLETED,
117
+ });
118
+ }
119
+ };
120
+ /**
121
+ * 恢复某个任务的执行。
122
+ * 可以自定义节点手动实现流程中断,然后通过此方法恢复流程的执行。
123
+ */
124
+ Scheduler.prototype.resume = function (resumeParam) {
125
+ return __awaiter(this, void 0, void 0, function () {
126
+ var model;
127
+ return __generator(this, function (_a) {
128
+ switch (_a.label) {
129
+ case 0:
130
+ this.pushTaskToRunningMap({
131
+ executionId: resumeParam.executionId,
132
+ nodeId: resumeParam.nodeId,
133
+ taskId: resumeParam.taskId,
134
+ });
135
+ model = this.flowModel.createTask(resumeParam.nodeId);
136
+ return [4 /*yield*/, model.resume(__assign(__assign({}, resumeParam), { next: this.next.bind(this) }))];
137
+ case 1:
138
+ _a.sent();
139
+ return [2 /*return*/];
140
+ }
141
+ });
142
+ });
143
+ };
144
+ // 流程执行过程中出错,停止执行
145
+ Scheduler.prototype.stop = function (data) {
146
+ console.log('stop', data);
147
+ };
148
+ Scheduler.prototype.pushTaskToRunningMap = function (taskParam) {
149
+ var executionId = taskParam.executionId, taskId = taskParam.taskId;
150
+ if (!this.taskRunningMap.has(executionId)) {
151
+ var runningMap = new Map();
152
+ this.taskRunningMap.set(executionId, runningMap);
153
+ }
154
+ this.taskRunningMap.get(executionId).set(taskId, taskParam);
155
+ };
156
+ Scheduler.prototype.removeTaskFromRunningMap = function (taskParam) {
157
+ var executionId = taskParam.executionId, taskId = taskParam.taskId;
158
+ if (!taskId)
159
+ return;
160
+ var runningMap = this.taskRunningMap.get(executionId);
161
+ if (!runningMap)
162
+ return;
163
+ runningMap.delete(taskId);
164
+ };
165
+ Scheduler.prototype.hasRunningTask = function (executionId) {
166
+ var runningMap = this.taskRunningMap.get(executionId);
167
+ if (!runningMap)
168
+ return false;
169
+ if (runningMap.size === 0) {
170
+ this.taskRunningMap.delete(executionId);
171
+ return false;
172
+ }
173
+ return true;
174
+ };
175
+ Scheduler.prototype.exec = function (taskParam) {
176
+ return __awaiter(this, void 0, void 0, function () {
177
+ var model, execResult;
178
+ return __generator(this, function (_a) {
179
+ switch (_a.label) {
180
+ case 0:
181
+ model = this.flowModel.createTask(taskParam.nodeId);
182
+ return [4 /*yield*/, model.execute({
183
+ executionId: taskParam.executionId,
184
+ taskId: taskParam.taskId,
185
+ nodeId: taskParam.nodeId,
186
+ next: this.next.bind(this),
187
+ })];
188
+ case 1:
189
+ execResult = _a.sent();
190
+ if (execResult && execResult.status === FlowStatus.INTERRUPTED) {
191
+ this.interrupted({
192
+ execResult: execResult,
193
+ taskParam: taskParam,
194
+ });
195
+ this.saveTaskResult({
196
+ executionId: taskParam.executionId,
197
+ nodeId: taskParam.nodeId,
198
+ taskId: taskParam.taskId,
199
+ nodeType: execResult.nodeType,
200
+ properties: execResult.properties,
201
+ outgoing: [],
202
+ extraInfo: {
203
+ status: execResult.status,
204
+ detail: execResult.detail,
205
+ },
206
+ });
207
+ this.removeTaskFromRunningMap(taskParam);
208
+ }
209
+ return [2 /*return*/];
210
+ }
211
+ });
212
+ });
213
+ };
214
+ Scheduler.prototype.interrupted = function (_a) {
215
+ var execResult = _a.execResult, taskParam = _a.taskParam;
216
+ this.emit(EVENT_INSTANCE_INTERRUPTED, {
217
+ executionId: taskParam.executionId,
218
+ status: FlowStatus.INTERRUPTED,
219
+ nodeId: taskParam.nodeId,
220
+ taskId: taskParam.taskId,
221
+ detail: execResult.detail,
222
+ });
223
+ };
224
+ Scheduler.prototype.next = function (data) {
225
+ return __awaiter(this, void 0, void 0, function () {
226
+ var _this = this;
227
+ return __generator(this, function (_a) {
228
+ switch (_a.label) {
229
+ case 0:
230
+ if (data.outgoing && data.outgoing.length > 0) {
231
+ data.outgoing.forEach(function (item) {
232
+ _this.addTask({
233
+ executionId: data.executionId,
234
+ nodeId: item.target,
235
+ });
236
+ });
237
+ }
238
+ return [4 /*yield*/, this.saveTaskResult(data)];
239
+ case 1:
240
+ _a.sent();
241
+ this.removeTaskFromRunningMap(data);
242
+ this.run({
243
+ executionId: data.executionId,
244
+ nodeId: data.nodeId,
245
+ taskId: data.taskId,
246
+ });
247
+ return [2 /*return*/];
248
+ }
249
+ });
250
+ });
251
+ };
252
+ /**
253
+ * 为了防止多次添加导致
254
+ */
255
+ Scheduler.prototype.saveTaskResult = function (data) {
256
+ return __awaiter(this, void 0, void 0, function () {
257
+ return __generator(this, function (_a) {
258
+ switch (_a.label) {
259
+ case 0: return [4 /*yield*/, this.recorder.addTask({
260
+ executionId: data.executionId,
261
+ taskId: data.taskId,
262
+ nodeId: data.nodeId,
263
+ nodeType: data.nodeType,
264
+ timestamp: Date.now(),
265
+ properties: data.properties,
266
+ })];
267
+ case 1:
268
+ _a.sent();
269
+ return [2 /*return*/];
270
+ }
271
+ });
272
+ });
273
+ };
274
+ return Scheduler;
275
+ }(EventEmitter));
276
+ export default Scheduler;
@@ -0,0 +1,12 @@
1
+ export declare enum ErrorCode {
2
+ NONE_START_NODE = 1000,
3
+ NONE_NODE_ID = 1001,
4
+ NO_DOCUMENT_BODY = 2001
5
+ }
6
+ export declare enum WarningCode {
7
+ NONE_START_NODE_IN_DATA = 2000,
8
+ START_NODE_INCOMING = 2001,
9
+ EXPRESSION_EXEC_ERROR = 3000
10
+ }
11
+ export declare const getErrorMsg: (code: ErrorCode) => string;
12
+ export declare const getWarningMsg: (code: WarningCode) => string;
@@ -0,0 +1,28 @@
1
+ var _a, _b;
2
+ export var ErrorCode;
3
+ (function (ErrorCode) {
4
+ // 模型数据错误
5
+ ErrorCode[ErrorCode["NONE_START_NODE"] = 1000] = "NONE_START_NODE";
6
+ ErrorCode[ErrorCode["NONE_NODE_ID"] = 1001] = "NONE_NODE_ID";
7
+ // 表达式错误
8
+ ErrorCode[ErrorCode["NO_DOCUMENT_BODY"] = 2001] = "NO_DOCUMENT_BODY";
9
+ })(ErrorCode || (ErrorCode = {}));
10
+ export var WarningCode;
11
+ (function (WarningCode) {
12
+ WarningCode[WarningCode["NONE_START_NODE_IN_DATA"] = 2000] = "NONE_START_NODE_IN_DATA";
13
+ WarningCode[WarningCode["START_NODE_INCOMING"] = 2001] = "START_NODE_INCOMING";
14
+ // 表达式判断异常
15
+ WarningCode[WarningCode["EXPRESSION_EXEC_ERROR"] = 3000] = "EXPRESSION_EXEC_ERROR";
16
+ })(WarningCode || (WarningCode = {}));
17
+ var errorMsgMapCn = (_a = {},
18
+ _a[ErrorCode.NONE_START_NODE] = '未找到入度为0的节点',
19
+ _a[ErrorCode.NONE_NODE_ID] = '流程数据中存在没有此节点',
20
+ _a[ErrorCode.NO_DOCUMENT_BODY] = '找不到document.body, 请在DOM加载完成后再执行',
21
+ _a);
22
+ var warningMsgMapCn = (_b = {},
23
+ _b[WarningCode.NONE_START_NODE_IN_DATA] = '初始化数据中未找到入度为0的节点',
24
+ _b[WarningCode.START_NODE_INCOMING] = '开始节点不允许被连入',
25
+ _b[WarningCode.EXPRESSION_EXEC_ERROR] = '表达式执行异常',
26
+ _b);
27
+ export var getErrorMsg = function (code) { return "error[" + code + "]: " + errorMsgMapCn[code]; };
28
+ export var getWarningMsg = function (code) { return "warning[" + code + "]: " + warningMsgMapCn[code]; };
@@ -0,0 +1,14 @@
1
+ export declare const BASE_START_NODE = "start";
2
+ export declare const EVENT_INSTANCE_COMPLETE = "instance:complete";
3
+ export declare const EVENT_INSTANCE_INTERRUPTED = "instance:interrupted";
4
+ export declare enum FlowStatus {
5
+ COMPLETED = "completed",
6
+ INTERRUPTED = "interrupted",
7
+ RUNNING = "running",
8
+ ERROR = "error"
9
+ }
10
+ export declare enum TaskStatus {
11
+ SUCCESS = "success",
12
+ ERROR = "error",
13
+ INTERRUPTED = "interrupted"
14
+ }
@@ -0,0 +1,20 @@
1
+ // baseType
2
+ export var BASE_START_NODE = 'start';
3
+ // event name
4
+ export var EVENT_INSTANCE_COMPLETE = 'instance:complete';
5
+ export var EVENT_INSTANCE_INTERRUPTED = 'instance:interrupted';
6
+ // flow status
7
+ export var FlowStatus;
8
+ (function (FlowStatus) {
9
+ FlowStatus["COMPLETED"] = "completed";
10
+ FlowStatus["INTERRUPTED"] = "interrupted";
11
+ FlowStatus["RUNNING"] = "running";
12
+ FlowStatus["ERROR"] = "error";
13
+ })(FlowStatus || (FlowStatus = {}));
14
+ // task status
15
+ export var TaskStatus;
16
+ (function (TaskStatus) {
17
+ TaskStatus["SUCCESS"] = "success";
18
+ TaskStatus["ERROR"] = "error";
19
+ TaskStatus["INTERRUPTED"] = "interrupted";
20
+ })(TaskStatus || (TaskStatus = {}));
@@ -0,0 +1,2 @@
1
+ declare const runInBrowserContext: (code: string, globalData?: any) => Promise<any>;
2
+ export { runInBrowserContext, };
@@ -0,0 +1,66 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (_) try {
17
+ 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;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { ErrorCode, WarningCode, getErrorMsg, getWarningMsg, } from '../constant/LogCode';
38
+ var runInBrowserContext = function (code, globalData) {
39
+ if (globalData === void 0) { globalData = {}; }
40
+ return __awaiter(void 0, void 0, void 0, function () {
41
+ var iframe, iframeWindow, iframeEval, res;
42
+ return __generator(this, function (_a) {
43
+ iframe = document.createElement('iframe');
44
+ iframe.style.display = 'none';
45
+ if (!document || !document.body) {
46
+ console.error(getErrorMsg(ErrorCode.NO_DOCUMENT_BODY));
47
+ }
48
+ document.body.appendChild(iframe);
49
+ iframeWindow = iframe.contentWindow;
50
+ iframeEval = iframeWindow.eval;
51
+ Object.keys(globalData).forEach(function (key) {
52
+ iframeWindow[key] = globalData[key];
53
+ });
54
+ res = null;
55
+ try {
56
+ res = iframeEval.call(iframeWindow, code);
57
+ }
58
+ catch (e) {
59
+ console.warn(getWarningMsg(WarningCode.EXPRESSION_EXEC_ERROR), { code: code, globalData: globalData, e: e });
60
+ }
61
+ document.body.removeChild(iframe);
62
+ return [2 /*return*/, res];
63
+ });
64
+ });
65
+ };
66
+ export { runInBrowserContext, };
@@ -0,0 +1,2 @@
1
+ declare const getExpressionResult: (code: string, context: any) => Promise<any>;
2
+ export { getExpressionResult, };
@@ -0,0 +1,60 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (_) try {
17
+ 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;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { runInNewContext } from './nodeVm';
38
+ import { runInBrowserContext } from './browserVm';
39
+ import { isInNodeJS, isInBrowser, globalScope } from '../util/global';
40
+ var getExpressionResult = function (code, context) { return __awaiter(void 0, void 0, void 0, function () {
41
+ var r, r;
42
+ return __generator(this, function (_a) {
43
+ switch (_a.label) {
44
+ case 0:
45
+ if (!isInNodeJS) return [3 /*break*/, 2];
46
+ return [4 /*yield*/, runInNewContext(code, context)];
47
+ case 1:
48
+ r = _a.sent();
49
+ return [2 /*return*/, r];
50
+ case 2:
51
+ if (!isInBrowser) return [3 /*break*/, 4];
52
+ return [4 /*yield*/, runInBrowserContext(code, context)];
53
+ case 3:
54
+ r = _a.sent();
55
+ return [2 /*return*/, r];
56
+ case 4: return [2 /*return*/, globalScope.eval(code)]; // eslint-disable-line no-eval
57
+ }
58
+ });
59
+ }); };
60
+ export { getExpressionResult, };
@@ -0,0 +1,2 @@
1
+ declare const runInNewContext: (code: string, globalData?: any) => Promise<any>;
2
+ export { runInNewContext, };
@@ -0,0 +1,50 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (_) try {
17
+ 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;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ // import vm from 'node:vm';
38
+ var vm = require('vm');
39
+ var runInNewContext = function (code, globalData) {
40
+ if (globalData === void 0) { globalData = {}; }
41
+ return __awaiter(void 0, void 0, void 0, function () {
42
+ var context;
43
+ return __generator(this, function (_a) {
44
+ context = vm.createContext(globalData);
45
+ vm.runInContext(code, context);
46
+ return [2 /*return*/, context];
47
+ });
48
+ });
49
+ };
50
+ export { runInNewContext, };
package/es/index.d.ts ADDED
@@ -0,0 +1,47 @@
1
+ import type { ResumeParams, GraphConfigData } from './types.d';
2
+ import FlowModel, { TaskParams } from './FlowModel';
3
+ import StartNode from './nodes/StartNode';
4
+ import TaskNode from './nodes/TaskNode';
5
+ import Recorder from './recorder';
6
+ export default class Engine {
7
+ global: Record<string, any>;
8
+ graphData: GraphConfigData;
9
+ nodeModelMap: Map<string, any>;
10
+ flowModel: FlowModel;
11
+ recorder: Recorder;
12
+ constructor();
13
+ /**
14
+ * 注册节点
15
+ * @param nodeConfig { type: 'custom-node', model: Class }
16
+ */
17
+ register(nodeConfig: any): void;
18
+ /**
19
+ * 自定义执行记录的存储,默认浏览器使用 sessionStorage,nodejs 使用内存存储。
20
+ * 注意:由于执行记录不会主动删除,所以需要自行清理。
21
+ * nodejs环境建议自定义为持久化存储。
22
+ * engine.setCustomRecorder({
23
+ * async addTask(task) {}
24
+ * async getTask(taskId) {}
25
+ * async getExecutionTasks(executionId) {}
26
+ * clear() {}
27
+ * });
28
+ */
29
+ setCustomRecorder(recorder: Recorder): void;
30
+ /**
31
+ * 加载流程图数据
32
+ */
33
+ load({ graphData, startNodeType, globalData, context, }: {
34
+ graphData: any;
35
+ startNodeType?: string;
36
+ globalData?: {};
37
+ context?: {};
38
+ }): FlowModel;
39
+ /**
40
+ * 执行流程,允许多次调用。
41
+ */
42
+ execute(execParam?: TaskParams): Promise<unknown>;
43
+ resume(resumeParam: ResumeParams): Promise<unknown>;
44
+ getExecutionRecord(executionId: any): Promise<any[]>;
45
+ }
46
+ export { Engine, TaskNode, StartNode, };
47
+ export type { TaskParams, };