diff --git a/.changeset/clear-shrimps-see.md b/.changeset/clear-shrimps-see.md new file mode 100644 index 0000000..57e4f8b --- /dev/null +++ b/.changeset/clear-shrimps-see.md @@ -0,0 +1,5 @@ +--- +"solid-relay": patch +--- + +fix: stop caching queries that wasn't fetched diff --git a/.changeset/twenty-trains-wish.md b/.changeset/twenty-trains-wish.md new file mode 100644 index 0000000..2ff4c46 --- /dev/null +++ b/.changeset/twenty-trains-wish.md @@ -0,0 +1,5 @@ +--- +"solid-relay": patch +--- + +fix: proper fragment subscription cleanup diff --git a/src/primitives/createFragment.ts b/src/primitives/createFragment.ts index 6f733de..b1b767d 100644 --- a/src/primitives/createFragment.ts +++ b/src/primitives/createFragment.ts @@ -14,9 +14,8 @@ import { KeyTypeData, } from "relay-runtime/lib/store/FragmentTypes"; import type { Accessor, Setter, Signal } from "solid-js"; -import { batch, createResource, createSignal, untrack } from "solid-js"; +import { batch, createEffect, createResource, createSignal, onCleanup, untrack } from "solid-js"; import { reconcile, type SetStoreFunction, unwrap } from "solid-js/store"; -import { isServer } from "solid-js/web"; import { useRelayEnvironment } from "../RelayEnvironment"; import { createDataStore, type DataStore } from "../utils/dataStore"; import { cleanSnapshot } from "../utils/snapshot"; @@ -154,6 +153,14 @@ export function createFragmentInternal< }, } satisfies Observer>; const [subscription, setSubscription] = createSignal(); + createEffect(() => { + const sub = subscription(); + if (sub) { + onCleanup(() => { + sub.unsubscribe(); + }); + } + }); const setResultQueue: unknown[][] = []; let setResult: SetStoreFunction> = (...args: unknown[]) => { @@ -164,7 +171,6 @@ export function createFragmentInternal< const [resource] = createResource( () => { return batch(() => { - untrack(subscription)?.unsubscribe(); setSubscription(undefined); setResult("pending", false); @@ -203,11 +209,6 @@ export function createFragmentInternal< }, }), ); - }).finally(() => { - if (isServer) { - subscription()?.unsubscribe(); - setSubscription(undefined); - } }); }, { diff --git a/src/primitives/createLazyLoadQuery.ts b/src/primitives/createLazyLoadQuery.ts index 165d5ef..aab7d0f 100644 --- a/src/primitives/createLazyLoadQuery.ts +++ b/src/primitives/createLazyLoadQuery.ts @@ -213,7 +213,7 @@ export function createLazyLoadQueryInternal(params }, ); - let entry: QueryCacheEntry = null; + let entry: QueryCacheEntry | undefined; if (shouldFetch) { const subscription = subscriptionTarget?.subscribe({}); let retainCount = 0; @@ -237,9 +237,9 @@ export function createLazyLoadQueryInternal(params }; }, }; + cache.set(key, entry); } - cache.set(key, entry); return entry; }); diff --git a/src/queryCache.ts b/src/queryCache.ts index 4dd1fe4..b3182d2 100644 --- a/src/queryCache.ts +++ b/src/queryCache.ts @@ -4,7 +4,7 @@ import type { Resource } from "solid-js"; export type QueryCacheEntry = { resource: Resource; retain: (environment: IEnvironment) => Disposable; -} | null; +}; const caches = new WeakMap>();