12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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
|