gemi 0.128.0 → 0.129.0
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/dist/{chunk-0mp9tck6.js → chunk-0ryswty9.js} +20 -20
- package/dist/{chunk-0mp9tck6.js.map → chunk-0ryswty9.js.map} +5 -4
- package/dist/{chunk-wzfvwvz0.js → chunk-jj1ppnnk.js} +2 -2
- package/dist/{chunk-wzfvwvz0.js.map → chunk-jj1ppnnk.js.map} +1 -1
- package/dist/{chunk-tchte4dv.js → chunk-sbdm4enk.js} +2 -2
- package/dist/{chunk-tchte4dv.js.map → chunk-sbdm4enk.js.map} +1 -1
- package/dist/{chunk-df0mekds.js → chunk-wmkrb1qv.js} +1 -1
- package/dist/{chunk-qz0da20r.js → chunk-zw5z1k84.js} +1 -1
- package/dist/chunks/RealtimeClient-CqGve6h8.js +545 -0
- package/dist/chunks/RealtimeClient-CqGve6h8.js.map +1 -0
- package/dist/chunks/{ThemeProvider-BIrCSrFY.js → ThemeProvider-DaX0eyqs.js} +155 -539
- package/dist/chunks/ThemeProvider-DaX0eyqs.js.map +1 -0
- package/dist/chunks/live-DIUDdLrA.js +69 -0
- package/dist/chunks/live-DIUDdLrA.js.map +1 -0
- package/dist/chunks/subscriptionStream-CULcRbx0.js +166 -0
- package/dist/chunks/subscriptionStream-CULcRbx0.js.map +1 -0
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +118 -330
- package/dist/client/index.js.map +1 -1
- package/dist/client/init.d.ts +1 -1
- package/dist/client/init.d.ts.map +1 -1
- package/dist/client/realtime/FakeSocket.d.ts +1 -1
- package/dist/client/realtime/FakeSocket.d.ts.map +1 -1
- package/dist/client/realtime/RealtimeClient.d.ts +4 -20
- package/dist/client/realtime/RealtimeClient.d.ts.map +1 -1
- package/dist/client/realtime/live.d.ts +25 -0
- package/dist/client/realtime/live.d.ts.map +1 -0
- package/dist/client/realtime/loader.d.ts +59 -0
- package/dist/client/realtime/loader.d.ts.map +1 -0
- package/dist/client/realtime/useChannelSubscription.d.ts +1 -1
- package/dist/client/realtime/useChannelSubscription.d.ts.map +1 -1
- package/dist/client/subscriptionStream.d.ts +36 -0
- package/dist/client/subscriptionStream.d.ts.map +1 -0
- package/dist/client/useChannel.d.ts +1 -13
- package/dist/client/useChannel.d.ts.map +1 -1
- package/dist/client/useQuery.d.ts +1 -1
- package/dist/client/useQuery.d.ts.map +1 -1
- package/dist/client/useSubscription.d.ts +5 -10
- package/dist/client/useSubscription.d.ts.map +1 -1
- package/dist/facades/index.js +1 -1
- package/dist/http/index.js +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/kernel/index.js +1 -1
- package/dist/server/index.js +1 -1
- package/dist/services/broadcast/protocol.d.ts +1 -2
- package/dist/services/broadcast/protocol.d.ts.map +1 -1
- package/dist/services/broadcast/socketHeader.d.ts +9 -0
- package/dist/services/broadcast/socketHeader.d.ts.map +1 -0
- package/dist/services/index.js +2 -2
- package/dist/services/index.js.map +1 -1
- package/dist/testing/Page.d.ts.map +1 -1
- package/dist/testing/index.js +3 -1
- package/dist/testing/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/ThemeProvider-BIrCSrFY.js.map +0 -1
- /package/dist/{chunk-df0mekds.js.map → chunk-wmkrb1qv.js.map} +0 -0
- /package/dist/{chunk-qz0da20r.js.map → chunk-zw5z1k84.js.map} +0 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import "./ThemeProvider-DaX0eyqs.js";
|
|
2
|
+
//#region \0rolldown/runtime.js
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __exportAll = (all, no_symbols) => {
|
|
5
|
+
let target = {};
|
|
6
|
+
for (var name in all) __defProp(target, name, {
|
|
7
|
+
get: all[name],
|
|
8
|
+
enumerable: true
|
|
9
|
+
});
|
|
10
|
+
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
11
|
+
return target;
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region client/realtime/live.ts
|
|
15
|
+
var live_exports = /* @__PURE__ */ __exportAll({
|
|
16
|
+
resolveLiveChannel: () => resolveLiveChannel,
|
|
17
|
+
subscribeLive: () => subscribeLive
|
|
18
|
+
});
|
|
19
|
+
function resolveLiveChannel(live) {
|
|
20
|
+
if (!live) return null;
|
|
21
|
+
if (typeof live === "string") return {
|
|
22
|
+
pattern: live,
|
|
23
|
+
params: {}
|
|
24
|
+
};
|
|
25
|
+
if (Array.isArray(live)) return {
|
|
26
|
+
pattern: live[0],
|
|
27
|
+
params: live[1] ?? {}
|
|
28
|
+
};
|
|
29
|
+
const object = live;
|
|
30
|
+
return {
|
|
31
|
+
pattern: object.channel,
|
|
32
|
+
params: object.params ?? {}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* `useQuery`'s `live` subscription, loaded on first use by `followLive` in
|
|
37
|
+
* `./loader` (#891). The channel's events refetch every cached variant of the
|
|
38
|
+
* query (the rendered ones now), a burst of them once per
|
|
39
|
+
* `EVENT_COALESCE_MS`; a resync refetches at once. `setOpen` follows whether
|
|
40
|
+
* the channel is open, which pauses the query's polling.
|
|
41
|
+
*/
|
|
42
|
+
function subscribeLive(socket, live, resource, setOpen) {
|
|
43
|
+
const channel = resolveLiveChannel(live);
|
|
44
|
+
if (!channel) return () => {};
|
|
45
|
+
const refresh = () => {
|
|
46
|
+
const target = resource();
|
|
47
|
+
for (const key of target.variantKeys()) target.invalidate(key);
|
|
48
|
+
};
|
|
49
|
+
let timer = null;
|
|
50
|
+
const release = socket.subscribe(channel.pattern, channel.params, {
|
|
51
|
+
onEvent: () => {
|
|
52
|
+
if (timer) return;
|
|
53
|
+
timer = setTimeout(() => {
|
|
54
|
+
timer = null;
|
|
55
|
+
refresh();
|
|
56
|
+
}, 150);
|
|
57
|
+
},
|
|
58
|
+
onResync: refresh,
|
|
59
|
+
onStatus: (status) => setOpen(status === "open")
|
|
60
|
+
});
|
|
61
|
+
return () => {
|
|
62
|
+
if (timer) clearTimeout(timer);
|
|
63
|
+
release();
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
export { live_exports as t };
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=live-DIUDdLrA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-DIUDdLrA.js","names":[],"sources":["../../client/realtime/live.ts"],"sourcesContent":["import type { QueryResource } from \"../QueryResource\";\nimport type { ChannelPattern } from \"../useChannel\";\nimport { EVENT_COALESCE_MS } from \"./useChannelSubscription\";\nimport type { ChannelParamValues, RealtimeSocket } from \"./RealtimeClient\";\n\n/**\n * `useQuery`'s `live` option: the channel whose events and resyncs refetch\n * the query. A pattern without params (`\"user\"`), `[pattern, params]`, or\n * `{ channel, params }`.\n */\nexport type LiveChannel =\n | ChannelPattern\n | readonly [ChannelPattern, ChannelParamValues]\n | { channel: ChannelPattern; params?: ChannelParamValues };\n\nexport function resolveLiveChannel(\n live: LiveChannel | null | undefined | false,\n): { pattern: string; params: ChannelParamValues } | null {\n if (!live) return null;\n if (typeof live === \"string\") return { pattern: live, params: {} };\n if (Array.isArray(live)) return { pattern: live[0], params: live[1] ?? {} };\n const object = live as { channel: string; params?: ChannelParamValues };\n return { pattern: object.channel, params: object.params ?? {} };\n}\n\n/**\n * `useQuery`'s `live` subscription, loaded on first use by `followLive` in\n * `./loader` (#891). The channel's events refetch every cached variant of the\n * query (the rendered ones now), a burst of them once per\n * `EVENT_COALESCE_MS`; a resync refetches at once. `setOpen` follows whether\n * the channel is open, which pauses the query's polling.\n */\nexport function subscribeLive(\n socket: RealtimeSocket,\n live: LiveChannel,\n resource: () => QueryResource,\n setOpen: (open: boolean) => void,\n): () => void {\n const channel = resolveLiveChannel(live);\n if (!channel) return () => {};\n const refresh = () => {\n const target = resource();\n for (const key of target.variantKeys()) target.invalidate(key);\n };\n let timer: ReturnType<typeof setTimeout> | null = null;\n const release = socket.subscribe(channel.pattern, channel.params, {\n onEvent: () => {\n if (timer) return;\n timer = setTimeout(() => {\n timer = null;\n refresh();\n }, EVENT_COALESCE_MS);\n },\n onResync: refresh,\n onStatus: (status) => setOpen(status === \"open\"),\n });\n return () => {\n if (timer) clearTimeout(timer);\n release();\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAeA,SAAgB,mBACd,MACwD;CACxD,IAAI,CAAC,MAAM,OAAO;CAClB,IAAI,OAAO,SAAS,UAAU,OAAO;EAAE,SAAS;EAAM,QAAQ,CAAC;CAAE;CACjE,IAAI,MAAM,QAAQ,IAAI,GAAG,OAAO;EAAE,SAAS,KAAK;EAAI,QAAQ,KAAK,MAAM,CAAC;CAAE;CAC1E,MAAM,SAAS;CACf,OAAO;EAAE,SAAS,OAAO;EAAS,QAAQ,OAAO,UAAU,CAAC;CAAE;AAChE;;;;;;;;AASA,SAAgB,cACd,QACA,MACA,UACA,SACY;CACZ,MAAM,UAAU,mBAAmB,IAAI;CACvC,IAAI,CAAC,SAAS,aAAa,CAAC;CAC5B,MAAM,gBAAgB;EACpB,MAAM,SAAS,SAAS;EACxB,KAAK,MAAM,OAAO,OAAO,YAAY,GAAG,OAAO,WAAW,GAAG;CAC/D;CACA,IAAI,QAA8C;CAClD,MAAM,UAAU,OAAO,UAAU,QAAQ,SAAS,QAAQ,QAAQ;EAChE,eAAe;GACb,IAAI,OAAO;GACX,QAAQ,iBAAiB;IACvB,QAAQ;IACR,QAAQ;GACV,GAAA,GAAoB;EACtB;EACA,UAAU;EACV,WAAW,WAAW,QAAQ,WAAW,MAAM;CACjD,CAAC;CACD,aAAa;EACX,IAAI,OAAO,aAAa,KAAK;EAC7B,QAAQ;CACV;AACF"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
//#region client/subscriptionStream.ts
|
|
2
|
+
var MIN_RETRY_MS = 1e3;
|
|
3
|
+
var MAX_RETRY_MS = 3e4;
|
|
4
|
+
/** The server answered in a way retrying will not change (401, 403, 404). */
|
|
5
|
+
var FatalStatus = class extends Error {
|
|
6
|
+
status;
|
|
7
|
+
constructor(status) {
|
|
8
|
+
super(`The subscription was refused with ${status}.`);
|
|
9
|
+
this.status = status;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Follows `endpoint` until the returned function is called: connects,
|
|
14
|
+
* reconnects with backoff, pauses while the tab is hidden, and reports
|
|
15
|
+
* through `setState` and `callbacks`.
|
|
16
|
+
*/
|
|
17
|
+
function follow({ endpoint, pauseWhenHidden, cursor, callbacks, setState }) {
|
|
18
|
+
let stopped = false;
|
|
19
|
+
let request = null;
|
|
20
|
+
let resume = null;
|
|
21
|
+
let retryMs = MIN_RETRY_MS;
|
|
22
|
+
const hidden = () => pauseWhenHidden && typeof document !== "undefined" && document.visibilityState === "hidden";
|
|
23
|
+
const onVisibilityChange = () => {
|
|
24
|
+
if (hidden()) request?.abort();
|
|
25
|
+
else resume?.();
|
|
26
|
+
};
|
|
27
|
+
if (typeof document !== "undefined") document.addEventListener("visibilitychange", onVisibilityChange);
|
|
28
|
+
const wait = (ms) => new Promise((resolve) => {
|
|
29
|
+
const timer = setTimeout(done, ms);
|
|
30
|
+
function done() {
|
|
31
|
+
clearTimeout(timer);
|
|
32
|
+
resume = null;
|
|
33
|
+
resolve();
|
|
34
|
+
}
|
|
35
|
+
resume = done;
|
|
36
|
+
});
|
|
37
|
+
(async () => {
|
|
38
|
+
while (!stopped) {
|
|
39
|
+
if (hidden()) {
|
|
40
|
+
setState((s) => ({
|
|
41
|
+
...s,
|
|
42
|
+
status: "paused"
|
|
43
|
+
}));
|
|
44
|
+
await new Promise((resolve) => resume = resolve);
|
|
45
|
+
resume = null;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
setState((s) => ({
|
|
49
|
+
...s,
|
|
50
|
+
status: "connecting"
|
|
51
|
+
}));
|
|
52
|
+
const controller = request = new AbortController();
|
|
53
|
+
let delay = retryMs;
|
|
54
|
+
try {
|
|
55
|
+
const headers = { Accept: "text/event-stream" };
|
|
56
|
+
if (cursor.current) headers["Last-Event-ID"] = cursor.current;
|
|
57
|
+
const response = await fetch(endpoint, {
|
|
58
|
+
headers,
|
|
59
|
+
signal: controller.signal
|
|
60
|
+
});
|
|
61
|
+
if (!response.ok || !response.body) {
|
|
62
|
+
const status = response.status;
|
|
63
|
+
if (status >= 400 && status < 500 && status !== 408 && status !== 429) throw new FatalStatus(status);
|
|
64
|
+
const retryAfter = Number(response.headers.get("Retry-After"));
|
|
65
|
+
if (Number.isFinite(retryAfter) && retryAfter > 0) delay = retryAfter * 1e3;
|
|
66
|
+
throw new Error(`The subscription answered ${status}.`);
|
|
67
|
+
}
|
|
68
|
+
for await (const { id, message } of readEvents(response.body)) {
|
|
69
|
+
if (stopped) return;
|
|
70
|
+
if (id !== void 0) cursor.current = id;
|
|
71
|
+
if (message.type === "ready") {
|
|
72
|
+
retryMs = MIN_RETRY_MS;
|
|
73
|
+
delay = MIN_RETRY_MS;
|
|
74
|
+
setState({
|
|
75
|
+
status: "open",
|
|
76
|
+
cursor: cursor.current,
|
|
77
|
+
error: null
|
|
78
|
+
});
|
|
79
|
+
} else {
|
|
80
|
+
setState((s) => ({
|
|
81
|
+
...s,
|
|
82
|
+
cursor: cursor.current
|
|
83
|
+
}));
|
|
84
|
+
if (message.type === "change") callbacks.current.onChange?.(message);
|
|
85
|
+
else if (message.type === "reset") callbacks.current.onReset?.(message);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
} catch (error) {
|
|
89
|
+
if (stopped) return;
|
|
90
|
+
if (error instanceof FatalStatus) {
|
|
91
|
+
setState((s) => ({
|
|
92
|
+
...s,
|
|
93
|
+
status: "closed",
|
|
94
|
+
error
|
|
95
|
+
}));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (controller.signal.aborted) continue;
|
|
99
|
+
setState((s) => ({
|
|
100
|
+
...s,
|
|
101
|
+
error
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
if (stopped || controller.signal.aborted) continue;
|
|
105
|
+
setState((s) => ({
|
|
106
|
+
...s,
|
|
107
|
+
status: "connecting"
|
|
108
|
+
}));
|
|
109
|
+
await wait(delay);
|
|
110
|
+
retryMs = Math.min(retryMs * 2, MAX_RETRY_MS);
|
|
111
|
+
}
|
|
112
|
+
})();
|
|
113
|
+
return () => {
|
|
114
|
+
stopped = true;
|
|
115
|
+
request?.abort();
|
|
116
|
+
resume?.();
|
|
117
|
+
if (typeof document !== "undefined") document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The events of an SSE body: `id` and the JSON `data`. Comments (keepalives)
|
|
122
|
+
* and events without data are skipped; an event whose data is not JSON is
|
|
123
|
+
* dropped rather than ending the stream.
|
|
124
|
+
*/
|
|
125
|
+
async function* readEvents(body) {
|
|
126
|
+
const reader = body.getReader();
|
|
127
|
+
const decoder = new TextDecoder();
|
|
128
|
+
let buffer = "";
|
|
129
|
+
try {
|
|
130
|
+
for (;;) {
|
|
131
|
+
const { done, value } = await reader.read();
|
|
132
|
+
if (done) return;
|
|
133
|
+
buffer = (buffer + decoder.decode(value, { stream: true })).replace(/\r\n?/g, "\n");
|
|
134
|
+
let boundary = buffer.indexOf("\n\n");
|
|
135
|
+
while (boundary !== -1) {
|
|
136
|
+
const block = buffer.slice(0, boundary);
|
|
137
|
+
buffer = buffer.slice(boundary + 2);
|
|
138
|
+
boundary = buffer.indexOf("\n\n");
|
|
139
|
+
let id;
|
|
140
|
+
const data = [];
|
|
141
|
+
for (const line of block.split("\n")) {
|
|
142
|
+
if (line === "" || line.startsWith(":")) continue;
|
|
143
|
+
const colon = line.indexOf(":");
|
|
144
|
+
const field = colon === -1 ? line : line.slice(0, colon);
|
|
145
|
+
let text = colon === -1 ? "" : line.slice(colon + 1);
|
|
146
|
+
if (text.startsWith(" ")) text = text.slice(1);
|
|
147
|
+
if (field === "id") id = text;
|
|
148
|
+
else if (field === "data") data.push(text);
|
|
149
|
+
}
|
|
150
|
+
if (data.length === 0) continue;
|
|
151
|
+
try {
|
|
152
|
+
yield {
|
|
153
|
+
id,
|
|
154
|
+
message: JSON.parse(data.join("\n"))
|
|
155
|
+
};
|
|
156
|
+
} catch {}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
} finally {
|
|
160
|
+
await reader.cancel().catch(() => {});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//#endregion
|
|
164
|
+
export { follow, readEvents };
|
|
165
|
+
|
|
166
|
+
//# sourceMappingURL=subscriptionStream-CULcRbx0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptionStream-CULcRbx0.js","names":[],"sources":["../../client/subscriptionStream.ts"],"sourcesContent":["import type { Dispatch, SetStateAction } from \"react\";\n\nimport type { ChangeFeedMessage } from \"../services/change-feed/wire\";\nimport type { SubscriptionConfig, SubscriptionStatus } from \"./useSubscription\";\n\n// `useSubscription`'s connection: the SSE request, its reader and the\n// reconnect loop. Loaded by the hook with a dynamic `import()` when it first\n// connects, so it lands in a chunk of its own rather than in the entry chunk\n// every route loads (#891). Import it as a type only from anywhere else.\n\nconst MIN_RETRY_MS = 1_000;\nconst MAX_RETRY_MS = 30_000;\n\n/** The server answered in a way retrying will not change (401, 403, 404). */\nclass FatalStatus extends Error {\n constructor(readonly status: number) {\n super(`The subscription was refused with ${status}.`);\n }\n}\n\nexport interface SubscriptionState {\n status: SubscriptionStatus;\n cursor: string | null;\n error: Error | null;\n}\n\nexport interface FollowOptions {\n endpoint: string;\n pauseWhenHidden: boolean;\n /** Where to resume; advanced as events arrive. */\n cursor: { current: string | null };\n callbacks: { current: SubscriptionConfig<unknown> };\n setState: Dispatch<SetStateAction<SubscriptionState>>;\n}\n\n/**\n * Follows `endpoint` until the returned function is called: connects,\n * reconnects with backoff, pauses while the tab is hidden, and reports\n * through `setState` and `callbacks`.\n */\nexport function follow({\n endpoint,\n pauseWhenHidden,\n cursor,\n callbacks,\n setState,\n}: FollowOptions): () => void {\n let stopped = false;\n let request: AbortController | null = null;\n let resume: (() => void) | null = null;\n let retryMs = MIN_RETRY_MS;\n const hidden = () =>\n pauseWhenHidden && typeof document !== \"undefined\" && document.visibilityState === \"hidden\";\n const onVisibilityChange = () => {\n if (hidden()) request?.abort();\n else resume?.();\n };\n if (typeof document !== \"undefined\") {\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n }\n const wait = (ms: number) =>\n new Promise<void>((resolve) => {\n const timer = setTimeout(done, ms);\n function done() {\n clearTimeout(timer);\n resume = null;\n resolve();\n }\n // Shown again, or unmounted: stop waiting.\n resume = done;\n });\n\n void (async () => {\n while (!stopped) {\n if (hidden()) {\n setState((s) => ({ ...s, status: \"paused\" }));\n await new Promise<void>((resolve) => (resume = resolve));\n resume = null;\n continue;\n }\n setState((s) => ({ ...s, status: \"connecting\" }));\n const controller = (request = new AbortController());\n let delay = retryMs;\n try {\n const headers: Record<string, string> = { Accept: \"text/event-stream\" };\n if (cursor.current) headers[\"Last-Event-ID\"] = cursor.current;\n const response = await fetch(endpoint, { headers, signal: controller.signal });\n if (!response.ok || !response.body) {\n const status = response.status;\n if (status >= 400 && status < 500 && status !== 408 && status !== 429) {\n throw new FatalStatus(status);\n }\n const retryAfter = Number(response.headers.get(\"Retry-After\"));\n if (Number.isFinite(retryAfter) && retryAfter > 0) delay = retryAfter * 1000;\n throw new Error(`The subscription answered ${status}.`);\n }\n for await (const { id, message } of readEvents(response.body)) {\n if (stopped) return;\n if (id !== undefined) cursor.current = id;\n if (message.type === \"ready\") {\n retryMs = MIN_RETRY_MS;\n delay = MIN_RETRY_MS;\n setState({ status: \"open\", cursor: cursor.current, error: null });\n } else {\n setState((s) => ({ ...s, cursor: cursor.current }));\n if (message.type === \"change\") callbacks.current.onChange?.(message as never);\n else if (message.type === \"reset\") callbacks.current.onReset?.(message as never);\n }\n }\n } catch (error) {\n if (stopped) return;\n if (error instanceof FatalStatus) {\n setState((s) => ({ ...s, status: \"closed\", error }));\n return;\n }\n // Aborted because the tab was hidden: the loop pauses instead.\n if (controller.signal.aborted) continue;\n setState((s) => ({ ...s, error: error as Error }));\n }\n if (stopped || controller.signal.aborted) continue;\n // The stream ended or failed: try again, a little later each time.\n setState((s) => ({ ...s, status: \"connecting\" }));\n await wait(delay);\n retryMs = Math.min(retryMs * 2, MAX_RETRY_MS);\n }\n })();\n\n return () => {\n stopped = true;\n request?.abort();\n resume?.();\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n }\n };\n}\n\n/**\n * The events of an SSE body: `id` and the JSON `data`. Comments (keepalives)\n * and events without data are skipped; an event whose data is not JSON is\n * dropped rather than ending the stream.\n */\nexport async function* readEvents(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<{ id?: string; message: ChangeFeedMessage }> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) return;\n // `ChangeFeed.stream` writes `\\n` only; a proxy's `\\r\\n` is folded here.\n buffer = (buffer + decoder.decode(value, { stream: true })).replace(/\\r\\n?/g, \"\\n\");\n let boundary = buffer.indexOf(\"\\n\\n\");\n while (boundary !== -1) {\n const block = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n boundary = buffer.indexOf(\"\\n\\n\");\n let id: string | undefined;\n const data: string[] = [];\n for (const line of block.split(\"\\n\")) {\n if (line === \"\" || line.startsWith(\":\")) continue;\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n let text = colon === -1 ? \"\" : line.slice(colon + 1);\n if (text.startsWith(\" \")) text = text.slice(1);\n if (field === \"id\") id = text;\n else if (field === \"data\") data.push(text);\n }\n if (data.length === 0) continue;\n try {\n yield { id, message: JSON.parse(data.join(\"\\n\")) };\n } catch {\n // Not JSON: not ours to apply.\n }\n }\n }\n } finally {\n await reader.cancel().catch(() => {});\n }\n}\n"],"mappings":"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"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export type { QueryTarget, QueryUpdate } from "./useSetQueryData";
|
|
|
16
16
|
export { useSubscription } from "./useSubscription";
|
|
17
17
|
export { useChannel, useChannelInvalidate } from "./useChannel";
|
|
18
18
|
export type { ChannelPattern, ChannelParamsFor, ChannelEventsFor, ChannelState, ChannelStatus, InvalidatePath, LiveChannel, UseChannelConfig, UseChannelOptions, } from "./useChannel";
|
|
19
|
-
export { configureRealtime } from "./realtime/
|
|
19
|
+
export { configureRealtime } from "./realtime/loader";
|
|
20
20
|
export type { RealtimeOptions } from "./realtime/RealtimeClient";
|
|
21
21
|
export type { SubscriptionConfig, SubscriptionData, SubscriptionOptions, SubscriptionStatus, } from "./useSubscription";
|
|
22
22
|
export { isValidationError, isFormError, isAuthenticationError, isPermissionError, isCsrfError, isNotFoundError, isRateLimitError, isServerError, isNetworkError, isHttpError, mutationErrorKind, mutationErrorList, mutationErrorField, } from "./MutationError";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../client/index.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EACV,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC7F,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../client/index.ts"],"names":[],"mappings":";AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EACV,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC7F,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAChE,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EACL,IAAI,EACJ,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,YAAY,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,YAAY,EACV,GAAG,EACH,OAAO,EACP,OAAO,EACP,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,gBAAgB,GACjB,MAAM,OAAO,CAAC;AACf,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EACL,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC3E,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
|