UNPKG

fsm-state-manager

Version:

A Flow FSM using a finite state machine pattern

74 lines (73 loc) 2.49 kB
"use strict"; 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']);