UNPKG

multitude

Version:

Comprehensive streams for push and pull

79 lines (64 loc) 8.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.catches = catches; var _Observable = require("../../classes/Observable"); var _transform = require("../../utils/transform"); var _intercept = require("../../utils/intercept"); var _from = require("../../creators/from"); var _typeCore = require("type-core"); /** * Catches an error in the original observable * and continues the stream by asynchronously subscribing * to the Observable returned by `selector`. * When no `selector` is provided, the original observable * will be resubscribed. */ function catches(selector) { const options = _typeCore.TypeGuard.isFunction(selector) ? { selector: selector } : selector || {}; const fn = (limit, err, observable) => { const obs = options.selector ? options.selector(err, observable) : observable; return trunk(limit, fn)(obs); }; const limit = _typeCore.TypeGuard.isNumber(options.limit) ? options.limit : 1; return trunk(limit < 0 ? Infinity : limit, fn); } function trunk(limit, selector) { return (0, _transform.transform)(observable => { return new _Observable.Observable(obs => { let subs = null; const unsubscribe = () => { if (!subs) return; subs.unsubscribe(); subs = null; }; (0, _intercept.intercept)(observable, obs, { start(subscription) { subs = subscription; }, error(reason) { if (limit < 1) { obs.error(reason); } else { unsubscribe(); Promise.resolve().then(() => { (0, _from.from)(selector(limit - 1, reason, observable)).subscribe({ start(subscription) { subs = subscription; }, next: obs.next.bind(obs), error: obs.error.bind(obs), complete: obs.complete.bind(obs) }); }); } } }); return unsubscribe; }); }); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wdXNoL29wZXJhdG9ycy9jb21iaW5lL2NhdGNoZXMudHMiXSwibmFtZXMiOlsiY2F0Y2hlcyIsInNlbGVjdG9yIiwib3B0aW9ucyIsIlR5cGVHdWFyZCIsImlzRnVuY3Rpb24iLCJmbiIsImxpbWl0IiwiZXJyIiwib2JzZXJ2YWJsZSIsIm9icyIsInRydW5rIiwiaXNOdW1iZXIiLCJJbmZpbml0eSIsIk9ic2VydmFibGUiLCJzdWJzIiwidW5zdWJzY3JpYmUiLCJzdGFydCIsInN1YnNjcmlwdGlvbiIsImVycm9yIiwicmVhc29uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwic3Vic2NyaWJlIiwibmV4dCIsImJpbmQiLCJjb21wbGV0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQXdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNBLE9BQVQsQ0FDTEMsUUFESyxFQUVxQjtBQUMxQixRQUFNQyxPQUFPLEdBQUdDLG9CQUFVQyxVQUFWLENBQXFCSCxRQUFyQixJQUNaO0FBQUVBLElBQUFBLFFBQVEsRUFBRUE7QUFBWixHQURZLEdBRVpBLFFBQVEsSUFBSSxFQUZoQjs7QUFJQSxRQUFNSSxFQUFFLEdBQUcsQ0FDVEMsS0FEUyxFQUVUQyxHQUZTLEVBR1RDLFVBSFMsS0FJWTtBQUNyQixVQUFNQyxHQUFHLEdBQUdQLE9BQU8sQ0FBQ0QsUUFBUixHQUNSQyxPQUFPLENBQUNELFFBQVIsQ0FBaUJNLEdBQWpCLEVBQXNCQyxVQUF0QixDQURRLEdBRVJBLFVBRko7QUFHQSxXQUFPRSxLQUFLLENBQUNKLEtBQUQsRUFBUUQsRUFBUixDQUFMLENBQWlCSSxHQUFqQixDQUFQO0FBQ0QsR0FURDs7QUFXQSxRQUFNSCxLQUFLLEdBQUdILG9CQUFVUSxRQUFWLENBQW1CVCxPQUFPLENBQUNJLEtBQTNCLElBQW9DSixPQUFPLENBQUNJLEtBQTVDLEdBQW9ELENBQWxFO0FBQ0EsU0FBT0ksS0FBSyxDQUFDSixLQUFLLEdBQUcsQ0FBUixHQUFZTSxRQUFaLEdBQXVCTixLQUF4QixFQUErQkQsRUFBL0IsQ0FBWjtBQUNEOztBQUVELFNBQVNLLEtBQVQsQ0FDRUosS0FERixFQUVFTCxRQUZGLEVBTzRCO0FBQzFCLFNBQU8sMEJBQVdPLFVBQUQsSUFBZ0I7QUFDL0IsV0FBTyxJQUFJSyxzQkFBSixDQUF1QkosR0FBRCxJQUFTO0FBQ3BDLFVBQUlLLElBQThCLEdBQUcsSUFBckM7O0FBQ0EsWUFBTUMsV0FBVyxHQUFHLE1BQVk7QUFDOUIsWUFBSSxDQUFDRCxJQUFMLEVBQVc7QUFDWEEsUUFBQUEsSUFBSSxDQUFDQyxXQUFMO0FBQ0FELFFBQUFBLElBQUksR0FBRyxJQUFQO0FBQ0QsT0FKRDs7QUFNQSxnQ0FBVU4sVUFBVixFQUFzQkMsR0FBdEIsRUFBMkI7QUFDekJPLFFBQUFBLEtBQUssQ0FBQ0MsWUFBRCxFQUFlO0FBQ2xCSCxVQUFBQSxJQUFJLEdBQUdHLFlBQVA7QUFDRCxTQUh3Qjs7QUFJekJDLFFBQUFBLEtBQUssQ0FBQ0MsTUFBRCxFQUFnQjtBQUNuQixjQUFJYixLQUFLLEdBQUcsQ0FBWixFQUFlO0FBQ2JHLFlBQUFBLEdBQUcsQ0FBQ1MsS0FBSixDQUFVQyxNQUFWO0FBQ0QsV0FGRCxNQUVPO0FBQ0xKLFlBQUFBLFdBQVc7QUFFWEssWUFBQUEsT0FBTyxDQUFDQyxPQUFSLEdBQWtCQyxJQUFsQixDQUF1QixNQUFNO0FBQzNCLDhCQUFLckIsUUFBUSxDQUFDSyxLQUFLLEdBQUcsQ0FBVCxFQUFZYSxNQUFaLEVBQW9CWCxVQUFwQixDQUFiLEVBQThDZSxTQUE5QyxDQUF3RDtBQUN0RFAsZ0JBQUFBLEtBQUssQ0FBQ0MsWUFBRCxFQUFlO0FBQ2xCSCxrQkFBQUEsSUFBSSxHQUFHRyxZQUFQO0FBQ0QsaUJBSHFEOztBQUl0RE8sZ0JBQUFBLElBQUksRUFBRWYsR0FBRyxDQUFDZSxJQUFKLENBQVNDLElBQVQsQ0FBY2hCLEdBQWQsQ0FKZ0Q7QUFLdERTLGdCQUFBQSxLQUFLLEVBQUVULEdBQUcsQ0FBQ1MsS0FBSixDQUFVTyxJQUFWLENBQWVoQixHQUFmLENBTCtDO0FBTXREaUIsZ0JBQUFBLFFBQVEsRUFBRWpCLEdBQUcsQ0FBQ2lCLFFBQUosQ0FBYUQsSUFBYixDQUFrQmhCLEdBQWxCO0FBTjRDLGVBQXhEO0FBUUQsYUFURDtBQVVEO0FBQ0Y7O0FBckJ3QixPQUEzQjtBQXdCQSxhQUFPTSxXQUFQO0FBQ0QsS0FqQ00sQ0FBUDtBQWtDRCxHQW5DTSxDQUFQO0FBb0NEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHVzaCB9IGZyb20gJ0BkZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy9PYnNlcnZhYmxlJztcbmltcG9ydCB7IHRyYW5zZm9ybSB9IGZyb20gJy4uLy4uL3V0aWxzL3RyYW5zZm9ybSc7XG5pbXBvcnQgeyBpbnRlcmNlcHQgfSBmcm9tICcuLi8uLi91dGlscy9pbnRlcmNlcHQnO1xuaW1wb3J0IHsgZnJvbSB9IGZyb20gJy4uLy4uL2NyZWF0b3JzL2Zyb20nO1xuaW1wb3J0IHsgVHlwZUd1YXJkIH0gZnJvbSAndHlwZS1jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBDYXRjaGVzT3B0aW9uczxULCBVPiB7XG4gIC8qKlxuICAgKiBFcnJvcnMgd2lsbCBvbmx5IGJlIGNhdGNoZWQgb25jZSBieSBkZWZhdWx0LFxuICAgKiBidXQgYHNlbGVjdG9yYCBjYW4gYmUgbWFkZSB0byBiZSBjYWxsZWQgcmVjdXJzaXZlbHlcbiAgICogYnkgc2V0dGluZyBhIGhpZ2hlciB0aGFuIDEgbGltaXQuXG4gICAqL1xuICBsaW1pdD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFNlZSBgQ2F0Y2hlc1NlbGVjdG9yYC5cbiAgICovXG4gIHNlbGVjdG9yPzogQ2F0Y2hlc1NlbGVjdG9yPFQsIFU+O1xufVxuXG4vKipcbiAqIFNob3VsZCByZXR1cm4gYW4gb2JzZXJ2YWJsZSBmb3IgYGNhdGNoZXNgXG4gKiB0byBjb250aW51ZSB0aGUgc3RyZWFtIHdpdGguXG4gKi9cbmV4cG9ydCB0eXBlIENhdGNoZXNTZWxlY3RvcjxULCBVPiA9IChcbiAgZXJyOiBFcnJvcixcbiAgb2JzZXJ2YWJsZTogUHVzaC5PYnNlcnZhYmxlPFQ+XG4pID0+IFB1c2guQ29udmVydGlibGU8VT47XG5cbi8qKlxuICogQ2F0Y2hlcyBhbiBlcnJvciBpbiB0aGUgb3JpZ2luYWwgb2JzZXJ2YWJsZVxuICogYW5kIGNvbnRpbnVlcyB0aGUgc3RyZWFtIGJ5IGFzeW5jaHJvbm91c2x5IHN1YnNjcmliaW5nXG4gKiB0byB0aGUgT2JzZXJ2YWJsZSByZXR1cm5lZCBieSBgc2VsZWN0b3JgLlxuICogV2hlbiBubyBgc2VsZWN0b3JgIGlzIHByb3ZpZGVkLCB0aGUgb3JpZ2luYWwgb2JzZXJ2YWJsZVxuICogd2lsbCBiZSByZXN1YnNjcmliZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXRjaGVzPFQsIFUgPSBUPihcbiAgc2VsZWN0b3I/OiBDYXRjaGVzU2VsZWN0b3I8VCwgVT4gfCBDYXRjaGVzT3B0aW9uczxULCBVPlxuKTogUHVzaC5PcGVyYXRpb248VCwgVCB8IFU+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IFR5cGVHdWFyZC5pc0Z1bmN0aW9uKHNlbGVjdG9yKVxuICAgID8geyBzZWxlY3Rvcjogc2VsZWN0b3IgfVxuICAgIDogc2VsZWN0b3IgfHwge307XG5cbiAgY29uc3QgZm4gPSAoXG4gICAgbGltaXQ6IG51bWJlcixcbiAgICBlcnI6IEVycm9yLFxuICAgIG9ic2VydmFibGU6IFB1c2guT2JzZXJ2YWJsZVxuICApOiBQdXNoLkNvbnZlcnRpYmxlID0+IHtcbiAgICBjb25zdCBvYnMgPSBvcHRpb25zLnNlbGVjdG9yXG4gICAgICA/IG9wdGlvbnMuc2VsZWN0b3IoZXJyLCBvYnNlcnZhYmxlKVxuICAgICAgOiBvYnNlcnZhYmxlO1xuICAgIHJldHVybiB0cnVuayhsaW1pdCwgZm4pKG9icyk7XG4gIH07XG5cbiAgY29uc3QgbGltaXQgPSBUeXBlR3VhcmQuaXNOdW1iZXIob3B0aW9ucy5saW1pdCkgPyBvcHRpb25zLmxpbWl0IDogMTtcbiAgcmV0dXJuIHRydW5rKGxpbWl0IDwgMCA/IEluZmluaXR5IDogbGltaXQsIGZuKTtcbn1cblxuZnVuY3Rpb24gdHJ1bms8VCwgVSA9IFQ+KFxuICBsaW1pdDogbnVtYmVyLFxuICBzZWxlY3RvcjogKFxuICAgIGxpbWl0OiBudW1iZXIsXG4gICAgZXJyOiBFcnJvcixcbiAgICBvYnNlcnZhYmxlOiBQdXNoLk9ic2VydmFibGU8VD5cbiAgKSA9PiBQdXNoLkNvbnZlcnRpYmxlPFU+XG4pOiBQdXNoLk9wZXJhdGlvbjxULCBUIHwgVT4ge1xuICByZXR1cm4gdHJhbnNmb3JtKChvYnNlcnZhYmxlKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFQgfCBVPigob2JzKSA9PiB7XG4gICAgICBsZXQgc3ViczogUHVzaC5TdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIXN1YnMpIHJldHVybjtcbiAgICAgICAgc3Vicy51bnN1YnNjcmliZSgpO1xuICAgICAgICBzdWJzID0gbnVsbDtcbiAgICAgIH07XG5cbiAgICAgIGludGVyY2VwdChvYnNlcnZhYmxlLCBvYnMsIHtcbiAgICAgICAgc3RhcnQoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgc3VicyA9IHN1YnNjcmlwdGlvbjtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3IocmVhc29uOiBFcnJvcikge1xuICAgICAgICAgIGlmIChsaW1pdCA8IDEpIHtcbiAgICAgICAgICAgIG9icy5lcnJvcihyZWFzb24pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1bnN1YnNjcmliZSgpO1xuXG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgZnJvbShzZWxlY3RvcihsaW1pdCAtIDEsIHJlYXNvbiwgb2JzZXJ2YWJsZSkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgc3RhcnQoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICBzdWJzID0gc3Vic2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbmV4dDogb2JzLm5leHQuYmluZChvYnMpLFxuICAgICAgICAgICAgICAgIGVycm9yOiBvYnMuZXJyb3IuYmluZChvYnMpLFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBvYnMuY29tcGxldGUuYmluZChvYnMpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHVuc3Vic2NyaWJlO1xuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==