@veams/status-quo-query 0.13.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/README.md +91 -0
- package/dist/query.js +49 -2
- package/dist/query.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/query.spec.ts +35 -1
- package/src/query.ts +58 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
- Fixed `QueryHandle.subscribe(...)` to mount the TanStack `QueryClient` lifecycle while a query handle subscription is active, restoring `refetchOnWindowFocus` and reconnect behavior for stale subscribed queries.
|
|
6
|
+
- Documented how `staleTime`, `refetchOnWindowFocus`, `bindSubscribable(...)`, and passive cache reads interact in the wrapper.
|
|
7
|
+
|
|
3
8
|
## 0.1.0
|
|
4
9
|
|
|
5
10
|
- Initial package scaffold for TanStack Query and mutation services.
|
package/README.md
CHANGED
|
@@ -870,6 +870,97 @@ It also adds:
|
|
|
870
870
|
|
|
871
871
|
`unsafe_getResult()` returns the raw TanStack `QueryObserverResult`.
|
|
872
872
|
|
|
873
|
+
### Window focus and stale queries
|
|
874
|
+
|
|
875
|
+
`QueryHandle.subscribe(...)` activates the same TanStack `QueryClient` lifecycle that
|
|
876
|
+
`QueryClientProvider` activates for `useQuery`.
|
|
877
|
+
|
|
878
|
+
TanStack's `refetchOnWindowFocus` support does not live on the individual
|
|
879
|
+
`QueryObserver` alone. A `QueryClient` has to be mounted so TanStack can subscribe to
|
|
880
|
+
the global `focusManager` and forward browser focus changes to the query cache. Native
|
|
881
|
+
React Query users usually get this through:
|
|
882
|
+
|
|
883
|
+
```tsx
|
|
884
|
+
<QueryClientProvider client={queryClient}>
|
|
885
|
+
<App />
|
|
886
|
+
</QueryClientProvider>
|
|
887
|
+
```
|
|
888
|
+
|
|
889
|
+
Status Quo Query does not require that provider because query handles can be used in
|
|
890
|
+
service code, state handlers, and React components. Instead, a subscribed query handle
|
|
891
|
+
mounts the provided `QueryClient` for as long as that handle subscription is active:
|
|
892
|
+
|
|
893
|
+
```ts
|
|
894
|
+
const query = createUntrackedQuery(['clock'], fetchClock, {
|
|
895
|
+
staleTime: 5_000,
|
|
896
|
+
refetchOnWindowFocus: true,
|
|
897
|
+
});
|
|
898
|
+
|
|
899
|
+
const unsubscribe = query.subscribe((snapshot) => {
|
|
900
|
+
console.log(snapshot.data);
|
|
901
|
+
});
|
|
902
|
+
|
|
903
|
+
// Later, when the state handler or component is destroyed:
|
|
904
|
+
unsubscribe();
|
|
905
|
+
```
|
|
906
|
+
|
|
907
|
+
With an active subscription, the flow is:
|
|
908
|
+
|
|
909
|
+
1. The first `subscribe(...)` mounts the `QueryClient`.
|
|
910
|
+
2. TanStack installs its focus and online listeners through `focusManager` and
|
|
911
|
+
`onlineManager`.
|
|
912
|
+
3. The `QueryObserver` performs its normal mount behavior and starts stale timers.
|
|
913
|
+
4. Once `staleTime` has elapsed, the observer marks the current result stale.
|
|
914
|
+
5. When the browser window becomes focused again, TanStack calls `queryCache.onFocus()`.
|
|
915
|
+
6. Active stale queries with `refetchOnWindowFocus: true` refetch.
|
|
916
|
+
7. Unsubscribing removes the observer and unmounts the client lifecycle for that
|
|
917
|
+
subscription.
|
|
918
|
+
|
|
919
|
+
This means `staleTime` and `refetchOnWindowFocus` behave the same way through a
|
|
920
|
+
`QueryHandle` subscription as they do through `useQuery`:
|
|
921
|
+
|
|
922
|
+
```ts
|
|
923
|
+
const query = createUntrackedQuery(
|
|
924
|
+
['staleTime'],
|
|
925
|
+
() => Promise.resolve(new Date()),
|
|
926
|
+
{
|
|
927
|
+
staleTime: 5_000,
|
|
928
|
+
}
|
|
929
|
+
);
|
|
930
|
+
```
|
|
931
|
+
|
|
932
|
+
The default TanStack behavior is preserved. `refetchOnWindowFocus` defaults to `true`,
|
|
933
|
+
so the query above refetches on focus only after it has become stale. Use
|
|
934
|
+
`refetchOnWindowFocus: 'always'` when focus should refetch even while the cached data is
|
|
935
|
+
still fresh, or `refetchOnWindowFocus: false` when focus should never refetch that
|
|
936
|
+
query.
|
|
937
|
+
|
|
938
|
+
`bindSubscribable(...)` integrations also participate automatically because they call
|
|
939
|
+
`QueryHandle.subscribe(...)` internally:
|
|
940
|
+
|
|
941
|
+
```ts
|
|
942
|
+
this.bindSubscribable(productQuery, (snapshot) => {
|
|
943
|
+
this.setState({
|
|
944
|
+
product: snapshot.data,
|
|
945
|
+
productStatus: snapshot.status,
|
|
946
|
+
});
|
|
947
|
+
});
|
|
948
|
+
```
|
|
949
|
+
|
|
950
|
+
The state handler receives:
|
|
951
|
+
|
|
952
|
+
- an initial snapshot, either synchronously from the observer or through
|
|
953
|
+
`getSnapshot()`
|
|
954
|
+
- the stale-result update after `staleTime` expires
|
|
955
|
+
- a fresh snapshot after the window regains focus and the stale query refetches
|
|
956
|
+
|
|
957
|
+
One-off reads do not install focus listeners. `getSnapshot()`, `getQueryData(...)`,
|
|
958
|
+
`getQueryState(...)`, and `fetchQuery(...)` are passive cache reads or explicit fetches;
|
|
959
|
+
they are not live observers. Use `subscribe(...)`, `useQueryHandle(...)`, or
|
|
960
|
+
`bindSubscribable(...)` when the query should respond to TanStack observer lifecycle
|
|
961
|
+
events such as `refetchOnWindowFocus`, `refetchOnReconnect`, stale timers, and refetch
|
|
962
|
+
intervals.
|
|
963
|
+
|
|
873
964
|
### `setupMutation(queryClient)`
|
|
874
965
|
|
|
875
966
|
Creates a `createUntrackedMutation` factory bound to a `QueryClient`.
|
package/dist/query.js
CHANGED
|
@@ -152,9 +152,13 @@ function createQueryHandle(queryClient, queryKey, queryFn, options) {
|
|
|
152
152
|
setDerivedState,
|
|
153
153
|
handle: {
|
|
154
154
|
getSnapshot: () => toQueryHandleSnapshot(observer.getCurrentResult()),
|
|
155
|
-
subscribe: (listener) =>
|
|
155
|
+
subscribe: (listener) =>
|
|
156
|
+
// QueryObserver subscriptions alone are not enough for browser lifecycle events.
|
|
157
|
+
// TanStack wires focus/reconnect refetching through QueryClient.mount(), so every
|
|
158
|
+
// live QueryHandle subscription must also activate the client lifecycle.
|
|
159
|
+
subscribeToMountedQueryClient(queryClient, () => observer.subscribe((result) => {
|
|
156
160
|
listener(toQueryHandleSnapshot(result));
|
|
157
|
-
}),
|
|
161
|
+
})),
|
|
158
162
|
refetch: async (refetchOptions) => toQueryHandleSnapshot(await observer.refetch(refetchOptions)),
|
|
159
163
|
invalidate: (invalidateOptions) => queryClient.invalidateQueries({
|
|
160
164
|
exact: true,
|
|
@@ -167,6 +171,49 @@ function createQueryHandle(queryClient, queryKey, queryFn, options) {
|
|
|
167
171
|
},
|
|
168
172
|
};
|
|
169
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* Subscribes to a TanStack observer while the owning QueryClient is mounted.
|
|
176
|
+
*
|
|
177
|
+
* Native `useQuery` users normally get this lifecycle from `QueryClientProvider`, which calls
|
|
178
|
+
* `queryClient.mount()` and lets TanStack subscribe to `focusManager` and `onlineManager`.
|
|
179
|
+
* Status Quo Query can be used without a React provider, so the wrapper has to mount the client
|
|
180
|
+
* when a query handle becomes live.
|
|
181
|
+
*
|
|
182
|
+
* Mounting is intentionally scoped to `subscribe(...)` rather than `setupQuery(...)`:
|
|
183
|
+
*
|
|
184
|
+
* - passive reads such as `getSnapshot()` and `getQueryData(...)` should not install global
|
|
185
|
+
* focus/online listeners
|
|
186
|
+
* - short-lived factories should not leave a permanently mounted client behind
|
|
187
|
+
* - TanStack reference-counts `mount()` / `unmount()`, so multiple active handles can safely
|
|
188
|
+
* mount the same client at the same time
|
|
189
|
+
*
|
|
190
|
+
* This is the piece that makes `staleTime` + `refetchOnWindowFocus` behave like native
|
|
191
|
+
* `useQuery`: the observer marks itself stale after the stale timer expires, then the mounted
|
|
192
|
+
* client forwards the next focus event to the query cache so active stale queries refetch.
|
|
193
|
+
*/
|
|
194
|
+
function subscribeToMountedQueryClient(queryClient, subscribe) {
|
|
195
|
+
queryClient.mount();
|
|
196
|
+
let isSubscribed = true;
|
|
197
|
+
let unsubscribe;
|
|
198
|
+
try {
|
|
199
|
+
unsubscribe = subscribe();
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
// Keep mount/unmount balanced if the observer subscription throws before returning cleanup.
|
|
203
|
+
queryClient.unmount();
|
|
204
|
+
throw error;
|
|
205
|
+
}
|
|
206
|
+
return () => {
|
|
207
|
+
if (!isSubscribed) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
isSubscribed = false;
|
|
211
|
+
unsubscribe();
|
|
212
|
+
// Balance the mount for this specific subscription. TanStack keeps the client mounted while
|
|
213
|
+
// any other active subscription has also called mount().
|
|
214
|
+
queryClient.unmount();
|
|
215
|
+
};
|
|
216
|
+
}
|
|
170
217
|
function bindQueryDependencies(queryHandle, queryKey, dependsOn) {
|
|
171
218
|
const dependencyController = createDependencyController(queryKey, queryHandle.setDerivedState, dependsOn);
|
|
172
219
|
let subscriberCount = 0;
|
package/dist/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { QueryClient } from '@tanstack/query-core';
|
|
1
|
+
import { focusManager, QueryClient } from '@tanstack/query-core';
|
|
2
2
|
|
|
3
3
|
import { isQueryLoading, setupQuery, toQueryMetaState } from '../query';
|
|
4
4
|
|
|
@@ -43,6 +43,40 @@ describe('Query Service', () => {
|
|
|
43
43
|
expect(statuses).toContain('success');
|
|
44
44
|
});
|
|
45
45
|
|
|
46
|
+
it('refetches stale subscribed queries when window focus returns', async () => {
|
|
47
|
+
jest.useFakeTimers();
|
|
48
|
+
|
|
49
|
+
const queryClient = new QueryClient({ defaultOptions: { queries: { retry: 0 } } });
|
|
50
|
+
const createQuery = setupQuery(queryClient);
|
|
51
|
+
const queryFn = jest
|
|
52
|
+
.fn()
|
|
53
|
+
.mockResolvedValueOnce('initial')
|
|
54
|
+
.mockResolvedValueOnce('focused');
|
|
55
|
+
const service = createQuery(['demo', 'focus'], queryFn, { staleTime: 5_000 });
|
|
56
|
+
const unsubscribe = service.subscribe(() => undefined);
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
await flushTasks();
|
|
60
|
+
|
|
61
|
+
expect(queryFn).toHaveBeenCalledTimes(1);
|
|
62
|
+
expect(service.getSnapshot().data).toBe('initial');
|
|
63
|
+
|
|
64
|
+
jest.advanceTimersByTime(5_001);
|
|
65
|
+
await flushTasks();
|
|
66
|
+
|
|
67
|
+
focusManager.setFocused(false);
|
|
68
|
+
focusManager.setFocused(true);
|
|
69
|
+
await flushTasks();
|
|
70
|
+
|
|
71
|
+
expect(queryFn).toHaveBeenCalledTimes(2);
|
|
72
|
+
expect(service.getSnapshot().data).toBe('focused');
|
|
73
|
+
} finally {
|
|
74
|
+
unsubscribe();
|
|
75
|
+
focusManager.setFocused(undefined);
|
|
76
|
+
jest.useRealTimers();
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
46
80
|
it('invalidates its own query key exactly', async () => {
|
|
47
81
|
const queryClient = new QueryClient({ defaultOptions: { queries: { retry: 0 } } });
|
|
48
82
|
const invalidateQueriesSpy = jest.spyOn(queryClient, 'invalidateQueries');
|
package/src/query.ts
CHANGED
|
@@ -424,9 +424,14 @@ function createQueryHandle<
|
|
|
424
424
|
handle: {
|
|
425
425
|
getSnapshot: () => toQueryHandleSnapshot(observer.getCurrentResult()),
|
|
426
426
|
subscribe: (listener) =>
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
427
|
+
// QueryObserver subscriptions alone are not enough for browser lifecycle events.
|
|
428
|
+
// TanStack wires focus/reconnect refetching through QueryClient.mount(), so every
|
|
429
|
+
// live QueryHandle subscription must also activate the client lifecycle.
|
|
430
|
+
subscribeToMountedQueryClient(queryClient, () =>
|
|
431
|
+
observer.subscribe((result) => {
|
|
432
|
+
listener(toQueryHandleSnapshot(result));
|
|
433
|
+
})
|
|
434
|
+
),
|
|
430
435
|
refetch: async (refetchOptions) =>
|
|
431
436
|
toQueryHandleSnapshot(await observer.refetch(refetchOptions)),
|
|
432
437
|
invalidate: (invalidateOptions) =>
|
|
@@ -445,6 +450,56 @@ function createQueryHandle<
|
|
|
445
450
|
};
|
|
446
451
|
}
|
|
447
452
|
|
|
453
|
+
/**
|
|
454
|
+
* Subscribes to a TanStack observer while the owning QueryClient is mounted.
|
|
455
|
+
*
|
|
456
|
+
* Native `useQuery` users normally get this lifecycle from `QueryClientProvider`, which calls
|
|
457
|
+
* `queryClient.mount()` and lets TanStack subscribe to `focusManager` and `onlineManager`.
|
|
458
|
+
* Status Quo Query can be used without a React provider, so the wrapper has to mount the client
|
|
459
|
+
* when a query handle becomes live.
|
|
460
|
+
*
|
|
461
|
+
* Mounting is intentionally scoped to `subscribe(...)` rather than `setupQuery(...)`:
|
|
462
|
+
*
|
|
463
|
+
* - passive reads such as `getSnapshot()` and `getQueryData(...)` should not install global
|
|
464
|
+
* focus/online listeners
|
|
465
|
+
* - short-lived factories should not leave a permanently mounted client behind
|
|
466
|
+
* - TanStack reference-counts `mount()` / `unmount()`, so multiple active handles can safely
|
|
467
|
+
* mount the same client at the same time
|
|
468
|
+
*
|
|
469
|
+
* This is the piece that makes `staleTime` + `refetchOnWindowFocus` behave like native
|
|
470
|
+
* `useQuery`: the observer marks itself stale after the stale timer expires, then the mounted
|
|
471
|
+
* client forwards the next focus event to the query cache so active stale queries refetch.
|
|
472
|
+
*/
|
|
473
|
+
function subscribeToMountedQueryClient(
|
|
474
|
+
queryClient: QueryClient,
|
|
475
|
+
subscribe: () => () => void
|
|
476
|
+
): () => void {
|
|
477
|
+
queryClient.mount();
|
|
478
|
+
|
|
479
|
+
let isSubscribed = true;
|
|
480
|
+
let unsubscribe: () => void;
|
|
481
|
+
|
|
482
|
+
try {
|
|
483
|
+
unsubscribe = subscribe();
|
|
484
|
+
} catch (error) {
|
|
485
|
+
// Keep mount/unmount balanced if the observer subscription throws before returning cleanup.
|
|
486
|
+
queryClient.unmount();
|
|
487
|
+
throw error;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
return () => {
|
|
491
|
+
if (!isSubscribed) {
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
isSubscribed = false;
|
|
496
|
+
unsubscribe();
|
|
497
|
+
// Balance the mount for this specific subscription. TanStack keeps the client mounted while
|
|
498
|
+
// any other active subscription has also called mount().
|
|
499
|
+
queryClient.unmount();
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
|
|
448
503
|
function bindQueryDependencies<
|
|
449
504
|
TSources extends readonly unknown[] = [],
|
|
450
505
|
TQueryFnData = unknown,
|