@@ -2,10 +2,10 @@ import type {
2
2
Middleware ,
3
3
Dispatch as ReduxDispatch ,
4
4
UnknownAction ,
5
- MiddlewareAPI ,
6
5
} from 'redux'
7
6
import { compose } from 'redux'
8
7
import { createAction , isAction } from '../createAction'
8
+ import { isAllOf } from '../matchers'
9
9
import { nanoid } from '../nanoid'
10
10
import { find } from '../utils'
11
11
import type {
@@ -27,33 +27,32 @@ const createMiddlewareEntry = <
27
27
applied : new Map ( ) ,
28
28
} )
29
29
30
+ const matchInstance =
31
+ ( instanceId : string ) =>
32
+ ( action : any ) : action is { meta : { instanceId : string } } =>
33
+ action ?. meta ?. instanceId === instanceId
34
+
30
35
export const createDynamicMiddleware = <
31
36
State = any ,
32
37
Dispatch extends ReduxDispatch < UnknownAction > = ReduxDispatch < UnknownAction >
33
38
> ( ) : DynamicMiddlewareInstance < State , Dispatch > => {
34
39
const instanceId = nanoid ( )
35
40
const middlewareMap = new Map < string , MiddlewareEntry < State , Dispatch > > ( )
36
41
37
- const insertEntry = ( entry : MiddlewareEntry < State , Dispatch > ) => {
38
- middlewareMap . set ( entry . id , entry )
39
- }
40
-
41
- const withMiddleware = ( ( ) => {
42
- const withMiddleware = createAction (
42
+ const withMiddleware = Object . assign (
43
+ createAction (
43
44
'dynamicMiddleware/add' ,
44
45
( ...middlewares : Middleware < any , State , Dispatch > [ ] ) => ( {
45
46
payload : middlewares ,
46
47
meta : {
47
48
instanceId,
48
49
} ,
49
50
} )
50
- )
51
- // @ts -ignore
52
- withMiddleware . withTypes = ( ) => withMiddleware
53
- return withMiddleware as WithMiddleware < State , Dispatch >
54
- } ) ( )
51
+ ) ,
52
+ { withTypes : ( ) => withMiddleware }
53
+ ) as WithMiddleware < State , Dispatch >
55
54
56
- const addMiddleware = ( ( ) => {
55
+ const addMiddleware = Object . assign (
57
56
function addMiddleware ( ...middlewares : Middleware < any , State , Dispatch > [ ] ) {
58
57
middlewares . forEach ( ( middleware ) => {
59
58
let entry = find (
@@ -63,16 +62,13 @@ export const createDynamicMiddleware = <
63
62
if ( ! entry ) {
64
63
entry = createMiddlewareEntry ( middleware )
65
64
}
66
- insertEntry ( entry )
65
+ middlewareMap . set ( entry . id , entry )
67
66
} )
68
- }
69
- addMiddleware . withTypes = ( ) => addMiddleware
70
- return addMiddleware as AddMiddleware < State , Dispatch >
71
- } ) ( )
67
+ } ,
68
+ { withTypes : ( ) => addMiddleware }
69
+ ) as AddMiddleware < State , Dispatch >
72
70
73
- const getFinalMiddleware = (
74
- api : MiddlewareAPI < Dispatch , State >
75
- ) : ReturnType < Middleware < any , State , Dispatch > > => {
71
+ const getFinalMiddleware : Middleware < { } , State , Dispatch > = ( api ) => {
76
72
const appliedMiddleware = Array . from ( middlewareMap . values ( ) ) . map (
77
73
( entry ) => {
78
74
let applied = entry . applied . get ( api )
@@ -86,13 +82,15 @@ export const createDynamicMiddleware = <
86
82
return compose ( ...appliedMiddleware )
87
83
}
88
84
85
+ const isWithMiddleware = isAllOf (
86
+ isAction ,
87
+ withMiddleware ,
88
+ matchInstance ( instanceId )
89
+ )
90
+
89
91
const middleware : DynamicMiddleware < State , Dispatch > =
90
92
( api ) => ( next ) => ( action ) => {
91
- if (
92
- isAction ( action ) &&
93
- withMiddleware . match ( action ) &&
94
- action . meta . instanceId === instanceId
95
- ) {
93
+ if ( isWithMiddleware ( action ) ) {
96
94
addMiddleware ( ...action . payload )
97
95
return api . dispatch
98
96
}
@@ -103,5 +101,6 @@ export const createDynamicMiddleware = <
103
101
middleware,
104
102
addMiddleware,
105
103
withMiddleware,
104
+ instanceId,
106
105
}
107
106
}
0 commit comments