diff options
Diffstat (limited to 'node_modules/rxjs/dist/esm/internal/operators/share.js')
| -rw-r--r-- | node_modules/rxjs/dist/esm/internal/operators/share.js | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/node_modules/rxjs/dist/esm/internal/operators/share.js b/node_modules/rxjs/dist/esm/internal/operators/share.js new file mode 100644 index 0000000..da77830 --- /dev/null +++ b/node_modules/rxjs/dist/esm/internal/operators/share.js @@ -0,0 +1,79 @@ +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 innerFrom(on(...args)).subscribe(onSubscriber); +} +//# sourceMappingURL=share.js.map
\ No newline at end of file |
