63 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { ReplaySubject } from '../ReplaySubject';
 | |
| export function shareReplay(configOrBufferSize, windowTime, scheduler) {
 | |
|     let config;
 | |
|     if (configOrBufferSize && typeof configOrBufferSize === 'object') {
 | |
|         config = configOrBufferSize;
 | |
|     }
 | |
|     else {
 | |
|         config = {
 | |
|             bufferSize: configOrBufferSize,
 | |
|             windowTime,
 | |
|             refCount: false,
 | |
|             scheduler,
 | |
|         };
 | |
|     }
 | |
|     return (source) => source.lift(shareReplayOperator(config));
 | |
| }
 | |
| function shareReplayOperator({ bufferSize = Number.POSITIVE_INFINITY, windowTime = Number.POSITIVE_INFINITY, refCount: useRefCount, scheduler, }) {
 | |
|     let subject;
 | |
|     let refCount = 0;
 | |
|     let subscription;
 | |
|     let hasError = false;
 | |
|     let isComplete = false;
 | |
|     return function shareReplayOperation(source) {
 | |
|         refCount++;
 | |
|         let innerSub;
 | |
|         if (!subject || hasError) {
 | |
|             hasError = false;
 | |
|             subject = new ReplaySubject(bufferSize, windowTime, scheduler);
 | |
|             innerSub = subject.subscribe(this);
 | |
|             subscription = source.subscribe({
 | |
|                 next(value) {
 | |
|                     subject.next(value);
 | |
|                 },
 | |
|                 error(err) {
 | |
|                     hasError = true;
 | |
|                     subject.error(err);
 | |
|                 },
 | |
|                 complete() {
 | |
|                     isComplete = true;
 | |
|                     subscription = undefined;
 | |
|                     subject.complete();
 | |
|                 },
 | |
|             });
 | |
|             if (isComplete) {
 | |
|                 subscription = undefined;
 | |
|             }
 | |
|         }
 | |
|         else {
 | |
|             innerSub = subject.subscribe(this);
 | |
|         }
 | |
|         this.add(() => {
 | |
|             refCount--;
 | |
|             innerSub.unsubscribe();
 | |
|             innerSub = undefined;
 | |
|             if (subscription && !isComplete && useRefCount && refCount === 0) {
 | |
|                 subscription.unsubscribe();
 | |
|                 subscription = undefined;
 | |
|                 subject = undefined;
 | |
|             }
 | |
|         });
 | |
|     };
 | |
| }
 | |
| //# sourceMappingURL=shareReplay.js.map
 | 
