diff --git a/.changeset/breezy-waves-float.md b/.changeset/breezy-waves-float.md new file mode 100644 index 0000000..2634090 --- /dev/null +++ b/.changeset/breezy-waves-float.md @@ -0,0 +1,7 @@ +--- +"@effect-rx/rx-react": minor +"@effect-rx/rx": minor +"@effect-rx/rx-vue": minor +--- + +revert keepAlive removal diff --git a/packages/rx-react/src/index.ts b/packages/rx-react/src/index.ts index 8f54b5a..007471e 100644 --- a/packages/rx-react/src/index.ts +++ b/packages/rx-react/src/index.ts @@ -42,7 +42,8 @@ function scheduleTask(f: () => void): void { * @category context */ export const RegistryContext = React.createContext(Registry.make({ - scheduleTask + scheduleTask, + defaultIdleTTL: 150 })) interface RxStore { diff --git a/packages/rx/src/Registry.ts b/packages/rx/src/Registry.ts index 942efcc..384dd19 100644 --- a/packages/rx/src/Registry.ts +++ b/packages/rx/src/Registry.ts @@ -40,5 +40,6 @@ export const make: ( readonly initialValues?: Iterable, any]> | undefined readonly scheduleTask?: ((f: () => void) => void) | undefined readonly timeoutResolution?: number | undefined + readonly defaultIdleTTL?: number | undefined } | undefined ) => Registry = internal.make diff --git a/packages/rx/src/internal/registry.ts b/packages/rx/src/internal/registry.ts index a2160f8..fab2601 100644 --- a/packages/rx/src/internal/registry.ts +++ b/packages/rx/src/internal/registry.ts @@ -21,11 +21,13 @@ export const make = (options?: { readonly initialValues?: Iterable, any]> | undefined readonly scheduleTask?: ((f: () => void) => void) | undefined readonly timeoutResolution?: number | undefined + readonly defaultIdleTTL?: number | undefined }): Registry.Registry => new RegistryImpl( options?.initialValues, options?.scheduleTask, - options?.timeoutResolution + options?.timeoutResolution, + options?.defaultIdleTTL ) class RegistryImpl implements Registry.Registry { @@ -33,7 +35,8 @@ class RegistryImpl implements Registry.Registry { constructor( initialValues?: Iterable, any]>, readonly scheduleTask = queueMicrotask, - readonly timeoutResolution = 5000 + readonly timeoutResolution = 5000, + readonly defaultIdleTTL?: number ) { this[TypeId] = TypeId if (initialValues !== undefined) { @@ -89,7 +92,7 @@ class RegistryImpl implements Registry.Registry { if (node === undefined) { node = this.createNode(rx) this.nodes.set(rx, node) - } else if (!rx.keepAlive && rx.idleTTL) { + } else if (!rx.keepAlive && (rx.idleTTL || this.defaultIdleTTL)) { this.removeNodeTimeout(node) } return node @@ -128,7 +131,7 @@ class RegistryImpl implements Registry.Registry { } removeNode(node: Node): void { - if (node.rx.idleTTL) { + if (!node.rx.keepAlive && (node.rx.idleTTL || this.defaultIdleTTL)) { this.setNodeTimeout(node) } else { this.nodes.delete(node.rx) @@ -141,7 +144,8 @@ class RegistryImpl implements Registry.Registry { return } - const ttl = Math.ceil(node.rx.idleTTL! / this.timeoutResolution) * this.timeoutResolution + const idleTTL = node.rx.idleTTL ?? this.defaultIdleTTL! + const ttl = Math.ceil(idleTTL! / this.timeoutResolution) * this.timeoutResolution const timestamp = Date.now() + ttl const bucket = timestamp - (timestamp % this.timeoutResolution) + this.timeoutResolution diff --git a/packages/rx/test/Rx.test.ts b/packages/rx/test/Rx.test.ts index a9d3ca5..671265e 100644 --- a/packages/rx/test/Rx.test.ts +++ b/packages/rx/test/Rx.test.ts @@ -630,16 +630,14 @@ describe("Rx", () => { }) it("idleTTL", async () => { - const state = Rx.make(0).pipe( - Rx.setIdleTTL(2000) - ) + const state = Rx.make(0) const state2 = Rx.make(0).pipe( Rx.setIdleTTL(10000) ) const state3 = Rx.make(0).pipe( Rx.setIdleTTL(3000) ) - const r = Registry.make() + const r = Registry.make({ defaultIdleTTL: 2000 }) r.set(state, 10) r.set(state2, 10) r.set(state3, 10)