timing-provider
Version:
An implementation of the timing provider specification.
26 lines (21 loc) • 1.09 kB
text/typescript
import { OperatorFunction, Subject, filter, map, withLatestFrom } from 'rxjs';
import { isNotNullish } from 'rxjs-etc';
import { IPongEvent } from '../interfaces';
export const matchPongWithPing =
(
localSentTimesSubject: Subject<[number, number[]]>
): OperatorFunction<IPongEvent & { timestamp: number }, readonly [number, number, number, number]> =>
(source) =>
source.pipe(
withLatestFrom(localSentTimesSubject),
map(([{ index, remoteReceivedTime, remoteSentTime, timestamp }, [startIndex, localSentTimes]]) => {
if (index < startIndex) {
return null;
}
const numberOfMissingPings = index - startIndex;
const [localSentTime, ...unansweredPings] = localSentTimes.slice(numberOfMissingPings);
localSentTimesSubject.next([startIndex + numberOfMissingPings + 1, unansweredPings]);
return <const>[localSentTime, remoteReceivedTime, remoteSentTime, timestamp];
}),
filter(isNotNullish)
);