multitude
Version:
Comprehensive streams for push and pull
68 lines (57 loc) • 6.82 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.share = share;
var _Multicast = require("../../classes/Multicast");
var _transform = require("../../utils/transform");
var _typeCore = require("type-core");
/**
* Creates an Observable that multicasts the original Observable.
* The original Observable won't be subscribed until there is at least
* one subscriber.
*/
function share(policy) {
const options = !policy || _typeCore.TypeGuard.isString(policy) ? {
policy
} : policy;
return (0, _transform.transform)(observable => {
let count = 0;
let observer;
let subscription;
return new _Multicast.Multicast(obs => {
observer = obs;
return observable.subscribe(obs);
}, options, {
onSubscribe(connect) {
count++;
subscription = connect();
},
onUnsubscribe() {
count--;
if (count > 0) return;
switch (options.policy) {
case 'keep-open':
{
return;
}
case 'keep-closed':
{
if (observer && !observer.closed) {
const err = Error('Multicast is already closed');
observer.error(err);
}
if (subscription) subscription.unsubscribe();
return;
}
default:
{
if (subscription) subscription.unsubscribe();
subscription = null;
}
}
}
});
});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wdXNoL29wZXJhdG9ycy9tdWx0aWNhc3Qvc2hhcmUudHMiXSwibmFtZXMiOlsic2hhcmUiLCJwb2xpY3kiLCJvcHRpb25zIiwiVHlwZUd1YXJkIiwiaXNTdHJpbmciLCJvYnNlcnZhYmxlIiwiY291bnQiLCJvYnNlcnZlciIsInN1YnNjcmlwdGlvbiIsIk11bHRpY2FzdCIsIm9icyIsInN1YnNjcmliZSIsIm9uU3Vic2NyaWJlIiwiY29ubmVjdCIsIm9uVW5zdWJzY3JpYmUiLCJjbG9zZWQiLCJlcnIiLCJFcnJvciIsImVycm9yIiwidW5zdWJzY3JpYmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0EsS0FBVCxDQUNMQyxNQURLLEVBRXlDO0FBQzlDLFFBQU1DLE9BQU8sR0FBRyxDQUFDRCxNQUFELElBQVdFLG9CQUFVQyxRQUFWLENBQW1CSCxNQUFuQixDQUFYLEdBQXdDO0FBQUVBLElBQUFBO0FBQUYsR0FBeEMsR0FBcURBLE1BQXJFO0FBRUEsU0FBTywwQkFBV0ksVUFBRCxJQUFnQjtBQUMvQixRQUFJQyxLQUFLLEdBQUcsQ0FBWjtBQUNBLFFBQUlDLFFBQUo7QUFDQSxRQUFJQyxZQUFKO0FBRUEsV0FBTyxJQUFJQyxvQkFBSixDQUNKQyxHQUFELElBQVM7QUFDUEgsTUFBQUEsUUFBUSxHQUFHRyxHQUFYO0FBQ0EsYUFBT0wsVUFBVSxDQUFDTSxTQUFYLENBQXFCRCxHQUFyQixDQUFQO0FBQ0QsS0FKSSxFQUtMUixPQUxLLEVBTUw7QUFDRVUsTUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVU7QUFDbkJQLFFBQUFBLEtBQUs7QUFDTEUsUUFBQUEsWUFBWSxHQUFHSyxPQUFPLEVBQXRCO0FBQ0QsT0FKSDs7QUFLRUMsTUFBQUEsYUFBYSxHQUFHO0FBQ2RSLFFBQUFBLEtBQUs7QUFFTCxZQUFJQSxLQUFLLEdBQUcsQ0FBWixFQUFlOztBQUNmLGdCQUFRSixPQUFPLENBQUNELE1BQWhCO0FBQ0UsZUFBSyxXQUFMO0FBQWtCO0FBQ2hCO0FBQ0Q7O0FBQ0QsZUFBSyxhQUFMO0FBQW9CO0FBQ2xCLGtCQUFJTSxRQUFRLElBQUksQ0FBQ0EsUUFBUSxDQUFDUSxNQUExQixFQUFrQztBQUNoQyxzQkFBTUMsR0FBRyxHQUFHQyxLQUFLLENBQUMsNkJBQUQsQ0FBakI7QUFDQVYsZ0JBQUFBLFFBQVEsQ0FBQ1csS0FBVCxDQUFlRixHQUFmO0FBQ0Q7O0FBQ0Qsa0JBQUlSLFlBQUosRUFBa0JBLFlBQVksQ0FBQ1csV0FBYjtBQUNsQjtBQUNEOztBQUNEO0FBQVM7QUFDUCxrQkFBSVgsWUFBSixFQUFrQkEsWUFBWSxDQUFDVyxXQUFiO0FBQ2xCWCxjQUFBQSxZQUFZLEdBQUcsSUFBZjtBQUNEO0FBZkg7QUFpQkQ7O0FBMUJILEtBTkssQ0FBUDtBQW1DRCxHQXhDTSxDQUFQO0FBeUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHVzaCB9IGZyb20gJ0BkZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBNdWx0aWNhc3QgfSBmcm9tICcuLi8uLi9jbGFzc2VzL011bHRpY2FzdCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tICcuLi8uLi91dGlscy90cmFuc2Zvcm0nO1xuaW1wb3J0IHsgRW1wdHksIFR5cGVHdWFyZCB9IGZyb20gJ3R5cGUtY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcmVPcHRpb25zPFU+IGV4dGVuZHMgTXVsdGljYXN0Lk9wdGlvbnM8VT4ge1xuICBwb2xpY3k/OiBTaGFyZVBvbGljeTtcbn1cblxuLyoqXG4gKiAnb24tZGVtYW5kJzogRGVmYXVsdCBwb2xpY3kuIFN1YnNjcmliZXMgYW5kIHJlLXN1YnNjcmliZXMgdG8gdGhlIG9yaWdpbmFsIE9ic2VydmFibGUgb25jZSB0aGUgcmVzdWx0aW5nIG9uZSBoYXMgb3BlbiBzdWJzY3JpcHRpb25zLCBzbyBsb25nIGFzIHRoZSBvcmlnaW5hbCBPYnNlcnZhYmxlIGhhc24ndCBlcnJvcmVkIG9yIGNvbXBsZXRlZCBvbiBwcmV2aW91cyBzdWJzY3JpcHRpb25zLiBVbnN1YnNjcmliZXMgZnJvbSB0aGUgb3JpZ2luYWwgT2JzZXJ2YWJsZSBvbmNlIHRoZSByZXN1bHRpbmcgT2JzZXJ2YWJsZSBoYXMgbm8gYWN0aXZlIHN1YnNjcmlwdGlvbnMuXG4gKiAna2VlcC1vcGVuJzogS2VlcHMgdGhlIHBhcmVudCBzdWJzY3JpcHRpb24gb3BlbiBldmVuIGlmIGl0IGhhcyBubyBjdXJyZW50IHN1YnNjcmlwdGlvbnMuXG4gKiAna2VlcC1jbG9zZWQnOiBQZXJtYW5lbnRseSB1bnN1YnNjcmliZXMgZnJvbSB0aGUgb3JpZ2luYWwgT2JzZXJ2YWJsZSBvbmNlIHRoZSByZXN1bHRpbmcgb25lIGhhcyBubyBhY3RpdmUgc3Vic2NyaXB0aW9ucy4gU3Vic2VxdWVudCBzdWJzY3JpcHRpb25zIHdpbGwgZXJyb3Igb3IgY29tcGxldGUgaW1tZWRpYXRlbHkgd2l0aCB0aGUgc2FtZSBzaWduYWwgYXMgdGhlIG9yaWdpbmFsIE9ic2VydmFibGUgaWYgaXQgZmluYWxpemVkIGJlZm9yZSBiZWluZyB1bnN1YnNjcmliZWQsIG9yIG90aGVyd2lzZSBlcnJvci5cbiAqL1xuZXhwb3J0IHR5cGUgU2hhcmVQb2xpY3kgPSAnb24tZGVtYW5kJyB8ICdrZWVwLW9wZW4nIHwgJ2tlZXAtY2xvc2VkJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIE9ic2VydmFibGUgdGhhdCBtdWx0aWNhc3RzIHRoZSBvcmlnaW5hbCBPYnNlcnZhYmxlLlxuICogVGhlIG9yaWdpbmFsIE9ic2VydmFibGUgd29uJ3QgYmUgc3Vic2NyaWJlZCB1bnRpbCB0aGVyZSBpcyBhdCBsZWFzdFxuICogb25lIHN1YnNjcmliZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZTxULCBVIGV4dGVuZHMgVCB8IHZvaWQgPSBUIHwgdm9pZD4oXG4gIHBvbGljeT86IFNoYXJlUG9saWN5IHwgU2hhcmVPcHRpb25zPFU+XG4pOiBQdXNoLlRyYW5zZm9ybWF0aW9uPFQsIFB1c2guTXVsdGljYXN0PFQsIFU+PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSAhcG9saWN5IHx8IFR5cGVHdWFyZC5pc1N0cmluZyhwb2xpY3kpID8geyBwb2xpY3kgfSA6IHBvbGljeTtcblxuICByZXR1cm4gdHJhbnNmb3JtKChvYnNlcnZhYmxlKSA9PiB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBsZXQgb2JzZXJ2ZXI6IFB1c2guU3Vic2NyaXB0aW9uT2JzZXJ2ZXIgfCBFbXB0eTtcbiAgICBsZXQgc3Vic2NyaXB0aW9uOiBQdXNoLlN1YnNjcmlwdGlvbiB8IEVtcHR5O1xuXG4gICAgcmV0dXJuIG5ldyBNdWx0aWNhc3QoXG4gICAgICAob2JzKSA9PiB7XG4gICAgICAgIG9ic2VydmVyID0gb2JzO1xuICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZS5zdWJzY3JpYmUob2JzKTtcbiAgICAgIH0sXG4gICAgICBvcHRpb25zLFxuICAgICAge1xuICAgICAgICBvblN1YnNjcmliZShjb25uZWN0KSB7XG4gICAgICAgICAgY291bnQrKztcbiAgICAgICAgICBzdWJzY3JpcHRpb24gPSBjb25uZWN0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5zdWJzY3JpYmUoKSB7XG4gICAgICAgICAgY291bnQtLTtcblxuICAgICAgICAgIGlmIChjb3VudCA+IDApIHJldHVybjtcbiAgICAgICAgICBzd2l0Y2ggKG9wdGlvbnMucG9saWN5KSB7XG4gICAgICAgICAgICBjYXNlICdrZWVwLW9wZW4nOiB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2tlZXAtY2xvc2VkJzoge1xuICAgICAgICAgICAgICBpZiAob2JzZXJ2ZXIgJiYgIW9ic2VydmVyLmNsb3NlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IEVycm9yKCdNdWx0aWNhc3QgaXMgYWxyZWFkeSBjbG9zZWQnKTtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG4gIH0pO1xufVxuIl19
;