@@ -47,13 +47,19 @@ function abortIt(signal) {
47
47
return new AbortError ( undefined , { __proto__ : null , cause : signal . reason } ) ;
48
48
}
49
49
50
- const SUPPORTED_TIMERS = [ 'setTimeout' , 'setInterval' ] ;
50
+ const SUPPORTED_TIMERS = [ 'setTimeout' , 'setInterval' , 'setImmediate' ] ;
51
+ const TIMERS_DEFAULT_INTERVAL = {
52
+ __proto__ : null ,
53
+ setImmediate : - 1 ,
54
+ } ;
51
55
52
56
class MockTimers {
53
57
#realSetTimeout;
54
58
#realClearTimeout;
55
59
#realSetInterval;
56
60
#realClearInterval;
61
+ #realSetImmediate;
62
+ #realClearImmediate;
57
63
58
64
#realPromisifiedSetTimeout;
59
65
#realPromisifiedSetInterval;
@@ -62,6 +68,9 @@ class MockTimers {
62
68
#realTimersClearTimeout;
63
69
#realTimersSetInterval;
64
70
#realTimersClearInterval;
71
+ #realTimersSetImmediate;
72
+ #realTimersClearImmediate;
73
+ #realPromisifiedSetImmediate;
65
74
66
75
#timersInContext = [ ] ;
67
76
#isEnabled = false ;
@@ -75,6 +84,16 @@ class MockTimers {
75
84
#setInterval = FunctionPrototypeBind ( this . #createTimer, this , true ) ;
76
85
#clearInterval = FunctionPrototypeBind ( this . #clearTimer, this ) ;
77
86
87
+ #setImmediate = ( callback , ...args ) => {
88
+ return this . #createTimer(
89
+ false ,
90
+ callback ,
91
+ TIMERS_DEFAULT_INTERVAL . setImmediate ,
92
+ ...args ,
93
+ ) ;
94
+ } ;
95
+
96
+ #clearImmediate = FunctionPrototypeBind ( this . #clearTimer, this ) ;
78
97
constructor ( ) {
79
98
emitExperimentalWarning ( 'The MockTimers API' ) ;
80
99
}
@@ -157,7 +176,7 @@ class MockTimers {
157
176
yield * iterator ;
158
177
}
159
178
160
- #setTimeoutPromisified ( ms , result , options ) {
179
+ #promisifyTimer ( { timerFn , clearFn , ms, result, options } ) {
161
180
return new Promise ( ( resolve , reject ) => {
162
181
if ( options ?. signal ) {
163
182
try {
@@ -172,12 +191,12 @@ class MockTimers {
172
191
}
173
192
174
193
const onabort = ( ) => {
175
- this . #clearTimeout ( id ) ;
194
+ clearFn ( id ) ;
176
195
return reject ( abortIt ( options . signal ) ) ;
177
196
} ;
178
197
179
- const id = this . #setTimeout ( ( ) => {
180
- return resolve ( result || id ) ;
198
+ const id = timerFn ( ( ) => {
199
+ return resolve ( result ) ;
181
200
} , ms ) ;
182
201
183
202
if ( options ?. signal ) {
@@ -191,6 +210,28 @@ class MockTimers {
191
210
} ) ;
192
211
}
193
212
213
+ #setImmediatePromisified( result , options ) {
214
+ return this . #promisifyTimer( {
215
+ __proto__ : null ,
216
+ timerFn : FunctionPrototypeBind ( this . #setImmediate, this ) ,
217
+ clearFn : FunctionPrototypeBind ( this . #clearImmediate, this ) ,
218
+ ms : TIMERS_DEFAULT_INTERVAL . setImmediate ,
219
+ result,
220
+ options,
221
+ } ) ;
222
+ }
223
+
224
+ #setTimeoutPromisified( ms , result , options ) {
225
+ return this . #promisifyTimer( {
226
+ __proto__ : null ,
227
+ timerFn : FunctionPrototypeBind ( this . #setTimeout, this ) ,
228
+ clearFn : FunctionPrototypeBind ( this . #clearTimeout, this ) ,
229
+ ms,
230
+ result,
231
+ options,
232
+ } ) ;
233
+ }
234
+
194
235
#toggleEnableTimers( activate ) {
195
236
const options = {
196
237
__proto__ : null ,
@@ -232,6 +273,23 @@ class MockTimers {
232
273
this ,
233
274
) ;
234
275
} ,
276
+ setImmediate : ( ) => {
277
+ this . #realSetImmediate = globalThis . setImmediate ;
278
+ this . #realClearImmediate = globalThis . clearImmediate ;
279
+ this . #realTimersSetImmediate = nodeTimers . setImmediate ;
280
+ this . #realTimersClearImmediate = nodeTimers . clearImmediate ;
281
+
282
+ globalThis . setImmediate = this . #setImmediate;
283
+ globalThis . clearImmediate = this . #clearImmediate;
284
+
285
+ nodeTimers . setImmediate = this . #setImmediate;
286
+ nodeTimers . clearImmediate = this . #clearImmediate;
287
+
288
+ nodeTimersPromises . setImmediate = FunctionPrototypeBind (
289
+ this . #setImmediatePromisified,
290
+ this ,
291
+ ) ;
292
+ } ,
235
293
} ,
236
294
toReal : {
237
295
__proto__ : null ,
@@ -253,6 +311,15 @@ class MockTimers {
253
311
254
312
nodeTimersPromises . setInterval = this . #realPromisifiedSetInterval;
255
313
} ,
314
+ setImmediate : ( ) => {
315
+ globalThis . setImmediate = this . #realSetImmediate;
316
+ globalThis . clearImmediate = this . #realClearImmediate;
317
+
318
+ nodeTimers . setImmediate = this . #realTimersSetImmediate;
319
+ nodeTimers . clearImmediate = this . #realTimersClearImmediate;
320
+
321
+ nodeTimersPromises . setImmediate = this . #realPromisifiedSetImmediate;
322
+ } ,
256
323
} ,
257
324
} ;
258
325
0 commit comments