@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.
- package/README.md +5 -2
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/es/EventEmitter.d.ts +34 -4
- package/es/EventEmitter.js +70 -48
- package/es/EventEmitter.js.map +1 -0
- package/es/FlowModel.d.ts +75 -73
- package/es/FlowModel.js +130 -173
- package/es/FlowModel.js.map +1 -0
- package/es/Scheduler.d.ts +50 -34
- package/es/Scheduler.js +134 -209
- package/es/Scheduler.js.map +1 -0
- package/es/constant/{constant.js → index.js} +8 -7
- package/es/constant/index.js.map +1 -0
- package/es/constant/logCode.js +29 -0
- package/es/constant/logCode.js.map +1 -0
- package/es/expression/brewserVm.d.ts +2 -0
- package/es/expression/brewserVm.js +30 -0
- package/es/expression/brewserVm.js.map +1 -0
- package/es/expression/index.d.ts +1 -1
- package/es/expression/index.js +16 -59
- package/es/expression/index.js.map +1 -0
- package/es/expression/nodeVm.d.ts +4 -2
- package/es/expression/nodeVm.js +10 -50
- package/es/expression/nodeVm.js.map +1 -0
- package/es/index.d.ts +135 -38
- package/es/index.js +92 -144
- package/es/index.js.map +1 -0
- package/es/nodes/base.d.ts +108 -0
- package/es/nodes/base.js +149 -0
- package/es/nodes/base.js.map +1 -0
- package/es/nodes/index.d.ts +3 -0
- package/es/nodes/index.js +4 -0
- package/es/nodes/index.js.map +1 -0
- package/es/nodes/{StartNode.d.ts → start.d.ts} +3 -2
- package/es/nodes/start.js +11 -0
- package/es/nodes/start.js.map +1 -0
- package/es/nodes/{TaskNode.d.ts → task.d.ts} +3 -2
- package/es/nodes/task.js +11 -0
- package/es/nodes/task.js.map +1 -0
- package/es/platform/browser/browserVm.d.ts +4 -0
- package/es/platform/browser/browserVm.js +44 -0
- package/es/platform/browser/browserVm.js.map +1 -0
- package/es/platform/browser/index.d.ts +4 -0
- package/es/platform/browser/index.js +23 -0
- package/es/platform/browser/index.js.map +1 -0
- package/es/platform/index.d.ts +1 -0
- package/es/platform/index.js +2 -0
- package/es/platform/index.js.map +1 -0
- package/es/platform/node/index.d.ts +4 -0
- package/es/platform/node/index.js +23 -0
- package/es/platform/node/index.js.map +1 -0
- package/es/platform/node/nodeVm.d.ts +1 -0
- package/es/platform/node/nodeVm.js +9 -0
- package/es/platform/node/nodeVm.js.map +1 -0
- package/es/recorder/index.d.ts +36 -10
- package/es/recorder/index.js +82 -135
- package/es/recorder/index.js.map +1 -0
- package/es/utils/global.d.ts +5 -0
- package/es/utils/global.js +27 -0
- package/es/utils/global.js.map +1 -0
- package/es/utils/id.js +14 -0
- package/es/utils/id.js.map +1 -0
- package/es/utils/index.d.ts +4 -0
- package/es/utils/index.js +5 -0
- package/es/utils/index.js.map +1 -0
- package/es/{util → utils}/storage.js +17 -16
- package/es/utils/storage.js.map +1 -0
- package/lib/EventEmitter.d.ts +37 -0
- package/lib/EventEmitter.js +94 -0
- package/lib/EventEmitter.js.map +1 -0
- package/lib/FlowModel.d.ts +146 -0
- package/lib/FlowModel.js +236 -0
- package/lib/FlowModel.js.map +1 -0
- package/lib/Scheduler.d.ts +78 -0
- package/lib/Scheduler.js +179 -0
- package/lib/Scheduler.js.map +1 -0
- package/lib/constant/index.d.ts +16 -0
- package/{cjs/constant/constant.js → lib/constant/index.js} +4 -3
- package/lib/constant/index.js.map +1 -0
- package/lib/constant/logCode.d.ts +12 -0
- package/{cjs/constant/LogCode.js → lib/constant/logCode.js} +16 -13
- package/lib/constant/logCode.js.map +1 -0
- package/lib/expression/brewserVm.d.ts +2 -0
- package/lib/expression/brewserVm.js +33 -0
- package/lib/expression/brewserVm.js.map +1 -0
- package/lib/expression/index.d.ts +2 -0
- package/lib/expression/index.js +20 -0
- package/lib/expression/index.js.map +1 -0
- package/lib/expression/nodeVm.d.ts +4 -0
- package/lib/expression/nodeVm.js +13 -0
- package/lib/expression/nodeVm.js.map +1 -0
- package/lib/index.d.ts +157 -0
- package/lib/index.js +159 -0
- package/lib/index.js.map +1 -0
- package/lib/nodes/base.d.ts +108 -0
- package/lib/nodes/base.js +152 -0
- package/lib/nodes/base.js.map +1 -0
- package/lib/nodes/index.d.ts +3 -0
- package/lib/nodes/index.js +7 -0
- package/lib/nodes/index.js.map +1 -0
- package/lib/nodes/start.d.ts +6 -0
- package/lib/nodes/start.js +15 -0
- package/lib/nodes/start.js.map +1 -0
- package/lib/nodes/task.d.ts +6 -0
- package/lib/nodes/task.js +15 -0
- package/lib/nodes/task.js.map +1 -0
- package/lib/platform/browser/browserVm.d.ts +4 -0
- package/lib/platform/browser/browserVm.js +49 -0
- package/lib/platform/browser/browserVm.js.map +1 -0
- package/lib/platform/browser/index.d.ts +4 -0
- package/lib/platform/browser/index.js +28 -0
- package/lib/platform/browser/index.js.map +1 -0
- package/lib/platform/index.d.ts +1 -0
- package/lib/platform/index.js +5 -0
- package/lib/platform/index.js.map +1 -0
- package/lib/platform/node/index.d.ts +4 -0
- package/lib/platform/node/index.js +28 -0
- package/lib/platform/node/index.js.map +1 -0
- package/lib/platform/node/nodeVm.d.ts +1 -0
- package/lib/platform/node/nodeVm.js +13 -0
- package/lib/platform/node/nodeVm.js.map +1 -0
- package/lib/recorder/index.d.ts +46 -0
- package/lib/recorder/index.js +117 -0
- package/lib/recorder/index.js.map +1 -0
- package/lib/utils/global.d.ts +5 -0
- package/lib/utils/global.js +31 -0
- package/lib/utils/global.js.map +1 -0
- package/lib/utils/id.d.ts +3 -0
- package/lib/utils/id.js +20 -0
- package/lib/utils/id.js.map +1 -0
- package/lib/utils/index.d.ts +4 -0
- package/lib/utils/index.js +9 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/storage.d.ts +7 -0
- package/{cjs/util → lib/utils}/storage.js +18 -17
- package/lib/utils/storage.js.map +1 -0
- package/package.json +30 -71
- package/src/EventEmitter.ts +103 -0
- package/src/FlowModel.ts +325 -0
- package/src/Scheduler.ts +244 -0
- package/src/constant/index.ts +23 -0
- package/src/constant/logCode.ts +34 -0
- package/src/expression/brewserVm.ts +36 -0
- package/src/expression/index.ts +17 -0
- package/src/expression/nodeVm.ts +14 -0
- package/src/index.ts +300 -0
- package/src/nodes/base.ts +234 -0
- package/src/nodes/index.ts +3 -0
- package/src/nodes/start.ts +8 -0
- package/src/nodes/task.ts +8 -0
- package/src/platform/browser/browserVm.ts +52 -0
- package/src/platform/browser/index.ts +28 -0
- package/src/platform/index.ts +1 -0
- package/src/platform/node/index.ts +28 -0
- package/src/platform/node/nodeVm.ts +12 -0
- package/src/recorder/index.ts +137 -0
- package/src/typings.d.ts +0 -0
- package/src/utils/global.ts +41 -0
- package/src/utils/id.ts +16 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/storage.ts +55 -0
- package/cjs/EventEmitter.js +0 -70
- package/cjs/FlowModel.js +0 -277
- package/cjs/Scheduler.js +0 -252
- package/cjs/expression/browserVm.js +0 -81
- package/cjs/expression/index.js +0 -63
- package/cjs/expression/nodeVm.js +0 -53
- package/cjs/index.js +0 -210
- package/cjs/nodes/BaseNode.js +0 -252
- package/cjs/nodes/StartNode.js +0 -27
- package/cjs/nodes/TaskNode.js +0 -27
- package/cjs/recorder/index.js +0 -168
- package/cjs/util/ID.js +0 -16
- package/cjs/util/global.js +0 -32
- package/es/constant/LogCode.js +0 -28
- package/es/expression/browserVm.d.ts +0 -4
- package/es/expression/browserVm.js +0 -76
- package/es/nodes/BaseNode.d.ts +0 -110
- package/es/nodes/BaseNode.js +0 -250
- package/es/nodes/StartNode.js +0 -25
- package/es/nodes/TaskNode.js +0 -25
- package/es/util/ID.js +0 -13
- package/es/util/global.d.ts +0 -5
- package/es/util/global.js +0 -26
- package/lib/main.js +0 -1
- /package/es/constant/{constant.d.ts → index.d.ts} +0 -0
- /package/es/constant/{LogCode.d.ts → logCode.d.ts} +0 -0
- /package/es/{util/ID.d.ts → utils/id.d.ts} +0 -0
- /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
|
-
|
|
8
|
+
pnpm run test
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
## 参考资料
|
|
12
|
+

