@idiosync/react-observable
Version:
State management control layer for React projects
78 lines (77 loc) • 3.06 kB
JavaScript
;
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;