@logicflow/engine 0.0.9 → 0.0.10

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/README.md CHANGED
@@ -1,10 +1,13 @@
1
- # engine
1
+ # @logicflow/engine
2
2
 
3
3
  一个可以在JavaScript环境执行的流程引擎
4
4
 
5
5
  ## 使用方式
6
6
 
7
7
  ```shell
8
- npm test
8
+ pnpm run test
9
9
  ```
10
10
 
11
+ ## 参考资料
12
+ ![package.json 中 browser. module, main 字段优先级](https://github.com/SunshowerC/blog/issues/8)
13
+ ![编写兼容 nodejs/浏览器的库](https://blog.rxliuli.com/p/b8a95af9134a488e9d94463bd18768c9/)
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("node:vm")):"function"==typeof define&&define.amd?define(["exports","node:vm"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Engine={},e.vm)}(this,(function(e,t){"use strict";function o(e,t,o,n){return new(o||(o=Promise))((function(i,s){function r(e){try{a(n.next(e))}catch(e){s(e)}}function d(e){try{a(n.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(r,d)}a((n=n.apply(e,t||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;const n="instance:complete",i="instance:interrupted",s="instance:error";var r,d;e.FlowStatus=void 0,(r=e.FlowStatus||(e.FlowStatus={})).COMPLETED="completed",r.INTERRUPTED="interrupted",r.RUNNING="running",r.PENDING="pending",r.ERROR="error",e.ActionStatus=void 0,(d=e.ActionStatus||(e.ActionStatus={})).SUCCESS="success",d.ERROR="error",d.INTERRUPTED="interrupted";const a=(e,n)=>o(void 0,void 0,void 0,(function*(){const i=yield((e,n={})=>o(void 0,void 0,void 0,(function*(){const o=t.createContext(n);return t.runInContext(e,o),o})))(e,n);return i}));class c{constructor({nodeConfig:e,context:t,globalData:o}){const{outgoing:n,incoming:i,id:s,type:r,properties:d}=e;this.baseType="base",this.outgoing=n,this.incoming=i,this.nodeId=s,this.type=r,this.properties=d,this.context=t,this.globalData=o}action(e){return o(this,void 0,void 0,(function*(){console.log("action param ---\x3e>>",e)}))}onResume(e){return o(this,void 0,void 0,(function*(){console.log("onResume params ---\x3e>>",e)}))}isPass(e){return o(this,void 0,void 0,(function*(){if(!e)return!0;const{conditionExpression:t}=e;if(!t)return!0;try{return(yield a(`isPassResult = (${t})`,Object.assign({},this.globalData))).isPassResult}catch(e){return!1}}))}getOutgoing(){return o(this,void 0,void 0,(function*(){const e=[],t=[];for(const e of this.outgoing){const{properties:o}=e;t.push(this.isPass(o))}return(yield Promise.all(t)).forEach(((t,o)=>{const n=this.outgoing[o];n.result=t,e.push(n)})),e}))}execute(t){return o(this,void 0,void 0,(function*(){const{executionId:o,actionId:n}=t,i=yield this.action({nodeId:this.nodeId,executionId:o,actionId:n}),s=i?i.status:"success";if(s===e.ActionStatus.SUCCESS){const s=yield this.getOutgoing(),r=i?i.detail:{};t.next({status:e.ActionStatus.SUCCESS,detail:r,nodeId:this.nodeId,nodeType:this.type,properties:this.properties,executionId:o,actionId:n,outgoing:s})}return{status:s,detail:null==i?void 0:i.detail,executionId:o,actionId:n,nodeId:this.nodeId,nodeType:this.type,properties:this.properties,outgoing:[]}}))}resume(t){return o(this,void 0,void 0,(function*(){const o=yield this.getOutgoing();yield this.onResume({executionId:t.executionId,actionId:t.actionId,nodeId:t.nodeId,data:t.data}),t.next({executionId:t.executionId,actionId:t.actionId,nodeId:this.nodeId,nodeType:this.type,properties:this.properties,outgoing:o,status:e.ActionStatus.SUCCESS})}))}}c.nodeTypeName="BaseNode";class u extends c{constructor(){super(...arguments),this.baseType="start"}}u.nodeTypeName="StartNode";class l extends c{constructor(){super(...arguments),this.baseType="task"}}l.nodeTypeName="TaskNode";class h{constructor(){this._events={}}on(e,t,o){e=e.trim(),this._events[e]||(this._events[e]=[]),this._events[e].push({callback:t,once:!!o})}off(e,t){if(e||(this._events={}),t){const o=this._events[e]||[];let{length:n}=o;for(let e=0;e<n;e++)o[e].callback===t&&(o.splice(e,1),n--,e--);0===o.length&&delete this._events[e]}else delete this._events[e]}emit(e,t){(o=>{let{length:n}=o;for(let i=0;i<n;i++){if(!o[i])continue;const{callback:s,once:r}=o[i];r&&(o.splice(i,1),0===o.length&&delete this._events[e],n--,i--),s.apply(this,[t])}})(this._events[e]||[])}getEvents(){return this._events}}const f="object"==typeof window&&window.window===window,p="object"==typeof global&&global.global===global,g=f?window:"object"==typeof self&&self.self===self?self:p?global:"object"==typeof globalThis?globalThis:{eval:()=>{}};if(!g.sessionStorage){const e={data:{},setItem(t,o){e.data[t]=o},getItem:t=>e.data[t],removeItem(t){delete e.data[t]},clear(){e.data={}}};g.sessionStorage=e}var v={setItem(e,t){"object"==typeof t&&(t=JSON.stringify(t)),g.sessionStorage.setItem(e,t)},getItem(e){const t=g.sessionStorage.getItem(e);try{return JSON.parse(t)}catch(e){return t}},removeItem(e){g.sessionStorage.removeItem(e)},clear(){g.sessionStorage.clear()}};function I(e){var t=e.default;if("function"==typeof t){var o=function e(){if(this instanceof e){var o=[null];return o.push.apply(o,arguments),new(Function.bind.apply(t,o))}return t.apply(this,arguments)};o.prototype=t.prototype}else o={};return Object.defineProperty(o,"__esModule",{value:!0}),Object.keys(e).forEach((function(t){var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(o,t,n.get?n:{enumerable:!0,get:function(){return e[t]}})})),o}var E={},m={},y={},_=I(Object.freeze({__proto__:null,default:{}}));Object.defineProperty(y,"__esModule",{value:!0}),y.default=function(){return b.default.randomFillSync(x)};var N,b=(N=_)&&N.__esModule?N:{default:N};const x=new Uint8Array(16);var M={};Object.defineProperty(M,"__esModule",{value:!0}),M.default=void 0;const O=[];for(let e=0;e<256;++e)O.push((e+256).toString(16).substr(1));var R=function(e,t){const o=t||0;return(O[e[o+0]]+O[e[o+1]]+O[e[o+2]]+O[e[o+3]]+"-"+O[e[o+4]]+O[e[o+5]]+"-"+O[e[o+6]]+O[e[o+7]]+"-"+O[e[o+8]]+O[e[o+9]]+"-"+O[e[o+10]]+O[e[o+11]]+O[e[o+12]]+O[e[o+13]]+O[e[o+14]]+O[e[o+15]]).toLowerCase()};M.default=R,Object.defineProperty(m,"__esModule",{value:!0}),m.default=void 0;var T=S(y),A=S(M);function S(e){return e&&e.__esModule?e:{default:e}}let D,w,j=0,C=0;var P=function(e,t,o){let n=t&&o||0;const i=t||new Array(16);let s=(e=e||{}).node||D,r=void 0!==e.clockseq?e.clockseq:w;if(null==s||null==r){const t=e.random||(e.rng||T.default)();null==s&&(s=D=[1|t[0],t[1],t[2],t[3],t[4],t[5]]),null==r&&(r=w=16383&(t[6]<<8|t[7]))}let d=void 0!==e.msecs?e.msecs:Date.now(),a=void 0!==e.nsecs?e.nsecs:C+1;const c=d-j+(a-C)/1e4;if(c<0&&void 0===e.clockseq&&(r=r+1&16383),(c<0||d>j)&&void 0===e.nsecs&&(a=0),a>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");j=d,C=a,w=r,d+=122192928e5;const u=(1e4*(268435455&d)+a)%4294967296;i[n++]=u>>>24&255,i[n++]=u>>>16&255,i[n++]=u>>>8&255,i[n++]=255&u;const l=d/4294967296*1e4&268435455;i[n++]=l>>>8&255,i[n++]=255&l,i[n++]=l>>>24&15|16,i[n++]=l>>>16&255,i[n++]=r>>>8|128,i[n++]=255&r;for(let e=0;e<6;++e)i[n+e]=s[e];return t||(0,A.default)(i)};m.default=P;var F={},L={};Object.defineProperty(L,"__esModule",{value:!0}),L.default=function(e,t,o){function n(e,n,i,s){if("string"==typeof e&&(e=function(e){e=unescape(encodeURIComponent(e));const t=[];for(let o=0;o<e.length;++o)t.push(e.charCodeAt(o));return t}(e)),"string"==typeof n&&(n=function(e){const t=[];return e.replace(/[a-fA-F0-9]{2}/g,(function(e){t.push(parseInt(e,16))})),t}(n)),!Array.isArray(e))throw TypeError("value must be an array of bytes");if(!Array.isArray(n)||16!==n.length)throw TypeError("namespace must be uuid string or an Array of 16 byte values");const r=o(n.concat(e));if(r[6]=15&r[6]|t,r[8]=63&r[8]|128,i){s=s||0;for(let e=0;e<16;++e)i[s+e]=r[e];return i}return(0,U.default)(r)}try{n.name=e}catch(e){}return n.DNS=k,n.URL=G,n},L.URL=L.DNS=void 0;var U=function(e){return e&&e.__esModule?e:{default:e}}(M);const k="6ba7b810-9dad-11d1-80b4-00c04fd430c8";L.DNS=k;const G="6ba7b811-9dad-11d1-80b4-00c04fd430c8";L.URL=G;var B={};Object.defineProperty(B,"__esModule",{value:!0}),B.default=void 0;var $=function(e){return e&&e.__esModule?e:{default:e}}(_);var Q=function(e){return Array.isArray(e)?e=Buffer.from(e):"string"==typeof e&&(e=Buffer.from(e,"utf8")),$.default.createHash("md5").update(e).digest()};B.default=Q,Object.defineProperty(F,"__esModule",{value:!0}),F.default=void 0;var X=V(L),q=V(B);function V(e){return e&&e.__esModule?e:{default:e}}var Y=(0,X.default)("v3",48,q.default);F.default=Y;var z={};Object.defineProperty(z,"__esModule",{value:!0}),z.default=void 0;var H=W(y),J=W(M);function W(e){return e&&e.__esModule?e:{default:e}}var K=function(e,t,o){const n=(e=e||{}).random||(e.rng||H.default)();if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,t){o=o||0;for(let e=0;e<16;++e)t[o+e]=n[e];return t}return(0,J.default)(n)};z.default=K;var Z={},ee={};Object.defineProperty(ee,"__esModule",{value:!0}),ee.default=void 0;var te=function(e){return e&&e.__esModule?e:{default:e}}(_);var oe=function(e){return Array.isArray(e)?e=Buffer.from(e):"string"==typeof e&&(e=Buffer.from(e,"utf8")),te.default.createHash("sha1").update(e).digest()};ee.default=oe,Object.defineProperty(Z,"__esModule",{value:!0}),Z.default=void 0;var ne=se(L),ie=se(ee);function se(e){return e&&e.__esModule?e:{default:e}}var re=(0,ne.default)("v5",80,ie.default);Z.default=re,function(e){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"v1",{enumerable:!0,get:function(){return t.default}}),Object.defineProperty(e,"v3",{enumerable:!0,get:function(){return o.default}}),Object.defineProperty(e,"v4",{enumerable:!0,get:function(){return n.default}}),Object.defineProperty(e,"v5",{enumerable:!0,get:function(){return i.default}});var t=s(m),o=s(F),n=s(z),i=s(Z);function s(e){return e&&e.__esModule?e:{default:e}}}(E);class de extends h{constructor(e){super(),this.nodeQueueMap=new Map,this.actionRunningMap=new Map,this.flowModel=e.flowModel,this.recorder=e.recorder}addAction(e){const{executionId:t}=e;this.nodeQueueMap.has(t)||this.nodeQueueMap.set(t,[]);const o=this.nodeQueueMap.get(t);o&&o.push(e),console.log("this.nodeQueueMap---\x3e>>",this.nodeQueueMap)}pushActionToRunningMap(e){var t;const{executionId:o,actionId:n}=e;if(!this.actionRunningMap.has(o)){const e=new Map;this.actionRunningMap.set(o,e)}n&&(null===(t=this.actionRunningMap.get(o))||void 0===t||t.set(n,e))}removeActionFromRunningMap(e){const{executionId:t,actionId:o}=e;if(!o)return;const n=this.actionRunningMap.get(t);n&&n.delete(o)}saveActionResult(e){var t;null===(t=this.recorder)||void 0===t||t.addActionRecord(Object.assign({timestamp:Date.now()},e))}hasRunningAction(e){const t=this.actionRunningMap.get(e);return!!t&&(0!==t.size||(this.actionRunningMap.delete(e),!1))}run(t){const o=this.nodeQueueMap.get(t.executionId);for(;null==o?void 0:o.length;){const e=o.pop(),t=`action-${E.v4()}`,n=Object.assign(Object.assign({},e),{actionId:t});this.pushActionToRunningMap(n),this.exec(n)}this.hasRunningAction(t.executionId)||this.emit(n,Object.assign(Object.assign({},t),{status:e.FlowStatus.COMPLETED}))}next(e){e.outgoing&&e.outgoing.length>0&&e.outgoing.forEach((t=>{t.result&&this.addAction({executionId:e.executionId,nodeId:t.target})})),this.saveActionResult(e),this.removeActionFromRunningMap(e),this.run(e)}resume(e){return o(this,void 0,void 0,(function*(){const{executionId:t,actionId:o,nodeId:n}=e;this.pushActionToRunningMap({executionId:t,actionId:o,nodeId:n});const i=this.flowModel.createAction(n);yield null==i?void 0:i.resume(Object.assign(Object.assign({},e),{next:this.next.bind(this)}))}))}interrupted(e){this.emit(i,e)}error(e){this.emit(s,e)}exec(t){return o(this,void 0,void 0,(function*(){const{executionId:o,actionId:n,nodeId:i}=t,s=this.flowModel.createAction(i),r=yield null==s?void 0:s.execute({executionId:o,actionId:n,nodeId:i,next:this.next.bind(this)});if(r){const{nodeType:s,properties:d,outgoing:a,status:c,detail:u}=r,l={executionId:o,actionId:n,nodeId:i,nodeType:s,properties:d,outgoing:a,status:c,detail:u};(null==r?void 0:r.status)===e.FlowStatus.INTERRUPTED&&(this.interrupted(r),this.saveActionResult(l),this.removeActionFromRunningMap(t)),(null==r?void 0:r.status)===e.FlowStatus.ERROR&&(this.error(r),this.saveActionResult(l),this.removeActionFromRunningMap(t))}}))}}var ae,ce;!function(e){e[e.NONE_START_NODE=1e3]="NONE_START_NODE",e[e.NONE_NODE_ID=1001]="NONE_NODE_ID",e[e.NO_DOCUMENT_BODY=2001]="NO_DOCUMENT_BODY"}(ae||(ae={})),function(e){e[e.NONE_START_NODE_IN_DATA=2e3]="NONE_START_NODE_IN_DATA",e[e.START_NODE_INCOMING=2001]="START_NODE_INCOMING",e[e.EXPRESSION_EXEC_ERROR=3e3]="EXPRESSION_EXEC_ERROR"}(ce||(ce={}));const ue={[ae.NONE_START_NODE]:"未找到入度为0的节点",[ae.NONE_NODE_ID]:"流程数据中存在没有此节点",[ae.NO_DOCUMENT_BODY]:"找不到document.body, 请在DOM加载完成后再执行"};ce.NONE_START_NODE_IN_DATA,ce.START_NODE_INCOMING,ce.EXPRESSION_EXEC_ERROR;class le{constructor({nodeModelMap:e,recorder:t,context:o={},globalData:r={},startNodeType:d="StartNode"}){this.nodeConfigMap=new Map,this.startNodes=[],this.globalData={},this.nodeModelMap=e,this.executeList=[],this.executingInstance=null,this.context=o,this.globalData=r,this.startNodeType=d,this.isRunning=!1,this.scheduler=new de({flowModel:this,recorder:t}),this.scheduler.on(n,(e=>{this.onExecuteFinished(e)})),this.scheduler.on(i,(e=>{this.onExecuteFinished(e)})),this.scheduler.on(s,(e=>{this.onExecuteFinished(e)}))}load(e){const{nodes:t=[],edges:o=[]}=e;t.forEach((e=>{if(this.nodeModelMap.has(e.type)){const t={id:e.id,type:e.type,properties:e.properties,incoming:[],outgoing:[]};this.nodeConfigMap.set(e.id,t),e.type===this.startNodeType&&this.startNodes.push(t)}else console.warn(`未识别的节点类型:${e.type}`)})),o.forEach((e=>{const t=this.nodeConfigMap.get(e.sourceNodeId),o=this.nodeConfigMap.get(e.targetNodeId);t&&t.outgoing.push({id:e.id,properties:e.properties,target:e.targetNodeId}),o&&o.type!==this.startNodeType&&o.incoming.push({id:e.id,properties:e.properties,source:e.sourceNodeId})}))}createExecution(e){var t;if(this.executeList.push(e),e.actionId&&e.nodeId&&e.executionId)return void this.scheduler.resume({executionId:e.executionId,actionId:e.actionId,nodeId:e.nodeId,data:e.data});const o=`exec-${E.v4()}`;if(e.executionId=o,null==e?void 0:e.nodeId){const o=this.nodeConfigMap.get(e.nodeId);if(!o)return void(null===(t=null==e?void 0:e.onError)||void 0===t||t.call(e,new Error(`${n=ae.NONE_NODE_ID,`error[${n}]: ${ue[n]}`}(${e.nodeId})`)));this.startNodes=[o]}var n;this.startNodes.forEach((e=>{this.scheduler.addAction({executionId:o,nodeId:e.id})})),this.scheduler.run({executionId:o})}execute(e){return o(this,void 0,void 0,(function*(){this.createExecution(e)}))}resume(e){return o(this,void 0,void 0,(function*(){this.createExecution(e)}))}createAction(e){const t=this.nodeConfigMap.get(e);if(t){const e=this.nodeModelMap.get(t.type);if(!e)throw new Error("该 NodeModel 不存在,抛出异常");return new e({nodeConfig:t,globalData:this.globalData,context:this.context})}}setStartNodeType(e){this.startNodeType=e}updateGlobalData(e){return this.globalData=Object.assign(Object.assign({},this.globalData),e),this.globalData}onExecuteFinished(e){const t=this.executeList.findIndex((t=>t.executionId===e.executionId));if(t>-1){const{callback:o}=this.executeList[t];this.executeList.splice(t,1),null==o||o(e)}}}const he="LOGICFLOW_ENGINE_INSTANCES";class fe{constructor({instanceId:e}){this.instanceId=e,this.maxRecorder=100;const t=this.getItem(he)||[];if(-1===t.indexOf(e)&&t.push(e),t.length>100){const e=t.shift();this.clearInstance(e)}this.setItem(he,t)}setMaxRecorderNumber(e){this.maxRecorder=e}setItem(e,t){try{v.setItem(e,t)}catch(o){console.error("Ops, something wrong with storage.setItem !!!"),v.clear(),v.setItem(e,t)}}getItem(e){return v.getItem(e)}getExecutionActions(e){return o(this,void 0,void 0,(function*(){return this.getItem(e)}))}getExecutionList(){return o(this,void 0,void 0,(function*(){return this.getItem(this.instanceId)||[]}))}addExecution(e){const t=this.getItem(this.instanceId)||[];if(t.length>=this.maxRecorder){const e=t.shift();this.popExecution(e)}t.push(e),this.setItem(this.instanceId,t)}popExecution(e){(this.getItem(e)||[]).forEach((e=>{v.removeItem(e)})),v.removeItem(e)}pushActionToExecution(e,t){const o=this.getItem(e)||[];o.push(t),this.setItem(e,o)}addActionRecord(e){return o(this,void 0,void 0,(function*(){const{executionId:t,actionId:o}=e;(yield this.getExecutionActions(t))||this.addExecution(t),this.pushActionToExecution(t,o),this.setItem(o,e)}))}getActionRecord(e){return o(this,void 0,void 0,(function*(){return this.getItem(e)}))}clear(){this.clearInstance(this.instanceId)}clearInstance(e){(this.getItem(e)||[]).forEach((e=>{v.removeItem(e);(this.getItem(e)||[]).forEach((e=>{v.removeItem(e)}))})),v.removeItem(e)}}class pe{constructor(e){this.nodeModelMap=new Map,this.instanceId=`engine-${E.v4()}`,(null==e?void 0:e.debug)&&(this.recorder=new fe({instanceId:this.instanceId})),this.register({type:u.nodeTypeName,model:u}),this.register({type:l.nodeTypeName,model:l}),this.context=(null==e?void 0:e.context)||{}}register(e){this.nodeModelMap.set(e.type,e.model)}setCustomRecorder(e){this.recorder=e}load({graphData:e,startNodeType:t="StartNode",globalData:o={}}){this.graphData=e;const n=new le({nodeModelMap:this.nodeModelMap,recorder:this.recorder,context:this.context,globalData:o,startNodeType:t});return n.load(e),this.flowModel=n,n}execute(e){return o(this,void 0,void 0,(function*(){return new Promise(((t,o)=>{var n;let i=e;e||(i={}),null===(n=this.flowModel)||void 0===n||n.execute(Object.assign(Object.assign({},i),{callback:e=>{t(e)},onError:e=>{o(e)}}))}))}))}resume(e){return o(this,void 0,void 0,(function*(){return new Promise(((t,o)=>{var n;null===(n=this.flowModel)||void 0===n||n.resume(Object.assign(Object.assign({},e),{callback:e=>{t(e)},onError:e=>{o(e)}}))}))}))}getExecutionList(){var e;return o(this,void 0,void 0,(function*(){return yield null===(e=this.recorder)||void 0===e?void 0:e.getExecutionList()}))}getExecutionRecord(e){var t,n;return o(this,void 0,void 0,(function*(){const o=yield null===(t=this.recorder)||void 0===t?void 0:t.getExecutionActions(e);if(!o)return null;const i=[];for(let e=0;e<(null==o?void 0:o.length);e++){const t=o[e];this.recorder&&i.push(null===(n=this.recorder)||void 0===n?void 0:n.getActionRecord(t))}return Promise.all(i)}))}destroy(){var e;null===(e=this.recorder)||void 0===e||e.clear()}getGlobalData(){var e;return null===(e=this.flowModel)||void 0===e?void 0:e.globalData}setGlobalData(e){this.flowModel&&(this.flowModel.globalData=e)}updateGlobalData(e){this.flowModel&&Object.assign(this.flowModel.globalData,e)}}e.BASE_START_NODE="start",e.BaseNode=c,e.EVENT_INSTANCE_COMPLETE=n,e.EVENT_INSTANCE_ERROR=s,e.EVENT_INSTANCE_INTERRUPTED=i,e.Engine=pe,e.Recorder=fe,e.StartNode=u,e.TaskNode=l,e.default=pe,Object.defineProperty(e,"__esModule",{value:!0})}));
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,7 +1,37 @@
1
+ export interface EventType {
2
+ readonly callback: (params?: any) => void;
3
+ readonly once: boolean;
4
+ }
5
+ export type EventArgs = Record<string, unknown>;
6
+ export type EventsType = Record<string, EventType[]>;
7
+ export type CallbackType = (...args: unknown[]) => void;
1
8
  export default class EventEmitter {
2
- _events: Record<string, any>;
9
+ private _events;
3
10
  constructor();
4
- on(evKey: any, callback: any, once?: boolean): void;
5
- emit(evt: any, eventArgs: any): void;
6
- off(evt: any, callback: any): void;
11
+ /**
12
+ * 添加一个监听事件
13
+ * @param evtKey 事件名称
14
+ * @param callback 回调方法
15
+ * @param once 是否触发一次
16
+ * @returns 当前 EventEmitter 实例
17
+ */
18
+ on(evtKey: string, callback: CallbackType, once?: boolean): void;
19
+ /**
20
+ * 取消监听一个事件,或者一个 Channel
21
+ * @param evtKey
22
+ * @param callback
23
+ */
24
+ off(evtKey: string, callback?: CallbackType): void;
25
+ /**
26
+ * 主动触发事件
27
+ * @param evtKey 触发事件名称
28
+ * @param eventArgs 事件参数
29
+ */
30
+ emit(evtKey: string, eventArgs: EventArgs): void;
31
+ /**
32
+ * 获取当前所有事件
33
+ * @returns _events
34
+ */
35
+ getEvents(): EventsType;
7
36
  }
37
+ export { EventEmitter };
@@ -1,68 +1,90 @@
1
- var EventEmitter = /** @class */ (function () {
2
- function EventEmitter() {
1
+ export default class EventEmitter {
2
+ constructor() {
3
3
  this._events = {};
4
4
  }
5
- EventEmitter.prototype.on = function (evKey, callback, once) {
6
- if (once === void 0) { once = false; }
7
- evKey = evKey.trim();
8
- if (!this._events[evKey]) {
9
- this._events[evKey] = [];
5
+ /**
6
+ * 添加一个监听事件
7
+ * @param evtKey 事件名称
8
+ * @param callback 回调方法
9
+ * @param once 是否触发一次
10
+ * @returns 当前 EventEmitter 实例
11
+ */
12
+ on(evtKey, callback, once) {
13
+ evtKey = evtKey.trim();
14
+ if (!this._events[evtKey]) {
15
+ this._events[evtKey] = [];
10
16
  }
11
- this._events[evKey].push({
12
- callback: callback,
17
+ this._events[evtKey].push({
18
+ callback,
13
19
  once: !!once,
14
20
  });
15
- };
16
- EventEmitter.prototype.emit = function (evt, eventArgs) {
17
- var _this = this;
18
- var events = this._events[evt] || [];
21
+ }
22
+ /**
23
+ * 取消监听一个事件,或者一个 Channel
24
+ * @param evtKey
25
+ * @param callback
26
+ */
27
+ off(evtKey, callback) {
28
+ if (!evtKey) {
29
+ // evtKey 为空全部清除
30
+ this._events = {};
31
+ }
32
+ if (!callback) {
33
+ // evtKey 存在,callback 为空,清除事件所有方法
34
+ delete this._events[evtKey];
35
+ }
36
+ else {
37
+ // evtKey 存在,callback 存在,清除匹配的
38
+ const events = this._events[evtKey] || [];
39
+ let { length } = events;
40
+ for (let i = 0; i < length; i++) {
41
+ if (events[i].callback === callback) {
42
+ events.splice(i, 1);
43
+ length--;
44
+ i--;
45
+ }
46
+ }
47
+ if (events.length === 0) {
48
+ delete this._events[evtKey];
49
+ }
50
+ }
51
+ }
52
+ /**
53
+ * 主动触发事件
54
+ * @param evtKey 触发事件名称
55
+ * @param eventArgs 事件参数
56
+ */
57
+ emit(evtKey, eventArgs) {
58
+ const events = this._events[evtKey] || [];
19
59
  // 实际的处理 emit 方法
20
- var doEmit = function (es) {
21
- var length = es.length;
22
- for (var i = 0; i < length; i++) {
60
+ const doEmit = (es) => {
61
+ let { length } = es;
62
+ for (let i = 0; i < length; i++) {
23
63
  if (!es[i]) {
24
64
  // eslint-disable-next-line no-continue
25
65
  continue;
26
66
  }
27
- var _a = es[i], callback = _a.callback, once = _a.once;
67
+ const { callback, once } = es[i];
28
68
  if (once) {
29
69
  es.splice(i, 1);
30
70
  if (es.length === 0) {
31
- delete _this._events[evt];
71
+ delete this._events[evtKey];
32
72
  }
33
73
  length--;
34
74
  i--;
35
75
  }
36
- callback.apply(_this, [eventArgs]);
76
+ callback.apply(this, [eventArgs]);
37
77
  }
38
78
  };
39
79
  doEmit(events);
40
- };
41
- EventEmitter.prototype.off = function (evt, callback) {
42
- if (!evt) {
43
- // evt 为空全部清除
44
- this._events = {};
45
- }
46
- if (!callback) {
47
- // evt 存在,callback 为空,清除事件所有方法
48
- delete this._events[evt];
49
- }
50
- else {
51
- // evt 存在,callback 存在,清除匹配的
52
- var events = this._events[evt] || [];
53
- var length_1 = events.length;
54
- for (var i = 0; i < length_1; i++) {
55
- if (events[i].callback === callback) {
56
- events.splice(i, 1);
57
- length_1--;
58
- i--;
59
- }
60
- }
61
- if (events.length === 0) {
62
- delete this._events[evt];
63
- }
64
- }
65
- };
66
- return EventEmitter;
67
- }());
68
- export default EventEmitter;
80
+ }
81
+ /**
82
+ * 获取当前所有事件
83
+ * @returns _events
84
+ */
85
+ getEvents() {
86
+ return this._events;
87
+ }
88
+ }
89
+ export { EventEmitter };
90
+ //# sourceMappingURL=EventEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventEmitter.js","sourceRoot":"","sources":["../src/EventEmitter.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,OAAO,OAAO,YAAY;IAE/B;QACE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;IACnB,CAAC;IAED;;;;;;OAMG;IACH,EAAE,CAAC,MAAc,EAAE,QAAsB,EAAE,IAAc;QACvD,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAA;SAC1B;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YACxB,QAAQ;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAA;IACJ,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,MAAc,EAAE,QAAuB;QACzC,IAAI,CAAC,MAAM,EAAE;YACX,gBAAgB;YAChB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;SAClB;QACD,IAAI,CAAC,QAAQ,EAAE;YACb,iCAAiC;YACjC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;SAC5B;aAAM;YACL,8BAA8B;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;YACzC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;YACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC/B,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE;oBACnC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;oBACnB,MAAM,EAAE,CAAA;oBACR,CAAC,EAAE,CAAA;iBACJ;aACF;YACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;aAC5B;SACF;IACH,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,MAAc,EAAE,SAAoB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;QACzC,gBAAgB;QAChB,MAAM,MAAM,GAAG,CAAC,EAAE,EAAE,EAAE;YACpB,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAA;YACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC/B,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;oBACV,uCAAuC;oBACvC,SAAQ;iBACT;gBACD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;gBAChC,IAAI,IAAI,EAAE;oBACR,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;oBACf,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;wBACnB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;qBAC5B;oBACD,MAAM,EAAE,CAAA;oBACR,CAAC,EAAE,CAAA;iBACJ;gBACD,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;aAClC;QACH,CAAC,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,CAAA;IAChB,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;CACF;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
package/es/FlowModel.d.ts CHANGED
@@ -1,76 +1,58 @@
1
- import type { NodeConfig, NodeConstructor } from './nodes/BaseNode';
2
- import type Recorder from './recorder';
3
- import Scheduler from './Scheduler';
4
- import type { ActionParam, NextActionParam } from './types.d';
5
- export declare type FlowResult = ({
6
- result?: Record<string, any>;
7
- } & ActionParam) | NextActionParam;
8
- export declare type ActionParams = {
9
- executionId?: string;
10
- actionId?: string;
11
- nodeId?: string;
12
- };
13
- export declare type ExecParams = {
14
- callback?: (result: NextActionParam) => void;
15
- onError?: (error: Error) => void;
16
- } & ActionParams;
17
- export default class FlowModel {
1
+ import { Engine } from '.';
2
+ import { Recorder } from './recorder';
3
+ import { Scheduler } from './Scheduler';
4
+ import { BaseNode } from './nodes';
5
+ export declare class FlowModel {
18
6
  /**
19
- * 流程支持的节点类型
7
+ * 流程支持的节点类型.
20
8
  */
21
- nodeModelMap: Map<string, NodeConstructor>;
9
+ nodeModelMap: Map<string, BaseNode.NodeConstructor>;
22
10
  /**
23
- * 调度器,用于调度节点的执行。
11
+ * 调度器,用于调度节点执行
24
12
  */
25
13
  scheduler: Scheduler;
26
14
  /**
27
- * 待执行的队列,当流程正在执行时,如果再次触发执行。那么会将执行参数放入到队列中,等待上一次执行完成后再执行。
15
+ * 待执行的队列,当流程正在执行时,如果再次触发执行。那么会将执行参数放到队列中,等待上一次执行完成后再执行。
28
16
  */
29
- executeList: ExecParams[];
17
+ executeList: Partial<FlowModel.ExecParam>[];
30
18
  /**
31
- * 当前正在执行。当监听到调度器执行完成时,出触发执行参数中的回调,告知外部执行完成。
19
+ * 当前正在执行的任务。当监听到调度器执行完成时,触发执行参数中的回调,告知外部执行完成。
32
20
  */
33
- executingInstance: ExecParams;
21
+ executingInstance?: FlowModel.ExecParam | null;
34
22
  /**
35
- * 当前流程模型中的所有节点,边会被转换成节点的incoming和outgoing属性。
23
+ * 当前流程模型中的所有节点,边会被转换成节点的 incoming outgoing 属性
36
24
  */
37
- nodeConfigMap: Map<string, NodeConfig>;
25
+ nodeConfigMap: Map<Engine.Key, BaseNode.NodeConfig>;
38
26
  /**
39
27
  * 当流程正在执行时,如果再次触发执行。那么会将执行参数放入到队列中,等待上一次执行完成后再执行。
40
28
  */
41
29
  isRunning: boolean;
42
30
  /**
43
- * 开始节点类型,在执行流程时,会从这些节点开始执行。
31
+ * 开始接地那类型,在执行流程时,会从这些节点开始执行
44
32
  */
45
33
  startNodeType: string;
46
34
  /**
47
- * 当前流程中开始节点组成的数组。
35
+ * 当前流程中开始节点组成的数组
48
36
  */
49
- startNodes: NodeConfig[];
37
+ startNodes: BaseNode.NodeConfig[];
50
38
  /**
51
- * 用于存储全局数据,可以在流程中共享。
39
+ * 用于存储全局数据,最终会传递给每个节点
52
40
  */
53
- globalData: Record<string, any>;
41
+ globalData: Record<string, unknown>;
54
42
  /**
55
43
  * 外部传入的上下文,最终会传递给每个节点
56
44
  * 例如:
57
45
  * const context = {
58
- * request: {
59
- * get: (url) => {
60
- * return fetch(url);
61
- * }
46
+ * request: {
47
+ * get: (url) => {
48
+ * return fetch(url);
49
+ * },
50
+ * },
62
51
  * }
63
- * 在节点内部可以通过 this.context.request.get(url) 来调用。
52
+ * 在节点内可以通过 this.context.request.get(url) 来调用。
64
53
  */
65
- context: Record<string, any>;
66
- constructor({ nodeModelMap, recorder, context, globalData, startNodeType, }: {
67
- nodeModelMap: Map<string, NodeConstructor>;
68
- recorder: Recorder;
69
- context?: Record<string, any>;
70
- globalData?: Record<string, any>;
71
- startNodeType?: string;
72
- });
73
- setStartNodeType(startNodeType: any): void;
54
+ context: Record<string, unknown>;
55
+ constructor({ nodeModelMap, recorder, context, globalData, startNodeType, }: FlowModel.IFlowModelProps);
74
56
  /**
75
57
  * 解析LogicFlow图数据,将nodes和edges转换成节点格式。
76
58
  * 例如:
@@ -104,41 +86,61 @@ export default class FlowModel {
104
86
  * 同时此方法还会找到所有的开始节点,方便后续执行时,从开始节点开始执行。
105
87
  * @param graphData 流程图数据
106
88
  */
107
- load(graphData: any): void;
89
+ load(graphData: Engine.GraphConfigData): void;
108
90
  /**
109
- * 执行流程, 每次执行都会生成一个唯一的executionId,用于区分不同的执行。
110
- * 同一次执行,这次执行内部的节点执行顺序为并行。内部并行是为了避免异步节点阻塞其他节点的执行。
111
- * 多次执行,多次执行之间为串行,这里选择串行的原因是避免多次执行之间的数据冲突。
112
- * example:
113
- * 一个流程存在着两个开始节点,A和B,A和B的下一个节点都是C,C的下两个节点是D和E。
114
- * 外部分别触发了A和B的执行,那么A和B的执行是串行的(也就是需要A执行完成后再执行B),但是D和E的执行是并行的。
115
- * 如果希望A和B的执行是并行的,就不能使用同一个流程模型执行,应该初始化两个。
116
- * TODO: 去掉此处的对列,直接使用调度器的队列。
91
+ * 从待执行队列中取出需要执行的内容。
92
+ * 会依次判断是否有 actionId、nodeId、executionId。
93
+ * 若存在 actionId,那么表示恢复执行
94
+ * 若存在 nodeId,那么表示从指定节点开始执行
95
+ * 若都不存在,那么新建一个 executionId,从开始节点开始执行
96
+ * @private
117
97
  */
118
- execute(params: ExecParams): Promise<void>;
119
- resume(params: ExecParams): Promise<void>;
98
+ private createExecution;
120
99
  /**
121
- * 创建节点实例, 每个节点实例都会有一个唯一的actionId。
122
- * 通过executionId、nodeId、actionId可以唯一确定一个节点的某一次执行。
123
- * @param nodeId 节点Id
124
- * @returns 节点示例
100
+ * 执行流程,每次执行都会生成一个唯一的 executionId,用于区分不同的执行。
101
+ * 同一次执行,这次执行内部的节点执行顺序为并行。内部并行是为了避免异步节点阻塞其他节点的执行
102
+ * 多次执行,多次执行之间为串行,这里选择串行的原因是避免多次执行之间的数据冲突。
103
+ * 例如:
104
+ * 一个流程存在两个开始节点,A 和 B,A 和 B 的下一个节点都是 C,C 的下两个节点是 D 和 E
105
+ * 外部分别触发了 A 和 B 的执行,那么 A 和 B 的执行是串行(即 A 执行完再执行 B),但是 D 和 E 的执行是并行的。
106
+ * 如果希望 A 和 B 的执行时并行的,就不能使用同一个流程模型执行,应该初始化两个。
107
+ * 下面直接使用调度器的队列
108
+ * @param params
125
109
  */
126
- createAction(nodeId: string): import("./nodes/BaseNode").default;
110
+ execute(params: Partial<FlowModel.ExecParam>): Promise<void>;
111
+ resume(params: Partial<FlowModel.ExecParam>): Promise<void>;
127
112
  /**
128
- * 更新流程全局数据
113
+ * 创建节点实例,每个节点实例都会有一个唯一的 actionId
114
+ * 通过 executionId, nodeId, actionId 可以唯一确定一个节点的某一次执行
115
+ * @param nodeId
116
+ * @returns 节点实例
129
117
  */
130
- updateGlobalData(data: any): void;
118
+ createAction(nodeId: Engine.Key): BaseNode | undefined;
119
+ setStartNodeType(type: string): void;
120
+ updateGlobalData(data: Record<string, unknown>): Record<string, unknown>;
131
121
  /**
132
- * 在执行完成后,通知外部此次执行完成。
133
- * 如果还存在待执行的任务,那么继续执行。
122
+ * 在执行完成后,通知外部此次之行完成
123
+ * 如果还存在待执行的任务,那么继续执行
124
+ * @param result
125
+ * @private
134
126
  */
135
127
  private onExecuteFinished;
136
- /**
137
- * 从待执行队列中取出需要执行的内容。
138
- * 会依次判断是否有taskId、nodeId、executionId。
139
- * 若存在taskId,那么表示恢复执行。
140
- * 若存在nodeId,那么表示从指定节点开始执行。
141
- * 若都不存在,那么新建一个executionId,从开始节点开始执行。
142
- */
143
- private createExecution;
144
128
  }
129
+ export declare namespace FlowModel {
130
+ type FlowResult = ({
131
+ result?: Record<string, unknown>;
132
+ } & Engine.ActionParam) | Engine.NextActionParam;
133
+ type ActionParam = Scheduler.ActionParam;
134
+ type ExecParam = {
135
+ callback?: (result: Engine.NextActionParam) => void;
136
+ onError?: (error: Error) => void;
137
+ } & ActionParam;
138
+ interface IFlowModelProps {
139
+ nodeModelMap: Map<string, BaseNode.NodeConstructor>;
140
+ recorder?: Recorder;
141
+ context?: Record<string, unknown>;
142
+ globalData?: Record<string, unknown>;
143
+ startNodeType?: string;
144
+ }
145
+ }
146
+ export default FlowModel;