UNPKG

@apollo/client

Version:

A fully-featured caching GraphQL client.

137 lines 5.17 kB
import { __extends } from "tslib"; import { Observable } from "./Observable.js"; import { iterateObserversSafely } from "./iteration.js"; import { fixObservableSubclass } from "./subclassing.js"; function isPromiseLike(value) { return value && typeof value.then === "function"; } var Concast = (function (_super) { __extends(Concast, _super); function Concast(sources) { var _this = _super.call(this, function (observer) { _this.addObserver(observer); return function () { return _this.removeObserver(observer); }; }) || this; _this.observers = new Set(); _this.promise = new Promise(function (resolve, reject) { _this.resolve = resolve; _this.reject = reject; }); _this.handlers = { next: function (result) { if (_this.sub !== null) { _this.latest = ["next", result]; _this.notify("next", result); iterateObserversSafely(_this.observers, "next", result); } }, error: function (error) { var sub = _this.sub; if (sub !== null) { if (sub) setTimeout(function () { return sub.unsubscribe(); }); _this.sub = null; _this.latest = ["error", error]; _this.reject(error); _this.notify("error", error); iterateObserversSafely(_this.observers, "error", error); } }, complete: function () { var _a = _this, sub = _a.sub, _b = _a.sources, sources = _b === void 0 ? [] : _b; if (sub !== null) { var value = sources.shift(); if (!value) { if (sub) setTimeout(function () { return sub.unsubscribe(); }); _this.sub = null; if (_this.latest && _this.latest[0] === "next") { _this.resolve(_this.latest[1]); } else { _this.resolve(); } _this.notify("complete"); iterateObserversSafely(_this.observers, "complete"); } else if (isPromiseLike(value)) { value.then(function (obs) { return _this.sub = obs.subscribe(_this.handlers); }); } else { _this.sub = value.subscribe(_this.handlers); } } }, }; _this.nextResultListeners = new Set(); _this.cancel = function (reason) { _this.reject(reason); _this.sources = []; _this.handlers.complete(); }; _this.promise.catch(function (_) { }); if (typeof sources === "function") { sources = [new Observable(sources)]; } if (isPromiseLike(sources)) { sources.then(function (iterable) { return _this.start(iterable); }, _this.handlers.error); } else { _this.start(sources); } return _this; } Concast.prototype.start = function (sources) { if (this.sub !== void 0) return; this.sources = Array.from(sources); this.handlers.complete(); }; Concast.prototype.deliverLastMessage = function (observer) { if (this.latest) { var nextOrError = this.latest[0]; var method = observer[nextOrError]; if (method) { method.call(observer, this.latest[1]); } if (this.sub === null && nextOrError === "next" && observer.complete) { observer.complete(); } } }; Concast.prototype.addObserver = function (observer) { if (!this.observers.has(observer)) { this.deliverLastMessage(observer); this.observers.add(observer); } }; Concast.prototype.removeObserver = function (observer) { if (this.observers.delete(observer) && this.observers.size < 1) { this.handlers.complete(); } }; Concast.prototype.notify = function (method, arg) { var nextResultListeners = this.nextResultListeners; if (nextResultListeners.size) { this.nextResultListeners = new Set; nextResultListeners.forEach(function (listener) { return listener(method, arg); }); } }; Concast.prototype.beforeNext = function (callback) { var called = false; this.nextResultListeners.add(function (method, arg) { if (!called) { called = true; callback(method, arg); } }); }; return Concast; }(Observable)); export { Concast }; fixObservableSubclass(Concast); //# sourceMappingURL=Concast.js.map