Skip to content

Commit be9793d

Browse files
committed
perf(store/observers): add share() and shareReplay()
1 parent 983f826 commit be9793d

File tree

2 files changed

+18
-10
lines changed

2 files changed

+18
-10
lines changed

src/app/store/observers/actionObserver.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
type PayloadActionCreator,
77
type StoreEnhancer,
88
} from '@reduxjs/toolkit'
9-
import { filter, map, type Observable, Subject } from 'rxjs'
9+
import { filter, map, type Observable, share, Subject } from 'rxjs'
1010

1111
import { injectStoreExtension } from '../enhancers/injectStoreExtension'
1212
import { weakMemo } from './weakMemo'
@@ -36,7 +36,11 @@ export const createActionObserver = (): ActionObserver => {
3636
}
3737

3838
const onAction: ObserveAction = weakMemo((actionCreator) =>
39-
action$.pipe(filter(matchType(actionCreator)), map(getPayload)),
39+
action$.pipe(
40+
filter(matchType(actionCreator)),
41+
map(getPayload),
42+
share(),
43+
),
4044
)
4145

4246
const enhancer = injectStoreExtension(() => ({ onAction }))

src/app/store/observers/stateObserver.ts

+12-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import type { Middleware, Selector, StoreEnhancer } from '@reduxjs/toolkit'
2-
import { BehaviorSubject, distinctUntilChanged, map, type Observable } from 'rxjs'
3-
4-
import { invariant } from '@/common/utils'
2+
import { distinctUntilChanged, map, type Observable, ReplaySubject, share, shareReplay } from 'rxjs'
53

64
import { injectStoreExtension } from '../enhancers/injectStoreExtension'
75
import { weakMemo } from './weakMemo'
@@ -13,17 +11,19 @@ interface StateObserver<State> {
1311
enhancer: StoreEnhancer<{ onState: ObserveState<State> }>
1412
}
1513

14+
const BUFFER_SIZE = 1 // latest state only
15+
1616
export const createStateObserver = <State>(): StateObserver<State> => {
17-
const NIL = Symbol('NIL')
18-
const state$ = new BehaviorSubject<State | typeof NIL>(NIL)
17+
const state$ = new ReplaySubject<State>(BUFFER_SIZE)
1918

2019
const distinctState$ = state$.pipe(
21-
map((state) => (invariant(state !== NIL), state)),
2220
distinctUntilChanged(),
21+
shareReplay(BUFFER_SIZE),
2322
)
2423

2524
const middleware: Middleware<{}, State> = (api) => {
26-
state$.next(api.getState())
25+
const initialState = api.getState()
26+
state$.next(initialState)
2727

2828
return (next) => (action) => {
2929
const result = next(action)
@@ -33,7 +33,11 @@ export const createStateObserver = <State>(): StateObserver<State> => {
3333
}
3434

3535
const onState: ObserveState<State> = weakMemo((selector) =>
36-
distinctState$.pipe(map(selector), distinctUntilChanged()),
36+
distinctState$.pipe(
37+
map(selector),
38+
distinctUntilChanged(),
39+
share(),
40+
),
3741
)
3842

3943
const enhancer = injectStoreExtension(() => ({ onState }))

0 commit comments

Comments
 (0)