import type { IReadOnlySharedReference } from "../../utils/reference"; import type { CancellationSignal } from "../../utils/task_canceller"; import type { IReadOnlyPlaybackObserver } from "../types"; /** * Create `IReadOnlyPlaybackObserver` from a source `IReadOnlyPlaybackObserver` * and a mapping function. * @param {Object} src * @param {Function} transform * @returns {Object} */ export default function generateReadOnlyObserver( src: IReadOnlyPlaybackObserver, transform: ( observationRef: IReadOnlySharedReference, cancellationSignal: CancellationSignal, ) => IReadOnlySharedReference, cancellationSignal: CancellationSignal, ): IReadOnlyPlaybackObserver { const mappedRef = transform(src.getReference(), cancellationSignal); return { getCurrentTime() { return src.getCurrentTime(); }, getReadyState() { return src.getReadyState(); }, getPlaybackRate() { return src.getPlaybackRate(); }, getIsPaused() { return src.getIsPaused(); }, getReference(): IReadOnlySharedReference { return mappedRef; }, listen( cb: (observation: TDest, stopListening: () => void) => void, params: { includeLastObservation?: boolean | undefined; clearSignal: CancellationSignal; }, ): void { if (cancellationSignal.isCancelled() || params.clearSignal.isCancelled()) { return; } mappedRef.onUpdate(cb, { clearSignal: params.clearSignal, emitCurrentValue: params.includeLastObservation, }); }, deriveReadOnlyObserver( newTransformFn: ( observationRef: IReadOnlySharedReference, signal: CancellationSignal, ) => IReadOnlySharedReference, ): IReadOnlyPlaybackObserver { return generateReadOnlyObserver(this, newTransformFn, cancellationSignal); }, }; }