multitude
Version:
Comprehensive streams for push and pull
79 lines (64 loc) • 8.63 kB
JavaScript
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==
;