UNPKG

@antischematic/angular-state-library

Version:
50 lines 9.28 kB
import { ChangeDetectorRef, ErrorHandler, inject } from "@angular/core"; import { runInContext } from "./core"; import { EventType } from "./interfaces"; import { catchError, EMPTY, Subject, tap } from "rxjs"; import { getChanges } from "./proxy"; import { isPlainObject, observeInZone, wrap } from "./utils"; import { ACTION, CONTEXT, EffectScheduler, EventScheduler } from "./providers"; const observers = [EventType.Next, EventType.Error, EventType.Complete, "finalize"]; function callObserver(fn, applyThis, value) { fn.call(applyThis, value); } export function dispatch(source, observerOrOptions = {}, options = observerOrOptions) { const action = inject(ACTION); const context = inject(CONTEXT).instance; const applyThis = observerOrOptions && !isPlainObject(observerOrOptions) ? observerOrOptions : context; const errorHandler = inject(ErrorHandler); const event = inject(EventScheduler); const effect = inject(EffectScheduler); const changeDetector = inject(ChangeDetectorRef); const signal = new Subject(); const zone = options.zone === "noop" ? Zone.root : options.zone ?? Zone.current; const observer = typeof observerOrOptions === "function" ? { next: observerOrOptions } : { ...observerOrOptions }; for (const key of observers) { wrap(observer, key, function (fn, value) { const isAction = key !== "finalize"; try { if (!changeDetector.destroyed) { const deps = new Map(); isAction && event.schedule(key, action.key, value, getChanges(deps)); changeDetector.markForCheck(); runInContext(deps, callObserver, context, false, action.key, fn, applyThis, value); } } finally { if (isAction) { signal[key](value); } else { signal.complete(); } } }); } effect.enqueue(observeInZone(source.pipe(tap(observer), catchError(e => { zone.runGuarded(() => errorHandler.handleError(e)); return EMPTY; })), zone)); return signal; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9kaXNwYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBbUMsU0FBUyxFQUEyQixNQUFNLGNBQWMsQ0FBQztBQUNuRyxPQUFPLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUUsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzNELE9BQU8sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0UsTUFBTSxTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQVUsQ0FBQTtBQU01RixTQUFTLFlBQVksQ0FBQyxFQUFZLEVBQUUsU0FBYyxFQUFFLEtBQVU7SUFDM0QsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUE7QUFDNUIsQ0FBQztBQUtELE1BQU0sVUFBVSxRQUFRLENBQUMsTUFBdUIsRUFBRSxvQkFBeUIsRUFBRSxFQUFFLFVBQTJCLGlCQUFpQjtJQUN4SCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUE2QixDQUFBO0lBQ3pELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFlLENBQUE7SUFDL0MsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtJQUN0RyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7SUFDekMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFBO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQTtJQUN0QyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQVksQ0FBQTtJQUMzRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFBO0lBQ2pDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDL0UsTUFBTSxRQUFRLEdBQUcsT0FBTyxpQkFBaUIsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxpQkFBaUIsRUFBRSxDQUFBO0lBRWpILEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFO1FBQzFCLElBQUksQ0FBQyxRQUFTLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxFQUFFLEtBQUs7WUFDckMsTUFBTSxRQUFRLEdBQUcsR0FBRyxLQUFLLFVBQVUsQ0FBQTtZQUNuQyxJQUFJO2dCQUNELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFO29CQUM1QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO29CQUN0QixRQUFRLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7b0JBQ3BFLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQTtvQkFDN0IsWUFBWSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUE7aUJBQ3BGO2FBQ0g7b0JBQVM7Z0JBQ1AsSUFBSSxRQUFRLEVBQUU7b0JBQ1gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFBO2lCQUNwQjtxQkFBTTtvQkFDSixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUE7aUJBQ25CO2FBQ0g7UUFDSixDQUFDLENBQUMsQ0FBQTtLQUNKO0lBRUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDckMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUNiLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xELE9BQU8sS0FBSyxDQUFBO0lBQ2YsQ0FBQyxDQUFDLENBQ0osRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBRVQsT0FBTyxNQUFhLENBQUE7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JSZWYsIEVycm9ySGFuZGxlciwgaW5qZWN0LCBWaWV3UmVmfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtydW5JbkNvbnRleHR9IGZyb20gXCIuL2NvcmVcIjtcbmltcG9ydCB7QWN0aW9uTWV0YWRhdGEsIERpc3BhdGNoT2JzZXJ2ZXIsIEV2ZW50VHlwZSwgTWV0YWRhdGEsIFpvbmVDb21wYXRpYmxlfSBmcm9tIFwiLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQge2NhdGNoRXJyb3IsIEVNUFRZLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YXB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge2dldENoYW5nZXN9IGZyb20gXCIuL3Byb3h5XCI7XG5pbXBvcnQge2lzUGxhaW5PYmplY3QsIG9ic2VydmVJblpvbmUsIHdyYXB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge0FDVElPTiwgQ09OVEVYVCwgRWZmZWN0U2NoZWR1bGVyLCBFdmVudFNjaGVkdWxlcn0gZnJvbSBcIi4vcHJvdmlkZXJzXCI7XG5cbmNvbnN0IG9ic2VydmVycyA9IFtFdmVudFR5cGUuTmV4dCwgRXZlbnRUeXBlLkVycm9yLCBFdmVudFR5cGUuQ29tcGxldGUsIFwiZmluYWxpemVcIl0gYXMgY29uc3RcblxuZXhwb3J0IGludGVyZmFjZSBEaXNwYXRjaE9wdGlvbnMge1xuICAgem9uZT86IFwibm9vcFwiIHwgWm9uZUNvbXBhdGlibGVcbn1cblxuZnVuY3Rpb24gY2FsbE9ic2VydmVyKGZuOiBGdW5jdGlvbiwgYXBwbHlUaGlzOiBhbnksIHZhbHVlOiBhbnkpIHtcbiAgIGZuLmNhbGwoYXBwbHlUaGlzLCB2YWx1ZSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoPFRWYWx1ZT4oc291cmNlOiBPYnNlcnZhYmxlPFRWYWx1ZT4sIG9wdGlvbnM/OiBEaXNwYXRjaE9wdGlvbnMpOiBPYnNlcnZhYmxlPFRWYWx1ZT5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwYXRjaDxUVmFsdWU+KHNvdXJjZTogT2JzZXJ2YWJsZTxUVmFsdWU+LCBvYnNlcnZlcjogRGlzcGF0Y2hPYnNlcnZlcjxUVmFsdWU+LCBvcHRpb25zPzogRGlzcGF0Y2hPcHRpb25zKTogT2JzZXJ2YWJsZTxUVmFsdWU+XG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2g8VFZhbHVlPihzb3VyY2U6IE9ic2VydmFibGU8VFZhbHVlPiwgbmV4dDogKHZhbHVlOiBUVmFsdWUpID0+IHZvaWQsIG9wdGlvbnM/OiBEaXNwYXRjaE9wdGlvbnMpOiBPYnNlcnZhYmxlPFRWYWx1ZT5cbmV4cG9ydCBmdW5jdGlvbiBkaXNwYXRjaChzb3VyY2U6IE9ic2VydmFibGU8YW55Piwgb2JzZXJ2ZXJPck9wdGlvbnM6IGFueSA9IHt9LCBvcHRpb25zOiBEaXNwYXRjaE9wdGlvbnMgPSBvYnNlcnZlck9yT3B0aW9ucykge1xuICAgY29uc3QgYWN0aW9uID0gaW5qZWN0KEFDVElPTikgYXMgTWV0YWRhdGE8QWN0aW9uTWV0YWRhdGE+XG4gICBjb25zdCBjb250ZXh0ID0gaW5qZWN0KENPTlRFWFQpLmluc3RhbmNlIGFzIGFueVxuICAgY29uc3QgYXBwbHlUaGlzID0gb2JzZXJ2ZXJPck9wdGlvbnMgJiYgIWlzUGxhaW5PYmplY3Qob2JzZXJ2ZXJPck9wdGlvbnMpID8gb2JzZXJ2ZXJPck9wdGlvbnMgOiBjb250ZXh0XG4gICBjb25zdCBlcnJvckhhbmRsZXIgPSBpbmplY3QoRXJyb3JIYW5kbGVyKVxuICAgY29uc3QgZXZlbnQgPSBpbmplY3QoRXZlbnRTY2hlZHVsZXIpXG4gICBjb25zdCBlZmZlY3QgPSBpbmplY3QoRWZmZWN0U2NoZWR1bGVyKVxuICAgY29uc3QgY2hhbmdlRGV0ZWN0b3IgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpIGFzIFZpZXdSZWZcbiAgIGNvbnN0IHNpZ25hbCA9IG5ldyBTdWJqZWN0PGFueT4oKVxuICAgY29uc3Qgem9uZSA9IG9wdGlvbnMuem9uZSA9PT0gXCJub29wXCIgPyBab25lLnJvb3QgOiBvcHRpb25zLnpvbmUgPz8gWm9uZS5jdXJyZW50XG4gICBjb25zdCBvYnNlcnZlciA9IHR5cGVvZiBvYnNlcnZlck9yT3B0aW9ucyA9PT0gXCJmdW5jdGlvblwiID8geyBuZXh0OiBvYnNlcnZlck9yT3B0aW9ucyB9IDogeyAuLi5vYnNlcnZlck9yT3B0aW9ucyB9XG5cbiAgIGZvciAoY29uc3Qga2V5IG9mIG9ic2VydmVycykge1xuICAgICAgd3JhcChvYnNlcnZlciEsIGtleSwgZnVuY3Rpb24gKGZuLCB2YWx1ZSkge1xuICAgICAgICAgY29uc3QgaXNBY3Rpb24gPSBrZXkgIT09IFwiZmluYWxpemVcIlxuICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghY2hhbmdlRGV0ZWN0b3IuZGVzdHJveWVkKSB7XG4gICAgICAgICAgICAgICBjb25zdCBkZXBzID0gbmV3IE1hcCgpXG4gICAgICAgICAgICAgICBpc0FjdGlvbiAmJiBldmVudC5zY2hlZHVsZShrZXksIGFjdGlvbi5rZXksIHZhbHVlLCBnZXRDaGFuZ2VzKGRlcHMpKVxuICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKClcbiAgICAgICAgICAgICAgIHJ1bkluQ29udGV4dChkZXBzLCBjYWxsT2JzZXJ2ZXIsIGNvbnRleHQsIGZhbHNlLCBhY3Rpb24ua2V5LCBmbiwgYXBwbHlUaGlzLCB2YWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoaXNBY3Rpb24pIHtcbiAgICAgICAgICAgICAgIHNpZ25hbFtrZXldKHZhbHVlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgIHNpZ25hbC5jb21wbGV0ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICB9KVxuICAgfVxuXG4gICBlZmZlY3QuZW5xdWV1ZShvYnNlcnZlSW5ab25lKHNvdXJjZS5waXBlKFxuICAgICAgdGFwKG9ic2VydmVyKSxcbiAgICAgIGNhdGNoRXJyb3IoZSA9PiB7XG4gICAgICAgICB6b25lLnJ1bkd1YXJkZWQoKCkgPT4gZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGUpKVxuICAgICAgICAgcmV0dXJuIEVNUFRZXG4gICAgICB9KVxuICAgKSwgem9uZSkpXG5cbiAgIHJldHVybiBzaWduYWwgYXMgYW55XG59XG4iXX0=