import { innerFrom } from '../observable/innerFrom'; import { Subject } from '../Subject'; import { SafeSubscriber } from '../Subscriber'; import { operate } from '../util/lift'; export function share(options = {}) { const { connector = () => new Subject(), resetOnError = true, resetOnComplete = true, resetOnRefCountZero = true } = options; return (wrapperSource) => { let connection; let resetConnection; let subject; let refCount = 0; let hasCompleted = false; let hasErrored = false; const cancelReset = () => { resetConnection === null || resetConnection === void 0 ? void 0 : resetConnection.unsubscribe(); resetConnection = undefined; }; const reset = () => { cancelReset(); connection = subject = undefined; hasCompleted = hasErrored = false; }; const resetAndUnsubscribe = () => { const conn = connection; reset(); conn === null || conn === void 0 ? void 0 : conn.unsubscribe(); }; return operate((source, subscriber) => { refCount++; if (!hasErrored && !hasCompleted) { cancelReset(); } const dest = (subject = subject !== null && subject !== void 0 ? subject : connector()); subscriber.add(() => { refCount--; if (refCount === 0 && !hasErrored && !hasCompleted) { resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero); } }); dest.subscribe(subscriber); if (!connection && refCount > 0) { connection = new SafeSubscriber({ next: (value) => dest.next(value), error: (err) => { hasErrored = true; cancelReset(); resetConnection = handleReset(reset, resetOnError, err); dest.error(err); }, complete: () => { hasCompleted = true; cancelReset(); resetConnection = handleReset(reset, resetOnComplete); dest.complete(); }, }); innerFrom(source).subscribe(connection); } })(wrapperSource); }; } function handleReset(reset, on, ...args) { if (on === true) { reset(); return; } if (on === false) { return; } const onSubscriber = new SafeSubscriber({ next: () => { onSubscriber.unsubscribe(); reset(); }, }); return on(...args).subscribe(onSubscriber); } //# sourceMappingURL=share.js.map