@@ -2,9 +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 { nanoid } from '../nanoid'
6
5
7
- import { find } from '../utils'
8
6
import {
9
7
TaskAbortError ,
10
8
listenerCancelled ,
@@ -48,6 +46,7 @@ import {
48
46
catchRejection ,
49
47
noop ,
50
48
} from './utils'
49
+ import { getOrInsertComputed } from '@internal/utils'
51
50
export { TaskAbortError } from './exceptions'
52
51
export type {
53
52
AsyncTaskExecutor ,
@@ -221,9 +220,7 @@ export const createListenerEntry: TypedCreateListenerEntry<unknown> =
221
220
( options : FallbackAddListenerOptions ) => {
222
221
const { type, predicate, effect } = getListenerEntryPropsFrom ( options )
223
222
224
- const id = nanoid ( )
225
223
const entry : ListenerEntry < unknown > = {
226
- id,
227
224
effect,
228
225
type,
229
226
predicate,
@@ -247,7 +244,7 @@ const cancelActiveListeners = (
247
244
}
248
245
249
246
const createClearListenerMiddleware = (
250
- listenerMap : Map < string , ListenerEntry > ,
247
+ listenerMap : Map < ListenerEntry [ 'effect' ] , ListenerEntry > ,
251
248
) => {
252
249
return ( ) => {
253
250
listenerMap . forEach ( cancelActiveListeners )
@@ -324,15 +321,15 @@ export const createListenerMiddleware = <
324
321
> (
325
322
middlewareOptions : CreateListenerMiddlewareOptions < ExtraArgument > = { } ,
326
323
) => {
327
- const listenerMap = new Map < string , ListenerEntry > ( )
324
+ const listenerMap = new Map < ListenerEntry [ 'effect' ] , ListenerEntry > ( )
328
325
const { extra, onError = defaultErrorHandler } = middlewareOptions
329
326
330
327
assertFunction ( onError , 'onError' )
331
328
332
329
const insertEntry = ( entry : ListenerEntry ) => {
333
- entry . unsubscribe = ( ) => listenerMap . delete ( entry ! . id )
330
+ entry . unsubscribe = ( ) => listenerMap . delete ( entry . effect )
334
331
335
- listenerMap . set ( entry . id , entry )
332
+ listenerMap . set ( entry . effect , entry )
336
333
return ( cancelOptions ?: UnsubscribeListenerOptions ) => {
337
334
entry . unsubscribe ( )
338
335
if ( cancelOptions ?. cancelActive ) {
@@ -342,15 +339,9 @@ export const createListenerMiddleware = <
342
339
}
343
340
344
341
const startListening = ( ( options : FallbackAddListenerOptions ) => {
345
- let entry = find (
346
- Array . from ( listenerMap . values ( ) ) ,
347
- ( existingEntry ) => existingEntry . effect === options . effect ,
342
+ const entry = getOrInsertComputed ( listenerMap , options . effect , ( ) =>
343
+ createListenerEntry ( options as any ) ,
348
344
)
349
-
350
- if ( ! entry ) {
351
- entry = createListenerEntry ( options as any )
352
- }
353
-
354
345
return insertEntry ( entry )
355
346
} ) as AddListenerOverloads < any >
356
347
@@ -363,7 +354,7 @@ export const createListenerMiddleware = <
363
354
) : boolean => {
364
355
const { type, effect, predicate } = getListenerEntryPropsFrom ( options )
365
356
366
- const entry = find ( Array . from ( listenerMap . values ( ) ) , ( entry ) => {
357
+ const entry = Array . from ( listenerMap . values ( ) ) . find ( ( entry ) => {
367
358
const matchPredicateOrType =
368
359
typeof type === 'string'
369
360
? entry . type === type
@@ -419,7 +410,7 @@ export const createListenerMiddleware = <
419
410
fork : createFork ( internalTaskController . signal , autoJoinPromises ) ,
420
411
unsubscribe : entry . unsubscribe ,
421
412
subscribe : ( ) => {
422
- listenerMap . set ( entry . id , entry )
413
+ listenerMap . set ( entry . effect , entry )
423
414
} ,
424
415
cancelActiveListeners : ( ) => {
425
416
entry . pending . forEach ( ( controller , _ , set ) => {
0 commit comments