@@ -2,7 +2,7 @@ import type { Action, Dispatch, MiddlewareAPI, UnknownAction } from 'redux'
2
2
import { isAction } from 'redux'
3
3
import type { ThunkDispatch } from 'redux-thunk'
4
4
import { createAction } from '../createAction'
5
- import { getOrInsertComputed } from '../utils '
5
+ import { nanoid } from '../nanoid '
6
6
7
7
import {
8
8
TaskAbortError ,
@@ -221,6 +221,7 @@ export const createListenerEntry: TypedCreateListenerEntry<unknown> =
221
221
const { type, predicate, effect } = getListenerEntryPropsFrom ( options )
222
222
223
223
const entry : ListenerEntry < unknown > = {
224
+ id : nanoid ( ) ,
224
225
effect,
225
226
type,
226
227
predicate,
@@ -235,6 +236,22 @@ export const createListenerEntry: TypedCreateListenerEntry<unknown> =
235
236
{ withTypes : ( ) => createListenerEntry } ,
236
237
) as unknown as TypedCreateListenerEntry < unknown >
237
238
239
+ const findListenerEntry = (
240
+ listenerMap : Map < string , ListenerEntry > ,
241
+ options : FallbackAddListenerOptions ,
242
+ ) => {
243
+ const { type, effect, predicate } = getListenerEntryPropsFrom ( options )
244
+
245
+ return Array . from ( listenerMap . values ( ) ) . find ( ( entry ) => {
246
+ const matchPredicateOrType =
247
+ typeof type === 'string'
248
+ ? entry . type === type
249
+ : entry . predicate === predicate
250
+
251
+ return matchPredicateOrType && entry . effect === effect
252
+ } )
253
+ }
254
+
238
255
const cancelActiveListeners = (
239
256
entry : ListenerEntry < unknown , Dispatch < UnknownAction > > ,
240
257
) => {
@@ -244,7 +261,7 @@ const cancelActiveListeners = (
244
261
}
245
262
246
263
const createClearListenerMiddleware = (
247
- listenerMap : Map < ListenerEntry [ 'effect' ] , ListenerEntry > ,
264
+ listenerMap : Map < string , ListenerEntry > ,
248
265
) => {
249
266
return ( ) => {
250
267
listenerMap . forEach ( cancelActiveListeners )
@@ -321,15 +338,15 @@ export const createListenerMiddleware = <
321
338
> (
322
339
middlewareOptions : CreateListenerMiddlewareOptions < ExtraArgument > = { } ,
323
340
) => {
324
- const listenerMap = new Map < ListenerEntry [ 'effect' ] , ListenerEntry > ( )
341
+ const listenerMap = new Map < string , ListenerEntry > ( )
325
342
const { extra, onError = defaultErrorHandler } = middlewareOptions
326
343
327
344
assertFunction ( onError , 'onError' )
328
345
329
346
const insertEntry = ( entry : ListenerEntry ) => {
330
- entry . unsubscribe = ( ) => listenerMap . delete ( entry . effect )
347
+ entry . unsubscribe = ( ) => listenerMap . delete ( entry . id )
331
348
332
- listenerMap . set ( entry . effect , entry )
349
+ listenerMap . set ( entry . id , entry )
333
350
return ( cancelOptions ?: UnsubscribeListenerOptions ) => {
334
351
entry . unsubscribe ( )
335
352
if ( cancelOptions ?. cancelActive ) {
@@ -339,9 +356,10 @@ export const createListenerMiddleware = <
339
356
}
340
357
341
358
const startListening = ( ( options : FallbackAddListenerOptions ) => {
342
- const entry = getOrInsertComputed ( listenerMap , options . effect , ( ) =>
343
- createListenerEntry ( options as any ) ,
344
- )
359
+ const entry =
360
+ findListenerEntry ( listenerMap , options ) ??
361
+ createListenerEntry ( options as any )
362
+
345
363
return insertEntry ( entry )
346
364
} ) as AddListenerOverloads < any >
347
365
@@ -352,16 +370,7 @@ export const createListenerMiddleware = <
352
370
const stopListening = (
353
371
options : FallbackAddListenerOptions & UnsubscribeListenerOptions ,
354
372
) : boolean => {
355
- const { type, effect, predicate } = getListenerEntryPropsFrom ( options )
356
-
357
- const entry = Array . from ( listenerMap . values ( ) ) . find ( ( entry ) => {
358
- const matchPredicateOrType =
359
- typeof type === 'string'
360
- ? entry . type === type
361
- : entry . predicate === predicate
362
-
363
- return matchPredicateOrType && entry . effect === effect
364
- } )
373
+ const entry = findListenerEntry ( listenerMap , options )
365
374
366
375
if ( entry ) {
367
376
entry . unsubscribe ( )
@@ -410,7 +419,7 @@ export const createListenerMiddleware = <
410
419
fork : createFork ( internalTaskController . signal , autoJoinPromises ) ,
411
420
unsubscribe : entry . unsubscribe ,
412
421
subscribe : ( ) => {
413
- listenerMap . set ( entry . effect , entry )
422
+ listenerMap . set ( entry . id , entry )
414
423
} ,
415
424
cancelActiveListeners : ( ) => {
416
425
entry . pending . forEach ( ( controller , _ , set ) => {
0 commit comments