chenyc
2025-12-09 65e034683b28d799e73c7d7e5e4769fab5b9bc9c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import { TResolveSetResponseResultPromise } from '../types';
import type { createSetTimeoutCallback } from './set-timeout-callback';
 
export const createSetTimer =
    (
        identifiersAndResolvers: Map<number, [number, TResolveSetResponseResultPromise]>,
        performance: Pick<Performance, 'now' | 'timeOrigin'>,
        setTimeout: (typeof globalThis)['setTimeout'],
        setTimeoutCallback: ReturnType<typeof createSetTimeoutCallback>
    ) =>
    (delay: number, nowAndTimeOrigin: number, timerId: number) => {
        const expected = delay + nowAndTimeOrigin - performance.timeOrigin;
        const remainingDelay = expected - performance.now();
 
        return new Promise((resolve) => {
            identifiersAndResolvers.set(timerId, [
                setTimeout(setTimeoutCallback, remainingDelay, expected, identifiersAndResolvers, resolve, timerId),
                resolve
            ]);
        });
    };