@alwatr/fsm 1.0.1 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -1
- package/core.d.ts +2 -2
- package/core.d.ts.map +1 -1
- package/core.js +34 -54
- package/core.js.map +1 -1
- package/package.json +6 -6
- package/type.d.ts +1 -1
- package/type.d.ts.map +1 -1
- package/type.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,10 +3,61 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
-
## [1.
|
|
6
|
+
## [1.1.1](https://github.com/AliMD/alwatr/compare/@alwatr/fsm@1.1.0...@alwatr/fsm@1.1.1) (2023-09-12)
|
|
7
7
|
|
|
8
8
|
**Note:** Version bump only for package @alwatr/fsm
|
|
9
9
|
|
|
10
|
+
# 1.1.0 (2023-09-12)
|
|
11
|
+
|
|
12
|
+
# 1.0.0 (2023-06-14)
|
|
13
|
+
|
|
14
|
+
# 0.32.0 (2023-05-27)
|
|
15
|
+
|
|
16
|
+
# 0.31.0 (2023-05-08)
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
|
|
20
|
+
* **fms:** import path ([f6770a0](https://github.com/AliMD/alwatr/commit/f6770a07fdf6855ccd63a85822d44d5ef9c72dee))
|
|
21
|
+
* **fsm:** action maybe async ([50efffa](https://github.com/AliMD/alwatr/commit/50efffa34a2ea5a3515561d7425da0c109631f36))
|
|
22
|
+
* **fsm:** autoSignalUnsubscribe type ([f7db30b](https://github.com/AliMD/alwatr/commit/f7db30bf5a90ff3d163f036b313a412a5149ff2b))
|
|
23
|
+
* **fsm:** call render states function in there own this ([a950478](https://github.com/AliMD/alwatr/commit/a95047811366e375785b2cd8fb176b1176638cab))
|
|
24
|
+
* **fsm:** fix order of `initFsmInstance` args ([3b60138](https://github.com/AliMD/alwatr/commit/3b60138ecebcbcb4d732e4d1a3e79f5b8661ae47))
|
|
25
|
+
* **fsm:** initial exec actions ([e7dd5c8](https://github.com/AliMD/alwatr/commit/e7dd5c8aaf9760c9856e4392cc899020f7e796d9))
|
|
26
|
+
* **fsm:** last reported bugs in set state ([e7435c8](https://github.com/AliMD/alwatr/commit/e7435c870a054b0ec3e4004f13c6db7610610be0))
|
|
27
|
+
* **fsm:** review reset process ([af6e81c](https://github.com/AliMD/alwatr/commit/af6e81c068b467d8b3aa96f2431e13ac479f018c))
|
|
28
|
+
* **fsm:** run init entry actions ([777ae45](https://github.com/AliMD/alwatr/commit/777ae459f2b77f79696daf3a0ca355d6d78e57d3))
|
|
29
|
+
* new logger api ([9d83a7d](https://github.com/AliMD/alwatr/commit/9d83a7dc5c103bc3bb4282dacfd85fa998915300))
|
|
30
|
+
|
|
31
|
+
### Features
|
|
32
|
+
|
|
33
|
+
* **fsm:** add `signalRecord` to config ([1a35291](https://github.com/AliMD/alwatr/commit/1a352915fba978da141513517655d1e07350c3ec))
|
|
34
|
+
* **fsm:** add unsubscribe ([85ed3c3](https://github.com/AliMD/alwatr/commit/85ed3c3439e1f40c2760f6011df112242f10be06))
|
|
35
|
+
* **fsm:** callback in provider signals ([772818b](https://github.com/AliMD/alwatr/commit/772818baa7953b6fbb4d4128fcee76733f42cc2d))
|
|
36
|
+
* **fsm:** custom signal callback ([47c22e9](https://github.com/AliMD/alwatr/commit/47c22e92a8a8085148b44b316d649b695ff8071a))
|
|
37
|
+
* **fsm:** destroy and expire api ([e1a1c15](https://github.com/AliMD/alwatr/commit/e1a1c150d81f4428718bd18f039235c7fce9caf2))
|
|
38
|
+
* **fsm:** new types ([2866e3b](https://github.com/AliMD/alwatr/commit/2866e3bd5ff56fd2b5bddcaed3673a5868bae4bb))
|
|
39
|
+
* **fsm:** rewrite state machine ([7f24695](https://github.com/AliMD/alwatr/commit/7f246959e5a80b21c1c4b21e895e75f8fbe56798))
|
|
40
|
+
* **fsm:** subscribe ([2af4f44](https://github.com/AliMD/alwatr/commit/2af4f44f0e8a2dee39cde10dcaa3281075632e6a))
|
|
41
|
+
|
|
42
|
+
# 0.30.0 (2023-03-06)
|
|
43
|
+
|
|
44
|
+
### Bug Fixes
|
|
45
|
+
|
|
46
|
+
* **fsm:** every signal mather ([0dc504d](https://github.com/AliMD/alwatr/commit/0dc504dacbb1ec68f154244619d644ff8e43cc04))
|
|
47
|
+
* **fsm:** remove additional import ([231337b](https://github.com/AliMD/alwatr/commit/231337b95ee7b046fe35429f50931ddf85be291f))
|
|
48
|
+
* **fsm:** update context in transition bug ([28a21d0](https://github.com/AliMD/alwatr/commit/28a21d00d903b6189d814303c72ba6e784852f33))
|
|
49
|
+
|
|
50
|
+
### Features
|
|
51
|
+
|
|
52
|
+
* Alwatr Finite State Machines ([d5900b4](https://github.com/AliMD/alwatr/commit/d5900b4ee8685b120188888871405853f5a69417))
|
|
53
|
+
* **fsm:** $all and $self state ([69adf41](https://github.com/AliMD/alwatr/commit/69adf41064ca0f55497484c50e298ebc26c42dcc))
|
|
54
|
+
* **fsm:** enhance types ([3b13046](https://github.com/AliMD/alwatr/commit/3b130463a102f59c38603b0de470be5c87ee88c9))
|
|
55
|
+
* **fsm:** make simple state machine ([ff9ae1c](https://github.com/AliMD/alwatr/commit/ff9ae1ca04156e8b811899ff0f62480e1c37af72))
|
|
56
|
+
* **fsm:** new state context type with {to, from, by} ([11423e6](https://github.com/AliMD/alwatr/commit/11423e6a89159b92e82cfd1e774ad37983581090))
|
|
57
|
+
* **fsm:** rewrite with signal power ([01a1651](https://github.com/AliMD/alwatr/commit/01a1651e231a817d5eebb54cf84d51d620bfd6e8))
|
|
58
|
+
* **fsm:** share state events ([de42522](https://github.com/AliMD/alwatr/commit/de42522a97fdf6be8bee73d91a35820e2a5e6efb))
|
|
59
|
+
* **fsm:** transition with partial context set ([823377e](https://github.com/AliMD/alwatr/commit/823377e65028ea3e713f060ae678776c609c1661))
|
|
60
|
+
|
|
10
61
|
# [1.0.0](https://github.com/AliMD/alwatr/compare/v0.32.0...v1.0.0) (2023-06-14)
|
|
11
62
|
|
|
12
63
|
**Note:** Version bump only for package @alwatr/fsm
|
package/core.d.ts
CHANGED
|
@@ -51,7 +51,7 @@ export declare const initFsmInstance: (instanceId: string, constructorId: string
|
|
|
51
51
|
/**
|
|
52
52
|
* Subscribe to all defined signals for finite state machine instance.
|
|
53
53
|
*/
|
|
54
|
-
export declare const subscribeSignals: (instanceId: string, signalList:
|
|
54
|
+
export declare const subscribeSignals: (instanceId: string, signalList: SignalConfig[], subscribeConstructorSignals?: boolean) => ListenerSpec[];
|
|
55
55
|
/**
|
|
56
56
|
* Define signals for finite state machine constructor.
|
|
57
57
|
*/
|
|
@@ -69,7 +69,7 @@ export declare const defineInstanceSignals: <T extends Readonly<{
|
|
|
69
69
|
TEventId: string;
|
|
70
70
|
TActionName: string;
|
|
71
71
|
TContext: StringifyableRecord;
|
|
72
|
-
}>>(instanceId: string, signalList: SignalConfig<T>[], subscribeConstructorSignals?: boolean) =>
|
|
72
|
+
}>>(instanceId: string, signalList: SignalConfig<T>[], subscribeConstructorSignals?: boolean) => ListenerSpec[];
|
|
73
73
|
/**
|
|
74
74
|
* Render helper for use finite state machine instance in UI.
|
|
75
75
|
*
|
package/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAmC,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,QAAQ,EAER,YAAY,EACb,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAC,YAAY,EAAkB,aAAa,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAcnG,eAAO,MAAM,iBAAiB,0KAMtB,MAAM,yIAYb,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,6IAKX,MAAM,4CAMrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,kBAAmB,MAAM,KAAG,cAKzD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,iFACP,MAAM,+BAInB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,2EACT,MAAM,aAInB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,2EACT,MAAM,uCAET,OAAO,KACf,IAWF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,6GAIP,MAAM,+DAGjB,IAgDJ,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;mBAA4C,MAAM,oCAAkC,IAO7G,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,gBACX,cAAc,SACpB,QAAQ,qBACI,oBAAoB,KACxC,IA0BF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,gBACP,cAAc,eACd,cAAc,MAAM,CAAC,GAAG,SAAS,sBAC1B,oBAAoB,KACzC,OAAO,GAAG,aAAa,IAAI,CA4B7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,eAAgB,MAAM,iBAAiB,MAAM,KAAG,IAgB3E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,eACb,MAAM,cACN,
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAmC,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAC,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,QAAQ,EAER,YAAY,EACb,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAC,YAAY,EAAkB,aAAa,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAcnG,eAAO,MAAM,iBAAiB,0KAMtB,MAAM,yIAYb,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,6IAKX,MAAM,4CAMrB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,kBAAmB,MAAM,KAAG,cAKzD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,iFACP,MAAM,+BAInB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,2EACT,MAAM,aAInB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,2EACT,MAAM,uCAET,OAAO,KACf,IAWF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,6GAIP,MAAM,+DAGjB,IAgDJ,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;mBAA4C,MAAM,oCAAkC,IAO7G,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,gBACX,cAAc,SACpB,QAAQ,qBACI,oBAAoB,KACxC,IA0BF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,gBACP,cAAc,eACd,cAAc,MAAM,CAAC,GAAG,SAAS,sBAC1B,oBAAoB,KACzC,OAAO,GAAG,aAAa,IAAI,CA4B7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,eAAgB,MAAM,iBAAiB,MAAM,KAAG,IAgB3E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,eACb,MAAM,cACN,YAAY,EAAE,4CAE3B,YAAY,EAmCd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;mBACpB,MAAM,oCAEpB,IAIF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;gBACpB,MAAM,2EAGjB,YAAY,EAGd,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,MAAM,+CACL,MAAM,2CACa,OAAO,gBAC7B,OAAO,KACf,OAcF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,eACN,MAAM,YACR,MAAM,IAAI,YACV,QAAQ,gBAAgB,CAAC,KACpC,YAGF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,eAAgB,MAAM,KAAG,IAG5C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,KAAK,eAAgB,MAAM,KAAG,IAK1C,CAAC;AAEF;;;GAGG;AAEH,eAAO,MAAM,0BAA0B;;;;;gEACzB,MAAM,wBACI,MAAM;IAc1B;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;2DAjF0B,OAAO;IAoFpC;;OAEG;yCA/Da,IAAI;IAkEpB;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;IAGH;;OAEG;;CAGN,CAAC"}
|
package/core.js
CHANGED
|
@@ -11,8 +11,7 @@ const logger = createLogger(`alwatr/fsm`);
|
|
|
11
11
|
*/
|
|
12
12
|
const fsmConstructorStorage = {};
|
|
13
13
|
export const defineConstructor = (id, config) => {
|
|
14
|
-
|
|
15
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'defineConstructor', { id, config });
|
|
14
|
+
logger.logMethodArgs?.('defineConstructor', { id, config });
|
|
16
15
|
if (fsmConstructorStorage[id] != null)
|
|
17
16
|
throw new Error('fsm_exist', { cause: { id } });
|
|
18
17
|
fsmConstructorStorage[id] = {
|
|
@@ -27,8 +26,7 @@ export const defineConstructor = (id, config) => {
|
|
|
27
26
|
* Get finite state machine instance by id.
|
|
28
27
|
*/
|
|
29
28
|
export const getFsmInstance = (instanceId) => {
|
|
30
|
-
|
|
31
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, '_getFsmInstance', instanceId);
|
|
29
|
+
logger.logMethodArgs?.('_getFsmInstance', instanceId);
|
|
32
30
|
const fsmInstance = contextConsumer.getValue(instanceId);
|
|
33
31
|
if (fsmInstance == null)
|
|
34
32
|
throw new Error('fsm_undefined', { cause: { instanceId } });
|
|
@@ -38,8 +36,7 @@ export const getFsmInstance = (instanceId) => {
|
|
|
38
36
|
* Get finite state machine constructor by id.
|
|
39
37
|
*/
|
|
40
38
|
export const getFsmConstructor = (constructorId) => {
|
|
41
|
-
|
|
42
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, '_getFsmConstructor', constructorId);
|
|
39
|
+
logger.logMethodArgs?.('_getFsmConstructor', constructorId);
|
|
43
40
|
const fsmConstructor = fsmConstructorStorage[constructorId];
|
|
44
41
|
if (fsmConstructor == null)
|
|
45
42
|
throw new Error('fsm_undefined', { cause: { constructorId: constructorId } });
|
|
@@ -49,24 +46,21 @@ export const getFsmConstructor = (constructorId) => {
|
|
|
49
46
|
* Get current state of finite state machine instance.
|
|
50
47
|
*/
|
|
51
48
|
export const getState = (instanceId) => {
|
|
52
|
-
|
|
53
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'getState', instanceId);
|
|
49
|
+
logger.logMethodArgs?.('getState', instanceId);
|
|
54
50
|
return getFsmInstance(instanceId).state;
|
|
55
51
|
};
|
|
56
52
|
/**
|
|
57
53
|
* Get current context of finite state machine instance.
|
|
58
54
|
*/
|
|
59
55
|
export const getContext = (instanceId) => {
|
|
60
|
-
|
|
61
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'getContext', instanceId);
|
|
56
|
+
logger.logMethodArgs?.('getContext', instanceId);
|
|
62
57
|
return getFsmInstance(instanceId).context;
|
|
63
58
|
};
|
|
64
59
|
/**
|
|
65
60
|
* Set context of finite state machine instance.
|
|
66
61
|
*/
|
|
67
62
|
export const setContext = (instanceId, context, notify) => {
|
|
68
|
-
|
|
69
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'setContext', { instanceId, context });
|
|
63
|
+
logger.logMethodArgs?.('setContext', { instanceId, context });
|
|
70
64
|
const fsmInstance = getFsmInstance(instanceId);
|
|
71
65
|
fsmInstance.context = {
|
|
72
66
|
...fsmInstance.context,
|
|
@@ -80,13 +74,12 @@ export const setContext = (instanceId, context, notify) => {
|
|
|
80
74
|
* Transition finite state machine instance to new state.
|
|
81
75
|
*/
|
|
82
76
|
export const transition = (instanceId, event, context) => {
|
|
83
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
84
77
|
const fsmInstance = getFsmInstance(instanceId);
|
|
85
78
|
const fsmConstructor = getFsmConstructor(fsmInstance.constructorId);
|
|
86
79
|
const fromState = fsmInstance.state.target;
|
|
87
80
|
const stateRecord = fsmConstructor.config.stateRecord;
|
|
88
|
-
const transitionConfig =
|
|
89
|
-
|
|
81
|
+
const transitionConfig = stateRecord[fromState]?.on[event] ?? stateRecord.$all.on[event];
|
|
82
|
+
logger.logMethodArgs?.('transition', { instanceId, fromState, event, context, target: transitionConfig?.target });
|
|
90
83
|
if (context !== undefined) {
|
|
91
84
|
fsmInstance.context = {
|
|
92
85
|
...fsmInstance.context,
|
|
@@ -94,12 +87,12 @@ export const transition = (instanceId, event, context) => {
|
|
|
94
87
|
};
|
|
95
88
|
}
|
|
96
89
|
if (transitionConfig == null) {
|
|
97
|
-
|
|
90
|
+
logger.incident?.('transition', 'invalid_target_state', 'Defined target state for this event not found in state config', {
|
|
98
91
|
fromState,
|
|
99
92
|
event,
|
|
100
93
|
events: {
|
|
101
|
-
...
|
|
102
|
-
...
|
|
94
|
+
...stateRecord.$all?.on,
|
|
95
|
+
...stateRecord[fromState]?.on,
|
|
103
96
|
},
|
|
104
97
|
});
|
|
105
98
|
return;
|
|
@@ -110,7 +103,7 @@ export const transition = (instanceId, event, context) => {
|
|
|
110
103
|
return;
|
|
111
104
|
}
|
|
112
105
|
fsmInstance.state = {
|
|
113
|
-
target:
|
|
106
|
+
target: transitionConfig.target ?? fromState,
|
|
114
107
|
from: fromState,
|
|
115
108
|
by: event,
|
|
116
109
|
};
|
|
@@ -121,8 +114,7 @@ export const transition = (instanceId, event, context) => {
|
|
|
121
114
|
* Define actions for finite state machine constructor.
|
|
122
115
|
*/
|
|
123
116
|
export const defineActions = (constructorId, actionRecord) => {
|
|
124
|
-
|
|
125
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'defineActions', { constructorId, actionRecord });
|
|
117
|
+
logger.logMethodArgs?.('defineActions', { constructorId, actionRecord });
|
|
126
118
|
const fmsConstructor = getFsmConstructor(constructorId);
|
|
127
119
|
fmsConstructor.actionRecord = {
|
|
128
120
|
...fmsConstructor.actionRecord,
|
|
@@ -133,33 +125,31 @@ export const defineActions = (constructorId, actionRecord) => {
|
|
|
133
125
|
* Execute all actions for current state.
|
|
134
126
|
*/
|
|
135
127
|
export const _execAllActions = (constructor, state, consumerInterface) => {
|
|
136
|
-
|
|
137
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, '_execAllActions', consumerInterface.id);
|
|
128
|
+
logger.logMethodArgs?.('_execAllActions', consumerInterface.id);
|
|
138
129
|
const stateRecord = constructor.config.stateRecord;
|
|
139
130
|
if (state.by === 'INIT') {
|
|
140
131
|
_execAction(constructor, stateRecord.$all.entry, consumerInterface);
|
|
141
|
-
_execAction(constructor,
|
|
132
|
+
_execAction(constructor, stateRecord[state.target]?.entry, consumerInterface);
|
|
142
133
|
return;
|
|
143
134
|
}
|
|
144
135
|
// else
|
|
145
136
|
if (state.from !== state.target) {
|
|
146
137
|
_execAction(constructor, stateRecord.$all.exit, consumerInterface);
|
|
147
|
-
_execAction(constructor,
|
|
138
|
+
_execAction(constructor, stateRecord[state.from]?.exit, consumerInterface);
|
|
148
139
|
_execAction(constructor, stateRecord.$all.entry, consumerInterface);
|
|
149
|
-
_execAction(constructor,
|
|
140
|
+
_execAction(constructor, stateRecord[state.target]?.entry, consumerInterface);
|
|
150
141
|
}
|
|
151
|
-
_execAction(constructor,
|
|
152
|
-
?
|
|
153
|
-
:
|
|
142
|
+
_execAction(constructor, stateRecord[state.from]?.on[state.by] != null
|
|
143
|
+
? stateRecord[state.from].on[state.by]?.actions
|
|
144
|
+
: stateRecord.$all.on[state.by]?.actions, consumerInterface);
|
|
154
145
|
};
|
|
155
146
|
/**
|
|
156
147
|
* Execute single action.
|
|
157
148
|
*/
|
|
158
149
|
export const _execAction = (constructor, actionNames, finiteStateMachine) => {
|
|
159
|
-
var _a;
|
|
160
150
|
if (actionNames == null)
|
|
161
151
|
return;
|
|
162
|
-
|
|
152
|
+
logger.logMethodArgs?.('execAction', { constructorId: constructor.id, actionNames });
|
|
163
153
|
if (Array.isArray(actionNames)) {
|
|
164
154
|
return actionNames
|
|
165
155
|
.map((actionName) => _execAction(constructor, actionName, finiteStateMachine))
|
|
@@ -188,8 +178,7 @@ export const _execAction = (constructor, actionNames, finiteStateMachine) => {
|
|
|
188
178
|
* Initialize new finite state machine instance.
|
|
189
179
|
*/
|
|
190
180
|
export const initFsmInstance = (instanceId, constructorId) => {
|
|
191
|
-
|
|
192
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'initializeMachine', { constructorId, instanceId });
|
|
181
|
+
logger.logMethodArgs?.('initializeMachine', { constructorId, instanceId });
|
|
193
182
|
const constructor = getFsmConstructor(constructorId);
|
|
194
183
|
const { initial, context } = constructor.config;
|
|
195
184
|
const newInstance = {
|
|
@@ -208,17 +197,15 @@ export const initFsmInstance = (instanceId, constructorId) => {
|
|
|
208
197
|
* Subscribe to all defined signals for finite state machine instance.
|
|
209
198
|
*/
|
|
210
199
|
export const subscribeSignals = (instanceId, signalList, subscribeConstructorSignals = true) => {
|
|
211
|
-
|
|
212
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'subscribeSignals', { instanceId, signalList });
|
|
200
|
+
logger.logMethodArgs?.('subscribeSignals', { instanceId, signalList });
|
|
213
201
|
const listenerList = [];
|
|
214
202
|
if (subscribeConstructorSignals) {
|
|
215
203
|
signalList = signalList.concat(getFsmConstructor(getFsmInstance(instanceId).constructorId).signalList);
|
|
216
204
|
}
|
|
217
205
|
for (const signalConfig of signalList) {
|
|
218
|
-
|
|
206
|
+
signalConfig.signalId ?? (signalConfig.signalId = instanceId);
|
|
219
207
|
listenerList.push(contextConsumer.subscribe(signalConfig.signalId, (signalDetail) => {
|
|
220
|
-
|
|
221
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'execSignalCallback', { instanceId, signalId: signalConfig.signalId, signalDetail });
|
|
208
|
+
logger.logMethodArgs?.('execSignalCallback', { instanceId, signalId: signalConfig.signalId, signalDetail });
|
|
222
209
|
if (signalConfig.callback) {
|
|
223
210
|
signalConfig.callback(signalDetail, finiteStateMachineConsumer(instanceId));
|
|
224
211
|
}
|
|
@@ -228,7 +215,7 @@ export const subscribeSignals = (instanceId, signalList, subscribeConstructorSig
|
|
|
228
215
|
[signalConfig.contextName]: signalDetail,
|
|
229
216
|
});
|
|
230
217
|
}
|
|
231
|
-
}, { receivePrevious:
|
|
218
|
+
}, { receivePrevious: signalConfig.receivePrevious ?? 'No' }));
|
|
232
219
|
}
|
|
233
220
|
return listenerList;
|
|
234
221
|
};
|
|
@@ -236,8 +223,7 @@ export const subscribeSignals = (instanceId, signalList, subscribeConstructorSig
|
|
|
236
223
|
* Define signals for finite state machine constructor.
|
|
237
224
|
*/
|
|
238
225
|
export const defineConstructorSignals = (constructorId, signalList) => {
|
|
239
|
-
|
|
240
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'defineSignals', { constructorId, signalList: signalList });
|
|
226
|
+
logger.logMethodArgs?.('defineSignals', { constructorId, signalList: signalList });
|
|
241
227
|
const fsmConstructor = getFsmConstructor(constructorId);
|
|
242
228
|
fsmConstructor.signalList = fsmConstructor.signalList.concat(signalList);
|
|
243
229
|
};
|
|
@@ -245,8 +231,7 @@ export const defineConstructorSignals = (constructorId, signalList) => {
|
|
|
245
231
|
* Define signals for finite state machine instance.
|
|
246
232
|
*/
|
|
247
233
|
export const defineInstanceSignals = (instanceId, signalList, subscribeConstructorSignals = true) => {
|
|
248
|
-
|
|
249
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'defineSignals', { instanceId, signals: signalList });
|
|
234
|
+
logger.logMethodArgs?.('defineSignals', { instanceId, signals: signalList });
|
|
250
235
|
return subscribeSignals(instanceId, signalList, subscribeConstructorSignals);
|
|
251
236
|
};
|
|
252
237
|
/**
|
|
@@ -263,9 +248,8 @@ export const defineInstanceSignals = (instanceId, signalList, subscribeConstruct
|
|
|
263
248
|
* ```
|
|
264
249
|
*/
|
|
265
250
|
export const render = (instanceId, states, thisArg = null) => {
|
|
266
|
-
var _a;
|
|
267
251
|
const state = getFsmInstance(instanceId).state;
|
|
268
|
-
|
|
252
|
+
logger.logMethodArgs?.('render', { instanceId, state: state.target });
|
|
269
253
|
let renderFn = states[state.target];
|
|
270
254
|
if (typeof renderFn === 'string') {
|
|
271
255
|
renderFn = states[renderFn];
|
|
@@ -279,24 +263,21 @@ export const render = (instanceId, states, thisArg = null) => {
|
|
|
279
263
|
* Subscribe to finite state machine instance state changes.
|
|
280
264
|
*/
|
|
281
265
|
export const subscribe = (instanceId, callback, options) => {
|
|
282
|
-
|
|
283
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'subscribe', instanceId);
|
|
266
|
+
logger.logMethodArgs?.('subscribe', instanceId);
|
|
284
267
|
return contextConsumer.subscribe(instanceId, callback, options);
|
|
285
268
|
};
|
|
286
269
|
/**
|
|
287
270
|
* Destroy finite state machine instance object to clear memory.
|
|
288
271
|
*/
|
|
289
272
|
export const destroy = (instanceId) => {
|
|
290
|
-
|
|
291
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'destroy', instanceId);
|
|
273
|
+
logger.logMethodArgs?.('destroy', instanceId);
|
|
292
274
|
destroySignal(instanceId);
|
|
293
275
|
};
|
|
294
276
|
/**
|
|
295
277
|
* Reset finite state machine instance to initial state and context.
|
|
296
278
|
*/
|
|
297
279
|
export const reset = (instanceId) => {
|
|
298
|
-
|
|
299
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'reset', instanceId);
|
|
280
|
+
logger.logMethodArgs?.('reset', instanceId);
|
|
300
281
|
const constructorId = getFsmInstance(instanceId).constructorId;
|
|
301
282
|
// contextProvider.expire(instanceId);
|
|
302
283
|
initFsmInstance(instanceId, constructorId);
|
|
@@ -307,8 +288,7 @@ export const reset = (instanceId) => {
|
|
|
307
288
|
*/
|
|
308
289
|
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
|
|
309
290
|
export const finiteStateMachineConsumer = (instanceId, makeFromConstructor) => {
|
|
310
|
-
|
|
311
|
-
(_a = logger.logMethodArgs) === null || _a === void 0 ? void 0 : _a.call(logger, 'stateMachineLookup', instanceId);
|
|
291
|
+
logger.logMethodArgs?.('stateMachineLookup', instanceId);
|
|
312
292
|
const machineInstance = contextConsumer.getValue(instanceId);
|
|
313
293
|
if (machineInstance == null) {
|
|
314
294
|
// instance not initialized.
|
|
@@ -325,7 +305,7 @@ export const finiteStateMachineConsumer = (instanceId, makeFromConstructor) => {
|
|
|
325
305
|
/**
|
|
326
306
|
* Finite state machine constructor id.
|
|
327
307
|
*/
|
|
328
|
-
constructorId:
|
|
308
|
+
constructorId: machineInstance?.constructorId ?? makeFromConstructor,
|
|
329
309
|
/**
|
|
330
310
|
* Render helper for use finite state machine instance in UI.
|
|
331
311
|
*/
|
package/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"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","sourcesContent":["import {createLogger, globalAlwatr} from '@alwatr/logger';\nimport {ListenerSpec, contextProvider, contextConsumer} from '@alwatr/signal';\nimport {destroySignal, unsubscribe} from '@alwatr/signal/core.js';\nimport {SubscribeOptions} from '@alwatr/signal/type.js';\n\nimport type {\n ActionRecord,\n FsmConstructor,\n FsmConstructorConfig,\n FsmConsumerInterface,\n FsmInstance,\n FsmState,\n FsmTypeHelper,\n SignalConfig,\n} from './type.js';\nimport type {MaybePromise, OmitFirstParam, SingleOrArray, StringifyableRecord} from '@alwatr/type';\n\nglobalAlwatr.registeredList.push({\n name: '@alwatr/fsm',\n version: _ALWATR_VERSION_,\n});\n\nconst logger = createLogger(`alwatr/fsm`);\n\n/**\n * Finite state machine constructor storage.\n */\nconst fsmConstructorStorage: Record<string, FsmConstructor | undefined> = {};\n\nexport const defineConstructor = <\n TState extends string = string,\n TEventId extends string = string,\n TActionName extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n>(\n id: string,\n config: FsmConstructorConfig<TState, TEventId, TActionName, TContext>,\n ): FsmConstructorConfig<TState, TEventId, TActionName, TContext> => {\n logger.logMethodArgs?.('defineConstructor', {id, config});\n if (fsmConstructorStorage[id] != null) throw new Error('fsm_exist', {cause: {id}});\n fsmConstructorStorage[id] = {\n id,\n config,\n actionRecord: {},\n signalList: [],\n };\n return config;\n};\n\n/**\n * Get finite state machine instance by id.\n */\nexport const getFsmInstance = <\n TState extends string = string,\n TEventId extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n>(\n instanceId: string,\n ): FsmInstance<TState, TEventId, TContext> => {\n logger.logMethodArgs?.('_getFsmInstance', instanceId);\n const fsmInstance = contextConsumer.getValue<FsmInstance<TState, TEventId, TContext>>(instanceId);\n if (fsmInstance == null) throw new Error('fsm_undefined', {cause: {instanceId}});\n return fsmInstance;\n};\n\n/**\n * Get finite state machine constructor by id.\n */\nexport const getFsmConstructor = (constructorId: string): FsmConstructor => {\n logger.logMethodArgs?.('_getFsmConstructor', constructorId);\n const fsmConstructor = fsmConstructorStorage[constructorId];\n if (fsmConstructor == null) throw new Error('fsm_undefined', {cause: {constructorId: constructorId}});\n return fsmConstructor;\n};\n\n/**\n * Get current state of finite state machine instance.\n */\nexport const getState = <TState extends string = string, TEventId extends string = string>(\n instanceId: string,\n): FsmState<TState, TEventId> => {\n logger.logMethodArgs?.('getState', instanceId);\n return getFsmInstance<TState, TEventId>(instanceId).state;\n};\n\n/**\n * Get current context of finite state machine instance.\n */\nexport const getContext = <TContext extends StringifyableRecord = StringifyableRecord>(\n instanceId: string,\n): TContext => {\n logger.logMethodArgs?.('getContext', instanceId);\n return getFsmInstance<string, string, TContext>(instanceId).context;\n};\n\n/**\n * Set context of finite state machine instance.\n */\nexport const setContext = <TContext extends StringifyableRecord = StringifyableRecord>(\n instanceId: string,\n context: Partial<TContext>,\n notify?: boolean,\n): void => {\n logger.logMethodArgs?.('setContext', {instanceId, context});\n const fsmInstance = getFsmInstance(instanceId);\n fsmInstance.context = {\n ...fsmInstance.context,\n ...context,\n };\n\n if (notify) {\n contextProvider.setValue(instanceId, fsmInstance, {debounce: 'Timeout'});\n }\n};\n\n/**\n * Transition finite state machine instance to new state.\n */\nexport const transition = <\n TEventId extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n>(\n instanceId: string,\n event: TEventId,\n context?: Partial<TContext>,\n ): void => {\n const fsmInstance = getFsmInstance(instanceId);\n const fsmConstructor = getFsmConstructor(fsmInstance.constructorId);\n const fromState = fsmInstance.state.target;\n const stateRecord = fsmConstructor.config.stateRecord;\n const transitionConfig = stateRecord[fromState]?.on[event] ?? stateRecord.$all.on[event];\n\n logger.logMethodArgs?.('transition', {instanceId, fromState, event, context, target: transitionConfig?.target});\n\n if (context !== undefined) {\n fsmInstance.context = {\n ...fsmInstance.context,\n ...context,\n };\n }\n\n if (transitionConfig == null) {\n logger.incident?.(\n 'transition',\n 'invalid_target_state',\n 'Defined target state for this event not found in state config',\n {\n fromState,\n event,\n events: {\n ...stateRecord.$all?.on,\n ...stateRecord[fromState]?.on,\n },\n },\n );\n return;\n }\n\n const consumerInterface = finiteStateMachineConsumer(instanceId);\n\n if (transitionConfig.condition) {\n if (_execAction(fsmConstructor, transitionConfig.condition, consumerInterface) === false) return;\n }\n\n fsmInstance.state = {\n target: transitionConfig.target ?? fromState,\n from: fromState,\n by: event,\n };\n\n contextProvider.setValue(instanceId, fsmInstance, {debounce: 'Timeout'});\n\n _execAllActions(fsmConstructor, fsmInstance.state, consumerInterface);\n};\n\n/**\n * Define actions for finite state machine constructor.\n */\nexport const defineActions = <T extends FsmTypeHelper>(constructorId: string, actionRecord: ActionRecord<T>): void => {\n logger.logMethodArgs?.('defineActions', {constructorId, actionRecord});\n const fmsConstructor = getFsmConstructor(constructorId);\n fmsConstructor.actionRecord = {\n ...fmsConstructor.actionRecord,\n ...actionRecord,\n };\n};\n\n/**\n * Execute all actions for current state.\n */\nexport const _execAllActions = (\n constructor: FsmConstructor,\n state: FsmState,\n consumerInterface: FsmConsumerInterface,\n): void => {\n logger.logMethodArgs?.('_execAllActions', consumerInterface.id);\n\n const stateRecord = constructor.config.stateRecord;\n\n if (state.by === 'INIT') {\n _execAction(constructor, stateRecord.$all.entry, consumerInterface);\n _execAction(constructor, stateRecord[state.target]?.entry, consumerInterface);\n return;\n }\n\n // else\n if (state.from !== state.target) {\n _execAction(constructor, stateRecord.$all.exit, consumerInterface);\n _execAction(constructor, stateRecord[state.from]?.exit, consumerInterface);\n _execAction(constructor, stateRecord.$all.entry, consumerInterface);\n _execAction(constructor, stateRecord[state.target]?.entry, consumerInterface);\n }\n\n _execAction(\n constructor,\n stateRecord[state.from]?.on[state.by] != null\n ? stateRecord[state.from].on[state.by]?.actions\n : stateRecord.$all.on[state.by]?.actions,\n consumerInterface,\n );\n};\n\n/**\n * Execute single action.\n */\nexport const _execAction = (\n constructor: FsmConstructor,\n actionNames: SingleOrArray<string> | undefined,\n finiteStateMachine: FsmConsumerInterface,\n): boolean | MaybePromise<void> => {\n if (actionNames == null) return;\n logger.logMethodArgs?.('execAction', {constructorId: constructor.id, actionNames});\n\n if (Array.isArray(actionNames)) {\n return actionNames\n .map((actionName) => _execAction(constructor, actionName, finiteStateMachine))\n .every((r) => r === true);\n }\n\n try {\n const actionFn = constructor.actionRecord[actionNames];\n if (actionFn == null) {\n return logger.error('execAction', 'action_not_found', {\n actionNames,\n constructorId: constructor.id,\n instanceId: finiteStateMachine.id,\n });\n }\n return actionFn(finiteStateMachine);\n }\n catch (error) {\n return logger.error('execAction', 'action_error', error, {\n actionNames,\n constructorId: constructor.id,\n instanceId: finiteStateMachine.id,\n });\n }\n};\n\n/**\n * Initialize new finite state machine instance.\n */\nexport const initFsmInstance = (instanceId: string, constructorId: string): void => {\n logger.logMethodArgs?.('initializeMachine', {constructorId, instanceId});\n const constructor = getFsmConstructor(constructorId);\n const {initial, context} = constructor.config;\n const newInstance: FsmInstance = {\n constructorId,\n state: {\n target: initial,\n from: initial,\n by: 'INIT',\n },\n context,\n };\n contextProvider.setValue<FsmInstance>(instanceId, newInstance, {debounce: 'NextCycle'});\n\n _execAllActions(constructor, newInstance.state, finiteStateMachineConsumer(instanceId));\n};\n\n/**\n * Subscribe to all defined signals for finite state machine instance.\n */\nexport const subscribeSignals = (\n instanceId: string,\n signalList: Array<SignalConfig>,\n subscribeConstructorSignals = true,\n): Array<ListenerSpec> => {\n logger.logMethodArgs?.('subscribeSignals', {instanceId, signalList});\n const listenerList: Array<ListenerSpec> = [];\n\n if (subscribeConstructorSignals) {\n signalList = signalList.concat(getFsmConstructor(getFsmInstance(instanceId).constructorId).signalList);\n }\n\n for (const signalConfig of signalList) {\n signalConfig.signalId ??= instanceId;\n listenerList.push(\n contextConsumer.subscribe(\n signalConfig.signalId,\n (signalDetail: StringifyableRecord): void => {\n logger.logMethodArgs?.('execSignalCallback', {instanceId, signalId: signalConfig.signalId, signalDetail});\n if (signalConfig.callback) {\n signalConfig.callback(signalDetail, finiteStateMachineConsumer(instanceId));\n }\n else {\n // prettier-ignore\n transition(\n instanceId,\n signalConfig.transition,\n signalConfig.contextName == null ? undefined : {\n [signalConfig.contextName]: signalDetail,\n },\n );\n }\n },\n {receivePrevious: signalConfig.receivePrevious ?? 'No'},\n ),\n );\n }\n\n return listenerList;\n};\n\n/**\n * Define signals for finite state machine constructor.\n */\nexport const defineConstructorSignals = <T extends FsmTypeHelper>(\n constructorId: string,\n signalList: Array<SignalConfig<T>>,\n): void => {\n logger.logMethodArgs?.('defineSignals', {constructorId, signalList: signalList});\n const fsmConstructor = getFsmConstructor(constructorId);\n fsmConstructor.signalList = fsmConstructor.signalList.concat(signalList as Array<SignalConfig>);\n};\n\n/**\n * Define signals for finite state machine instance.\n */\nexport const defineInstanceSignals = <T extends FsmTypeHelper>(\n instanceId: string,\n signalList: Array<SignalConfig<T>>,\n subscribeConstructorSignals = true,\n): Array<ListenerSpec> => {\n logger.logMethodArgs?.('defineSignals', {instanceId, signals: signalList});\n return subscribeSignals(instanceId, signalList as Array<SignalConfig>, subscribeConstructorSignals);\n};\n\n/**\n * Render helper for use finite state machine instance in UI.\n *\n * Example:\n *\n * ```ts\n * render('myFsm', {\n * state1: () => html`<div>State 1 Render...</div>`,\n * state2: () => html`<div>State 2 Render...</div>`,\n * state3: 'state1',\n * });\n * ```\n */\nexport const render = <TState extends string = string>(\n instanceId: string,\n states: {[P in TState]: (() => unknown) | TState},\n thisArg: unknown = null,\n): unknown => {\n const state = getFsmInstance(instanceId).state;\n logger.logMethodArgs?.('render', {instanceId, state: state.target});\n let renderFn = states[state.target as TState];\n\n if (typeof renderFn === 'string') {\n renderFn = states[renderFn as TState];\n }\n\n if (typeof renderFn === 'function') {\n return renderFn.call(thisArg);\n }\n\n return;\n};\n\n/**\n * Subscribe to finite state machine instance state changes.\n */\nexport const subscribe = (\n instanceId: string,\n callback: () => void,\n options?: Partial<SubscribeOptions>,\n): ListenerSpec => {\n logger.logMethodArgs?.('subscribe', instanceId);\n return contextConsumer.subscribe(instanceId, callback, options);\n};\n\n/**\n * Destroy finite state machine instance object to clear memory.\n */\nexport const destroy = (instanceId: string): void => {\n logger.logMethodArgs?.('destroy', instanceId);\n destroySignal(instanceId);\n};\n\n/**\n * Reset finite state machine instance to initial state and context.\n */\nexport const reset = (instanceId: string): void => {\n logger.logMethodArgs?.('reset', instanceId);\n const constructorId = getFsmInstance(instanceId).constructorId;\n // contextProvider.expire(instanceId);\n initFsmInstance(instanceId, constructorId);\n};\n\n/**\n * Finite state machine instance consumer.\n * Lookup current finite state machine instance or initialize new one and return consumer object .\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport const finiteStateMachineConsumer = <T extends FsmTypeHelper, TContext extends T['TContext'] = T['TContext']>(\n instanceId: string,\n makeFromConstructor?: string,\n) => {\n logger.logMethodArgs?.('stateMachineLookup', instanceId);\n\n const machineInstance = contextConsumer.getValue<FsmInstance>(instanceId);\n if (machineInstance == null) {\n // instance not initialized.\n if (makeFromConstructor == null) {\n throw new Error('fsm_undefined', {cause: {instanceId}});\n }\n initFsmInstance(instanceId, makeFromConstructor);\n }\n\n return {\n /**\n * Finite state machine instance id.\n */\n id: instanceId,\n\n /**\n * Finite state machine constructor id.\n */\n constructorId: <string>machineInstance?.constructorId ?? makeFromConstructor,\n\n /**\n * Render helper for use finite state machine instance in UI.\n */\n render: render.bind(null, instanceId) as OmitFirstParam<typeof render<T['TState']>>,\n\n /**\n * Subscribe to finite state machine instance state changes.\n */\n subscribe: subscribe.bind(null, instanceId) as OmitFirstParam<typeof subscribe>,\n\n /**\n * Unsubscribe from finite state machine instance state changes.\n */\n unsubscribe: unsubscribe,\n\n /**\n * Get current state of finite state machine instance.\n */\n getState: getState.bind(null, instanceId) as OmitFirstParam<typeof getState<T['TState'], T['TEventId']>>,\n\n /**\n * Get current context of finite state machine instance.\n */\n getContext: getContext.bind(null, instanceId) as OmitFirstParam<typeof getContext<TContext>>,\n\n /**\n * Set context of finite state machine instance.\n */\n setContext: setContext.bind(null, instanceId) as OmitFirstParam<typeof setContext<TContext>>,\n\n /**\n * Transition finite state machine instance to new state.\n */\n transition: transition.bind(null, instanceId) as OmitFirstParam<typeof transition<T['TEventId'], TContext>>,\n\n /**\n * Define signals for finite state machine instance.\n */\n defineSignals: defineInstanceSignals.bind(null, instanceId) as OmitFirstParam<typeof defineInstanceSignals<T>>,\n\n /**\n * Reset finite state machine instance to initial state and context.\n */\n reset: reset.bind(null, instanceId) as OmitFirstParam<typeof reset>,\n\n /**\n * Destroy finite state machine instance object to clear memory.\n */\n destroy: destroy.bind(null, instanceId) as OmitFirstParam<typeof destroy>,\n } as const;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["src/core.ts"],"names":[],"mappings":"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","sourcesContent":["import {createLogger, globalAlwatr} from '@alwatr/logger';\nimport {ListenerSpec, contextProvider, contextConsumer} from '@alwatr/signal';\nimport {destroySignal, unsubscribe} from '@alwatr/signal/core.js';\nimport {SubscribeOptions} from '@alwatr/signal/type.js';\n\nimport type {\n ActionRecord,\n FsmConstructor,\n FsmConstructorConfig,\n FsmConsumerInterface,\n FsmInstance,\n FsmState,\n FsmTypeHelper,\n SignalConfig,\n} from './type.js';\nimport type {MaybePromise, OmitFirstParam, SingleOrArray, StringifyableRecord} from '@alwatr/type';\n\nglobalAlwatr.registeredList.push({\n name: '@alwatr/fsm',\n version: _ALWATR_VERSION_,\n});\n\nconst logger = createLogger(`alwatr/fsm`);\n\n/**\n * Finite state machine constructor storage.\n */\nconst fsmConstructorStorage: Record<string, FsmConstructor | undefined> = {};\n\nexport const defineConstructor = <\n TState extends string = string,\n TEventId extends string = string,\n TActionName extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n>(\n id: string,\n config: FsmConstructorConfig<TState, TEventId, TActionName, TContext>,\n ): FsmConstructorConfig<TState, TEventId, TActionName, TContext> => {\n logger.logMethodArgs?.('defineConstructor', {id, config});\n if (fsmConstructorStorage[id] != null) throw new Error('fsm_exist', {cause: {id}});\n fsmConstructorStorage[id] = {\n id,\n config,\n actionRecord: {},\n signalList: [],\n };\n return config;\n};\n\n/**\n * Get finite state machine instance by id.\n */\nexport const getFsmInstance = <\n TState extends string = string,\n TEventId extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n>(\n instanceId: string,\n ): FsmInstance<TState, TEventId, TContext> => {\n logger.logMethodArgs?.('_getFsmInstance', instanceId);\n const fsmInstance = contextConsumer.getValue<FsmInstance<TState, TEventId, TContext>>(instanceId);\n if (fsmInstance == null) throw new Error('fsm_undefined', {cause: {instanceId}});\n return fsmInstance;\n};\n\n/**\n * Get finite state machine constructor by id.\n */\nexport const getFsmConstructor = (constructorId: string): FsmConstructor => {\n logger.logMethodArgs?.('_getFsmConstructor', constructorId);\n const fsmConstructor = fsmConstructorStorage[constructorId];\n if (fsmConstructor == null) throw new Error('fsm_undefined', {cause: {constructorId: constructorId}});\n return fsmConstructor;\n};\n\n/**\n * Get current state of finite state machine instance.\n */\nexport const getState = <TState extends string = string, TEventId extends string = string>(\n instanceId: string,\n): FsmState<TState, TEventId> => {\n logger.logMethodArgs?.('getState', instanceId);\n return getFsmInstance<TState, TEventId>(instanceId).state;\n};\n\n/**\n * Get current context of finite state machine instance.\n */\nexport const getContext = <TContext extends StringifyableRecord = StringifyableRecord>(\n instanceId: string,\n): TContext => {\n logger.logMethodArgs?.('getContext', instanceId);\n return getFsmInstance<string, string, TContext>(instanceId).context;\n};\n\n/**\n * Set context of finite state machine instance.\n */\nexport const setContext = <TContext extends StringifyableRecord = StringifyableRecord>(\n instanceId: string,\n context: Partial<TContext>,\n notify?: boolean,\n): void => {\n logger.logMethodArgs?.('setContext', {instanceId, context});\n const fsmInstance = getFsmInstance(instanceId);\n fsmInstance.context = {\n ...fsmInstance.context,\n ...context,\n };\n\n if (notify) {\n contextProvider.setValue(instanceId, fsmInstance, {debounce: 'Timeout'});\n }\n};\n\n/**\n * Transition finite state machine instance to new state.\n */\nexport const transition = <\n TEventId extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n>(\n instanceId: string,\n event: TEventId,\n context?: Partial<TContext>,\n ): void => {\n const fsmInstance = getFsmInstance(instanceId);\n const fsmConstructor = getFsmConstructor(fsmInstance.constructorId);\n const fromState = fsmInstance.state.target;\n const stateRecord = fsmConstructor.config.stateRecord;\n const transitionConfig = stateRecord[fromState]?.on[event] ?? stateRecord.$all.on[event];\n\n logger.logMethodArgs?.('transition', {instanceId, fromState, event, context, target: transitionConfig?.target});\n\n if (context !== undefined) {\n fsmInstance.context = {\n ...fsmInstance.context,\n ...context,\n };\n }\n\n if (transitionConfig == null) {\n logger.incident?.(\n 'transition',\n 'invalid_target_state',\n 'Defined target state for this event not found in state config',\n {\n fromState,\n event,\n events: {\n ...stateRecord.$all?.on,\n ...stateRecord[fromState]?.on,\n },\n },\n );\n return;\n }\n\n const consumerInterface = finiteStateMachineConsumer(instanceId);\n\n if (transitionConfig.condition) {\n if (_execAction(fsmConstructor, transitionConfig.condition, consumerInterface) === false) return;\n }\n\n fsmInstance.state = {\n target: transitionConfig.target ?? fromState,\n from: fromState,\n by: event,\n };\n\n contextProvider.setValue(instanceId, fsmInstance, {debounce: 'Timeout'});\n\n _execAllActions(fsmConstructor, fsmInstance.state, consumerInterface);\n};\n\n/**\n * Define actions for finite state machine constructor.\n */\nexport const defineActions = <T extends FsmTypeHelper>(constructorId: string, actionRecord: ActionRecord<T>): void => {\n logger.logMethodArgs?.('defineActions', {constructorId, actionRecord});\n const fmsConstructor = getFsmConstructor(constructorId);\n fmsConstructor.actionRecord = {\n ...fmsConstructor.actionRecord,\n ...actionRecord,\n };\n};\n\n/**\n * Execute all actions for current state.\n */\nexport const _execAllActions = (\n constructor: FsmConstructor,\n state: FsmState,\n consumerInterface: FsmConsumerInterface,\n): void => {\n logger.logMethodArgs?.('_execAllActions', consumerInterface.id);\n\n const stateRecord = constructor.config.stateRecord;\n\n if (state.by === 'INIT') {\n _execAction(constructor, stateRecord.$all.entry, consumerInterface);\n _execAction(constructor, stateRecord[state.target]?.entry, consumerInterface);\n return;\n }\n\n // else\n if (state.from !== state.target) {\n _execAction(constructor, stateRecord.$all.exit, consumerInterface);\n _execAction(constructor, stateRecord[state.from]?.exit, consumerInterface);\n _execAction(constructor, stateRecord.$all.entry, consumerInterface);\n _execAction(constructor, stateRecord[state.target]?.entry, consumerInterface);\n }\n\n _execAction(\n constructor,\n stateRecord[state.from]?.on[state.by] != null\n ? stateRecord[state.from].on[state.by]?.actions\n : stateRecord.$all.on[state.by]?.actions,\n consumerInterface,\n );\n};\n\n/**\n * Execute single action.\n */\nexport const _execAction = (\n constructor: FsmConstructor,\n actionNames: SingleOrArray<string> | undefined,\n finiteStateMachine: FsmConsumerInterface,\n): boolean | MaybePromise<void> => {\n if (actionNames == null) return;\n logger.logMethodArgs?.('execAction', {constructorId: constructor.id, actionNames});\n\n if (Array.isArray(actionNames)) {\n return actionNames\n .map((actionName) => _execAction(constructor, actionName, finiteStateMachine))\n .every((r) => r === true);\n }\n\n try {\n const actionFn = constructor.actionRecord[actionNames];\n if (actionFn == null) {\n return logger.error('execAction', 'action_not_found', {\n actionNames,\n constructorId: constructor.id,\n instanceId: finiteStateMachine.id,\n });\n }\n return actionFn(finiteStateMachine);\n }\n catch (error) {\n return logger.error('execAction', 'action_error', error, {\n actionNames,\n constructorId: constructor.id,\n instanceId: finiteStateMachine.id,\n });\n }\n};\n\n/**\n * Initialize new finite state machine instance.\n */\nexport const initFsmInstance = (instanceId: string, constructorId: string): void => {\n logger.logMethodArgs?.('initializeMachine', {constructorId, instanceId});\n const constructor = getFsmConstructor(constructorId);\n const {initial, context} = constructor.config;\n const newInstance: FsmInstance = {\n constructorId,\n state: {\n target: initial,\n from: initial,\n by: 'INIT',\n },\n context,\n };\n contextProvider.setValue<FsmInstance>(instanceId, newInstance, {debounce: 'NextCycle'});\n\n _execAllActions(constructor, newInstance.state, finiteStateMachineConsumer(instanceId));\n};\n\n/**\n * Subscribe to all defined signals for finite state machine instance.\n */\nexport const subscribeSignals = (\n instanceId: string,\n signalList: SignalConfig[],\n subscribeConstructorSignals = true,\n): ListenerSpec[] => {\n logger.logMethodArgs?.('subscribeSignals', {instanceId, signalList});\n const listenerList: ListenerSpec[] = [];\n\n if (subscribeConstructorSignals) {\n signalList = signalList.concat(getFsmConstructor(getFsmInstance(instanceId).constructorId).signalList);\n }\n\n for (const signalConfig of signalList) {\n signalConfig.signalId ??= instanceId;\n listenerList.push(\n contextConsumer.subscribe(\n signalConfig.signalId,\n (signalDetail: StringifyableRecord): void => {\n logger.logMethodArgs?.('execSignalCallback', {instanceId, signalId: signalConfig.signalId, signalDetail});\n if (signalConfig.callback) {\n signalConfig.callback(signalDetail, finiteStateMachineConsumer(instanceId));\n }\n else {\n // prettier-ignore\n transition(\n instanceId,\n signalConfig.transition,\n signalConfig.contextName == null ? undefined : {\n [signalConfig.contextName]: signalDetail,\n },\n );\n }\n },\n {receivePrevious: signalConfig.receivePrevious ?? 'No'},\n ),\n );\n }\n\n return listenerList;\n};\n\n/**\n * Define signals for finite state machine constructor.\n */\nexport const defineConstructorSignals = <T extends FsmTypeHelper>(\n constructorId: string,\n signalList: SignalConfig<T>[],\n): void => {\n logger.logMethodArgs?.('defineSignals', {constructorId, signalList: signalList});\n const fsmConstructor = getFsmConstructor(constructorId);\n fsmConstructor.signalList = fsmConstructor.signalList.concat(signalList as SignalConfig[]);\n};\n\n/**\n * Define signals for finite state machine instance.\n */\nexport const defineInstanceSignals = <T extends FsmTypeHelper>(\n instanceId: string,\n signalList: SignalConfig<T>[],\n subscribeConstructorSignals = true,\n): ListenerSpec[] => {\n logger.logMethodArgs?.('defineSignals', {instanceId, signals: signalList});\n return subscribeSignals(instanceId, signalList as SignalConfig[], subscribeConstructorSignals);\n};\n\n/**\n * Render helper for use finite state machine instance in UI.\n *\n * Example:\n *\n * ```ts\n * render('myFsm', {\n * state1: () => html`<div>State 1 Render...</div>`,\n * state2: () => html`<div>State 2 Render...</div>`,\n * state3: 'state1',\n * });\n * ```\n */\nexport const render = <TState extends string = string>(\n instanceId: string,\n states: {[P in TState]: (() => unknown) | TState},\n thisArg: unknown = null,\n): unknown => {\n const state = getFsmInstance(instanceId).state;\n logger.logMethodArgs?.('render', {instanceId, state: state.target});\n let renderFn = states[state.target as TState];\n\n if (typeof renderFn === 'string') {\n renderFn = states[renderFn as TState];\n }\n\n if (typeof renderFn === 'function') {\n return renderFn.call(thisArg);\n }\n\n return;\n};\n\n/**\n * Subscribe to finite state machine instance state changes.\n */\nexport const subscribe = (\n instanceId: string,\n callback: () => void,\n options?: Partial<SubscribeOptions>,\n): ListenerSpec => {\n logger.logMethodArgs?.('subscribe', instanceId);\n return contextConsumer.subscribe(instanceId, callback, options);\n};\n\n/**\n * Destroy finite state machine instance object to clear memory.\n */\nexport const destroy = (instanceId: string): void => {\n logger.logMethodArgs?.('destroy', instanceId);\n destroySignal(instanceId);\n};\n\n/**\n * Reset finite state machine instance to initial state and context.\n */\nexport const reset = (instanceId: string): void => {\n logger.logMethodArgs?.('reset', instanceId);\n const constructorId = getFsmInstance(instanceId).constructorId;\n // contextProvider.expire(instanceId);\n initFsmInstance(instanceId, constructorId);\n};\n\n/**\n * Finite state machine instance consumer.\n * Lookup current finite state machine instance or initialize new one and return consumer object .\n */\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nexport const finiteStateMachineConsumer = <T extends FsmTypeHelper, TContext extends T['TContext'] = T['TContext']>(\n instanceId: string,\n makeFromConstructor?: string,\n) => {\n logger.logMethodArgs?.('stateMachineLookup', instanceId);\n\n const machineInstance = contextConsumer.getValue<FsmInstance>(instanceId);\n if (machineInstance == null) {\n // instance not initialized.\n if (makeFromConstructor == null) {\n throw new Error('fsm_undefined', {cause: {instanceId}});\n }\n initFsmInstance(instanceId, makeFromConstructor);\n }\n\n return {\n /**\n * Finite state machine instance id.\n */\n id: instanceId,\n\n /**\n * Finite state machine constructor id.\n */\n constructorId: machineInstance?.constructorId as string ?? makeFromConstructor,\n\n /**\n * Render helper for use finite state machine instance in UI.\n */\n render: render.bind(null, instanceId) as OmitFirstParam<typeof render<T['TState']>>,\n\n /**\n * Subscribe to finite state machine instance state changes.\n */\n subscribe: subscribe.bind(null, instanceId) as OmitFirstParam<typeof subscribe>,\n\n /**\n * Unsubscribe from finite state machine instance state changes.\n */\n unsubscribe: unsubscribe,\n\n /**\n * Get current state of finite state machine instance.\n */\n getState: getState.bind(null, instanceId) as OmitFirstParam<typeof getState<T['TState'], T['TEventId']>>,\n\n /**\n * Get current context of finite state machine instance.\n */\n getContext: getContext.bind(null, instanceId) as OmitFirstParam<typeof getContext<TContext>>,\n\n /**\n * Set context of finite state machine instance.\n */\n setContext: setContext.bind(null, instanceId) as OmitFirstParam<typeof setContext<TContext>>,\n\n /**\n * Transition finite state machine instance to new state.\n */\n transition: transition.bind(null, instanceId) as OmitFirstParam<typeof transition<T['TEventId'], TContext>>,\n\n /**\n * Define signals for finite state machine instance.\n */\n defineSignals: defineInstanceSignals.bind(null, instanceId) as OmitFirstParam<typeof defineInstanceSignals<T>>,\n\n /**\n * Reset finite state machine instance to initial state and context.\n */\n reset: reset.bind(null, instanceId) as OmitFirstParam<typeof reset>,\n\n /**\n * Destroy finite state machine instance object to clear memory.\n */\n destroy: destroy.bind(null, instanceId) as OmitFirstParam<typeof destroy>,\n } as const;\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwatr/fsm",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Managing invocations finite-state machines for lit-element written in tiny TypeScript module.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"state",
|
|
@@ -34,10 +34,10 @@
|
|
|
34
34
|
"url": "https://github.com/AliMD/alwatr/issues"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@alwatr/logger": "^1.
|
|
38
|
-
"@alwatr/signal": "^1.
|
|
39
|
-
"@alwatr/type": "^1.
|
|
40
|
-
"tslib": "^2.
|
|
37
|
+
"@alwatr/logger": "^1.1.1",
|
|
38
|
+
"@alwatr/signal": "^1.1.1",
|
|
39
|
+
"@alwatr/type": "^1.1.1",
|
|
40
|
+
"tslib": "^2.6.2"
|
|
41
41
|
},
|
|
42
|
-
"gitHead": "
|
|
42
|
+
"gitHead": "ebc98f75330ab77c7a5bfeebe0fd1f4748bf3821"
|
|
43
43
|
}
|
package/type.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export interface FsmConstructor {
|
|
|
8
8
|
readonly id: string;
|
|
9
9
|
readonly config: FsmConstructorConfig;
|
|
10
10
|
actionRecord: ActionRecord;
|
|
11
|
-
signalList:
|
|
11
|
+
signalList: SignalConfig[];
|
|
12
12
|
}
|
|
13
13
|
export interface FsmConstructorConfig<TState extends string = string, TEventId extends string = string, TActionName extends string = string, TContext extends StringifyableRecord = StringifyableRecord> extends StringifyableRecord {
|
|
14
14
|
/**
|
package/type.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["src/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,0BAA0B,EAAC,MAAM,WAAW,CAAC;AAC1D,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAE/F,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["src/type.ts"],"names":[],"mappings":"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"}
|
package/type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.js","sourceRoot":"","sources":["src/type.ts"],"names":[],"mappings":"","sourcesContent":["import type {finiteStateMachineConsumer} from './core.js';\nimport type {DebounceType} from '@alwatr/signal';\nimport type {ArrayItems, MaybePromise, SingleOrArray, StringifyableRecord} from '@alwatr/type';\n\nexport interface FsmConstructor {\n /**\n * Constructor id.\n */\n readonly id: string;\n readonly config: FsmConstructorConfig;\n actionRecord: ActionRecord;\n signalList:
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["src/type.ts"],"names":[],"mappings":"","sourcesContent":["import type {finiteStateMachineConsumer} from './core.js';\nimport type {DebounceType} from '@alwatr/signal';\nimport type {ArrayItems, MaybePromise, SingleOrArray, StringifyableRecord} from '@alwatr/type';\n\nexport interface FsmConstructor {\n /**\n * Constructor id.\n */\n readonly id: string;\n readonly config: FsmConstructorConfig;\n actionRecord: ActionRecord;\n signalList: SignalConfig[];\n}\n\nexport interface FsmConstructorConfig<\n TState extends string = string,\n TEventId extends string = string,\n TActionName extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n> extends StringifyableRecord {\n /**\n * Initial context.\n */\n readonly context: TContext;\n\n /**\n * Initial state.\n */\n readonly initial: TState;\n\n /**\n * Define state list\n */\n readonly stateRecord: StateRecord<TState, TEventId, TActionName>;\n}\n\nexport type StateRecord<\n TState extends string = string,\n TEventId extends string = string,\n TActionName extends string = string\n> = {\n readonly [S in TState | '$all']: {\n /**\n * On state exit actions\n */\n readonly exit?: SingleOrArray<TActionName>;\n\n /**\n * On state entry actions\n */\n readonly entry?: SingleOrArray<TActionName>;\n\n /**\n * An object mapping eventId to state.\n *\n * Example:\n *\n * ```ts\n * stateRecord: {\n * on: {\n * TIMER: {\n * target: 'green',\n * condition: () => car.gas > 0,\n * actions: () => car.go(),\n * }\n * }\n * }\n * ```\n */\n readonly on: {\n readonly [E in TEventId]?: TransitionConfig<TState, TActionName> | undefined;\n };\n };\n};\n\nexport interface FsmState<TState extends string = string, TEventId extends string = string>\n extends StringifyableRecord {\n /**\n * Current state\n */\n target: TState;\n /**\n * Last state\n */\n from: TState;\n /**\n * Transition event\n */\n by: TEventId | 'INIT';\n}\n\nexport interface TransitionConfig<TState extends string = string, TActionName extends string = string>\n extends StringifyableRecord {\n readonly target?: TState;\n readonly condition?: TActionName;\n readonly actions?: SingleOrArray<TActionName>;\n}\n\nexport interface FsmInstance<\n TState extends string = string,\n TEventId extends string = string,\n TContext extends StringifyableRecord = StringifyableRecord\n> extends StringifyableRecord {\n readonly constructorId: string;\n state: FsmState<TState, TEventId>;\n context: TContext;\n}\n\nexport type ActionRecord<T extends FsmTypeHelper = FsmTypeHelper> = {\n readonly [P in T['TActionName']]?: (finiteStateMachine: FsmConsumerInterface<T>) => MaybePromise<void> | boolean;\n};\n\nexport type SignalConfig<T extends FsmTypeHelper = FsmTypeHelper> = {\n signalId?: string;\n /**\n * @default `No`\n */\n receivePrevious?: DebounceType;\n} & (\n | {\n transition: T['TEventId'];\n contextName?: keyof T['TContext'];\n callback?: never;\n }\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n callback: (detail: any, fsmInstance: FsmConsumerInterface<T>) => void;\n transition?: never;\n }\n);\n\n// type helper\nexport type FsmTypeHelper<T extends FsmConstructorConfig = FsmConstructorConfig> = Readonly<{\n TState: Exclude<keyof T['stateRecord'], '$all'>;\n TEventId: keyof T['stateRecord'][FsmTypeHelper<T>['TState']]['on'];\n TActionName: NonNullable<ArrayItems<T['stateRecord'][FsmTypeHelper<T>['TState']]['entry']>>;\n TContext: T['context'];\n}>;\n\nexport type FsmConsumerInterface<\n T extends FsmTypeHelper = FsmTypeHelper,\n TContext extends T['TContext'] = T['TContext']\n> = ReturnType<typeof finiteStateMachineConsumer<T, TContext>>;\n"]}
|