UNPKG

@idiosync/react-observable

Version:

State management control layer for React projects

78 lines (77 loc) 3.06 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createCommandStream = void 0; const observable_1 = require("./observable"); const create_store_1 = require("../store/create-store"); const stream_1 = require("../utils/stream"); const general_1 = require("../utils/general"); const createCommandStream = (initialise, { onError, initialValue } = {}) => { const entry$ = (0, observable_1.createObservable)({ initialValue: undefined, emitWhenValuesAreEqual: true, }); const exit$ = (0, observable_1.createObservable)(initialValue ? { initialValue } : undefined); const isInitialised = (0, observable_1.createObservable)({ initialValue: false }); const initialiseStream = (store) => { const stream$ = initialise({ $: entry$, store: store, }); isInitialised.set(true); stream$.subscribe(exit$.set, exit$.emitError, exit$.emitStreamHalted); }; const execute = (payload) => new Promise((resolve) => { const run = () => { const executionId = (0, general_1.uuid)(); const entryEmitCount = entry$.getEmitCount(); const unsubscribe = exit$.subscribe((data, stack) => { const isAppropriateStream = stack ? (0, stream_1.getIsAppropriateStream)(stack, executionId, entryEmitCount) : false; if (isAppropriateStream) { resolve([data, undefined]); unsubscribe(); } }, (error, stack) => { const isAppropriateStream = stack ? (0, stream_1.getIsAppropriateStream)(stack, executionId, entryEmitCount) : false; if (isAppropriateStream) { onError && onError(error, stack); resolve([undefined, error]); unsubscribe(); } }, (stack) => { const isAppropriateStream = stack ? (0, stream_1.getIsAppropriateStream)(stack, executionId, entryEmitCount) : false; if (isAppropriateStream) { resolve([exit$.get(), undefined]); unsubscribe(); } }); entry$.set(payload, [ { id: executionId, name: `createStream:${executionId}`, emitCount: entryEmitCount, isError: false, }, ]); }; if (!isInitialised.get()) { if (!!create_store_1.store$.get()) { initialiseStream(create_store_1.store$.get()); } else { create_store_1.store$.subscribeOnce((store) => { initialiseStream(store); }); } } run(); }); execute.exit$ = exit$; return execute; }; exports.createCommandStream = createCommandStream;