Skip to content

Commit 6dcd05e

Browse files
Merge pull request #72 from bangnokia/main
Improve the polifill for setImmediate for max performance
2 parents 027f6ac + da07126 commit 6dcd05e

File tree

2 files changed

+45
-21
lines changed

2 files changed

+45
-21
lines changed

src/libs/set-immediate-polyfill.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
const originalSetImmediate = (globalThis as any).setImmediate
2+
let setImmediateChannel: MessageChannel | null = null
3+
const setImmediateQueue: (() => void)[] = []
4+
5+
function immediatePolyfill(callback: (...args: any[]) => void, ...args: any[]) {
6+
if (typeof originalSetImmediate === 'function') {
7+
return originalSetImmediate(callback, ...args)
8+
}
9+
10+
if (typeof MessageChannel !== 'undefined') {
11+
if (!setImmediateChannel) {
12+
setImmediateChannel = new MessageChannel()
13+
setImmediateChannel.port1.addEventListener('message', () => {
14+
const fn = setImmediateQueue.shift()
15+
if (fn) {
16+
try {
17+
fn()
18+
} catch {}
19+
}
20+
})
21+
setImmediateChannel.port1.start()
22+
}
23+
setImmediateQueue.push(() => callback(...args))
24+
setImmediateChannel.port2.postMessage(0)
25+
return 0
26+
}
27+
28+
return setTimeout(() => callback(...args), 0)
29+
}
30+
31+
export function installSetImmediatePolyfill() {
32+
if (typeof (globalThis as any).setImmediate === 'function') {
33+
return
34+
}
35+
;(globalThis as any).setImmediate = immediatePolyfill
36+
}
37+
38+
export function uninstallSetImmediatePolyfill() {
39+
if ((globalThis as any).setImmediate === immediatePolyfill) {
40+
delete (globalThis as any).setImmediate
41+
}
42+
}

src/libs/utils.ts

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { ResolvableFile } from '../classes/resolvable-file.ts'
2+
import { uninstallSetImmediatePolyfill } from './set-immediate-polyfill.ts'
23
import { vendors } from './vendors.ts'
34

5+
export { installSetImmediatePolyfill, uninstallSetImmediatePolyfill } from './set-immediate-polyfill.ts'
6+
47
const { path } = vendors
58

69
export const textEncoder = new TextEncoder()
@@ -238,24 +241,3 @@ export function isZip(uint8Array: Uint8Array) {
238241
(uint8Array[3] === 0x04 || uint8Array[3] === 0x06 || uint8Array[3] === 0x08)
239242
)
240243
}
241-
242-
const originalSetImmediate = globalThis.setImmediate
243-
function setImmediate(callback: any) {
244-
// eslint-disable-next-line @typescript-eslint/no-implied-eval
245-
return originalSetImmediate ? originalSetImmediate(callback) : setTimeout(callback, 0)
246-
}
247-
248-
export function installSetImmediatePolyfill() {
249-
if (typeof globalThis.setImmediate === 'function') {
250-
return
251-
}
252-
// @ts-expect-error polyfill
253-
globalThis.setImmediate = setImmediate
254-
}
255-
256-
export function uninstallSetImmediatePolyfill() {
257-
if (globalThis.setImmediate === setImmediate) {
258-
// @ts-expect-error remove polyfill
259-
delete globalThis.setImmediate
260-
}
261-
}

0 commit comments

Comments
 (0)