|
|
13
|
+

|
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":""}
|
package/es/EventEmitter.d.ts
CHANGED
|
@@ -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
|
|
9
|
+
private _events;
|
|
3
10
|
constructor();
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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 };
|
package/es/EventEmitter.js
CHANGED
|
@@ -1,68 +1,90 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export default class EventEmitter {
|
|
2
|
+
constructor() {
|
|
3
3
|
this._events = {};
|
|
4
4
|
}
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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[
|
|
12
|
-
callback
|
|
17
|
+
this._events[evtKey].push({
|
|
18
|
+
callback,
|
|
13
19
|
once: !!once,
|
|
14
20
|
});
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
for (
|
|
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
|
-
|
|
67
|
+
const { callback, once } = es[i];
|
|
28
68
|
if (once) {
|
|
29
69
|
es.splice(i, 1);
|
|
30
70
|
if (es.length === 0) {
|
|
31
|
-
delete
|
|
71
|
+
delete this._events[evtKey];
|
|
32
72
|
}
|
|
33
73
|
length--;
|
|
34
74
|
i--;
|
|
35
75
|
}
|
|
36
|
-
callback.apply(
|
|
76
|
+
callback.apply(this, [eventArgs]);
|
|
37
77
|
}
|
|
38
78
|
};
|
|
39
79
|
doEmit(events);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
2
|
-
import
|
|
3
|
-
import Scheduler from './Scheduler';
|
|
4
|
-
import
|
|
5
|
-
export declare
|
|
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:
|
|
17
|
+
executeList: Partial<FlowModel.ExecParam>[];
|
|
30
18
|
/**
|
|
31
|
-
*
|
|
19
|
+
* 当前正在执行的任务。当监听到调度器执行完成时,触发执行参数中的回调,告知外部执行完成。
|
|
32
20
|
*/
|
|
33
|
-
executingInstance
|
|
21
|
+
executingInstance?: FlowModel.ExecParam | null;
|
|
34
22
|
/**
|
|
35
|
-
* 当前流程模型中的所有节点,边会被转换成节点的incoming和outgoing
|
|
23
|
+
* 当前流程模型中的所有节点,边会被转换成节点的 incoming 和 outgoing 属性
|
|
36
24
|
*/
|
|
37
|
-
nodeConfigMap: Map<
|
|
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,
|
|
41
|
+
globalData: Record<string, unknown>;
|
|
54
42
|
/**
|
|
55
43
|
* 外部传入的上下文,最终会传递给每个节点
|
|
56
44
|
* 例如:
|
|
57
45
|
* const context = {
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
46
|
+
* request: {
|
|
47
|
+
* get: (url) => {
|
|
48
|
+
* return fetch(url);
|
|
49
|
+
* },
|
|
50
|
+
* },
|
|
62
51
|
* }
|
|
63
|
-
*
|
|
52
|
+
* 在节点内可以通过 this.context.request.get(url) 来调用。
|
|
64
53
|
*/
|
|
65
|
-
context: Record<string,
|
|
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:
|
|
89
|
+
load(graphData: Engine.GraphConfigData): void;
|
|
108
90
|
/**
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
* 如果希望A和B的执行是并行的,就不能使用同一个流程模型执行,应该初始化两个。
|
|
116
|
-
* TODO: 去掉此处的对列,直接使用调度器的队列。
|
|
91
|
+
* 从待执行队列中取出需要执行的内容。
|
|
92
|
+
* 会依次判断是否有 actionId、nodeId、executionId。
|
|
93
|
+
* 若存在 actionId,那么表示恢复执行
|
|
94
|
+
* 若存在 nodeId,那么表示从指定节点开始执行
|
|
95
|
+
* 若都不存在,那么新建一个 executionId,从开始节点开始执行
|
|
96
|
+
* @private
|
|
117
97
|
*/
|
|
118
|
-
|
|
119
|
-
resume(params: ExecParams): Promise<void>;
|
|
98
|
+
private createExecution;
|
|
120
99
|
/**
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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;
|