UNPKG

rx-sandbox

Version:

Marble diagram DSL based test suite for RxJS 6/7

37 lines (31 loc) 1.38 kB
import { Observable } from 'rxjs'; import { parseSubscriptionMarble } from '../marbles/parseSubscriptionMarble'; import { ColdObservable, HotObservable } from '../utils/coreInternalImport'; const calculateSubscriptionFrame = ( observable: Observable<any>, unsubscriptionMarbles: string | null, frameTimeFactor: number ) => { const { subscribedFrame, unsubscribedFrame } = parseSubscriptionMarble(unsubscriptionMarbles, frameTimeFactor); if (subscribedFrame === Number.POSITIVE_INFINITY) { return { subscribedFrame: 0, unsubscribedFrame }; } //looks internal of Observable implementation to determine source is hot or cold observable. //if source is hot, subscription / unsubscription works as specified, //if source is cold, subscription always triggers start of observable - adjust unsubscription frame as well let source = observable; while (!!source) { if (source instanceof HotObservable) { return { subscribedFrame, unsubscribedFrame }; } else if (source instanceof ColdObservable) { return { subscribedFrame: 0, unsubscribedFrame: unsubscribedFrame === Number.POSITIVE_INFINITY ? unsubscribedFrame : unsubscribedFrame - subscribedFrame, }; } source = (source as any).source; } throw new Error('Cannot detect source observable type'); }; export { calculateSubscriptionFrame };