@logicflow/engine 0.0.9 → 0.0.10-beta.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 (190) hide show
  1. package/README.md +5 -2
  2. package/dist/index.js +2 -0
  3. package/dist/index.js.map +1 -0
  4. package/es/EventEmitter.d.ts +34 -4
  5. package/es/EventEmitter.js +70 -48
  6. package/es/EventEmitter.js.map +1 -0
  7. package/es/FlowModel.d.ts +75 -73
  8. package/es/FlowModel.js +130 -173
  9. package/es/FlowModel.js.map +1 -0
  10. package/es/Scheduler.d.ts +50 -34
  11. package/es/Scheduler.js +134 -209
  12. package/es/Scheduler.js.map +1 -0
  13. package/es/constant/{constant.js → index.js} +8 -7
  14. package/es/constant/index.js.map +1 -0
  15. package/es/constant/logCode.js +29 -0
  16. package/es/constant/logCode.js.map +1 -0
  17. package/es/expression/brewserVm.d.ts +2 -0
  18. package/es/expression/brewserVm.js +30 -0
  19. package/es/expression/brewserVm.js.map +1 -0
  20. package/es/expression/index.d.ts +1 -1
  21. package/es/expression/index.js +16 -59
  22. package/es/expression/index.js.map +1 -0
  23. package/es/expression/nodeVm.d.ts +4 -2
  24. package/es/expression/nodeVm.js +10 -50
  25. package/es/expression/nodeVm.js.map +1 -0
  26. package/es/index.d.ts +135 -38
  27. package/es/index.js +92 -144
  28. package/es/index.js.map +1 -0
  29. package/es/nodes/base.d.ts +108 -0
  30. package/es/nodes/base.js +149 -0
  31. package/es/nodes/base.js.map +1 -0
  32. package/es/nodes/index.d.ts +3 -0
  33. package/es/nodes/index.js +4 -0
  34. package/es/nodes/index.js.map +1 -0
  35. package/es/nodes/{StartNode.d.ts → start.d.ts} +3 -2
  36. package/es/nodes/start.js +11 -0
  37. package/es/nodes/start.js.map +1 -0
  38. package/es/nodes/{TaskNode.d.ts → task.d.ts} +3 -2
  39. package/es/nodes/task.js +11 -0
  40. package/es/nodes/task.js.map +1 -0
  41. package/es/platform/browser/browserVm.d.ts +4 -0
  42. package/es/platform/browser/browserVm.js +44 -0
  43. package/es/platform/browser/browserVm.js.map +1 -0
  44. package/es/platform/browser/index.d.ts +4 -0
  45. package/es/platform/browser/index.js +23 -0
  46. package/es/platform/browser/index.js.map +1 -0
  47. package/es/platform/index.d.ts +1 -0
  48. package/es/platform/index.js +2 -0
  49. package/es/platform/index.js.map +1 -0
  50. package/es/platform/node/index.d.ts +4 -0
  51. package/es/platform/node/index.js +23 -0
  52. package/es/platform/node/index.js.map +1 -0
  53. package/es/platform/node/nodeVm.d.ts +1 -0
  54. package/es/platform/node/nodeVm.js +9 -0
  55. package/es/platform/node/nodeVm.js.map +1 -0
  56. package/es/recorder/index.d.ts +36 -10
  57. package/es/recorder/index.js +82 -135
  58. package/es/recorder/index.js.map +1 -0
  59. package/es/utils/global.d.ts +5 -0
  60. package/es/utils/global.js +27 -0
  61. package/es/utils/global.js.map +1 -0
  62. package/es/utils/id.js +14 -0
  63. package/es/utils/id.js.map +1 -0
  64. package/es/utils/index.d.ts +4 -0
  65. package/es/utils/index.js +5 -0
  66. package/es/utils/index.js.map +1 -0
  67. package/es/{util → utils}/storage.js +17 -16
  68. package/es/utils/storage.js.map +1 -0
  69. package/lib/EventEmitter.d.ts +37 -0
  70. package/lib/EventEmitter.js +94 -0
  71. package/lib/EventEmitter.js.map +1 -0
  72. package/lib/FlowModel.d.ts +146 -0
  73. package/lib/FlowModel.js +236 -0
  74. package/lib/FlowModel.js.map +1 -0
  75. package/lib/Scheduler.d.ts +78 -0
  76. package/lib/Scheduler.js +179 -0
  77. package/lib/Scheduler.js.map +1 -0
  78. package/lib/constant/index.d.ts +16 -0
  79. package/{cjs/constant/constant.js → lib/constant/index.js} +4 -3
  80. package/lib/constant/index.js.map +1 -0
  81. package/lib/constant/logCode.d.ts +12 -0
  82. package/{cjs/constant/LogCode.js → lib/constant/logCode.js} +16 -13
  83. package/lib/constant/logCode.js.map +1 -0
  84. package/lib/expression/brewserVm.d.ts +2 -0
  85. package/lib/expression/brewserVm.js +33 -0
  86. package/lib/expression/brewserVm.js.map +1 -0
  87. package/lib/expression/index.d.ts +2 -0
  88. package/lib/expression/index.js +20 -0
  89. package/lib/expression/index.js.map +1 -0
  90. package/lib/expression/nodeVm.d.ts +4 -0
  91. package/lib/expression/nodeVm.js +13 -0
  92. package/lib/expression/nodeVm.js.map +1 -0
  93. package/lib/index.d.ts +157 -0
  94. package/lib/index.js +159 -0
  95. package/lib/index.js.map +1 -0
  96. package/lib/nodes/base.d.ts +108 -0
  97. package/lib/nodes/base.js +152 -0
  98. package/lib/nodes/base.js.map +1 -0
  99. package/lib/nodes/index.d.ts +3 -0
  100. package/lib/nodes/index.js +7 -0
  101. package/lib/nodes/index.js.map +1 -0
  102. package/lib/nodes/start.d.ts +6 -0
  103. package/lib/nodes/start.js +15 -0
  104. package/lib/nodes/start.js.map +1 -0
  105. package/lib/nodes/task.d.ts +6 -0
  106. package/lib/nodes/task.js +15 -0
  107. package/lib/nodes/task.js.map +1 -0
  108. package/lib/platform/browser/browserVm.d.ts +4 -0
  109. package/lib/platform/browser/browserVm.js +49 -0
  110. package/lib/platform/browser/browserVm.js.map +1 -0
  111. package/lib/platform/browser/index.d.ts +4 -0
  112. package/lib/platform/browser/index.js +28 -0
  113. package/lib/platform/browser/index.js.map +1 -0
  114. package/lib/platform/index.d.ts +1 -0
  115. package/lib/platform/index.js +5 -0
  116. package/lib/platform/index.js.map +1 -0
  117. package/lib/platform/node/index.d.ts +4 -0
  118. package/lib/platform/node/index.js +28 -0
  119. package/lib/platform/node/index.js.map +1 -0
  120. package/lib/platform/node/nodeVm.d.ts +1 -0
  121. package/lib/platform/node/nodeVm.js +13 -0
  122. package/lib/platform/node/nodeVm.js.map +1 -0
  123. package/lib/recorder/index.d.ts +46 -0
  124. package/lib/recorder/index.js +117 -0
  125. package/lib/recorder/index.js.map +1 -0
  126. package/lib/utils/global.d.ts +5 -0
  127. package/lib/utils/global.js +31 -0
  128. package/lib/utils/global.js.map +1 -0
  129. package/lib/utils/id.d.ts +3 -0
  130. package/lib/utils/id.js +20 -0
  131. package/lib/utils/id.js.map +1 -0
  132. package/lib/utils/index.d.ts +4 -0
  133. package/lib/utils/index.js +9 -0
  134. package/lib/utils/index.js.map +1 -0
  135. package/lib/utils/storage.d.ts +7 -0
  136. package/{cjs/util → lib/utils}/storage.js +18 -17
  137. package/lib/utils/storage.js.map +1 -0
  138. package/package.json +30 -71
  139. package/src/EventEmitter.ts +103 -0
  140. package/src/FlowModel.ts +325 -0
  141. package/src/Scheduler.ts +244 -0
  142. package/src/constant/index.ts +23 -0
  143. package/src/constant/logCode.ts +34 -0
  144. package/src/expression/brewserVm.ts +36 -0
  145. package/src/expression/index.ts +17 -0
  146. package/src/expression/nodeVm.ts +14 -0
  147. package/src/index.ts +300 -0
  148. package/src/nodes/base.ts +234 -0
  149. package/src/nodes/index.ts +3 -0
  150. package/src/nodes/start.ts +8 -0
  151. package/src/nodes/task.ts +8 -0
  152. package/src/platform/browser/browserVm.ts +52 -0
  153. package/src/platform/browser/index.ts +28 -0
  154. package/src/platform/index.ts +1 -0
  155. package/src/platform/node/index.ts +28 -0
  156. package/src/platform/node/nodeVm.ts +12 -0
  157. package/src/recorder/index.ts +137 -0
  158. package/src/typings.d.ts +0 -0
  159. package/src/utils/global.ts +41 -0
  160. package/src/utils/id.ts +16 -0
  161. package/src/utils/index.ts +5 -0
  162. package/src/utils/storage.ts +55 -0
  163. package/cjs/EventEmitter.js +0 -70
  164. package/cjs/FlowModel.js +0 -277
  165. package/cjs/Scheduler.js +0 -252
  166. package/cjs/expression/browserVm.js +0 -81
  167. package/cjs/expression/index.js +0 -63
  168. package/cjs/expression/nodeVm.js +0 -53
  169. package/cjs/index.js +0 -210
  170. package/cjs/nodes/BaseNode.js +0 -252
  171. package/cjs/nodes/StartNode.js +0 -27
  172. package/cjs/nodes/TaskNode.js +0 -27
  173. package/cjs/recorder/index.js +0 -168
  174. package/cjs/util/ID.js +0 -16
  175. package/cjs/util/global.js +0 -32
  176. package/es/constant/LogCode.js +0 -28
  177. package/es/expression/browserVm.d.ts +0 -4
  178. package/es/expression/browserVm.js +0 -76
  179. package/es/nodes/BaseNode.d.ts +0 -110
  180. package/es/nodes/BaseNode.js +0 -250
  181. package/es/nodes/StartNode.js +0 -25
  182. package/es/nodes/TaskNode.js +0 -25
  183. package/es/util/ID.js +0 -13
  184. package/es/util/global.d.ts +0 -5
  185. package/es/util/global.js +0 -26
  186. package/lib/main.js +0 -1
  187. /package/es/constant/{constant.d.ts → index.d.ts} +0 -0
  188. /package/es/constant/{LogCode.d.ts → logCode.d.ts} +0 -0
  189. /package/es/{util/ID.d.ts → utils/id.d.ts} +0 -0
  190. /package/es/{util → utils}/storage.d.ts +0 -0
