fsm-state-manager
Version:
A Flow FSM using a finite state machine pattern
74 lines (73 loc) • 2.49 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var fsm_state_manager_1 = require("../fsm-state-manager");
var HttpRequestTransitionRules = {
init: {
fetch: {
transitionAction: function () { return ({
state: 'loading',
appliedData: [],
}); }
},
},
loading: {
success: {
transitionAction: function (data, payload) {
return (payload === null || payload === void 0 ? void 0 : payload.appliedData)
? { state: 'loaded', appliedData: payload.appliedData }
: data;
},
transitionGuard: function () { return 1 + 1 === 2; },
},
failure: {
transitionAction: function (data, payload) {
return (payload === null || payload === void 0 ? void 0 : payload.appliedData)
? { state: 'error', appliedData: payload.appliedData }
: data;
},
}
},
loaded: {
fetch: {
transitionAction: function () { return ({
state: 'loading',
appliedData: [],
}); },
}
},
error: {
retry: {
transitionAction: function () { return ({
state: 'loading',
appliedData: [],
}); },
}
},
};
var stateManager = new fsm_state_manager_1.StateManagerFSM(HttpRequestTransitionRules);
stateManager.setStateData({ state: 'init', appliedData: [] });
function logTransitionTime(event, time) {
var barLength = Math.round(time * 100);
var bar = '🟩'.repeat(barLength);
if (barLength > 4) {
bar = '🟨'.repeat(barLength);
}
if (barLength > 7) {
bar = '🟥'.repeat(barLength);
}
var paddedEvent = event.padEnd(10, ' ');
console.log("[FSM \uD83D\uDC40] ".concat(paddedEvent, " ").concat(time.toFixed(10), "ms ").concat(bar));
}
function benchmarkTransition(event, payload) {
var start = performance.now();
stateManager.transition(event, payload);
var end = performance.now();
var duration = end - start;
logTransitionTime(event, duration);
}
var subscribtion = stateManager.subscribe('loaded', function () { });
benchmarkTransition('fetch');
benchmarkTransition('success', ['data1', 'data2']);
subscribtion.unsubscribe();
benchmarkTransition('fetch');
benchmarkTransition('success', ['data1', 'data2']);