Skip to content

Commit 11c271b

Browse files
committed
avoid abortsignalwithreason now it's stable
1 parent cd5e6a6 commit 11c271b

File tree

6 files changed

+17
-78
lines changed

6 files changed

+17
-78
lines changed

packages/toolkit/src/listenerMiddleware/index.ts

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import {
1919
validateActive,
2020
} from './task'
2121
import type {
22-
AbortSignalWithReason,
2322
AddListenerOverloads,
2423
AnyListenerPredicate,
2524
CreateListenerMiddlewareOptions,
@@ -41,7 +40,6 @@ import type {
4140
UnsubscribeListenerOptions,
4241
} from './types'
4342
import {
44-
abortControllerWithReason,
4543
addAbortSignalListener,
4644
assertFunction,
4745
catchRejection,
@@ -82,12 +80,12 @@ const INTERNAL_NIL_TOKEN = {} as const
8280
const alm = 'listenerMiddleware' as const
8381

8482
const createFork = (
85-
parentAbortSignal: AbortSignalWithReason<unknown>,
83+
parentAbortSignal: AbortSignal,
8684
parentBlockingPromises: Promise<any>[],
8785
) => {
8886
const linkControllers = (controller: AbortController) =>
8987
addAbortSignalListener(parentAbortSignal, () =>
90-
abortControllerWithReason(controller, parentAbortSignal.reason),
88+
controller.abort(parentAbortSignal.reason),
9189
)
9290

9391
return <T>(
@@ -111,7 +109,7 @@ const createFork = (
111109
validateActive(childAbortController.signal)
112110
return result
113111
},
114-
() => abortControllerWithReason(childAbortController, taskCompleted),
112+
() => childAbortController.abort(taskCompleted),
115113
)
116114

117115
if (opts?.autoJoin) {
@@ -121,7 +119,7 @@ const createFork = (
121119
return {
122120
result: createPause<TaskResult<T>>(parentAbortSignal)(result),
123121
cancel() {
124-
abortControllerWithReason(childAbortController, taskCancelled)
122+
childAbortController.abort(taskCancelled)
125123
},
126124
}
127125
}
@@ -256,7 +254,7 @@ const cancelActiveListeners = (
256254
entry: ListenerEntry<unknown, Dispatch<UnknownAction>>,
257255
) => {
258256
entry.pending.forEach((controller) => {
259-
abortControllerWithReason(controller, listenerCancelled)
257+
controller.abort(listenerCancelled)
260258
})
261259
}
262260

@@ -444,16 +442,13 @@ export const createListenerMiddleware = <
444442
cancelActiveListeners: () => {
445443
entry.pending.forEach((controller, _, set) => {
446444
if (controller !== internalTaskController) {
447-
abortControllerWithReason(controller, listenerCancelled)
445+
controller.abort(listenerCancelled)
448446
set.delete(controller)
449447
}
450448
})
451449
},
452450
cancel: () => {
453-
abortControllerWithReason(
454-
internalTaskController,
455-
listenerCancelled,
456-
)
451+
internalTaskController.abort(listenerCancelled)
457452
entry.pending.delete(internalTaskController)
458453
},
459454
throwIfCancelled: () => {
@@ -471,7 +466,7 @@ export const createListenerMiddleware = <
471466
} finally {
472467
await Promise.all(autoJoinPromises)
473468

474-
abortControllerWithReason(internalTaskController, listenerCompleted) // Notify that the task has completed
469+
internalTaskController.abort(listenerCompleted) // Notify that the task has completed
475470
untrackExecutingListener(entry)
476471
entry.pending.delete(internalTaskController)
477472
}

packages/toolkit/src/listenerMiddleware/task.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
import { TaskAbortError } from './exceptions'
2-
import type { AbortSignalWithReason, TaskResult } from './types'
2+
import type { TaskResult } from './types'
33
import { addAbortSignalListener, catchRejection, noop } from './utils'
44

55
/**
66
* Synchronously raises {@link TaskAbortError} if the task tied to the input `signal` has been cancelled.
77
* @param signal
8-
* @param reason
98
* @see {TaskAbortError}
9+
* @throws {TaskAbortError} if the task tied to the input `signal` has been cancelled.
1010
*/
1111
export const validateActive = (signal: AbortSignal): void => {
1212
if (signal.aborted) {
13-
const { reason } = signal as AbortSignalWithReason<string>
14-
throw new TaskAbortError(reason)
13+
throw new TaskAbortError(signal.reason)
1514
}
1615
}
1716

@@ -21,7 +20,7 @@ export const validateActive = (signal: AbortSignal): void => {
2120
* https://github.com/nodejs/node/issues/17469#issuecomment-349794909
2221
*/
2322
export function raceWithSignal<T>(
24-
signal: AbortSignalWithReason<string>,
23+
signal: AbortSignal,
2524
promise: Promise<T>,
2625
): Promise<T> {
2726
let cleanup = noop

packages/toolkit/src/listenerMiddleware/tests/fork.test.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,7 @@ import type { EnhancedStore } from '@reduxjs/toolkit'
22
import { configureStore, createSlice, createAction } from '@reduxjs/toolkit'
33

44
import type { PayloadAction } from '@reduxjs/toolkit'
5-
import type {
6-
AbortSignalWithReason,
7-
ForkedTaskExecutor,
8-
TaskResult,
9-
} from '../types'
5+
import type { ForkedTaskExecutor, TaskResult } from '../types'
106
import { createListenerMiddleware, TaskAbortError } from '../index'
117
import {
128
listenerCancelled,
@@ -382,9 +378,7 @@ describe('fork', () => {
382378
listenerApi.fork(
383379
async (forkApi) => {
384380
forkApi.signal.addEventListener('abort', () => {
385-
deferredResult.resolve(
386-
(forkApi.signal as AbortSignalWithReason<unknown>).reason,
387-
)
381+
deferredResult.resolve(forkApi.signal.reason)
388382
})
389383

390384
await forkApi.delay(10)

packages/toolkit/src/listenerMiddleware/tests/listenerMiddleware.test.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ import {
22
listenerCancelled,
33
listenerCompleted,
44
} from '@internal/listenerMiddleware/exceptions'
5-
import type {
6-
AbortSignalWithReason,
7-
AddListenerOverloads,
8-
} from '@internal/listenerMiddleware/types'
5+
import type { AddListenerOverloads } from '@internal/listenerMiddleware/types'
96
import { noop } from '@internal/listenerMiddleware/utils'
107
import type {
118
Action,
@@ -606,7 +603,7 @@ describe('createListenerMiddleware', () => {
606603
signal.addEventListener(
607604
'abort',
608605
() => {
609-
payload.resolve((signal as AbortSignalWithReason<string>).reason)
606+
payload.resolve(signal.reason)
610607
},
611608
{ once: true },
612609
)
@@ -636,7 +633,7 @@ describe('createListenerMiddleware', () => {
636633
signal.addEventListener(
637634
'abort',
638635
() => {
639-
payload.resolve((signal as AbortSignalWithReason<string>).reason)
636+
payload.resolve(signal.reason)
640637
},
641638
{ once: true },
642639
)

packages/toolkit/src/listenerMiddleware/types.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,6 @@ import type { BaseActionCreator, PayloadAction } from '../createAction'
1010
import type { TypedActionCreator } from '../mapBuilders'
1111
import type { TaskAbortError } from './exceptions'
1212

13-
/**
14-
* @internal
15-
* At the time of writing `lib.dom.ts` does not provide `abortSignal.reason`.
16-
*/
17-
export type AbortSignalWithReason<T> = AbortSignal & { reason?: T }
18-
1913
/**
2014
* Types copied from RTK
2115
*/
Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import type { AbortSignalWithReason } from './types'
2-
31
export const assertFunction: (
42
func: unknown,
53
expected: string,
@@ -30,41 +28,3 @@ export const addAbortSignalListener = (
3028
abortSignal.addEventListener('abort', callback, { once: true })
3129
return () => abortSignal.removeEventListener('abort', callback)
3230
}
33-
34-
/**
35-
* Calls `abortController.abort(reason)` and patches `signal.reason`.
36-
* if it is not supported.
37-
*
38-
* At the time of writing `signal.reason` is available in FF chrome, edge node 17 and deno.
39-
* @param abortController
40-
* @param reason
41-
* @returns
42-
* @see https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/reason
43-
*/
44-
export const abortControllerWithReason = <T>(
45-
abortController: AbortController,
46-
reason: T,
47-
): void => {
48-
type Consumer<T> = (val: T) => void
49-
50-
const signal = abortController.signal as AbortSignalWithReason<T>
51-
52-
if (signal.aborted) {
53-
return
54-
}
55-
56-
// Patch `reason` if necessary.
57-
// - We use defineProperty here because reason is a getter of `AbortSignal.__proto__`.
58-
// - We need to patch 'reason' before calling `.abort()` because listeners to the 'abort'
59-
// event are are notified immediately.
60-
if (!('reason' in signal)) {
61-
Object.defineProperty(signal, 'reason', {
62-
enumerable: true,
63-
value: reason,
64-
configurable: true,
65-
writable: true,
66-
})
67-
}
68-
69-
;(abortController.abort as Consumer<typeof reason>)(reason)
70-
}

0 commit comments

Comments
 (0)