package/es/FlowModel.js CHANGED
@@ -1,71 +1,23 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
- return new (P || (P = Promise))(function (resolve, reject) {
15
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
- step((generator = generator.apply(thisArg, _arguments || [])).next());
19
- });
20
- };
21
- var __generator = (this && this.__generator) || function (thisArg, body) {
22
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
- function verb(n) { return function (v) { return step([n, v]); }; }
25
- function step(op) {
26
- if (f) throw new TypeError("Generator is already executing.");
27
- while (_) try {
28
- 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;
29
- if (y = 0, t) op = [op[0] & 2, t.value];
30
- switch (op[0]) {
31
- case 0: case 1: t = op; break;
32
- case 4: _.label++; return { value: op[1], done: false };
33
- case 5: _.label++; y = op[1]; op = [0]; continue;
34
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
- default:
36
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
- if (t[2]) _.ops.pop();
41
- _.trys.pop(); continue;
42
- }
43
- op = body.call(thisArg, _);
44
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
- }
47
- };
48
- import { EVENT_INSTANCE_COMPLETE, EVENT_INSTANCE_INTERRUPTED, EVENT_INSTANCE_ERROR, } from './constant/constant';
49
- import { createExecId } from './util/ID';
50
- import Scheduler from './Scheduler';
51
- import { ErrorCode, getErrorMsg } from './constant/LogCode';
52
- var FlowModel = /** @class */ (function () {
53
- function FlowModel(_a) {
54
- var _this = this;
55
- var nodeModelMap = _a.nodeModelMap, recorder = _a.recorder, _b = _a.context, context = _b === void 0 ? {} : _b, _c = _a.globalData, globalData = _c === void 0 ? {} : _c, _d = _a.startNodeType, startNodeType = _d === void 0 ? 'StartNode' : _d;
1
+ import { __awaiter } from "tslib";
2
+ import { Scheduler } from './Scheduler';
3
+ import { createExecId } from './utils';
4
+ import { EVENT_INSTANCE_COMPLETE, EVENT_INSTANCE_INTERRUPTED, EVENT_INSTANCE_ERROR, } from './constant';
5
+ import { ErrorCode, getErrorMsg } from './constant/logCode';
6
+ export class FlowModel {
7
+ constructor({ nodeModelMap, recorder, context = {}, globalData = {}, startNodeType = 'StartNode', }) {
56
8
  /**
57
- * 当前流程模型中的所有节点,边会被转换成节点的incoming和outgoing属性。
9
+ * 当前流程模型中的所有节点,边会被转换成节点的 incoming outgoing 属性
58
10
  */
59
11
  this.nodeConfigMap = new Map();
60
12
  /**
61
- * 当前流程中开始节点组成的数组。
13
+ * 当前流程中开始节点组成的数组
62
14
  */
63
15
  this.startNodes = [];
64
16
  /**
65
- * 用于存储全局数据,可以在流程中共享。
17
+ * 用于存储全局数据,最终会传递给每个节点
66
18
  */
67
19
  this.globalData = {};
68
- // 流程包含的节点类型
20
+ // 流程包含的节点类型 ??? 在 load 代码中又初始化了一遍,为什么要传进来
69
21
  this.nodeModelMap = nodeModelMap;
70
22
  // 需要执行的队列
71
23
  this.executeList = [];
@@ -73,28 +25,25 @@ var FlowModel = /** @class */ (function () {
73
25
  this.executingInstance = null;
74
26
  // 外部传入的上下文,最终会传递给每个节点
75
27
  this.context = context;
76
- // 用于存储全局数据,可以在流程中共享。
28
+ // 用于存储全局数据,可以在流程中共享
77
29
  this.globalData = globalData;
78
- // 开始节点类型,在执行流程时,会从这些节点开始执行。
30
+ // 开始节点类型,在执行流程时,会从这些节点开始执行
79
31
  this.startNodeType = startNodeType;
80
32
  this.isRunning = false;
81
33
  this.scheduler = new Scheduler({
82
34
  flowModel: this,
83
- recorder: recorder,
35
+ recorder,
84
36
  });
85
- this.scheduler.on(EVENT_INSTANCE_COMPLETE, function (result) {
86
- _this.onExecuteFinished(result);
37
+ this.scheduler.on(EVENT_INSTANCE_COMPLETE, (result) => {
38
+ this.onExecuteFinished(result);
87
39
  });
88
- this.scheduler.on(EVENT_INSTANCE_INTERRUPTED, function (result) {
89
- _this.onExecuteFinished(result);
40
+ this.scheduler.on(EVENT_INSTANCE_INTERRUPTED, (result) => {
41
+ this.onExecuteFinished(result);
90
42
  });
91
- this.scheduler.on(EVENT_INSTANCE_ERROR, function (result) {
92
- _this.onExecuteFinished(result);
43
+ this.scheduler.on(EVENT_INSTANCE_ERROR, (result) => {
44
+ this.onExecuteFinished(result);
93
45
  });
94
46
  }
95
- FlowModel.prototype.setStartNodeType = function (startNodeType) {
96
- this.startNodeType = startNodeType;
97
- };
98
47
  /**
99
48
  * 解析LogicFlow图数据,将nodes和edges转换成节点格式。
100
49
  * 例如:
@@ -128,32 +77,29 @@ var FlowModel = /** @class */ (function () {
128
77
  * 同时此方法还会找到所有的开始节点,方便后续执行时,从开始节点开始执行。
129
78
  * @param graphData 流程图数据
130
79
  */
131
- FlowModel.prototype.load = function (graphData) {
132
- var _this = this;
133
- var _a = graphData.nodes, nodes = _a === void 0 ? [] : _a, _b = graphData.edges, edges = _b === void 0 ? [] : _b;
134
- this.startNodes = [];
135
- this.nodeConfigMap = new Map();
136
- nodes.forEach(function (node) {
137
- if (_this.nodeModelMap.has(node.type)) {
138
- var nodeConfig = {
80
+ load(graphData) {
81
+ const { nodes = [], edges = [] } = graphData;
82
+ nodes.forEach((node) => {
83
+ if (this.nodeModelMap.has(node.type)) {
84
+ const nodeConfig = {
139
85
  id: node.id,
140
86
  type: node.type,
141
87
  properties: node.properties,
142
88
  incoming: [],
143
89
  outgoing: [],
144
90
  };
145
- _this.nodeConfigMap.set(node.id, nodeConfig);
146
- if (node.type === _this.startNodeType) {
147
- _this.startNodes.push(nodeConfig);
91
+ this.nodeConfigMap.set(node.id, nodeConfig);
92
+ if (node.type === this.startNodeType) {
93
+ this.startNodes.push(nodeConfig);
148
94
  }
149
95
  }
150
96
  else {
151
- console.warn("\u672A\u8BC6\u522B\u7684\u8282\u70B9\u7C7B\u578B: " + node.type);
97
+ console.warn(`未识别的节点类型:${node.type}`);
152
98
  }
153
99
  });
154
- edges.forEach(function (edge) {
155
- var sourceNode = _this.nodeConfigMap.get(edge.sourceNodeId);
156
- var targetNode = _this.nodeConfigMap.get(edge.targetNodeId);
100
+ edges.forEach((edge) => {
101
+ const sourceNode = this.nodeConfigMap.get(edge.sourceNodeId);
102
+ const targetNode = this.nodeConfigMap.get(edge.targetNodeId);
157
103
  if (sourceNode) {
158
104
  sourceNode.outgoing.push({
159
105
  id: edge.id,
@@ -161,7 +107,7 @@ var FlowModel = /** @class */ (function () {
161
107
  target: edge.targetNodeId,
162
108
  });
163
109
  }
164
- if (targetNode && targetNode.type !== _this.startNodeType) {
110
+ if (targetNode && targetNode.type !== this.startNodeType) {
165
111
  targetNode.incoming.push({
166
112
  id: edge.id,
167
113
  properties: edge.properties,
@@ -169,107 +115,118 @@ var FlowModel = /** @class */ (function () {
169
115
  });
170
116
  }
171
117
  });
172
- };
173
- /**
174
- * 执行流程, 每次执行都会生成一个唯一的executionId,用于区分不同的执行。
175
- * 同一次执行,这次执行内部的节点执行顺序为并行。内部并行是为了避免异步节点阻塞其他节点的执行。
176
- * 多次执行,多次执行之间为串行,这里选择串行的原因是避免多次执行之间的数据冲突。
177
- * example:
178
- * 一个流程存在着两个开始节点,A和B,A和B的下一个节点都是C,C的下两个节点是D和E。
179
- * 外部分别触发了A和B的执行,那么A和B的执行是串行的(也就是需要A执行完成后再执行B),但是D和E的执行是并行的。
180
- * 如果希望A和B的执行是并行的,就不能使用同一个流程模型执行,应该初始化两个。
181
- * TODO: 去掉此处的对列,直接使用调度器的队列。
182
- */
183
- FlowModel.prototype.execute = function (params) {
184
- return __awaiter(this, void 0, void 0, function () {
185
- return __generator(this, function (_a) {
186
- this.createExecution(params);
187
- return [2 /*return*/];
188
- });
189
- });
190
- };
191
- FlowModel.prototype.resume = function (params) {
192
- return __awaiter(this, void 0, void 0, function () {
193
- return __generator(this, function (_a) {
194
- this.createExecution(params);
195
- return [2 /*return*/];
196
- });
197
- });
198
- };
199
- /**
200
- * 创建节点实例, 每个节点实例都会有一个唯一的actionId。
201
- * 通过executionId、nodeId、actionId可以唯一确定一个节点的某一次执行。
202
- * @param nodeId 节点Id
203
- * @returns 节点示例
204
- */
205
- FlowModel.prototype.createAction = function (nodeId) {
206
- var nodeConfig = this.nodeConfigMap.get(nodeId);
207
- var NodeModel = this.nodeModelMap.get(nodeConfig.type);
208
- var action = new NodeModel({
209
- nodeConfig: nodeConfig,
210
- globalData: this.globalData,
211
- context: this.context,
212
- });
213
- return action;
214
- };
215
- /**
216
- * 更新流程全局数据
217
- */
218
- FlowModel.prototype.updateGlobalData = function (data) {
219
- this.globalData = __assign(__assign({}, this.globalData), data);
220
- };
221
- /**
222
- * 在执行完成后,通知外部此次执行完成。
223
- * 如果还存在待执行的任务,那么继续执行。
224
- */
225
- FlowModel.prototype.onExecuteFinished = function (result) {
226
- var index = this.executeList.findIndex(function (i) { return i.executionId === result.executionId; });
227
- if (index !== -1) {
228
- var callback = this.executeList[index].callback;
229
- this.executeList.splice(index, 1);
230
- callback && callback(result);
231
- }
232
- };
118
+ }
233
119
  /**
234
120
  * 从待执行队列中取出需要执行的内容。
235
- * 会依次判断是否有taskId、nodeId、executionId。
236
- * 若存在taskId,那么表示恢复执行。
237
- * 若存在nodeId,那么表示从指定节点开始执行。
238
- * 若都不存在,那么新建一个executionId,从开始节点开始执行。
121
+ * 会依次判断是否有 actionId、nodeId、executionId。
122
+ * 若存在 actionId,那么表示恢复执行
123
+ * 若存在 nodeId,那么表示从指定节点开始执行
124
+ * 若都不存在,那么新建一个 executionId,从开始节点开始执行
125
+ * @private
239
126
  */
240
- FlowModel.prototype.createExecution = function (execParams) {
241
- var _this = this;
242
- this.executeList.push(execParams);
243
- // 如果有taskId,那么表示恢复执行
244
- if (execParams.actionId && execParams.executionId && execParams.nodeId) {
127
+ createExecution(execParam) {
128
+ var _a;
129
+ this.executeList.push(execParam);
130
+ // 如果有 actionId,则表示恢复执行
131
+ // TODO: 待测试,确认该流程
132
+ if (execParam.actionId && execParam.nodeId && execParam.executionId) {
245
133
  this.scheduler.resume({
246
- executionId: execParams.executionId,
247
- actionId: execParams.actionId,
248
- nodeId: execParams.nodeId,
249
- data: execParams.data,
134
+ executionId: execParam.executionId,
135
+ actionId: execParam.actionId,
136
+ nodeId: execParam.nodeId,
137
+ data: execParam.data,
250
138
  });
251
139
  return;
252
140
  }
253
- var executionId = createExecId();
254
- execParams.executionId = executionId;
255
- if (execParams.nodeId) {
256
- var nodeConfig = this.nodeConfigMap.get(execParams.nodeId);
141
+ // 否则,判断 executionId 是否存在,使用 executionId 或创建新的 execution,从开始节点开始执行
142
+ // const executionId = execParam?.executionId || createExecId()
143
+ const executionId = createExecId();
144
+ execParam.executionId = executionId;
145
+ // 当指定了具体需要执行的节点时,执行下面方法
146
+ if (execParam === null || execParam === void 0 ? void 0 : execParam.nodeId) {
147
+ const nodeConfig = this.nodeConfigMap.get(execParam.nodeId);
257
148
  if (!nodeConfig) {
258
- execParams.onError(new Error(getErrorMsg(ErrorCode.NONE_NODE_ID) + "(" + execParams.nodeId + ")"));
149
+ (_a = execParam === null || execParam === void 0 ? void 0 : execParam.onError) === null || _a === void 0 ? void 0 : _a.call(execParam, new Error(`${getErrorMsg(ErrorCode.NONE_NODE_ID)}(${execParam.nodeId})`));
259
150
  return;
260
151
  }
152
+ // 当指定了开始节点,且该节点存在,则直接以这个节点开始执行
261
153
  this.startNodes = [nodeConfig];
262
154
  }
263
- this.startNodes.forEach(function (startNode) {
264
- _this.scheduler.addAction({
265
- executionId: executionId,
155
+ this.startNodes.forEach((startNode) => {
156
+ this.scheduler.addAction({
157
+ executionId,
266
158
  nodeId: startNode.id,
267
159
  });
268
160
  });
161
+ // 所有的开始节点都执行
269
162
  this.scheduler.run({
270
- executionId: executionId,
163
+ executionId,
271
164
  });
272
- };
273
- return FlowModel;
274
- }());
165
+ }
166
+ /**
167
+ * 执行流程,每次执行都会生成一个唯一的 executionId,用于区分不同的执行。
168
+ * 同一次执行,这次执行内部的节点执行顺序为并行。内部并行是为了避免异步节点阻塞其他节点的执行
169
+ * 多次执行,多次执行之间为串行,这里选择串行的原因是避免多次执行之间的数据冲突。
170
+ * 例如:
171
+ * 一个流程存在两个开始节点,A 和 B,A 和 B 的下一个节点都是 C,C 的下两个节点是 D 和 E
172
+ * 外部分别触发了 A 和 B 的执行,那么 A 和 B 的执行是串行(即 A 执行完再执行 B),但是 D 和 E 的执行是并行的。
173
+ * 如果希望 A 和 B 的执行时并行的,就不能使用同一个流程模型执行,应该初始化两个。
174
+ * 下面直接使用调度器的队列
175
+ * @param params
176
+ */
177
+ execute(params) {
178
+ return __awaiter(this, void 0, void 0, function* () {
179
+ this.createExecution(params);
180
+ });
181
+ }
182
+ resume(params) {
183
+ return __awaiter(this, void 0, void 0, function* () {
184
+ this.createExecution(params);
185
+ });
186
+ }
187
+ /**
188
+ * 创建节点实例,每个节点实例都会有一个唯一的 actionId
189
+ * 通过 executionId, nodeId, actionId 可以唯一确定一个节点的某一次执行
190
+ * @param nodeId
191
+ * @returns 节点实例
192
+ */
193
+ // TODO: 确认下面这种场景,类型如何定义
194
+ createAction(nodeId) {
195
+ const nodeConfig = this.nodeConfigMap.get(nodeId);
196
+ if (nodeConfig) {
197
+ const NodeModel = this.nodeModelMap.get(nodeConfig.type);
198
+ if (!NodeModel) {
199
+ throw new Error('该 NodeModel 不存在,抛出异常');
200
+ }
201
+ return new NodeModel({
202
+ nodeConfig,
203
+ globalData: this.globalData,
204
+ context: this.context,
205
+ });
206
+ }
207
+ }
208
+ setStartNodeType(type) {
209
+ this.startNodeType = type;
210
+ }
211
+ updateGlobalData(data) {
212
+ // TODO: 数据的合并,是否考虑子项的合并(默认值的替换)
213
+ this.globalData = Object.assign(Object.assign({}, this.globalData), data);
214
+ return this.globalData;
215
+ }
216
+ /**
217
+ * 在执行完成后,通知外部此次之行完成
218
+ * 如果还存在待执行的任务,那么继续执行
219
+ * @param result
220
+ * @private
221
+ */
222
+ onExecuteFinished(result) {
223
+ const index = this.executeList.findIndex((i) => i.executionId === result.executionId);
224
+ if (index > -1) {
225
+ const { callback } = this.executeList[index];
226
+ this.executeList.splice(index, 1);
227
+ callback === null || callback === void 0 ? void 0 : callback(result);
228
+ }
229
+ }
230
+ }
275
231
  export default FlowModel;
232
+ //# sourceMappingURL=FlowModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlowModel.js","sourceRoot":"","sources":["../src/FlowModel.ts"],"names":[],"mappings":"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"}
package/es/Scheduler.d.ts CHANGED
@@ -1,62 +1,78 @@
1
+ import { Engine } from '.';
2
+ import Recorder from './recorder';
3
+ import FlowModel from './FlowModel';
1
4
  import EventEmitter from './EventEmitter';
2
- import type { ActionParam, NodeParam, ResumeParam } from './types.d';
3
- import type FlowModel from './FlowModel';
4
- import type Recorder from './recorder';
5
- declare type ActionParamMap = Map<string, ActionParam>;
6
- declare type ExecutionId = string;
7
5
  /**
8
6
  * 调度器
9
7
  * 通过一个队列维护需要执行的节点,一个集合维护正在执行的节点
10
8
  */
11
- export default class Scheduler extends EventEmitter {
9
+ export declare class Scheduler extends EventEmitter {
12
10
  /**
13
11
  * 当前需要执行的节点队列
14
12
  */
15
- nodeQueueMap: Map<ExecutionId, NodeParam[]>;
13
+ nodeQueueMap: Map<Engine.Key, Engine.NodeParam[]>;
16
14
  /**
17
15
  * 当前正在执行的节点集合
18
- * 在每个节点执行完成后,会从集合中删除。
19
- * 同时会判断此集合中是否还存在和此节点相同的executionId,如果不存在,说明此流程已经执行完成。
16
+ * 在每个节点执行完成后,会从集合中删除
17
+ * 同时会判断次集合中是否还存在和此节点相同的 executionId,如果不存在,说明该流程已经执行完成
20
18
  */
21
- actionRunningMap: Map<ExecutionId, ActionParamMap>;
19
+ actionRunningMap: Map<Engine.Key, Scheduler.ActionParamMap>;
22
20
  /**
23
- * 流程模型,用于创建节点模型。
21
+ * 流程模型,用于创建节点模型
24
22
  */
25
23
  flowModel: FlowModel;
26
24
  /**
27
25
  * 执行记录存储器
28
- * 用于存储节点执行的结果。
26
+ * 用于存储节点执行的结果
29
27
  */
30
- recorder: Recorder;
31
- constructor(config: any);
28
+ recorder?: Recorder;
29
+ constructor(config: Scheduler.ISchedulerProps);
32
30
  /**
33
31
  * 添加一个任务到队列中。
34
- * 1. 由流程模型将所有的开始节点添加到队列中。
35
- * 2. 当一个节点执行完成后,将后续的节点添加到队列中。
32
+ * 1. 由流程模型将所有的开始及诶带你添加到队列中
33
+ * 2. 当一个节点执行完成后,将后续的节点添加到队列中
34
+ * @param nodeParam
36
35
  */
37
- addAction(nodeParam: NodeParam): void;
36
+ addAction(nodeParam: Engine.NodeParam): void;
37
+ private pushActionToRunningMap;
38
+ private removeActionFromRunningMap;
39
+ /**
40
+ * 为了防止多次添加导致
41
+ * @param actionParam
42
+ */
43
+ private saveActionResult;
44
+ private hasRunningAction;
38
45
  /**
39
46
  * 调度器执行下一个任务
40
- * 1. 提供给流程模型,用户开始执行第一个任务。
41
- * 2. 内部任务执行完成后,调用此方法继续执行下一个任务。
42
- * 3. 当判断没有可以继续执行的任务后,触发流程结束事件。
47
+ * 1. 提供给流程模型,用户开始执行第一个任务
48
+ * 2. 内部任务执行完成后,调用此方法继续执行下一个任务
49
+ * 3. 当判断没有可以继续执行的任务后,触发流程结束事件
50
+ * @param runParam
43
51
  */
44
- run(runParams: {
45
- executionId: string;
46
- [key: string]: any;
47
- }): void;
52
+ run(runParam: Scheduler.ActionParam): void;
53
+ private next;
48
54
  /**
49
- * 恢复某个任务的执行。
50
- * 可以自定义节点手动实现流程中断,然后通过此方法恢复流程的执行。
55
+ * 恢复某个任务的执行
56
+ * 可以自定义节点手动实现流程中断,然后通过此方法恢复流程的执行
57
+ * @param resumeParam
51
58
  */
52
- resume(resumeParam: ResumeParam): Promise<void>;
53
- private pushActionToRunningMap;
54
- private removeActionFromRunningMap;
55
- private hasRunningAction;
56
- private exec;
59
+ resume(resumeParam: Engine.ResumeParam): Promise<void>;
57
60
  private interrupted;
58
61
  private error;
59
- private next;
60
- private saveActionResult;
62
+ private exec;
63
+ }
64
+ export declare namespace Scheduler {
65
+ type ActionParam = {
66
+ executionId: Engine.Key;
67
+ actionId?: Engine.Key;
68
+ nodeId?: Engine.Key;
69
+ data?: Record<string, unknown>;
70
+ [key: string]: unknown;
71
+ };
72
+ type ActionParamMap = Map<Engine.Key, ActionParam>;
73
+ interface ISchedulerProps {
74
+ flowModel: FlowModel;
75
+ recorder?: Recorder;
76
+ }
61
77
  }
62
- export {};
78
+ export default Scheduler;