30 lines
631 B
JavaScript
30 lines
631 B
JavaScript
/**
|
|
* @typedef {{
|
|
* now(): number,
|
|
* sleep(milliseconds: number, signal?: AbortSignal): Promise<void>
|
|
* }} ClockPort
|
|
*/
|
|
|
|
/** @type {ClockPort} */
|
|
export const systemClock = Object.freeze({
|
|
now: () => Date.now(),
|
|
sleep(milliseconds, signal) {
|
|
return new Promise((resolve, reject) => {
|
|
if (signal?.aborted) {
|
|
reject(signal.reason);
|
|
return;
|
|
}
|
|
|
|
const timer = setTimeout(resolve, milliseconds);
|
|
signal?.addEventListener(
|
|
"abort",
|
|
() => {
|
|
clearTimeout(timer);
|
|
reject(signal.reason);
|
|
},
|
|
{ once: true },
|
|
);
|
|
});
|
|
},
|
|
});
|