Skip to content

Commit 81064eb

Browse files
authored
feat(std/sleep): with abort (#22)
1 parent bc6d19f commit 81064eb

1 file changed

Lines changed: 27 additions & 1 deletion

File tree

packages/std/src/sleep/index.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,28 @@
11
// eslint-disable-next-line @masknet/prefer-timer-id
2-
export const sleep = async (delay: number): Promise<void> => new Promise(resolve => setTimeout(resolve, delay))
2+
export const sleep = async (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms))
3+
4+
export const sleepWithAbort = async (ms: number, signal?: AbortSignal): Promise<void> => {
5+
if (!signal)
6+
return sleep(ms)
7+
8+
return new Promise<void>((resolve, reject) => {
9+
if (signal.aborted) {
10+
reject(signal.reason ?? new DOMException('Aborted', 'AbortError'))
11+
return
12+
}
13+
14+
const timer = setTimeout(() => {
15+
signal.removeEventListener('abort', onAbort)
16+
resolve()
17+
}, ms)
18+
19+
signal.addEventListener('abort', onAbort, { once: true })
20+
21+
// eslint-disable-next-line prefer-arrow/prefer-arrow-functions
22+
function onAbort() {
23+
clearTimeout(timer)
24+
signal?.removeEventListener('abort', onAbort)
25+
reject(signal?.reason ?? new DOMException('Aborted', 'AbortError'))
26+
};
27+
})
28+
}

0 commit comments

Comments
 (0)