@antischematic/angular-state-library
Version:
Reactive state without boilerplate
50 lines • 9.28 kB
JavaScript
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=