@beignet/react-query 0.0.53 → 0.0.55
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 +18 -0
- package/README.md +190 -0
- package/dist/broadcasting.d.ts +33 -0
- package/dist/broadcasting.d.ts.map +1 -0
- package/dist/broadcasting.js +164 -0
- package/dist/broadcasting.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/client/SKILL.md +27 -0
- package/skills/client/references/broadcast-coordination.md +169 -0
- package/src/broadcasting.ts +211 -0
- package/src/index.ts +9 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @beignet/react-query
|
|
2
2
|
|
|
3
|
+
## 0.0.55
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a3085a6: Coordinate broadcast refreshes with matching pending mutations or custom write
|
|
8
|
+
gates. Add connection admission with automatic resource cleanup, and expose
|
|
9
|
+
connection/reconciliation reasons. Keep the 60-second default, require valid
|
|
10
|
+
lifetime metadata, and use explicit connection-wide renewal control frames.
|
|
11
|
+
|
|
12
|
+
## 0.0.54
|
|
13
|
+
|
|
14
|
+
### Patch Changes
|
|
15
|
+
|
|
16
|
+
- b71b34f: Add typed, authorized browser broadcasting with bounded SSE connections, memory
|
|
17
|
+
and Redis providers, reconnect reconciliation, React Query invalidation,
|
|
18
|
+
initiating-client exclusion, notification delivery, and transactional inbox
|
|
19
|
+
scaffolding. Raw routes now preserve context added by route hooks.
|
|
20
|
+
|
|
3
21
|
## 0.0.53
|
|
4
22
|
|
|
5
23
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -830,6 +830,196 @@ Hook wrappers have been removed—use the options-first API for all queries and
|
|
|
830
830
|
- [`@beignet/react-hook-form`](https://beignetjs.com/react-hook-form) - React Hook Form integration
|
|
831
831
|
- [`@beignet/react-form`](https://beignetjs.com/react-form) - TanStack Form integration
|
|
832
832
|
|
|
833
|
+
## Broadcast query subscriptions
|
|
834
|
+
|
|
835
|
+
`createBroadcastQuerySubscription({ client, channel, params, queryClient,
|
|
836
|
+
invalidates, reconciles, onError?, onStatusChange? })` maps typed broadcasts to
|
|
837
|
+
TanStack Query filters. `invalidates(event)` returns the filters affected by one
|
|
838
|
+
hint; `reconciles` lists every query covered by the channel and runs after initial
|
|
839
|
+
readiness and every reconnect. Use contract-derived `contractFilter()`,
|
|
840
|
+
`filter(params)`, or `namespaceFilter()` rather than hand-built query keys.
|
|
841
|
+
|
|
842
|
+
The helper marks matching queries stale, coalesces hints, and performs a later
|
|
843
|
+
refetch if a hint arrives during an existing fetch. Active queries refetch;
|
|
844
|
+
inactive queries remain stale even when an earlier fetch completes after the
|
|
845
|
+
hint. Disabled and static queries retain TanStack's normal behavior. It
|
|
846
|
+
returns `unsubscribe()` and `getStatus()`. Unsubscribe removes its cache listener
|
|
847
|
+
and queued work without cancelling queries owned by other observers.
|
|
848
|
+
|
|
849
|
+
Share one `createBroadcastClient` from `@beignet/core/broadcasting/client` across
|
|
850
|
+
features, then close and recreate it on user/workspace changes. Reconcile
|
|
851
|
+
optimistic mutation state separately so a remote refetch does not overwrite an
|
|
852
|
+
in-flight edit. See the [broadcasting guide](https://beignetjs.com/broadcasting)
|
|
853
|
+
for complete channel and React Query examples.
|
|
854
|
+
|
|
855
|
+
### Delay broadcast refreshes during saves
|
|
856
|
+
|
|
857
|
+
`createBroadcastQuerySubscription` already coordinates queries that are fetching.
|
|
858
|
+
Its optional `refreshGate` also coordinates pending writes. The new
|
|
859
|
+
`createBroadcastMutationRefreshGate` helper covers ordinary TanStack mutations;
|
|
860
|
+
the new `BroadcastRefreshGate` interface supports application write queues.
|
|
861
|
+
Existing subscriptions need no changes when this coordination is unnecessary.
|
|
862
|
+
|
|
863
|
+
For task queries, put the following in `features/tasks/client/broadcasts.ts`.
|
|
864
|
+
This example assumes browser-safe `taskChanges` in `features/tasks/channels.ts`
|
|
865
|
+
with a `workspaceId` parameter, and existing `listTasks` and `saveTask` contracts.
|
|
866
|
+
`listTasks` accepts a `workspaceId` query parameter. Use the returned mutation
|
|
867
|
+
options with `useMutation`, retaining your optimistic update/rollback callbacks:
|
|
868
|
+
|
|
869
|
+
```ts
|
|
870
|
+
import type { BroadcastClient } from "@beignet/core/broadcasting/client";
|
|
871
|
+
import {
|
|
872
|
+
createBroadcastMutationRefreshGate,
|
|
873
|
+
createBroadcastQuerySubscription,
|
|
874
|
+
} from "@beignet/react-query";
|
|
875
|
+
import type { QueryClient } from "@tanstack/react-query";
|
|
876
|
+
import { rq } from "@/client";
|
|
877
|
+
import { taskChanges } from "@/features/tasks/channels";
|
|
878
|
+
import { listTasks, saveTask } from "@/features/tasks/contracts";
|
|
879
|
+
|
|
880
|
+
export function saveTaskMutationOptions(workspaceId: string) {
|
|
881
|
+
return rq(saveTask).mutationOptions({
|
|
882
|
+
mutationKey: ["tasks", workspaceId, "save"],
|
|
883
|
+
});
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
export function subscribeToTaskChanges(
|
|
887
|
+
client: BroadcastClient,
|
|
888
|
+
queryClient: QueryClient,
|
|
889
|
+
workspaceId: string,
|
|
890
|
+
) {
|
|
891
|
+
const taskQueries = rq(listTasks).filter({ query: { workspaceId } });
|
|
892
|
+
return createBroadcastQuerySubscription({
|
|
893
|
+
client, queryClient, channel: taskChanges, params: { workspaceId },
|
|
894
|
+
invalidates: () => [taskQueries],
|
|
895
|
+
reconciles: [taskQueries],
|
|
896
|
+
refreshGate: createBroadcastMutationRefreshGate({
|
|
897
|
+
queryClient,
|
|
898
|
+
mutations: { mutationKey: ["tasks", workspaceId] },
|
|
899
|
+
}),
|
|
900
|
+
});
|
|
901
|
+
}
|
|
902
|
+
```
|
|
903
|
+
|
|
904
|
+
`mutations` accepts TanStack's `mutationKey`, `exact`, and `predicate` filters.
|
|
905
|
+
Key matching is inclusive unless `exact: true`. Give every related write the
|
|
906
|
+
same key prefix, including creates and deletes that affect lists or counters.
|
|
907
|
+
Include workspace or resource scope when appropriate. Unrelated mutations do
|
|
908
|
+
not block. Omitting a key/predicate deliberately selects all mutations.
|
|
909
|
+
|
|
910
|
+
The helper always checks **pending** mutations; `status` is not configurable.
|
|
911
|
+
Paused pending mutations (offline or waiting for a mutation scope) also block,
|
|
912
|
+
as do overlapping matching mutations until all settle. A custom predicate can
|
|
913
|
+
exclude mutations, but excluding paused writes can refresh over unsaved edits.
|
|
914
|
+
The gate has no timeout that overrides your blocking policy.
|
|
915
|
+
|
|
916
|
+
### Combine mutations with an external write lock
|
|
917
|
+
|
|
918
|
+
Put this application helper beside the feature's broadcast query mappings.
|
|
919
|
+
Pass `createTaskWriteRefreshGate({ queryClient, workspaceId, writeLock })` as
|
|
920
|
+
`refreshGate` in the subscription above. The external lock owns its state and
|
|
921
|
+
notifies after changes; it may inspect the query key to block only related
|
|
922
|
+
queries. Beignet owns listening, queuing, and cleanup:
|
|
923
|
+
|
|
924
|
+
```ts
|
|
925
|
+
import {
|
|
926
|
+
type BroadcastRefreshGate,
|
|
927
|
+
createBroadcastMutationRefreshGate,
|
|
928
|
+
} from "@beignet/react-query";
|
|
929
|
+
import type { Query, QueryClient } from "@tanstack/react-query";
|
|
930
|
+
|
|
931
|
+
// Application-owned write queue/lock. It can block different queries independently.
|
|
932
|
+
export interface TaskWriteLock {
|
|
933
|
+
isBlocked(query: Query): boolean;
|
|
934
|
+
subscribe(onChange: () => void): () => void;
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
export function createTaskWriteRefreshGate({
|
|
938
|
+
queryClient, workspaceId, writeLock,
|
|
939
|
+
}: { queryClient: QueryClient; workspaceId: string; writeLock: TaskWriteLock }): BroadcastRefreshGate {
|
|
940
|
+
const mutations = createBroadcastMutationRefreshGate({
|
|
941
|
+
queryClient,
|
|
942
|
+
mutations: { mutationKey: ["tasks", workspaceId] },
|
|
943
|
+
});
|
|
944
|
+
return {
|
|
945
|
+
isBlocked: (query) => mutations.isBlocked(query) || writeLock.isBlocked(query),
|
|
946
|
+
subscribe(onChange) {
|
|
947
|
+
const stopMutations = mutations.subscribe(onChange);
|
|
948
|
+
try {
|
|
949
|
+
const stopLock = writeLock.subscribe(onChange);
|
|
950
|
+
return () => { try { stopLock(); } finally { stopMutations(); } };
|
|
951
|
+
} catch (error) {
|
|
952
|
+
stopMutations();
|
|
953
|
+
throw error;
|
|
954
|
+
}
|
|
955
|
+
},
|
|
956
|
+
};
|
|
957
|
+
}
|
|
958
|
+
```
|
|
959
|
+
|
|
960
|
+
Both event invalidations and readiness/reconnect reconciliation queue matching
|
|
961
|
+
**existing queries**, deduplicated per query. A blocked query is neither
|
|
962
|
+
invalidated nor refetched by the subscription. The gate is subscribed before
|
|
963
|
+
checking state to avoid a missed wakeup and checked again immediately before
|
|
964
|
+
queued work begins. Opening it schedules active queries for refresh and marks
|
|
965
|
+
inactive queries stale. TanStack's enabled/static rules still control fetching.
|
|
966
|
+
If it closes again, unprocessed work stays queued. A hint during an existing
|
|
967
|
+
fetch remains pending for a subsequent refresh after that fetch settles.
|
|
968
|
+
|
|
969
|
+
The gate controls **broadcast-driven refreshes only**. Polling, manual refresh,
|
|
970
|
+
mutation callbacks that invalidate queries, already-running requests, and
|
|
971
|
+
optimistic cache updates remain application-owned. If all refresh sources must
|
|
972
|
+
respect a write lock, apply that policy to those sources too.
|
|
973
|
+
|
|
974
|
+
Unsubscribe removes transport, query-cache, and gate listeners, discards queued
|
|
975
|
+
work, and prevents deferred callbacks from starting refreshes. It cannot undo
|
|
976
|
+
an already-started request. Gate checks that throw report through `onError`,
|
|
977
|
+
keep the query pending, and stay blocked until a later gate notification or
|
|
978
|
+
broadcast hint retries the check. They do not poll or retry themselves. If
|
|
979
|
+
`subscribe` throws, the subscription stays blocked: fix the cause, unsubscribe,
|
|
980
|
+
and create a new subscription. Custom gates must release partially acquired
|
|
981
|
+
listeners before throwing. Unsubscribe failures are reported while the other
|
|
982
|
+
listeners are still released.
|
|
983
|
+
|
|
984
|
+
### Diagnose connection changes
|
|
985
|
+
|
|
986
|
+
`onSync(info)` and `onStatusChange(status, info)` receive
|
|
987
|
+
`BroadcastConnectionInfo` from `@beignet/core/broadcasting/client`. Callbacks
|
|
988
|
+
may omit the metadata argument when they do not need it.
|
|
989
|
+
`createBroadcastQuerySubscription` forwards status metadata and accepts an
|
|
990
|
+
optional `onSync(info)` observer; its reconciliation is still scheduled even
|
|
991
|
+
when that observer throws. This notification describes readiness, not completion
|
|
992
|
+
of queued or gated query refreshes. Do not refetch from that observer to bypass
|
|
993
|
+
the gate accidentally.
|
|
994
|
+
|
|
995
|
+
| `info.reason` | What Beignet knows |
|
|
996
|
+
| --- | --- |
|
|
997
|
+
| `initial` | The first physical connection attempt. |
|
|
998
|
+
| `planned-renewal` | The server explicitly announced renewal and then ended the stream normally without further traffic. |
|
|
999
|
+
| `subscription-change` | Adding or removing a distinct channel restarted the multiplexed connection. |
|
|
1000
|
+
| `interruption` | A timeout, transport/protocol failure, or retryable rejection interrupted the connection. |
|
|
1001
|
+
| `unknown` | An unexplained EOF, explicit resume, or browser wakeup has no more precise known cause. |
|
|
1002
|
+
|
|
1003
|
+
Readiness reports the reason for that physical connection; another observer
|
|
1004
|
+
joining an already-ready channel sees the same information. Reconnecting status
|
|
1005
|
+
reports the known reason for restarting. An elapsed lifetime alone never proves
|
|
1006
|
+
planned renewal. Servers send an explicit, connection-wide renewal control frame
|
|
1007
|
+
before closing normally. An unexplained EOF stays `unknown`. A renewal frame
|
|
1008
|
+
followed by a stall produces `interruption` when a watchdog fires. Further traffic
|
|
1009
|
+
after the frame makes a later EOF `unknown`, including an incomplete frame.
|
|
1010
|
+
Reconciliation continues after **every** renewal because events have no replay.
|
|
1011
|
+
Planned renewal is a lifecycle change, not an `onError` failure.
|
|
1012
|
+
|
|
1013
|
+
Routes use the existing `broadcast` instrumentation watcher for admission,
|
|
1014
|
+
connection, and cleanup events. Server closure details report `planned-renewal`,
|
|
1015
|
+
`provider-disconnect`, `buffer-overflow`, `setup-failure`, or `unknown` as known
|
|
1016
|
+
locally; the server cannot infer why a browser cancelled. An optional
|
|
1017
|
+
`instrumentation` sink on `createBroadcastClient` uses the existing
|
|
1018
|
+
`ProviderInstrumentationPort` to record `broadcast.connecting`, `broadcast.ready`,
|
|
1019
|
+
and `broadcast.closed` with browser reasons. These events contain safe counts,
|
|
1020
|
+
durations, and reasons, never headers, credentials, payloads, or channel params.
|
|
1021
|
+
Keep custom logging equally restrained.
|
|
1022
|
+
|
|
833
1023
|
## License
|
|
834
1024
|
|
|
835
1025
|
MIT
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ChannelDefinition, InferChannelEvent, InferChannelParams } from "@beignet/core/broadcasting";
|
|
2
|
+
import type { BroadcastClient, BroadcastClientStatus, BroadcastClientSubscription, BroadcastConnectionInfo } from "@beignet/core/broadcasting/client";
|
|
3
|
+
import type { MutationFilters, Query, QueryClient, QueryFilters } from "@tanstack/react-query";
|
|
4
|
+
/** Application policy for broadcast-driven refreshes only. Checks must be synchronous. */
|
|
5
|
+
export interface BroadcastRefreshGate {
|
|
6
|
+
isBlocked(query: Query): boolean;
|
|
7
|
+
/** Notify after policy changes. Return cleanup; do not acquire resources before throwing. */
|
|
8
|
+
subscribe(onChange: () => void): () => void;
|
|
9
|
+
}
|
|
10
|
+
export interface BroadcastMutationRefreshGateOptions {
|
|
11
|
+
queryClient: QueryClient;
|
|
12
|
+
/** Native mutationKey/exact/predicate matching. Only pending mutations block, including paused ones. */
|
|
13
|
+
mutations: Omit<MutationFilters, "status">;
|
|
14
|
+
}
|
|
15
|
+
/** Coordinate related pending mutations without application subscription bookkeeping. */
|
|
16
|
+
export declare function createBroadcastMutationRefreshGate(options: BroadcastMutationRefreshGateOptions): BroadcastRefreshGate;
|
|
17
|
+
export interface BroadcastQuerySubscriptionOptions<C extends ChannelDefinition> {
|
|
18
|
+
client: BroadcastClient;
|
|
19
|
+
channel: C;
|
|
20
|
+
params: InferChannelParams<C>;
|
|
21
|
+
queryClient: QueryClient;
|
|
22
|
+
invalidates: (event: InferChannelEvent<C>) => readonly QueryFilters[];
|
|
23
|
+
/** All state covered by the channel, including unread counters and filtered lists. */
|
|
24
|
+
reconciles: readonly QueryFilters[];
|
|
25
|
+
refreshGate?: BroadcastRefreshGate;
|
|
26
|
+
/** Readiness notification; queued reconciliation may still be blocked by the gate. */
|
|
27
|
+
onSync?: (info: BroadcastConnectionInfo) => void | Promise<void>;
|
|
28
|
+
onError?: (error: unknown) => void;
|
|
29
|
+
onStatusChange?: (status: BroadcastClientStatus, info: BroadcastConnectionInfo) => void;
|
|
30
|
+
}
|
|
31
|
+
/** Invalidate hints and refetch after readiness. An event during a fetch schedules one later fetch. */
|
|
32
|
+
export declare function createBroadcastQuerySubscription<C extends ChannelDefinition>(options: BroadcastQuerySubscriptionOptions<C>): BroadcastClientSubscription;
|
|
33
|
+
//# sourceMappingURL=broadcasting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcasting.d.ts","sourceRoot":"","sources":["../src/broadcasting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACrB,2BAA2B,EAC3B,uBAAuB,EACxB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,eAAe,EACf,KAAK,EACL,WAAW,EACX,YAAY,EACb,MAAM,uBAAuB,CAAC;AAE/B,0FAA0F;AAC1F,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC;IACjC,6FAA6F;IAC7F,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,mCAAmC;IAClD,WAAW,EAAE,WAAW,CAAC;IACzB,wGAAwG;IACxG,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;CAC5C;AAED,yFAAyF;AACzF,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,mCAAmC,GAC3C,oBAAoB,CAMtB;AAED,MAAM,WAAW,iCAAiC,CAChD,CAAC,SAAS,iBAAiB;IAE3B,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC9B,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,SAAS,YAAY,EAAE,CAAC;IACtE,sFAAsF;IACtF,UAAU,EAAE,SAAS,YAAY,EAAE,CAAC;IACpC,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,sFAAsF;IACtF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,uBAAuB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,CACf,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,uBAAuB,KAC1B,IAAI,CAAC;CACX;AAED,uGAAuG;AACvG,wBAAgB,gCAAgC,CAAC,CAAC,SAAS,iBAAiB,EAC1E,OAAO,EAAE,iCAAiC,CAAC,CAAC,CAAC,GAC5C,2BAA2B,CAiJ7B"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/** Coordinate related pending mutations without application subscription bookkeeping. */
|
|
2
|
+
export function createBroadcastMutationRefreshGate(options) {
|
|
3
|
+
return {
|
|
4
|
+
isBlocked: () => options.queryClient.isMutating(options.mutations) > 0,
|
|
5
|
+
subscribe: (onChange) => options.queryClient.getMutationCache().subscribe(onChange),
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
/** Invalidate hints and refetch after readiness. An event during a fetch schedules one later fetch. */
|
|
9
|
+
export function createBroadcastQuerySubscription(options) {
|
|
10
|
+
const cache = options.queryClient.getQueryCache();
|
|
11
|
+
const pending = new Set();
|
|
12
|
+
let closed = false;
|
|
13
|
+
let queued = false;
|
|
14
|
+
const failed = new Set();
|
|
15
|
+
let gateSubscribed = !options.refreshGate;
|
|
16
|
+
function report(error) {
|
|
17
|
+
if (closed)
|
|
18
|
+
return;
|
|
19
|
+
try {
|
|
20
|
+
options.onError?.(error);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
/* Reporting cannot disrupt observers. */
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function blocked(query) {
|
|
27
|
+
if (!gateSubscribed || failed.has(query))
|
|
28
|
+
return true;
|
|
29
|
+
try {
|
|
30
|
+
if (!options.refreshGate)
|
|
31
|
+
return false;
|
|
32
|
+
const result = options.refreshGate.isBlocked(query);
|
|
33
|
+
if (typeof result !== "boolean")
|
|
34
|
+
throw new TypeError("Broadcast refresh gate isBlocked must return a boolean");
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
failed.add(query);
|
|
39
|
+
report(error);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function flush() {
|
|
44
|
+
if (queued || closed)
|
|
45
|
+
return;
|
|
46
|
+
queued = true;
|
|
47
|
+
queueMicrotask(() => {
|
|
48
|
+
queued = false;
|
|
49
|
+
if (closed)
|
|
50
|
+
return;
|
|
51
|
+
// A snapshot prevents synchronous callbacks from consuming a new hint in this pass.
|
|
52
|
+
for (const query of [...pending]) {
|
|
53
|
+
if (closed)
|
|
54
|
+
return;
|
|
55
|
+
if (query.state.fetchStatus !== "idle" || blocked(query) || closed)
|
|
56
|
+
continue;
|
|
57
|
+
pending.delete(query);
|
|
58
|
+
// A completed fetch clears invalidation, even when it began before the hint.
|
|
59
|
+
query.invalidate();
|
|
60
|
+
// Cache observers may close the gate (or unsubscribe) during invalidation.
|
|
61
|
+
if (closed)
|
|
62
|
+
return;
|
|
63
|
+
if (blocked(query) || closed) {
|
|
64
|
+
if (!closed)
|
|
65
|
+
pending.add(query);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
// Inactive queries remain stale. TanStack owns enabled/static behavior.
|
|
69
|
+
void options.queryClient
|
|
70
|
+
.refetchQueries({ predicate: (candidate) => candidate === query, type: "active" }, { cancelRefetch: false, throwOnError: true })
|
|
71
|
+
.catch(report);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
const unsubscribeCache = cache.subscribe((event) => {
|
|
76
|
+
if (event.type === "removed") {
|
|
77
|
+
pending.delete(event.query);
|
|
78
|
+
failed.delete(event.query);
|
|
79
|
+
}
|
|
80
|
+
if (event.type === "updated" &&
|
|
81
|
+
event.query.state.fetchStatus === "idle" &&
|
|
82
|
+
pending.has(event.query))
|
|
83
|
+
flush();
|
|
84
|
+
});
|
|
85
|
+
function invalidate(filters) {
|
|
86
|
+
if (closed)
|
|
87
|
+
return;
|
|
88
|
+
for (const filter of filters)
|
|
89
|
+
for (const query of cache.findAll(filter)) {
|
|
90
|
+
pending.add(query);
|
|
91
|
+
failed.delete(query);
|
|
92
|
+
// Preserve immediate staleness for existing subscriptions without a gate.
|
|
93
|
+
if (!options.refreshGate)
|
|
94
|
+
query.invalidate();
|
|
95
|
+
}
|
|
96
|
+
flush();
|
|
97
|
+
}
|
|
98
|
+
let unsubscribeGate;
|
|
99
|
+
if (options.refreshGate) {
|
|
100
|
+
try {
|
|
101
|
+
// Subscribe before the first check. A change during subscription still schedules a check.
|
|
102
|
+
const cleanup = options.refreshGate.subscribe(() => {
|
|
103
|
+
failed.clear();
|
|
104
|
+
flush();
|
|
105
|
+
});
|
|
106
|
+
if (typeof cleanup !== "function")
|
|
107
|
+
throw new TypeError("Broadcast refresh gate subscribe must return a cleanup function");
|
|
108
|
+
unsubscribeGate = cleanup;
|
|
109
|
+
gateSubscribed = true;
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
report(error);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function dispose() {
|
|
116
|
+
unsubscribeCache();
|
|
117
|
+
try {
|
|
118
|
+
unsubscribeGate?.();
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
try {
|
|
122
|
+
options.onError?.(error);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
/* Cleanup must finish. */
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
pending.clear();
|
|
129
|
+
failed.clear();
|
|
130
|
+
}
|
|
131
|
+
let subscription;
|
|
132
|
+
try {
|
|
133
|
+
subscription = options.client.subscribe(options.channel, {
|
|
134
|
+
params: options.params,
|
|
135
|
+
onEvent: (event) => invalidate(options.invalidates(event)),
|
|
136
|
+
onSync: (info) => {
|
|
137
|
+
invalidate(options.reconciles);
|
|
138
|
+
return options.onSync?.(info);
|
|
139
|
+
},
|
|
140
|
+
onError: options.onError,
|
|
141
|
+
onStatusChange: options.onStatusChange,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
closed = true;
|
|
146
|
+
dispose();
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
getStatus: subscription.getStatus,
|
|
151
|
+
unsubscribe() {
|
|
152
|
+
if (closed)
|
|
153
|
+
return;
|
|
154
|
+
closed = true;
|
|
155
|
+
try {
|
|
156
|
+
subscription.unsubscribe();
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
dispose();
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=broadcasting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcasting.js","sourceRoot":"","sources":["../src/broadcasting.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Client, Endpoint, EndpointCallArgs, InferBody, InferEndpointContractError, InferPathParams, InferQuery, InferSuccessResponse } from "@beignet/core/client";
|
|
2
|
+
export { type BroadcastMutationRefreshGateOptions, type BroadcastQuerySubscriptionOptions, type BroadcastRefreshGate, createBroadcastMutationRefreshGate, createBroadcastQuerySubscription, } from "./broadcasting.js";
|
|
2
3
|
import { type ContractLike, type HttpContractConfig, type ResolveContract } from "@beignet/core/contracts";
|
|
3
4
|
import type { InfiniteData, InvalidateQueryFilters, QueryClient, QueryFunction, QueryKey, UseInfiniteQueryOptions, UseMutationOptions, UseQueryOptions } from "@tanstack/react-query";
|
|
4
5
|
import { type ContractCacheEntry, type UpdateCachedQueriesOptions } from "./cache.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,0BAA0B,EAC1B,eAAe,EACf,UAAU,EACV,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/skills/client/SKILL.md
CHANGED
|
@@ -171,3 +171,30 @@ beignet lint
|
|
|
171
171
|
beignet doctor --strict
|
|
172
172
|
bun run typecheck
|
|
173
173
|
```
|
|
174
|
+
|
|
175
|
+
## Broadcast invalidation
|
|
176
|
+
|
|
177
|
+
Create one `createBroadcastClient` from `@beignet/core/broadcasting/client` in
|
|
178
|
+
browser lifecycle code and share it across features. Close and recreate it when
|
|
179
|
+
authenticated user/workspace changes. Import channel definitions from feature
|
|
180
|
+
`channels.ts`; never import `broadcasts.ts` or the broadcasting server subpath.
|
|
181
|
+
|
|
182
|
+
Use `createBroadcastQuerySubscription` with `client`, `channel`, `params`,
|
|
183
|
+
`queryClient`, `invalidates(event)`, and `reconciles`. Build filters through
|
|
184
|
+
`rq(contract).filter(...)`, `.contractFilter()`, or `.namespaceFilter()`.
|
|
185
|
+
`reconciles` covers all state in the channel because initial connection and
|
|
186
|
+
reconnection can miss events. Hints coalesce and schedule a follow-up refetch if
|
|
187
|
+
a fetch was already running. Inactive queries stay stale even when an earlier
|
|
188
|
+
fetch completes after a hint; disabled/static query behavior remains
|
|
189
|
+
TanStack-owned. Unsubscribe in effect cleanup.
|
|
190
|
+
|
|
191
|
+
Preserve optimistic mutation state while a mutation is pending and reconcile
|
|
192
|
+
versions after settlement. Broadcasting does not patch caches or resolve edit
|
|
193
|
+
conflicts. Merge `getRequestHeaders()` into the typed client's dynamic headers
|
|
194
|
+
only when the app opts into authenticated initiating-client exclusion.
|
|
195
|
+
|
|
196
|
+
Use [Broadcast coordination](./references/broadcast-coordination.md) for the
|
|
197
|
+
optional mutation refresh helper, custom write gates, connection admission,
|
|
198
|
+
and lifecycle metadata. Keep feature query mappings in feature `client/` code
|
|
199
|
+
and admission policy in `server/broadcast-admission.ts`, registered once on
|
|
200
|
+
the broadcast endpoint. The framework owns listeners and release callbacks.
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Broadcast coordination
|
|
2
|
+
|
|
3
|
+
### Delay broadcast refreshes during saves
|
|
4
|
+
|
|
5
|
+
`createBroadcastQuerySubscription` already coordinates queries that are fetching.
|
|
6
|
+
Its optional `refreshGate` also coordinates pending writes. The new
|
|
7
|
+
`createBroadcastMutationRefreshGate` helper covers ordinary TanStack mutations;
|
|
8
|
+
the new `BroadcastRefreshGate` interface supports application write queues.
|
|
9
|
+
Existing subscriptions need no changes when this coordination is unnecessary.
|
|
10
|
+
|
|
11
|
+
For task queries, put the following in `features/tasks/client/broadcasts.ts`.
|
|
12
|
+
This example assumes browser-safe `taskChanges` in `features/tasks/channels.ts`
|
|
13
|
+
with a `workspaceId` parameter, and existing `listTasks` and `saveTask` contracts.
|
|
14
|
+
`listTasks` accepts a `workspaceId` query parameter. Use the returned mutation
|
|
15
|
+
options with `useMutation`, retaining your optimistic update/rollback callbacks:
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import type { BroadcastClient } from "@beignet/core/broadcasting/client";
|
|
19
|
+
import {
|
|
20
|
+
createBroadcastMutationRefreshGate,
|
|
21
|
+
createBroadcastQuerySubscription,
|
|
22
|
+
} from "@beignet/react-query";
|
|
23
|
+
import type { QueryClient } from "@tanstack/react-query";
|
|
24
|
+
import { rq } from "@/client";
|
|
25
|
+
import { taskChanges } from "@/features/tasks/channels";
|
|
26
|
+
import { listTasks, saveTask } from "@/features/tasks/contracts";
|
|
27
|
+
|
|
28
|
+
export function saveTaskMutationOptions(workspaceId: string) {
|
|
29
|
+
return rq(saveTask).mutationOptions({
|
|
30
|
+
mutationKey: ["tasks", workspaceId, "save"],
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function subscribeToTaskChanges(
|
|
35
|
+
client: BroadcastClient,
|
|
36
|
+
queryClient: QueryClient,
|
|
37
|
+
workspaceId: string,
|
|
38
|
+
) {
|
|
39
|
+
const taskQueries = rq(listTasks).filter({ query: { workspaceId } });
|
|
40
|
+
return createBroadcastQuerySubscription({
|
|
41
|
+
client, queryClient, channel: taskChanges, params: { workspaceId },
|
|
42
|
+
invalidates: () => [taskQueries],
|
|
43
|
+
reconciles: [taskQueries],
|
|
44
|
+
refreshGate: createBroadcastMutationRefreshGate({
|
|
45
|
+
queryClient,
|
|
46
|
+
mutations: { mutationKey: ["tasks", workspaceId] },
|
|
47
|
+
}),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
`mutations` accepts TanStack's `mutationKey`, `exact`, and `predicate` filters.
|
|
53
|
+
Key matching is inclusive unless `exact: true`. Give every related write the
|
|
54
|
+
same key prefix, including creates and deletes that affect lists or counters.
|
|
55
|
+
Include workspace or resource scope when appropriate. Unrelated mutations do
|
|
56
|
+
not block. Omitting a key/predicate deliberately selects all mutations.
|
|
57
|
+
|
|
58
|
+
The helper always checks **pending** mutations; `status` is not configurable.
|
|
59
|
+
Paused pending mutations (offline or waiting for a mutation scope) also block,
|
|
60
|
+
as do overlapping matching mutations until all settle. A custom predicate can
|
|
61
|
+
exclude mutations, but excluding paused writes can refresh over unsaved edits.
|
|
62
|
+
The gate has no timeout that overrides your blocking policy.
|
|
63
|
+
|
|
64
|
+
### Combine mutations with an external write lock
|
|
65
|
+
|
|
66
|
+
Put this application helper beside the feature's broadcast query mappings.
|
|
67
|
+
Pass `createTaskWriteRefreshGate({ queryClient, workspaceId, writeLock })` as
|
|
68
|
+
`refreshGate` in the subscription above. The external lock owns its state and
|
|
69
|
+
notifies after changes; it may inspect the query key to block only related
|
|
70
|
+
queries. Beignet owns listening, queuing, and cleanup:
|
|
71
|
+
|
|
72
|
+
```ts
|
|
73
|
+
import {
|
|
74
|
+
type BroadcastRefreshGate,
|
|
75
|
+
createBroadcastMutationRefreshGate,
|
|
76
|
+
} from "@beignet/react-query";
|
|
77
|
+
import type { Query, QueryClient } from "@tanstack/react-query";
|
|
78
|
+
|
|
79
|
+
// Application-owned write queue/lock. It can block different queries independently.
|
|
80
|
+
export interface TaskWriteLock {
|
|
81
|
+
isBlocked(query: Query): boolean;
|
|
82
|
+
subscribe(onChange: () => void): () => void;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export function createTaskWriteRefreshGate({
|
|
86
|
+
queryClient, workspaceId, writeLock,
|
|
87
|
+
}: { queryClient: QueryClient; workspaceId: string; writeLock: TaskWriteLock }): BroadcastRefreshGate {
|
|
88
|
+
const mutations = createBroadcastMutationRefreshGate({
|
|
89
|
+
queryClient,
|
|
90
|
+
mutations: { mutationKey: ["tasks", workspaceId] },
|
|
91
|
+
});
|
|
92
|
+
return {
|
|
93
|
+
isBlocked: (query) => mutations.isBlocked(query) || writeLock.isBlocked(query),
|
|
94
|
+
subscribe(onChange) {
|
|
95
|
+
const stopMutations = mutations.subscribe(onChange);
|
|
96
|
+
try {
|
|
97
|
+
const stopLock = writeLock.subscribe(onChange);
|
|
98
|
+
return () => { try { stopLock(); } finally { stopMutations(); } };
|
|
99
|
+
} catch (error) {
|
|
100
|
+
stopMutations();
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Both event invalidations and readiness/reconnect reconciliation queue matching
|
|
109
|
+
**existing queries**, deduplicated per query. A blocked query is neither
|
|
110
|
+
invalidated nor refetched by the subscription. The gate is subscribed before
|
|
111
|
+
checking state to avoid a missed wakeup and checked again immediately before
|
|
112
|
+
queued work begins. Opening it schedules active queries for refresh and marks
|
|
113
|
+
inactive queries stale. TanStack's enabled/static rules still control fetching.
|
|
114
|
+
If it closes again, unprocessed work stays queued. A hint during an existing
|
|
115
|
+
fetch remains pending for a subsequent refresh after that fetch settles.
|
|
116
|
+
|
|
117
|
+
The gate controls **broadcast-driven refreshes only**. Polling, manual refresh,
|
|
118
|
+
mutation callbacks that invalidate queries, already-running requests, and
|
|
119
|
+
optimistic cache updates remain application-owned. If all refresh sources must
|
|
120
|
+
respect a write lock, apply that policy to those sources too.
|
|
121
|
+
|
|
122
|
+
Unsubscribe removes transport, query-cache, and gate listeners, discards queued
|
|
123
|
+
work, and prevents deferred callbacks from starting refreshes. It cannot undo
|
|
124
|
+
an already-started request. Gate checks that throw report through `onError`,
|
|
125
|
+
keep the query pending, and stay blocked until a later gate notification or
|
|
126
|
+
broadcast hint retries the check. They do not poll or retry themselves. If
|
|
127
|
+
`subscribe` throws, the subscription stays blocked: fix the cause, unsubscribe,
|
|
128
|
+
and create a new subscription. Custom gates must release partially acquired
|
|
129
|
+
listeners before throwing. Unsubscribe failures are reported while the other
|
|
130
|
+
listeners are still released.
|
|
131
|
+
|
|
132
|
+
### Diagnose connection changes
|
|
133
|
+
|
|
134
|
+
`onSync(info)` and `onStatusChange(status, info)` receive
|
|
135
|
+
`BroadcastConnectionInfo` from `@beignet/core/broadcasting/client`. Callbacks
|
|
136
|
+
may omit the metadata argument when they do not need it.
|
|
137
|
+
`createBroadcastQuerySubscription` forwards status metadata and accepts an
|
|
138
|
+
optional `onSync(info)` observer; its reconciliation is still scheduled even
|
|
139
|
+
when that observer throws. This notification describes readiness, not completion
|
|
140
|
+
of queued or gated query refreshes. Do not refetch from that observer to bypass
|
|
141
|
+
the gate accidentally.
|
|
142
|
+
|
|
143
|
+
| `info.reason` | What Beignet knows |
|
|
144
|
+
| --- | --- |
|
|
145
|
+
| `initial` | The first physical connection attempt. |
|
|
146
|
+
| `planned-renewal` | The server explicitly announced renewal and then ended the stream normally without further traffic. |
|
|
147
|
+
| `subscription-change` | Adding or removing a distinct channel restarted the multiplexed connection. |
|
|
148
|
+
| `interruption` | A timeout, transport/protocol failure, or retryable rejection interrupted the connection. |
|
|
149
|
+
| `unknown` | An unexplained EOF, explicit resume, or browser wakeup has no more precise known cause. |
|
|
150
|
+
|
|
151
|
+
Readiness reports the reason for that physical connection; another observer
|
|
152
|
+
joining an already-ready channel sees the same information. Reconnecting status
|
|
153
|
+
reports the known reason for restarting. An elapsed lifetime alone never proves
|
|
154
|
+
planned renewal. Servers send an explicit, connection-wide renewal control frame
|
|
155
|
+
before closing normally. An unexplained EOF stays `unknown`. A renewal frame
|
|
156
|
+
followed by a stall produces `interruption` when a watchdog fires. Further traffic
|
|
157
|
+
after the frame makes a later EOF `unknown`, including an incomplete frame.
|
|
158
|
+
Reconciliation continues after **every** renewal because events have no replay.
|
|
159
|
+
Planned renewal is a lifecycle change, not an `onError` failure.
|
|
160
|
+
|
|
161
|
+
Routes use the existing `broadcast` instrumentation watcher for admission,
|
|
162
|
+
connection, and cleanup events. Server closure details report `planned-renewal`,
|
|
163
|
+
`provider-disconnect`, `buffer-overflow`, `setup-failure`, or `unknown` as known
|
|
164
|
+
locally; the server cannot infer why a browser cancelled. An optional
|
|
165
|
+
`instrumentation` sink on `createBroadcastClient` uses the existing
|
|
166
|
+
`ProviderInstrumentationPort` to record `broadcast.connecting`, `broadcast.ready`,
|
|
167
|
+
and `broadcast.closed` with browser reasons. These events contain safe counts,
|
|
168
|
+
durations, and reasons, never headers, credentials, payloads, or channel params.
|
|
169
|
+
Keep custom logging equally restrained.
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ChannelDefinition,
|
|
3
|
+
InferChannelEvent,
|
|
4
|
+
InferChannelParams,
|
|
5
|
+
} from "@beignet/core/broadcasting";
|
|
6
|
+
import type {
|
|
7
|
+
BroadcastClient,
|
|
8
|
+
BroadcastClientStatus,
|
|
9
|
+
BroadcastClientSubscription,
|
|
10
|
+
BroadcastConnectionInfo,
|
|
11
|
+
} from "@beignet/core/broadcasting/client";
|
|
12
|
+
import type {
|
|
13
|
+
MutationFilters,
|
|
14
|
+
Query,
|
|
15
|
+
QueryClient,
|
|
16
|
+
QueryFilters,
|
|
17
|
+
} from "@tanstack/react-query";
|
|
18
|
+
|
|
19
|
+
/** Application policy for broadcast-driven refreshes only. Checks must be synchronous. */
|
|
20
|
+
export interface BroadcastRefreshGate {
|
|
21
|
+
isBlocked(query: Query): boolean;
|
|
22
|
+
/** Notify after policy changes. Return cleanup; do not acquire resources before throwing. */
|
|
23
|
+
subscribe(onChange: () => void): () => void;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface BroadcastMutationRefreshGateOptions {
|
|
27
|
+
queryClient: QueryClient;
|
|
28
|
+
/** Native mutationKey/exact/predicate matching. Only pending mutations block, including paused ones. */
|
|
29
|
+
mutations: Omit<MutationFilters, "status">;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Coordinate related pending mutations without application subscription bookkeeping. */
|
|
33
|
+
export function createBroadcastMutationRefreshGate(
|
|
34
|
+
options: BroadcastMutationRefreshGateOptions,
|
|
35
|
+
): BroadcastRefreshGate {
|
|
36
|
+
return {
|
|
37
|
+
isBlocked: () => options.queryClient.isMutating(options.mutations) > 0,
|
|
38
|
+
subscribe: (onChange) =>
|
|
39
|
+
options.queryClient.getMutationCache().subscribe(onChange),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface BroadcastQuerySubscriptionOptions<
|
|
44
|
+
C extends ChannelDefinition,
|
|
45
|
+
> {
|
|
46
|
+
client: BroadcastClient;
|
|
47
|
+
channel: C;
|
|
48
|
+
params: InferChannelParams<C>;
|
|
49
|
+
queryClient: QueryClient;
|
|
50
|
+
invalidates: (event: InferChannelEvent<C>) => readonly QueryFilters[];
|
|
51
|
+
/** All state covered by the channel, including unread counters and filtered lists. */
|
|
52
|
+
reconciles: readonly QueryFilters[];
|
|
53
|
+
refreshGate?: BroadcastRefreshGate;
|
|
54
|
+
/** Readiness notification; queued reconciliation may still be blocked by the gate. */
|
|
55
|
+
onSync?: (info: BroadcastConnectionInfo) => void | Promise<void>;
|
|
56
|
+
onError?: (error: unknown) => void;
|
|
57
|
+
onStatusChange?: (
|
|
58
|
+
status: BroadcastClientStatus,
|
|
59
|
+
info: BroadcastConnectionInfo,
|
|
60
|
+
) => void;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Invalidate hints and refetch after readiness. An event during a fetch schedules one later fetch. */
|
|
64
|
+
export function createBroadcastQuerySubscription<C extends ChannelDefinition>(
|
|
65
|
+
options: BroadcastQuerySubscriptionOptions<C>,
|
|
66
|
+
): BroadcastClientSubscription {
|
|
67
|
+
const cache = options.queryClient.getQueryCache();
|
|
68
|
+
const pending = new Set<Query>();
|
|
69
|
+
let closed = false;
|
|
70
|
+
let queued = false;
|
|
71
|
+
const failed = new Set<Query>();
|
|
72
|
+
let gateSubscribed = !options.refreshGate;
|
|
73
|
+
function report(error: unknown) {
|
|
74
|
+
if (closed) return;
|
|
75
|
+
try {
|
|
76
|
+
options.onError?.(error);
|
|
77
|
+
} catch {
|
|
78
|
+
/* Reporting cannot disrupt observers. */
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function blocked(query: Query): boolean {
|
|
82
|
+
if (!gateSubscribed || failed.has(query)) return true;
|
|
83
|
+
try {
|
|
84
|
+
if (!options.refreshGate) return false;
|
|
85
|
+
const result = options.refreshGate.isBlocked(query);
|
|
86
|
+
if (typeof result !== "boolean")
|
|
87
|
+
throw new TypeError(
|
|
88
|
+
"Broadcast refresh gate isBlocked must return a boolean",
|
|
89
|
+
);
|
|
90
|
+
return result;
|
|
91
|
+
} catch (error) {
|
|
92
|
+
failed.add(query);
|
|
93
|
+
report(error);
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function flush() {
|
|
98
|
+
if (queued || closed) return;
|
|
99
|
+
queued = true;
|
|
100
|
+
queueMicrotask(() => {
|
|
101
|
+
queued = false;
|
|
102
|
+
if (closed) return;
|
|
103
|
+
// A snapshot prevents synchronous callbacks from consuming a new hint in this pass.
|
|
104
|
+
for (const query of [...pending]) {
|
|
105
|
+
if (closed) return;
|
|
106
|
+
if (query.state.fetchStatus !== "idle" || blocked(query) || closed)
|
|
107
|
+
continue;
|
|
108
|
+
pending.delete(query);
|
|
109
|
+
// A completed fetch clears invalidation, even when it began before the hint.
|
|
110
|
+
query.invalidate();
|
|
111
|
+
// Cache observers may close the gate (or unsubscribe) during invalidation.
|
|
112
|
+
if (closed) return;
|
|
113
|
+
if (blocked(query) || closed) {
|
|
114
|
+
if (!closed) pending.add(query);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// Inactive queries remain stale. TanStack owns enabled/static behavior.
|
|
118
|
+
void options.queryClient
|
|
119
|
+
.refetchQueries(
|
|
120
|
+
{ predicate: (candidate) => candidate === query, type: "active" },
|
|
121
|
+
{ cancelRefetch: false, throwOnError: true },
|
|
122
|
+
)
|
|
123
|
+
.catch(report);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
const unsubscribeCache = cache.subscribe((event) => {
|
|
128
|
+
if (event.type === "removed") {
|
|
129
|
+
pending.delete(event.query);
|
|
130
|
+
failed.delete(event.query);
|
|
131
|
+
}
|
|
132
|
+
if (
|
|
133
|
+
event.type === "updated" &&
|
|
134
|
+
event.query.state.fetchStatus === "idle" &&
|
|
135
|
+
pending.has(event.query)
|
|
136
|
+
)
|
|
137
|
+
flush();
|
|
138
|
+
});
|
|
139
|
+
function invalidate(filters: readonly QueryFilters[]) {
|
|
140
|
+
if (closed) return;
|
|
141
|
+
for (const filter of filters)
|
|
142
|
+
for (const query of cache.findAll(filter)) {
|
|
143
|
+
pending.add(query);
|
|
144
|
+
failed.delete(query);
|
|
145
|
+
// Preserve immediate staleness for existing subscriptions without a gate.
|
|
146
|
+
if (!options.refreshGate) query.invalidate();
|
|
147
|
+
}
|
|
148
|
+
flush();
|
|
149
|
+
}
|
|
150
|
+
let unsubscribeGate: (() => void) | undefined;
|
|
151
|
+
if (options.refreshGate) {
|
|
152
|
+
try {
|
|
153
|
+
// Subscribe before the first check. A change during subscription still schedules a check.
|
|
154
|
+
const cleanup = options.refreshGate.subscribe(() => {
|
|
155
|
+
failed.clear();
|
|
156
|
+
flush();
|
|
157
|
+
});
|
|
158
|
+
if (typeof cleanup !== "function")
|
|
159
|
+
throw new TypeError(
|
|
160
|
+
"Broadcast refresh gate subscribe must return a cleanup function",
|
|
161
|
+
);
|
|
162
|
+
unsubscribeGate = cleanup;
|
|
163
|
+
gateSubscribed = true;
|
|
164
|
+
} catch (error) {
|
|
165
|
+
report(error);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function dispose() {
|
|
169
|
+
unsubscribeCache();
|
|
170
|
+
try {
|
|
171
|
+
unsubscribeGate?.();
|
|
172
|
+
} catch (error) {
|
|
173
|
+
try {
|
|
174
|
+
options.onError?.(error);
|
|
175
|
+
} catch {
|
|
176
|
+
/* Cleanup must finish. */
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
pending.clear();
|
|
180
|
+
failed.clear();
|
|
181
|
+
}
|
|
182
|
+
let subscription: BroadcastClientSubscription;
|
|
183
|
+
try {
|
|
184
|
+
subscription = options.client.subscribe(options.channel, {
|
|
185
|
+
params: options.params,
|
|
186
|
+
onEvent: (event) => invalidate(options.invalidates(event)),
|
|
187
|
+
onSync: (info) => {
|
|
188
|
+
invalidate(options.reconciles);
|
|
189
|
+
return options.onSync?.(info);
|
|
190
|
+
},
|
|
191
|
+
onError: options.onError,
|
|
192
|
+
onStatusChange: options.onStatusChange,
|
|
193
|
+
});
|
|
194
|
+
} catch (error) {
|
|
195
|
+
closed = true;
|
|
196
|
+
dispose();
|
|
197
|
+
throw error;
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
getStatus: subscription.getStatus,
|
|
201
|
+
unsubscribe() {
|
|
202
|
+
if (closed) return;
|
|
203
|
+
closed = true;
|
|
204
|
+
try {
|
|
205
|
+
subscription.unsubscribe();
|
|
206
|
+
} finally {
|
|
207
|
+
dispose();
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -8,6 +8,15 @@ import type {
|
|
|
8
8
|
InferQuery,
|
|
9
9
|
InferSuccessResponse,
|
|
10
10
|
} from "@beignet/core/client";
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
type BroadcastMutationRefreshGateOptions,
|
|
14
|
+
type BroadcastQuerySubscriptionOptions,
|
|
15
|
+
type BroadcastRefreshGate,
|
|
16
|
+
createBroadcastMutationRefreshGate,
|
|
17
|
+
createBroadcastQuerySubscription,
|
|
18
|
+
} from "./broadcasting.js";
|
|
19
|
+
|
|
11
20
|
import {
|
|
12
21
|
type ContractLike,
|
|
13
22
|
type HttpContractConfig,
|