diff --git a/package-lock.json b/package-lock.json index ea57366..3155dd9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@josepot/react-rxjs", - "version": "0.1.2", + "version": "0.1.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d77de02..1fa300e 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "0.1.2", + "version": "0.1.3", "repository": { "type": "git", "url": "git+https://github.com/josepot/react-rxjs.git" diff --git a/src/connectFactoryObservable.ts b/src/connectFactoryObservable.ts index 2b0a33f..2c1c9ef 100644 --- a/src/connectFactoryObservable.ts +++ b/src/connectFactoryObservable.ts @@ -1,6 +1,6 @@ import { useEffect, useState } from "react" import { Observable, of } from "rxjs" -import { finalize, delay, takeUntil } from "rxjs/operators" +import { delay, takeUntil } from "rxjs/operators" import { StaticObservableOptions, defaultStaticOptions, @@ -43,10 +43,9 @@ export function connectFactoryObservable< } const reactObservable$ = getObservable(...input).pipe( - finalize(() => { + distinctShareReplay(compare, () => { cache.delete(key) }), - distinctShareReplay(compare), ) cache.set(key, reactObservable$) diff --git a/src/operators/distinct-share-replay.ts b/src/operators/distinct-share-replay.ts index f8059e1..c6a5f4e 100644 --- a/src/operators/distinct-share-replay.ts +++ b/src/operators/distinct-share-replay.ts @@ -1,12 +1,19 @@ import { Observable, ReplaySubject, concat, NEVER } from "rxjs" -import { distinctUntilChanged, multicast, refCount } from "rxjs/operators" +import { + distinctUntilChanged, + multicast, + refCount, + finalize, +} from "rxjs/operators" -const distinctShareReplay = (compare?: (a: T, b: T) => boolean) => ( - source$: Observable, -): Observable => +const distinctShareReplay = ( + compare?: (a: T, b: T) => boolean, + tearDown?: () => void, +) => (source$: Observable): Observable => source$.pipe( distinctUntilChanged(compare), innerSource => concat(innerSource, NEVER), + tearDown ? finalize(tearDown) : x => x, multicast(() => new ReplaySubject(1)), refCount(), )