66
67
function virtualSetInterval(handler: () => void, interval: number): IDisposable {
69
>
const baseTrace = TraceContext.instance.currentTrace().child(`setInterval(${interval}ms)`, stack);
70
>
let iter = 0;
71
>
let disposed = false;
72
>
let lastDisposable: IDisposable;
73
>
74
>
const arm = (): void => {
75
>
iter++;
76
>
const myIter = iter;
77
>
lastDisposable = clock.schedule({
78
>
time: clock.now + interval,
79
>
run: () => {
80
if (disposed) { return; }
81
arm(); // schedule the next tick first, so a throwing
82
handler(); // handler doesn't kill the interval
83
},
84
>
source: { toString: () => `setInterval (iteration ${myIter})`, stackTrace: stack },
virtualTimeApi.ts
85
>
trace: baseTrace.child(`tick #${myIter}`),
86
>
});
87
>
};
88
>
89
>
arm();
90
>
return {
91
>
dispose: () => {
92
>
if (disposed) { return; }
93
>
disposed = true;
94
>
lastDisposable.dispose();
95
>
},
96
>
};
97
>
}
98
99
function virtualClearInterval(id: unknown): void {
101
>
}
102
103
// A faux `Date` that returns virtual time from `now()` and uses virtual