@rpcbase/client 0.386.0 → 0.388.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/index.js
CHANGED
|
@@ -6,8 +6,8 @@ import { getNavigationGuards, createRoutesFromElements, createBrowserRouter, Rou
|
|
|
6
6
|
import { hydrateRoot } from "react-dom/client";
|
|
7
7
|
import { r as reportClientException } from "./errorReporting-CVoUUKxW.js";
|
|
8
8
|
import { s } from "./errorReporting-CVoUUKxW.js";
|
|
9
|
-
import { n as hydrateRtsFromWindow, v as useQuery } from "./useQuery-
|
|
10
|
-
import { R, S, p, q, t } from "./useQuery-
|
|
9
|
+
import { n as hydrateRtsFromWindow, v as useQuery } from "./useQuery-ClKeTB8S.js";
|
|
10
|
+
import { R, S, p, q, t } from "./useQuery-ClKeTB8S.js";
|
|
11
11
|
const emptyUnsubscribe = () => {
|
|
12
12
|
};
|
|
13
13
|
const useMediaQuery = (query) => {
|
package/dist/rts/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { R, S, f, p, c, h, b, d, a, i, g, n, o, q, t, j, k, r, l, e, s, m, u, v } from "../useQuery-
|
|
1
|
+
import { R, S, f, p, c, h, b, d, a, i, g, n, o, q, t, j, k, r, l, e, s, m, u, v } from "../useQuery-ClKeTB8S.js";
|
|
2
2
|
export {
|
|
3
3
|
R as RtsSsrRuntimeProvider,
|
|
4
4
|
S as STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../../src/rts/wsClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAGtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAIhD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;IAC5B,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,QAAQ,CAAC,EAAE,iBAAiB,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,iBAAiB,GACjB,KAAK,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAA;AAErC,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,SAAS,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,kBAAkB,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,sBAAsB,GAAG,oBAAoB,CAAA;AAE3E,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,iBAAiB,CAAA;IAC5B,UAAU,CAAC,EAAE,cAAc,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACF,CAAA;AAED,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,KAAK,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../../src/rts/wsClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAGtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAIhD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;IAC5B,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,QAAQ,CAAC,EAAE,iBAAiB,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,iBAAiB,GACjB,KAAK,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAA;AAErC,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,SAAS,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,kBAAkB,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,sBAAsB,GAAG,oBAAoB,CAAA;AAE3E,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,iBAAiB,CAAA;IAC5B,UAAU,CAAC,EAAE,cAAc,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACF,CAAA;AAED,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,KAAK,IAAI,CAAA;AAmP7F,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,IAM3C,CAAA;AA8DD,eAAO,MAAM,cAAc,GAAU,UAAU,MAAM,EAAE,KAAK,MAAM,EAAE,UAAS,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAM,KAAG,OAAO,CAAC,IAAI,CAmElI,CAAA;AA0FD,eAAO,MAAM,OAAO,GAAI,UAAU,MAAM,EAAE,KAAK,MAAM,EAAE,UAAS,iBAAsB,KAAG,OAAO,CAAC,IAAI,CAEpG,CAAA;AAED,eAAO,MAAM,UAAU,QAAO,IAc7B,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,EAAE,KAAK,MAAM,EAAE,UAAS,iBAAsB,KAAG,OAAO,CAAC,IAAI,CActG,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,WAAW,YAAY,EACvB,OAAO,UAAU,EACjB,oBAAoB,eAAe,GAAG,aAAa,EACnD,gBAAgB,aAAa,EAC7B,WAAW;IACT,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B,KACA,CAAC,MAAM,IAAI,CAAC,GAAG,SA2DjB,CAAA;AAID,eAAO,MAAM,eAAe,GAAU,2CAKnC;IACD,SAAS,EAAE,YAAY,CAAA;IACvB,KAAK,EAAE,UAAU,CAAA;IACjB,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,KAAG,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAkGtD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,EAAE,UAAU,OAAO,KAAG,IAE9D,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAAG,CAAC,MAAM,IAAI,CAU1F,CAAA"}
|
|
@@ -507,6 +507,7 @@ const RTS_CHANGES_ROUTE = "/api/rb/rts/changes";
|
|
|
507
507
|
const MAX_TXN_BUF = 2048;
|
|
508
508
|
const SERVER_RECONNECT_DELAY_MIN_MS = 1e4;
|
|
509
509
|
const SERVER_RECONNECT_DELAY_MAX_MS = 15e3;
|
|
510
|
+
const RUN_NETWORK_QUERY_TIMEOUT_ERROR = "runNetworkQuery: request timed out";
|
|
510
511
|
let socket = null;
|
|
511
512
|
let connectPromise = null;
|
|
512
513
|
let explicitDisconnect = false;
|
|
@@ -987,9 +988,44 @@ const runNetworkQuery = async ({
|
|
|
987
988
|
if (typeof modelName !== "string" || modelName.trim().length === 0) {
|
|
988
989
|
throw new Error("runNetworkQuery: modelName must be a non-empty string");
|
|
989
990
|
}
|
|
991
|
+
const hasTimeout = typeof timeoutMs === "number" && Number.isFinite(timeoutMs) && timeoutMs > 0;
|
|
992
|
+
const timeoutStartedAt = hasTimeout ? Date.now() : 0;
|
|
990
993
|
if (!socket || socket.readyState !== WebSocket.OPEN) {
|
|
994
|
+
if (currentTenantId && currentUid) {
|
|
995
|
+
try {
|
|
996
|
+
const connectAttempt = connectInternal(currentTenantId, currentUid, connectOptions, {
|
|
997
|
+
resetReconnectAttempts: false
|
|
998
|
+
});
|
|
999
|
+
if (hasTimeout) {
|
|
1000
|
+
await new Promise((resolve, reject) => {
|
|
1001
|
+
const timeoutId = window.setTimeout(() => {
|
|
1002
|
+
reject(new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR));
|
|
1003
|
+
}, timeoutMs);
|
|
1004
|
+
connectAttempt.then(() => {
|
|
1005
|
+
window.clearTimeout(timeoutId);
|
|
1006
|
+
resolve();
|
|
1007
|
+
}, (error) => {
|
|
1008
|
+
window.clearTimeout(timeoutId);
|
|
1009
|
+
reject(error);
|
|
1010
|
+
});
|
|
1011
|
+
});
|
|
1012
|
+
} else {
|
|
1013
|
+
await connectAttempt;
|
|
1014
|
+
}
|
|
1015
|
+
} catch {
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
1019
|
+
if (!socket || socket.readyState !== WebSocket.OPEN) {
|
|
1020
|
+
if (hasTimeout && Date.now() - timeoutStartedAt >= timeoutMs) {
|
|
1021
|
+
throw new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR);
|
|
1022
|
+
}
|
|
991
1023
|
throw new Error("runNetworkQuery: RTS socket is not connected");
|
|
992
1024
|
}
|
|
1025
|
+
const remainingTimeoutMs = hasTimeout ? Math.max(0, timeoutMs - (Date.now() - timeoutStartedAt)) : null;
|
|
1026
|
+
if (remainingTimeoutMs !== null && remainingTimeoutMs <= 0) {
|
|
1027
|
+
throw new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR);
|
|
1028
|
+
}
|
|
993
1029
|
const resolvedOptions = options.key ? options : {
|
|
994
1030
|
...options,
|
|
995
1031
|
key: makeRunQueryKey()
|
|
@@ -1026,10 +1062,10 @@ const runNetworkQuery = async ({
|
|
|
1026
1062
|
const callbacks = queryCallbacks.get(cbKey) ?? /* @__PURE__ */ new Set();
|
|
1027
1063
|
callbacks.add(callback);
|
|
1028
1064
|
queryCallbacks.set(cbKey, callbacks);
|
|
1029
|
-
if (
|
|
1065
|
+
if (remainingTimeoutMs !== null) {
|
|
1030
1066
|
timeoutId = window.setTimeout(() => {
|
|
1031
|
-
settle(() => reject(new Error(
|
|
1032
|
-
},
|
|
1067
|
+
settle(() => reject(new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR)));
|
|
1068
|
+
}, remainingTimeoutMs);
|
|
1033
1069
|
}
|
|
1034
1070
|
sendToServer({
|
|
1035
1071
|
type: "run-query",
|
|
@@ -1452,4 +1488,4 @@ export {
|
|
|
1452
1488
|
updateDocs as u,
|
|
1453
1489
|
useQuery as v
|
|
1454
1490
|
};
|
|
1455
|
-
//# sourceMappingURL=useQuery-
|
|
1491
|
+
//# sourceMappingURL=useQuery-ClKeTB8S.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuery-ClKeTB8S.js","sources":["../src/rts/ssrHydration.tsx","../src/rts/pouchStore.ts","../src/rts/queryKey.ts","../src/rts/wsClient.ts","../src/rts/useQuery.ts"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\"\nimport type { PaginationPageInfo } from \"@rpcbase/api\"\n\nimport type { RtsModelName } from \"./modelTypes\"\nimport type { RtsQueryOptions } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport const STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY = \"__staticRpcbaseRtsHydrationData\"\n\nexport type RtsSsrHydrationQueryData = {\n modelName: RtsModelName\n queryKey: string\n data: unknown[]\n pageInfo?: PaginationPageInfo\n}\n\nexport type StaticRpcbaseRtsHydrationData = {\n v: 1\n tenantId: string | null\n uid: string | null\n queries: RtsSsrHydrationQueryData[]\n}\n\nexport type RtsSsrQueryRegistration = {\n modelName: RtsModelName\n query: JsonObject\n options: RtsQueryOptions\n queryKey: string\n}\n\nexport type RtsSsrRuntime = {\n registerQuery: (query: RtsSsrQueryRegistration) => void\n getQueryData: (modelName: RtsModelName, queryKey: string) => unknown[] | undefined\n getQueryPageInfo: (modelName: RtsModelName, queryKey: string) => PaginationPageInfo | undefined\n}\n\nconst RtsSsrRuntimeContext = createContext<RtsSsrRuntime | null>(null)\n\nconst hydrationDataStore = new Map<string, unknown[]>()\nconst hydrationPageInfoStore = new Map<string, PaginationPageInfo | undefined>()\n\nconst makeStoreKey = (modelName: string, queryKey: string): string => `${modelName}.${queryKey}`\n\nconst normalizeStringOrNull = (value: unknown): string | null => {\n if (typeof value !== \"string\") return null\n const normalized = value.trim()\n return normalized ? normalized : null\n}\n\nconst normalizePageInfo = (value: unknown): PaginationPageInfo | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n\n const raw = value as {\n nextCursor?: unknown\n prevCursor?: unknown\n hasNextPage?: unknown\n hasPrevPage?: unknown\n }\n\n if (typeof raw.hasNextPage !== \"boolean\" || typeof raw.hasPrevPage !== \"boolean\") return undefined\n\n const nextCursor = typeof raw.nextCursor === \"string\" && raw.nextCursor ? raw.nextCursor : undefined\n const prevCursor = typeof raw.prevCursor === \"string\" && raw.prevCursor ? raw.prevCursor : undefined\n\n return {\n hasNextPage: raw.hasNextPage,\n hasPrevPage: raw.hasPrevPage,\n ...(nextCursor ? { nextCursor } : {}),\n ...(prevCursor ? { prevCursor } : {}),\n }\n}\n\nconst parseHydrationData = (value: unknown): StaticRpcbaseRtsHydrationData | null => {\n if (!value || typeof value !== \"object\") return null\n\n const raw = value as {\n v?: unknown\n tenantId?: unknown\n uid?: unknown\n queries?: unknown\n }\n\n if (raw.v !== 1) return null\n if (!Array.isArray(raw.queries)) return null\n\n const queries: RtsSsrHydrationQueryData[] = []\n for (const entry of raw.queries) {\n if (!entry || typeof entry !== \"object\") continue\n\n const query = entry as {\n modelName?: unknown\n queryKey?: unknown\n data?: unknown\n pageInfo?: unknown\n }\n\n const modelName = normalizeStringOrNull(query.modelName)\n const queryKey = normalizeStringOrNull(query.queryKey)\n if (!modelName || !queryKey) continue\n if (!Array.isArray(query.data)) continue\n const pageInfo = normalizePageInfo(query.pageInfo)\n\n queries.push({\n modelName: modelName as RtsModelName,\n queryKey,\n data: query.data,\n ...(pageInfo ? { pageInfo } : {}),\n })\n }\n\n return {\n v: 1,\n tenantId: normalizeStringOrNull(raw.tenantId),\n uid: normalizeStringOrNull(raw.uid),\n queries,\n }\n}\n\nexport const hydrateRtsFromWindow = (): void => {\n if (typeof window === \"undefined\") return\n\n const browserWindow = window as unknown as Record<string, unknown>\n const raw = browserWindow[STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY]\n delete browserWindow[STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY]\n\n const parsed = parseHydrationData(raw)\n if (!parsed) return\n\n hydrationDataStore.clear()\n hydrationPageInfoStore.clear()\n for (const query of parsed.queries) {\n hydrationDataStore.set(makeStoreKey(query.modelName, query.queryKey), query.data)\n hydrationPageInfoStore.set(makeStoreKey(query.modelName, query.queryKey), query.pageInfo)\n }\n}\n\nexport const peekHydratedRtsQueryData = (\n modelName: RtsModelName,\n queryKey: string,\n): unknown[] | undefined => {\n return hydrationDataStore.get(makeStoreKey(modelName, queryKey))\n}\n\nexport const peekHydratedRtsQueryPageInfo = (\n modelName: RtsModelName,\n queryKey: string,\n): PaginationPageInfo | undefined => {\n return hydrationPageInfoStore.get(makeStoreKey(modelName, queryKey))\n}\n\nexport const consumeHydratedRtsQueryData = (\n modelName: RtsModelName,\n queryKey: string,\n): void => {\n const key = makeStoreKey(modelName, queryKey)\n hydrationDataStore.delete(key)\n hydrationPageInfoStore.delete(key)\n}\n\nexport const clearHydratedRtsQueryData = (): void => {\n hydrationDataStore.clear()\n hydrationPageInfoStore.clear()\n}\n\nexport const RtsSsrRuntimeProvider = ({\n value,\n children,\n}: {\n value: RtsSsrRuntime\n children: ReactNode\n}) => {\n return (\n <RtsSsrRuntimeContext.Provider value={value}>\n {children}\n </RtsSsrRuntimeContext.Provider>\n )\n}\n\nexport const useRtsSsrRuntime = (): RtsSsrRuntime | null => {\n return useContext(RtsSsrRuntimeContext)\n}\n","type PouchDbStatic = {\n plugin: (plugin: unknown) => void\n prefix?: string\n defaults?: (options: Record<string, unknown>) => PouchDbStatic\n new (name: string, options?: Record<string, unknown>): PouchDbDatabase\n}\n\ntype PouchDbDatabase = {\n find: (options: Record<string, unknown>) => Promise<{ docs: Record<string, unknown>[] }>\n bulkDocs: (docs: Record<string, unknown>[]) => Promise<unknown>\n destroy: () => Promise<unknown>\n}\n\nexport type RtsPouchStoreConfig = {\n tenantId: string\n appName?: string\n prefix?: string\n}\n\nexport type RtsPouchQueryOptions = {\n uid: string\n projection?: Record<string, 0 | 1>\n sort?: Record<string, 1 | -1>\n limit?: number\n}\n\nexport type RtsPouchQueryContext = {\n source: \"cache\"\n}\n\nconst UNDERSCORE_PREFIX = \"$_\"\nconst DEFAULT_FIND_LIMIT = 4096\n\nlet storeConfig: RtsPouchStoreConfig | null = null\n\nlet pouchDbPromise: Promise<PouchDbStatic> | null = null\nlet lastAppliedPrefix: string | null = null\n\nconst collections = new Map<string, PouchDbDatabase>()\nconst dbNamesByPrefix = new Map<string, Set<string>>()\n\nconst unwrapDefault = (mod: unknown): unknown => {\n if (!mod || typeof mod !== \"object\") return mod\n const maybe = mod as { default?: unknown }\n return maybe.default ?? mod\n}\n\nconst ensureBrowser = () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"RTS PouchDB store can only be used in the browser\")\n }\n}\n\nconst computeBasePrefix = ({ tenantId, appName }: { tenantId: string; appName?: string }): string => {\n let prefix = \"rb/\"\n if (appName) prefix += `${appName}/`\n prefix += `${tenantId}/`\n return prefix\n}\n\nconst getDbNamesKey = (prefix: string): string => `rb:rts:pouchDbs:${prefix}`\n\nconst getPrefixOverrideKey = ({ tenantId, appName }: { tenantId: string; appName?: string }): string =>\n `rb:rts:pouchPrefix:${appName ?? \"\"}:${tenantId}`\n\nconst readPrefixOverride = ({ tenantId, appName }: { tenantId: string; appName?: string }): string | null => {\n try {\n const value = window.localStorage.getItem(getPrefixOverrideKey({ tenantId, appName }))\n if (!value) return null\n if (!value.endsWith(\"/\")) return `${value}/`\n return value\n } catch {\n return null\n }\n}\n\nconst getPrefix = (): string => {\n if (!storeConfig) {\n throw new Error(\"RTS PouchDB store is not configured\")\n }\n\n if (storeConfig.prefix) return storeConfig.prefix\n\n const basePrefix = computeBasePrefix({ tenantId: storeConfig.tenantId, appName: storeConfig.appName })\n const override = readPrefixOverride({ tenantId: storeConfig.tenantId, appName: storeConfig.appName })\n return override ?? basePrefix\n}\n\nconst loadDbNames = (prefix: string): Set<string> => {\n const existing = dbNamesByPrefix.get(prefix)\n if (existing) return existing\n\n const names = new Set<string>()\n try {\n const raw = window.localStorage.getItem(getDbNamesKey(prefix))\n if (raw) {\n const parsed = JSON.parse(raw) as unknown\n if (Array.isArray(parsed)) {\n for (const value of parsed) {\n if (typeof value === \"string\" && value) names.add(value)\n }\n }\n }\n } catch {\n return names\n }\n\n dbNamesByPrefix.set(prefix, names)\n return names\n}\n\nconst persistDbNames = (prefix: string, names: Set<string>): void => {\n try {\n if (!names.size) {\n window.localStorage.removeItem(getDbNamesKey(prefix))\n dbNamesByPrefix.delete(prefix)\n return\n }\n\n window.localStorage.setItem(getDbNamesKey(prefix), JSON.stringify(Array.from(names)))\n dbNamesByPrefix.set(prefix, names)\n } catch {\n return\n }\n}\n\nconst registerDbName = (prefix: string, dbName: string): void => {\n if (!prefix || !dbName) return\n const names = loadDbNames(prefix)\n if (names.has(dbName)) return\n names.add(dbName)\n persistDbNames(prefix, names)\n}\n\nconst unregisterDbName = (prefix: string, dbName: string): void => {\n if (!prefix || !dbName) return\n const names = loadDbNames(prefix)\n if (!names.delete(dbName)) return\n persistDbNames(prefix, names)\n}\n\nconst getPouchDb = async (): Promise<PouchDbStatic> => {\n ensureBrowser()\n\n if (!pouchDbPromise) {\n pouchDbPromise = (async () => {\n const [core, indexedDbAdapter, findPlugin] = await Promise.all([\n import(\"pouchdb-core\"),\n import(\"pouchdb-adapter-indexeddb\"),\n import(\"pouchdb-find\"),\n ])\n\n const PouchDB = unwrapDefault(core) as PouchDbStatic\n PouchDB.plugin(unwrapDefault(indexedDbAdapter))\n PouchDB.plugin(unwrapDefault(findPlugin))\n\n return PouchDB\n })()\n }\n\n return pouchDbPromise\n}\n\nconst applyPrefix = (PouchDB: PouchDbStatic) => {\n const prefix = getPrefix()\n if (prefix === lastAppliedPrefix) return\n PouchDB.prefix = prefix\n lastAppliedPrefix = prefix\n}\n\nexport const configureRtsPouchStore = (config: RtsPouchStoreConfig | null) => {\n storeConfig = config\n lastAppliedPrefix = null\n collections.clear()\n}\n\nexport const getCollection = async (modelName: string, options: { uid: string }): Promise<PouchDbDatabase> => {\n const PouchDB = await getPouchDb()\n applyPrefix(PouchDB)\n\n const prefix = getPrefix()\n const dbName = `${options.uid}/${modelName}`\n const dbKey = `${prefix}${dbName}`\n\n const existing = collections.get(dbKey)\n if (existing) return existing\n\n registerDbName(prefix, dbName)\n const db = new PouchDB(dbName, { adapter: \"indexeddb\", revs_limit: 1 }) as PouchDbDatabase\n collections.set(dbKey, db)\n return db\n}\n\nconst replaceQueryKeys = (value: unknown, replaceKey: (key: string) => string): unknown => {\n if (typeof value !== \"object\" || value === null) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => replaceQueryKeys(item, replaceKey))\n }\n\n const obj = value as Record<string, unknown>\n const next: Record<string, unknown> = Object.create(Object.getPrototypeOf(obj))\n\n for (const key of Object.keys(obj)) {\n if (/^\\$/.test(key) || /\\.\\d+$/.test(key)) {\n throw new Error(`replaceQueryKeys: Unexpected key format: ${key}`)\n }\n\n const newKey = replaceKey(key)\n next[newKey] = replaceQueryKeys(obj[key], replaceKey)\n }\n\n return next\n}\n\nconst getKeys = (obj: Record<string, unknown>, parentKey = \"\"): string[] => {\n const keys: string[] = []\n\n for (const key of Object.keys(obj)) {\n const nextKey = parentKey ? `${parentKey}.${key}` : key\n const value = obj[key]\n\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n keys.push(...getKeys(value as Record<string, unknown>, nextKey))\n } else {\n keys.push(nextKey)\n }\n }\n\n return keys\n}\n\nconst satisfiesProjection = (doc: Record<string, unknown>, projection: Record<string, 0 | 1>): boolean => {\n const docKeys = new Set(getKeys(doc))\n const projectionKeys = new Set(Object.keys(projection).filter((key) => projection[key] === 1))\n\n if (!projectionKeys.has(\"_id\")) {\n docKeys.delete(\"_id\")\n }\n\n if (projectionKeys.size > docKeys.size) return false\n for (const key of projectionKeys) {\n if (!docKeys.has(key)) return false\n }\n return true\n}\n\nconst remapDocFromStorage = (doc: Record<string, unknown>): Record<string, unknown> => {\n const next: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(doc)) {\n const newKey = key.startsWith(UNDERSCORE_PREFIX) ? key.replace(/^\\$_/, \"\") : key\n next[newKey] = value\n }\n\n return next\n}\n\nexport const runQuery = async <T extends Record<string, unknown>>({\n modelName,\n query = {},\n options,\n}: {\n modelName: string\n query?: Record<string, unknown>\n options: RtsPouchQueryOptions\n}): Promise<{ data: T[]; context: RtsPouchQueryContext }> => {\n const collection = await getCollection(modelName, { uid: options.uid })\n\n const replacedQuery = replaceQueryKeys(query, (key) =>\n key.startsWith(\"_\") && key !== \"_id\" ? `${UNDERSCORE_PREFIX}${key}` : key,\n ) as Record<string, unknown>\n\n const limit = typeof options.limit === \"number\" ? Math.abs(options.limit) : DEFAULT_FIND_LIMIT\n\n const { docs } = await collection.find({\n selector: replacedQuery,\n limit,\n })\n\n let mappedDocs: T[] = docs.map(({ _rev: _revIgnored, ...rest }) => remapDocFromStorage(rest) as T)\n\n if (options.projection) {\n mappedDocs = mappedDocs.filter((doc) => satisfiesProjection(doc, options.projection!))\n }\n\n if (options.sort) {\n mappedDocs = mappedDocs.sort((a, b) => {\n for (const key of Object.keys(options.sort!)) {\n if (!Object.hasOwn(a, key) || !Object.hasOwn(b, key)) continue\n\n const dir = options.sort![key]\n const aVal = a[key]\n const bVal = b[key]\n\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n if (aVal < bVal) return -1 * dir\n if (aVal > bVal) return 1 * dir\n continue\n }\n\n if (typeof aVal === \"string\" && typeof bVal === \"string\") {\n if (aVal < bVal) return -1 * dir\n if (aVal > bVal) return 1 * dir\n continue\n }\n }\n return 0\n })\n }\n\n return { data: mappedDocs, context: { source: \"cache\" } }\n}\n\nexport const updateDocs = async (\n modelName: string,\n data: Array<Record<string, unknown> & { _id: string }>,\n uid: string,\n): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n\n const allIds = data.map((doc) => doc._id).filter(Boolean)\n if (!allIds.length) return\n\n const { docs: currentDocs } = await collection.find({\n selector: { _id: { $in: allIds } },\n fields: [\"_id\", \"_rev\"],\n limit: allIds.length,\n })\n\n const currentDocsById = currentDocs.reduce<Record<string, Record<string, unknown>>>((acc, doc) => {\n const id = String(doc._id ?? \"\")\n if (id) acc[id] = doc\n return acc\n }, {})\n\n const newDocs = data.map((mongoDoc) => {\n const currentDoc = currentDocsById[mongoDoc._id] ?? { _id: mongoDoc._id }\n const nextDoc = Object.entries(mongoDoc).reduce<Record<string, unknown>>((acc, [key, value]) => {\n const newKey = key !== \"_id\" && key.startsWith(\"_\") ? `${UNDERSCORE_PREFIX}${key}` : key\n acc[newKey] = value\n return acc\n }, { ...currentDoc })\n\n const rev = currentDoc._rev\n if (typeof rev === \"string\" && rev) {\n nextDoc._rev = rev\n } else {\n delete nextDoc._rev\n }\n\n return nextDoc\n })\n\n await collection.bulkDocs(newDocs)\n}\n\nexport const deleteDocs = async (modelName: string, ids: string[], uid: string): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n\n const allIds = ids.map((id) => String(id ?? \"\")).filter(Boolean)\n if (!allIds.length) return\n\n const { docs: currentDocs } = await collection.find({\n selector: { _id: { $in: allIds } },\n fields: [\"_id\", \"_rev\"],\n limit: allIds.length,\n })\n\n const deletions = currentDocs\n .map((doc) => ({\n _id: String((doc as { _id?: unknown })?._id ?? \"\"),\n _rev: (doc as { _rev?: unknown })?._rev,\n _deleted: true,\n }))\n .filter((doc) => doc._id && typeof doc._rev === \"string\" && doc._rev)\n\n if (!deletions.length) return\n await collection.bulkDocs(deletions)\n}\n\nexport const destroyCollection = async (modelName: string, uid: string): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n const prefix = getPrefix()\n const dbName = `${uid}/${modelName}`\n collections.delete(`${prefix}${dbName}`)\n unregisterDbName(prefix, dbName)\n await collection.destroy()\n}\n\nexport const resetRtsPouchStore = ({ tenantId, appName }: { tenantId: string; appName?: string }): string => {\n ensureBrowser()\n const basePrefix = computeBasePrefix({ tenantId, appName })\n const oldPrefix = readPrefixOverride({ tenantId, appName }) ?? basePrefix\n const dbNames = Array.from(loadDbNames(oldPrefix))\n const openDbs = Array.from(collections.entries())\n .filter(([key]) => key.startsWith(oldPrefix))\n .map(([, db]) => db)\n\n void (async () => {\n const remaining = new Set(dbNames)\n\n await Promise.all(openDbs.map((db) => db.destroy().catch(() => {})))\n\n if (remaining.size) {\n const PouchDB = await getPouchDb()\n const PouchDBForPrefix = (PouchDB.defaults?.({}) ?? PouchDB) as PouchDbStatic\n PouchDBForPrefix.prefix = oldPrefix\n\n await Promise.all(Array.from(remaining).map(async (name) => {\n const db = new PouchDBForPrefix(name, { adapter: \"indexeddb\", revs_limit: 1 }) as PouchDbDatabase\n await db.destroy().then(() => {\n remaining.delete(name)\n }).catch(() => {})\n }))\n }\n\n if (remaining.size) {\n persistDbNames(oldPrefix, remaining)\n } else {\n persistDbNames(oldPrefix, new Set())\n }\n })()\n\n const newPrefix = `${basePrefix}reset-${Date.now().toString(16)}/`\n try {\n window.localStorage.setItem(getPrefixOverrideKey({ tenantId, appName }), newPrefix)\n } catch {\n return newPrefix\n }\n\n lastAppliedPrefix = null\n collections.clear()\n return newPrefix\n}\n\nexport const destroyAllCollections = async (): Promise<void> => {\n const dbs = Array.from(collections.values())\n await Promise.all(dbs.map((db) => db.destroy()))\n collections.clear()\n}\n","import type { RtsQueryOptions } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport const computeRtsQueryKey = (query: JsonObject, options: RtsQueryOptions): string => {\n const key = options.key ?? \"\"\n const projection = options.projection ? JSON.stringify(options.projection) : \"\"\n const sort = options.sort ? JSON.stringify(options.sort) : \"\"\n const limit = typeof options.limit === \"number\" ? String(options.limit) : \"\"\n const populate = options.populate ? JSON.stringify(options.populate) : \"\"\n const pagination = options.pagination ? JSON.stringify(options.pagination) : \"\"\n return `${key}${JSON.stringify(query)}${projection}${sort}${limit}${populate}${pagination}`\n}\n","import type { PaginationPageInfo, PaginationSpec } from \"@rpcbase/api\"\n\nimport { configureRtsPouchStore, deleteDocs, destroyCollection, resetRtsPouchStore, runQuery, updateDocs } from \"./pouchStore\"\nimport type { RtsModelName } from \"./modelTypes\"\nimport { computeRtsQueryKey } from \"./queryKey\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport type RtsPopulateObject = {\n path: string\n model?: string\n select?: string | JsonObject\n match?: JsonObject\n options?: {\n sort?: Record<string, 1 | -1>\n limit?: number\n }\n populate?: RtsPopulateOption\n}\n\nexport type RtsPopulateOption =\n | string\n | RtsPopulateObject\n | Array<string | RtsPopulateObject>\n\nexport type RtsNetworkQueryContext = {\n source: \"network\"\n isLocal: boolean\n txnId?: string\n pageInfo?: PaginationPageInfo\n}\n\nexport type RtsCacheQueryContext = {\n source: \"cache\"\n}\n\nexport type RtsQueryContext = RtsNetworkQueryContext | RtsCacheQueryContext\n\nexport type RtsQueryOptions = {\n key?: string\n projection?: Record<string, 0 | 1>\n sort?: Record<string, 1 | -1>\n limit?: number\n populate?: RtsPopulateOption\n pagination?: PaginationSpec\n}\n\nexport type RtsConnectOptions = {\n url?: string\n path?: string\n appName?: string\n configureStore?: boolean\n syncChanges?: boolean\n reconnect?: {\n attempts?: number\n delayMs?: number\n delayMaxMs?: number\n }\n}\n\ntype QueryCallback = (error: unknown | null, data: unknown, context: RtsQueryContext) => void\n\ntype QuerySubscription = {\n modelName: RtsModelName\n query: JsonObject\n options: RtsQueryOptions\n queryKey: string\n runInitialNetworkQuery: boolean\n}\n\ntype ServerMessage =\n | {\n type: \"query-payload\"\n modelName: string\n queryKey: string\n data?: unknown\n error?: string\n txnId?: string\n pageInfo?: unknown\n }\n | { type: \"event\"; event: string; payload?: unknown }\n\ntype ClientMessage =\n | { type: \"run-query\"; modelName: string; queryKey: string; query: JsonObject; options?: RtsQueryOptions }\n | {\n type: \"register-query\"\n modelName: string\n queryKey: string\n query: JsonObject\n options?: RtsQueryOptions\n runInitialQuery?: boolean\n }\n | { type: \"remove-query\"; modelName: string; queryKey: string }\n | { type: \"event\"; event: string; payload?: unknown }\n\ntype DocWithId = Record<string, unknown> & { _id: string }\ntype SyncChangesPayload = {\n ok?: unknown\n latestSeq?: unknown\n needsFullResync?: unknown\n changes?: unknown\n}\ntype RawSyncChangeRecord = {\n seq?: unknown\n modelName?: unknown\n op?: unknown\n docId?: unknown\n}\n\nconst TENANT_ID_QUERY_PARAM = \"rb-tenant-id\"\nconst RTS_CHANGES_ROUTE = \"/api/rb/rts/changes\"\nconst MAX_TXN_BUF = 2048\nconst SERVER_RECONNECT_DELAY_MIN_MS = 10_000\nconst SERVER_RECONNECT_DELAY_MAX_MS = 15_000\nconst RUN_NETWORK_QUERY_TIMEOUT_ERROR = \"runNetworkQuery: request timed out\"\n\nlet socket: WebSocket | null = null\nlet connectPromise: Promise<void> | null = null\nlet explicitDisconnect = false\n\nlet currentTenantId: string | null = null\nlet currentUid: string | null = null\nlet connectOptions: RtsConnectOptions = {}\n\nconst localTxnBuf: string[] = []\n\nconst queryCallbacks = new Map<string, Set<QueryCallback>>()\nconst subscriptions = new Map<string, QuerySubscription>()\nconst messageCallbacks = new Map<string, Set<(payload: unknown) => void>>()\n\nlet reconnectTimer: number | null = null\nlet reconnectAttempts = 0\nlet hasEstablishedConnection = false\nlet pendingServerReconnectJitter = false\n\nlet syncPromise: Promise<void> | null = null\nlet syncKey: string | null = null\n\nconst ensureBrowser = () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"RTS websocket client can only be used in the browser\")\n }\n}\n\nconst buildSocketUrl = (tenantId: string, _uid: string, options: RtsConnectOptions): string => {\n if (options.url) {\n const url = new URL(options.url)\n url.searchParams.set(TENANT_ID_QUERY_PARAM, tenantId)\n return url.toString()\n }\n\n const base = new URL(window.location.href)\n base.protocol = base.protocol === \"https:\" ? \"wss:\" : \"ws:\"\n base.pathname = options.path ?? \"/rts\"\n base.search = \"\"\n base.hash = \"\"\n base.searchParams.set(TENANT_ID_QUERY_PARAM, tenantId)\n return base.toString()\n}\n\nconst sendToServer = (message: ClientMessage): void => {\n if (!socket) return\n if (socket.readyState !== WebSocket.OPEN) return\n socket.send(JSON.stringify(message))\n}\n\nconst resubscribeAll = ({ forceInitialQuery }: { forceInitialQuery: boolean }): void => {\n for (const sub of subscriptions.values()) {\n const runInitialQuery = forceInitialQuery || sub.runInitialNetworkQuery\n sendToServer({\n type: \"register-query\",\n modelName: sub.modelName,\n queryKey: sub.queryKey,\n query: sub.query,\n options: sub.options,\n runInitialQuery,\n })\n }\n}\n\nconst clearReconnectTimer = () => {\n if (reconnectTimer === null) return\n if (typeof window !== \"undefined\") {\n window.clearTimeout(reconnectTimer)\n }\n reconnectTimer = null\n}\n\nconst scheduleReconnect = () => {\n clearReconnectTimer()\n if (explicitDisconnect) {\n pendingServerReconnectJitter = false\n return\n }\n if (!currentTenantId || !currentUid) return\n\n const cfg = connectOptions.reconnect ?? {}\n const maxAttempts = cfg.attempts ?? 128\n const delayMs = cfg.delayMs ?? 400\n const delayMaxMs = cfg.delayMaxMs ?? 10_000\n\n if (reconnectAttempts >= maxAttempts) return\n\n let delay = Math.min(delayMaxMs, delayMs * Math.pow(2, reconnectAttempts))\n if (pendingServerReconnectJitter) {\n const span = SERVER_RECONNECT_DELAY_MAX_MS - SERVER_RECONNECT_DELAY_MIN_MS\n delay = SERVER_RECONNECT_DELAY_MIN_MS + Math.floor(Math.random() * (span + 1))\n pendingServerReconnectJitter = false\n }\n reconnectAttempts += 1\n reconnectTimer = window.setTimeout(() => {\n void connectInternal(currentTenantId!, currentUid!, connectOptions, { resetReconnectAttempts: false })\n }, delay)\n}\n\nconst isDocWithId = (doc: unknown): doc is DocWithId => {\n if (!doc || typeof doc !== \"object\") return false\n return typeof (doc as { _id?: unknown })._id === \"string\"\n}\n\nconst normalizePageInfo = (value: unknown): PaginationPageInfo | undefined => {\n if (!value || typeof value !== \"object\") return undefined\n if (Array.isArray(value)) return undefined\n\n const raw = value as {\n nextCursor?: unknown\n prevCursor?: unknown\n hasNextPage?: unknown\n hasPrevPage?: unknown\n }\n\n if (typeof raw.hasNextPage !== \"boolean\" || typeof raw.hasPrevPage !== \"boolean\") return undefined\n\n const nextCursor = typeof raw.nextCursor === \"string\" && raw.nextCursor ? raw.nextCursor : undefined\n const prevCursor = typeof raw.prevCursor === \"string\" && raw.prevCursor ? raw.prevCursor : undefined\n\n return {\n hasNextPage: raw.hasNextPage,\n hasPrevPage: raw.hasPrevPage,\n ...(nextCursor ? { nextCursor } : {}),\n ...(prevCursor ? { prevCursor } : {}),\n }\n}\n\nconst handleQueryPayload = (payload: Extract<ServerMessage, { type: \"query-payload\" }>) => {\n const { modelName, queryKey, data, error, txnId } = payload\n const cbKey = `${modelName}.${queryKey}`\n const callbacks = queryCallbacks.get(cbKey)\n if (!callbacks || !callbacks.size) return\n const subscription = subscriptions.get(cbKey)\n const pageInfo = normalizePageInfo(payload.pageInfo)\n const hasPopulate = Boolean(subscription?.options?.populate)\n const hasPagination = Boolean(subscription?.options?.pagination || pageInfo)\n\n const isLocal = !!(txnId && localTxnBuf.includes(txnId))\n const context: RtsNetworkQueryContext = { source: \"network\", isLocal, txnId, ...(pageInfo ? { pageInfo } : {}) }\n\n if (error) {\n for (const cb of callbacks) cb(error, undefined, context)\n return\n }\n\n for (const cb of callbacks) cb(null, data, context)\n\n if (!currentUid) return\n\n const docs = Array.isArray(data) ? data.filter(isDocWithId) : []\n\n if (!docs.length) return\n if (hasPopulate) return\n if (hasPagination) return\n\n void updateDocs(modelName, docs, currentUid)\n .catch(() => {})\n}\n\nconst handleEvent = (payload: Extract<ServerMessage, { type: \"event\" }>) => {\n const callbacks = messageCallbacks.get(payload.event)\n if (!callbacks || !callbacks.size) return\n for (const cb of callbacks) cb(payload.payload)\n}\n\nconst handleMessage = (event: MessageEvent) => {\n let parsed: unknown\n try {\n parsed = JSON.parse(typeof event.data === \"string\" ? event.data : String(event.data))\n } catch {\n return\n }\n\n if (!parsed || typeof parsed !== \"object\") return\n const message = parsed as ServerMessage\n\n if (message.type === \"query-payload\") {\n handleQueryPayload(message)\n return\n }\n\n if (message.type === \"event\") {\n handleEvent(message)\n }\n}\n\nexport const addLocalTxn = (txnId: string): void => {\n if (!txnId) return\n localTxnBuf.push(txnId)\n if (localTxnBuf.length > MAX_TXN_BUF) {\n localTxnBuf.shift()\n }\n}\n\ntype RtsChangeRecord = {\n seq: number\n modelName: string\n op: \"delete\" | \"reset_model\"\n docId?: string\n}\n\nconst getSyncStorageKey = ({ tenantId, uid, appName }: { tenantId: string; uid: string; appName?: string }): string =>\n `rb:rts:changesSeq:${appName ?? \"\"}:${tenantId}:${uid}`\n\nconst readStoredSeq = (key: string): number => {\n try {\n const raw = window.localStorage.getItem(key)\n const num = raw ? Number(raw) : 0\n return Number.isFinite(num) && num >= 0 ? Math.floor(num) : 0\n } catch {\n return 0\n }\n}\n\nconst writeStoredSeq = (key: string, value: number): void => {\n try {\n window.localStorage.setItem(key, String(Math.max(0, Math.floor(value))))\n } catch {\n return\n }\n}\n\nconst applyChangeBatch = async (changes: RtsChangeRecord[], uid: string): Promise<void> => {\n const resetModels = new Set<string>()\n const deletesByModel = new Map<string, string[]>()\n\n for (const change of changes) {\n const modelName = typeof change.modelName === \"string\" ? change.modelName : \"\"\n if (!modelName) continue\n\n if (change.op === \"reset_model\") {\n resetModels.add(modelName)\n continue\n }\n\n if (change.op === \"delete\") {\n const docId = typeof change.docId === \"string\" ? change.docId : \"\"\n if (!docId) continue\n const existing = deletesByModel.get(modelName) ?? []\n existing.push(docId)\n deletesByModel.set(modelName, existing)\n }\n }\n\n for (const modelName of resetModels) {\n await destroyCollection(modelName, uid).catch(() => {})\n }\n\n for (const [modelName, ids] of deletesByModel.entries()) {\n if (resetModels.has(modelName)) continue\n await deleteDocs(modelName, ids, uid).catch(() => {})\n }\n}\n\nexport const syncRtsChanges = async (tenantId: string, uid: string, options: Pick<RtsConnectOptions, \"appName\"> = {}): Promise<void> => {\n ensureBrowser()\n if (!tenantId || !uid) return\n\n const storageKey = getSyncStorageKey({ tenantId, uid, appName: options.appName })\n let sinceSeq = readStoredSeq(storageKey)\n\n for (let i = 0; i < 32; i += 1) {\n const url = `${RTS_CHANGES_ROUTE}?${TENANT_ID_QUERY_PARAM}=${encodeURIComponent(tenantId)}`\n const response = await fetch(url, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ sinceSeq, limit: 2000 }),\n })\n\n if (!response.ok) return\n\n const payload: unknown = await response.json().catch(() => null)\n if (!payload || typeof payload !== \"object\") return\n const payloadObj = payload as SyncChangesPayload\n const ok = payloadObj.ok\n if (ok !== true) return\n\n const latestSeq = Number(payloadObj.latestSeq ?? 0)\n const needsFullResync = Boolean(payloadObj.needsFullResync)\n\n if (needsFullResync) {\n resetRtsPouchStore({ tenantId, appName: options.appName })\n writeStoredSeq(storageKey, latestSeq)\n return\n }\n\n const changesRaw = payloadObj.changes\n const changes = Array.isArray(changesRaw) ? changesRaw : []\n const normalized = changes\n .map((c): RtsChangeRecord | null => {\n if (!c || typeof c !== \"object\") return null\n const obj = c as RawSyncChangeRecord\n\n const seq = Number(obj.seq ?? 0)\n const modelName = typeof obj.modelName === \"string\" ? obj.modelName : String(obj.modelName ?? \"\")\n const op = obj.op === \"reset_model\" ? \"reset_model\" : \"delete\"\n const docId = typeof obj.docId === \"string\" && obj.docId ? obj.docId : obj.docId ? String(obj.docId) : undefined\n\n return { seq, modelName, op, ...(docId ? { docId } : {}) }\n })\n .filter((c): c is RtsChangeRecord => c !== null)\n .filter((c: RtsChangeRecord) =>\n Number.isFinite(c.seq) && c.seq > 0 && c.modelName && (c.op === \"reset_model\" || !!c.docId),\n )\n\n if (!normalized.length) {\n writeStoredSeq(storageKey, latestSeq)\n return\n }\n\n await applyChangeBatch(normalized, uid)\n\n const lastSeq = normalized.reduce((max, c) => (c.seq > max ? c.seq : max), sinceSeq)\n sinceSeq = lastSeq\n writeStoredSeq(storageKey, sinceSeq)\n\n if (latestSeq > 0 && sinceSeq >= latestSeq) {\n return\n }\n }\n}\n\nconst ensureSynced = (tenantId: string, uid: string, options: RtsConnectOptions): void => {\n if (options.syncChanges === false) return\n const key = `${options.appName ?? \"\"}:${tenantId}:${uid}`\n if (syncPromise && syncKey === key) return\n\n syncKey = key\n syncPromise = syncRtsChanges(tenantId, uid, { appName: options.appName })\n .catch(() => {})\n .finally(() => {\n if (syncKey === key) {\n syncPromise = null\n }\n })\n}\n\nconst connectInternal = (\n tenantId: string,\n uid: string,\n options: RtsConnectOptions,\n { resetReconnectAttempts }: { resetReconnectAttempts: boolean },\n): Promise<void> => {\n ensureBrowser()\n\n if (!tenantId) return Promise.resolve()\n if (!uid) throw new Error(\"Missing uid\")\n\n currentTenantId = tenantId\n currentUid = uid\n connectOptions = options\n\n if (options.configureStore !== false) {\n configureRtsPouchStore({ tenantId, appName: options.appName })\n }\n ensureSynced(tenantId, uid, options)\n\n if (socket && (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)) {\n return connectPromise ?? Promise.resolve()\n }\n\n explicitDisconnect = false\n clearReconnectTimer()\n\n const url = buildSocketUrl(tenantId, uid, options)\n\n connectPromise = new Promise((resolve, reject) => {\n if (resetReconnectAttempts) reconnectAttempts = 0\n\n let opened = false\n let settled = false\n socket = new WebSocket(url)\n\n socket.addEventListener(\"open\", () => {\n opened = true\n settled = true\n reconnectAttempts = 0\n pendingServerReconnectJitter = false\n const forceInitialQuery = hasEstablishedConnection\n resubscribeAll({ forceInitialQuery })\n hasEstablishedConnection = true\n resolve()\n })\n\n socket.addEventListener(\"message\", handleMessage)\n\n socket.addEventListener(\"close\", (event) => {\n if (!opened && !settled) {\n settled = true\n reject(new Error(`RTS WebSocket closed before opening (code=${event.code})`))\n }\n if (!explicitDisconnect) {\n pendingServerReconnectJitter = opened\n }\n\n socket = null\n connectPromise = null\n scheduleReconnect()\n })\n\n socket.addEventListener(\"error\", (err) => {\n if (settled) return\n settled = true\n reject(err instanceof Error ? err : new Error(\"RTS WebSocket error\"))\n })\n })\n\n return connectPromise\n}\n\nexport const connect = (tenantId: string, uid: string, options: RtsConnectOptions = {}): Promise<void> => {\n return connectInternal(tenantId, uid, options, { resetReconnectAttempts: true })\n}\n\nexport const disconnect = (): void => {\n explicitDisconnect = true\n clearReconnectTimer()\n hasEstablishedConnection = false\n pendingServerReconnectJitter = false\n if (socket) {\n try {\n socket.close()\n } catch {\n // ignore\n }\n }\n socket = null\n connectPromise = null\n}\n\nexport const reconnect = (tenantId: string, uid: string, options: RtsConnectOptions = {}): Promise<void> => {\n explicitDisconnect = true\n clearReconnectTimer()\n pendingServerReconnectJitter = false\n if (socket) {\n try {\n socket.close()\n } catch {\n // ignore\n }\n }\n socket = null\n connectPromise = null\n return connect(tenantId, uid, options)\n}\n\nexport const registerQuery = (\n modelName: RtsModelName,\n query: JsonObject,\n optionsOrCallback?: RtsQueryOptions | QueryCallback,\n callbackMaybe?: QueryCallback,\n behavior?: {\n runInitialNetworkQuery?: boolean\n runInitialLocalQuery?: boolean\n },\n): (() => void) | undefined => {\n let options: RtsQueryOptions\n let callback: QueryCallback | undefined\n\n if (typeof optionsOrCallback === \"function\") {\n options = {}\n callback = optionsOrCallback\n } else {\n options = optionsOrCallback ?? {}\n callback = callbackMaybe\n }\n\n if (!callback) return undefined\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"registerQuery: modelName must be a non-empty string\")\n }\n\n const queryKey = computeRtsQueryKey(query, options)\n const cbKey = `${modelName}.${queryKey}`\n const runInitialNetworkQuery = behavior?.runInitialNetworkQuery !== false\n const runInitialLocalQuery = behavior?.runInitialLocalQuery !== false\n const hasPopulate = Boolean(options.populate)\n const hasPagination = Boolean(options.pagination)\n\n const set = queryCallbacks.get(cbKey) ?? new Set<QueryCallback>()\n set.add(callback)\n queryCallbacks.set(cbKey, set)\n\n subscriptions.set(cbKey, { modelName, query, options, queryKey, runInitialNetworkQuery })\n\n if (currentUid && runInitialLocalQuery && !hasPopulate && !hasPagination) {\n void runQuery({\n modelName,\n query,\n options: {\n uid: currentUid,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n },\n }).then(({ data, context }) => {\n callback?.(null, data, context)\n }).catch(() => {\n // ignore\n })\n }\n\n sendToServer({ type: \"register-query\", modelName, queryKey, query, options, runInitialQuery: runInitialNetworkQuery })\n\n return () => {\n sendToServer({ type: \"remove-query\", modelName, queryKey })\n\n const callbacks = queryCallbacks.get(cbKey)\n callbacks?.delete(callback!)\n if (callbacks && callbacks.size === 0) {\n queryCallbacks.delete(cbKey)\n subscriptions.delete(cbKey)\n }\n }\n}\n\nconst makeRunQueryKey = (): string => `run-query.${Date.now().toString(36)}.${Math.random().toString(36).slice(2, 10)}`\n\nexport const runNetworkQuery = async ({\n modelName,\n query,\n options = {},\n timeoutMs = 10_000,\n}: {\n modelName: RtsModelName\n query: JsonObject\n options?: RtsQueryOptions\n timeoutMs?: number\n}): Promise<{ data: unknown; context: RtsQueryContext }> => {\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"runNetworkQuery: modelName must be a non-empty string\")\n }\n\n const hasTimeout = typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs) && timeoutMs > 0\n const timeoutStartedAt = hasTimeout ? Date.now() : 0\n\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n if (currentTenantId && currentUid) {\n try {\n const connectAttempt = connectInternal(\n currentTenantId,\n currentUid,\n connectOptions,\n { resetReconnectAttempts: false },\n )\n if (hasTimeout) {\n await new Promise<void>((resolve, reject) => {\n const timeoutId = window.setTimeout(() => {\n reject(new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR))\n }, timeoutMs)\n connectAttempt.then(\n () => {\n window.clearTimeout(timeoutId)\n resolve()\n },\n (error) => {\n window.clearTimeout(timeoutId)\n reject(error)\n },\n )\n })\n } else {\n await connectAttempt\n }\n } catch {\n // ignore; fallback to the hard failure below\n }\n }\n }\n\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n if (hasTimeout && Date.now() - timeoutStartedAt >= timeoutMs) {\n throw new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR)\n }\n throw new Error(\"runNetworkQuery: RTS socket is not connected\")\n }\n\n const remainingTimeoutMs = hasTimeout ? Math.max(0, timeoutMs - (Date.now() - timeoutStartedAt)) : null\n if (remainingTimeoutMs !== null && remainingTimeoutMs <= 0) {\n throw new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR)\n }\n\n const resolvedOptions = options.key ? options : { ...options, key: makeRunQueryKey() }\n const queryKey = computeRtsQueryKey(query, resolvedOptions)\n const cbKey = `${modelName}.${queryKey}`\n\n return await new Promise<{ data: unknown; context: RtsQueryContext }>((resolve, reject) => {\n let settled = false\n let timeoutId: number | null = null\n\n const cleanup = () => {\n const callbacks = queryCallbacks.get(cbKey)\n callbacks?.delete(callback)\n if (callbacks && callbacks.size === 0) queryCallbacks.delete(cbKey)\n if (timeoutId !== null && typeof window !== \"undefined\") {\n window.clearTimeout(timeoutId)\n }\n }\n\n const settle = (next: () => void) => {\n if (settled) return\n settled = true\n cleanup()\n next()\n }\n\n const callback: QueryCallback = (error, data, context) => {\n if (error) {\n settle(() => reject(error))\n return\n }\n settle(() => resolve({ data, context }))\n }\n\n const callbacks = queryCallbacks.get(cbKey) ?? new Set<QueryCallback>()\n callbacks.add(callback)\n queryCallbacks.set(cbKey, callbacks)\n\n if (remainingTimeoutMs !== null) {\n timeoutId = window.setTimeout(() => {\n settle(() => reject(new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR)))\n }, remainingTimeoutMs)\n }\n\n sendToServer({ type: \"run-query\", modelName, queryKey, query, options: resolvedOptions })\n })\n}\n\nexport const sendMessage = (event: string, payload?: unknown): void => {\n sendToServer({ type: \"event\", event, payload })\n}\n\nexport const onMessage = (event: string, callback: (payload: unknown) => void): (() => void) => {\n const set = messageCallbacks.get(event) ?? new Set()\n set.add(callback)\n messageCallbacks.set(event, set)\n\n return () => {\n const callbacks = messageCallbacks.get(event)\n callbacks?.delete(callback)\n if (callbacks && callbacks.size === 0) messageCallbacks.delete(event)\n }\n}\n","import { useEffect, useId, useMemo, useRef, useState } from \"react\"\nimport type { PaginationPageInfo } from \"@rpcbase/api\"\n\nimport type { RtsModelName } from \"./modelTypes\"\nimport { computeRtsQueryKey } from \"./queryKey\"\nimport { consumeHydratedRtsQueryData, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, useRtsSsrRuntime } from \"./ssrHydration\"\nimport type { RtsQueryContext, RtsQueryOptions } from \"./wsClient\"\nimport { registerQuery, runNetworkQuery } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\ntype LoadedPage<T> = {\n nodes: T[]\n pageInfo?: PaginationPageInfo\n}\n\nconst normalizePageInfo = (value: unknown): PaginationPageInfo | undefined => {\n if (!value || typeof value !== \"object\") return undefined\n if (Array.isArray(value)) return undefined\n\n const raw = value as {\n nextCursor?: unknown\n prevCursor?: unknown\n hasNextPage?: unknown\n hasPrevPage?: unknown\n }\n\n if (typeof raw.hasNextPage !== \"boolean\" || typeof raw.hasPrevPage !== \"boolean\") return undefined\n\n const nextCursor = typeof raw.nextCursor === \"string\" && raw.nextCursor ? raw.nextCursor : undefined\n const prevCursor = typeof raw.prevCursor === \"string\" && raw.prevCursor ? raw.prevCursor : undefined\n\n return {\n hasNextPage: raw.hasNextPage,\n hasPrevPage: raw.hasPrevPage,\n ...(nextCursor ? { nextCursor } : {}),\n ...(prevCursor ? { prevCursor } : {}),\n }\n}\n\nconst getDocId = (doc: unknown): string => {\n if (!doc || typeof doc !== \"object\") return \"\"\n const id = (doc as { _id?: unknown })._id\n return typeof id === \"string\" ? id.trim() : \"\"\n}\n\nconst dedupeById = <T extends Record<string, unknown>>(docs: T[]): T[] => {\n const seen = new Set<string>()\n const merged: T[] = []\n\n for (const doc of docs) {\n const id = getDocId(doc)\n if (id && seen.has(id)) continue\n if (id) seen.add(id)\n merged.push(doc)\n }\n\n return merged\n}\n\nconst flattenLoadedPages = <T extends Record<string, unknown>>(\n previousPages: Array<LoadedPage<T>>,\n headPage: LoadedPage<T> | null,\n nextPages: Array<LoadedPage<T>>,\n): T[] => {\n const merged: T[] = []\n for (const page of previousPages) merged.push(...page.nodes)\n if (headPage) merged.push(...headPage.nodes)\n for (const page of nextPages) merged.push(...page.nodes)\n return dedupeById(merged)\n}\n\nexport type UseRtsQueryOptions = RtsQueryOptions & {\n enabled?: boolean\n skipLocal?: boolean\n ssr?: \"auto\" | boolean\n refreshOnMount?: boolean\n}\n\nexport type UseRtsQueryResult<T> = {\n data: T[] | undefined\n pageInfo?: PaginationPageInfo\n source: RtsQueryContext[\"source\"] | undefined\n error: unknown | undefined\n loading: boolean\n fetchNext: () => Promise<boolean>\n fetchPrevious: () => Promise<boolean>\n resetPagination: () => void\n}\n\nexport const useQuery = <T extends Record<string, unknown> = Record<string, unknown>>(\n modelName: RtsModelName,\n query: JsonObject = {},\n options: UseRtsQueryOptions = {},\n): UseRtsQueryResult<T> => {\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"useQuery: modelName must be a non-empty string\")\n }\n\n const id = useId()\n\n const enabled = options.enabled ?? true\n const ssrEnabled = options.ssr !== false\n const refreshOnMount = options.refreshOnMount === true\n const key = options.key ?? id\n const queryJson = JSON.stringify(query)\n const projectionJson = options.projection ? JSON.stringify(options.projection) : \"\"\n const sortJson = options.sort ? JSON.stringify(options.sort) : \"\"\n const limitStr = typeof options.limit === \"number\" ? String(options.limit) : \"\"\n const populateJson = options.populate ? JSON.stringify(options.populate) : \"\"\n const paginationJson = options.pagination ? JSON.stringify(options.pagination) : \"\"\n const hasPopulate = Boolean(options.populate)\n const isPaginated = Boolean(options.pagination)\n\n const queryKey = computeRtsQueryKey(query, {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: options.pagination,\n })\n\n const ssrRuntime = useRtsSsrRuntime()\n if (enabled && ssrEnabled && ssrRuntime) {\n ssrRuntime.registerQuery({\n modelName,\n query,\n options: {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: options.pagination,\n },\n queryKey,\n })\n }\n\n const seedDataRaw = useMemo(\n () => (\n enabled && ssrEnabled\n ? ssrRuntime\n ? ssrRuntime.getQueryData(modelName, queryKey)\n : peekHydratedRtsQueryData(modelName, queryKey)\n : undefined\n ),\n [enabled, ssrEnabled, ssrRuntime, modelName, queryKey],\n )\n\n const seedPageInfoRaw = useMemo(\n () => (\n enabled && ssrEnabled\n ? ssrRuntime\n ? ssrRuntime.getQueryPageInfo(modelName, queryKey)\n : peekHydratedRtsQueryPageInfo(modelName, queryKey)\n : undefined\n ),\n [enabled, ssrEnabled, ssrRuntime, modelName, queryKey],\n )\n\n const hasSeedData = Array.isArray(seedDataRaw)\n const seedData = hasSeedData ? seedDataRaw as T[] : undefined\n const seedPageInfo = normalizePageInfo(seedPageInfoRaw)\n const seedJson = (() => {\n if (!hasSeedData) return \"\"\n try {\n return JSON.stringify(seedDataRaw)\n } catch {\n return \"\"\n }\n })()\n const seedPageInfoJson = (() => {\n if (!seedPageInfo) return \"\"\n try {\n return JSON.stringify(seedPageInfo)\n } catch {\n return \"\"\n }\n })()\n\n const [data, setData] = useState<T[] | undefined>(() => (isPaginated ? undefined : seedData))\n const [headPage, setHeadPage] = useState<LoadedPage<T> | null>(() => (\n isPaginated && seedData ? { nodes: seedData, ...(seedPageInfo ? { pageInfo: seedPageInfo } : {}) } : null\n ))\n const [previousPages, setPreviousPages] = useState<Array<LoadedPage<T>>>([])\n const [nextPages, setNextPages] = useState<Array<LoadedPage<T>>>([])\n const [source, setSource] = useState<RtsQueryContext[\"source\"] | undefined>(() => (hasSeedData ? \"cache\" : undefined))\n const [error, setError] = useState<unknown | undefined>(undefined)\n const [loading, setLoading] = useState<boolean>(enabled && !hasSeedData)\n const [pagingDirection, setPagingDirection] = useState<\"next\" | \"prev\" | null>(null)\n\n const hasFirstReply = useRef(false)\n const hasNetworkReply = useRef(false)\n const lastDataJsonRef = useRef<string>(\"\")\n const previousPagesRef = useRef<Array<LoadedPage<T>>>([])\n const nextPagesRef = useRef<Array<LoadedPage<T>>>([])\n const headPageRef = useRef<LoadedPage<T> | null>(null)\n const pagingDirectionRef = useRef<\"next\" | \"prev\" | null>(null)\n\n useEffect(() => {\n previousPagesRef.current = previousPages\n }, [previousPages])\n\n useEffect(() => {\n nextPagesRef.current = nextPages\n }, [nextPages])\n\n useEffect(() => {\n headPageRef.current = headPage\n }, [headPage])\n\n useEffect(() => {\n pagingDirectionRef.current = pagingDirection\n }, [pagingDirection])\n\n useEffect(() => {\n if (!ssrRuntime && enabled && ssrEnabled && hasSeedData) {\n consumeHydratedRtsQueryData(modelName, queryKey)\n }\n\n hasFirstReply.current = hasSeedData\n hasNetworkReply.current = false\n lastDataJsonRef.current = seedJson\n setError(undefined)\n setPreviousPages([])\n setNextPages([])\n\n if (!enabled) {\n setLoading(false)\n setData(undefined)\n setHeadPage(null)\n setSource(undefined)\n return\n }\n\n if (hasSeedData) {\n const nextSeedData = seedData as T[]\n setLoading(false)\n setSource(\"cache\")\n if (isPaginated) {\n setHeadPage({\n nodes: nextSeedData,\n ...(seedPageInfo ? { pageInfo: seedPageInfo } : {}),\n })\n setData(undefined)\n } else {\n setData(nextSeedData)\n setHeadPage(null)\n }\n return\n }\n\n setData(undefined)\n setHeadPage(null)\n setLoading(true)\n }, [enabled, ssrEnabled, ssrRuntime, modelName, queryKey, hasSeedData, seedJson, seedPageInfoJson, isPaginated])\n\n useEffect(() => {\n if (!enabled) return\n\n const runInitialNetworkQuery = refreshOnMount || !hasSeedData\n const runInitialLocalQuery = !hasSeedData && !hasPopulate && !isPaginated\n\n const unsubscribe = registerQuery(\n modelName,\n query,\n {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: options.pagination,\n },\n (err, result, context) => {\n if (context.source === \"cache\" && hasNetworkReply.current) return\n\n if (context.source === \"network\") {\n hasNetworkReply.current = true\n }\n\n setLoading(false)\n\n if (err) {\n setError(err)\n return\n }\n\n if (!Array.isArray(result)) return\n\n if (context.source === \"network\" && context.isLocal && options.skipLocal && hasFirstReply.current) {\n return\n }\n\n hasFirstReply.current = true\n const networkPageInfo = context.source === \"network\" ? context.pageInfo : undefined\n\n const payloadForHash = isPaginated\n ? { result, pageInfo: networkPageInfo }\n : result\n\n let nextJson = \"\"\n try {\n nextJson = JSON.stringify(payloadForHash)\n } catch {\n nextJson = \"\"\n }\n\n if (nextJson && nextJson === lastDataJsonRef.current) {\n setSource(context.source)\n return\n }\n\n lastDataJsonRef.current = nextJson\n setSource(context.source)\n setError(undefined)\n\n if (isPaginated) {\n setHeadPage({\n nodes: result as T[],\n ...(networkPageInfo ? { pageInfo: networkPageInfo } : {}),\n })\n return\n }\n\n setData(result as T[])\n },\n {\n runInitialNetworkQuery,\n runInitialLocalQuery,\n },\n )\n\n return () => {\n unsubscribe?.()\n }\n }, [\n enabled,\n modelName,\n queryKey,\n queryJson,\n projectionJson,\n sortJson,\n limitStr,\n populateJson,\n paginationJson,\n hasSeedData,\n refreshOnMount,\n isPaginated,\n ])\n\n const effectivePageInfo = useMemo<PaginationPageInfo | undefined>(() => {\n if (!isPaginated) return undefined\n\n const firstPageInfo = previousPages.length > 0\n ? previousPages[0]?.pageInfo\n : headPage?.pageInfo\n\n const lastPageInfo = nextPages.length > 0\n ? nextPages[nextPages.length - 1]?.pageInfo\n : headPage?.pageInfo\n\n if (!firstPageInfo && !lastPageInfo) return undefined\n\n const hasPrevPage = Boolean(firstPageInfo?.hasPrevPage)\n const hasNextPage = Boolean(lastPageInfo?.hasNextPage)\n const prevCursor = firstPageInfo?.prevCursor\n const nextCursor = lastPageInfo?.nextCursor\n\n return {\n hasPrevPage,\n hasNextPage,\n ...(prevCursor ? { prevCursor } : {}),\n ...(nextCursor ? { nextCursor } : {}),\n }\n }, [headPage, isPaginated, nextPages, previousPages])\n\n const mergedPaginatedData = useMemo<T[] | undefined>(() => {\n if (!isPaginated) return undefined\n if (!headPage && previousPages.length === 0 && nextPages.length === 0) return undefined\n return flattenLoadedPages(previousPages, headPage, nextPages)\n }, [headPage, isPaginated, nextPages, previousPages])\n\n const fetchNext = async (): Promise<boolean> => {\n if (!enabled || !isPaginated || !options.pagination) return false\n if (pagingDirectionRef.current) return false\n\n const currentHead = headPageRef.current\n const currentNextPages = nextPagesRef.current\n const cursor = currentNextPages.length > 0\n ? currentNextPages[currentNextPages.length - 1]?.pageInfo?.nextCursor\n : currentHead?.pageInfo?.nextCursor\n\n const hasNextPage = currentNextPages.length > 0\n ? Boolean(currentNextPages[currentNextPages.length - 1]?.pageInfo?.hasNextPage)\n : Boolean(currentHead?.pageInfo?.hasNextPage)\n\n if (!cursor || !hasNextPage) return false\n\n setPagingDirection(\"next\")\n setLoading(true)\n setError(undefined)\n\n try {\n const response = await runNetworkQuery({\n modelName,\n query,\n options: {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: {\n ...options.pagination,\n direction: \"next\",\n cursor,\n },\n },\n })\n\n if (!Array.isArray(response.data)) return false\n\n const page: LoadedPage<T> = {\n nodes: response.data as T[],\n ...(response.context.source === \"network\" && response.context.pageInfo\n ? { pageInfo: response.context.pageInfo }\n : {}),\n }\n\n setSource(\"network\")\n setNextPages((current) => [...current, page])\n return true\n } catch (err) {\n setError(err)\n return false\n } finally {\n setPagingDirection(null)\n setLoading(false)\n }\n }\n\n const fetchPrevious = async (): Promise<boolean> => {\n if (!enabled || !isPaginated || !options.pagination) return false\n if (pagingDirectionRef.current) return false\n\n const currentHead = headPageRef.current\n const currentPreviousPages = previousPagesRef.current\n const cursor = currentPreviousPages.length > 0\n ? currentPreviousPages[0]?.pageInfo?.prevCursor\n : currentHead?.pageInfo?.prevCursor\n\n const hasPrevPage = currentPreviousPages.length > 0\n ? Boolean(currentPreviousPages[0]?.pageInfo?.hasPrevPage)\n : Boolean(currentHead?.pageInfo?.hasPrevPage)\n\n if (!cursor || !hasPrevPage) return false\n\n setPagingDirection(\"prev\")\n setLoading(true)\n setError(undefined)\n\n try {\n const response = await runNetworkQuery({\n modelName,\n query,\n options: {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: {\n ...options.pagination,\n direction: \"prev\",\n cursor,\n },\n },\n })\n\n if (!Array.isArray(response.data)) return false\n\n const page: LoadedPage<T> = {\n nodes: response.data as T[],\n ...(response.context.source === \"network\" && response.context.pageInfo\n ? { pageInfo: response.context.pageInfo }\n : {}),\n }\n\n setSource(\"network\")\n setPreviousPages((current) => [page, ...current])\n return true\n } catch (err) {\n setError(err)\n return false\n } finally {\n setPagingDirection(null)\n setLoading(false)\n }\n }\n\n const resetPagination = () => {\n if (!isPaginated) return\n setPreviousPages([])\n setNextPages([])\n }\n\n return useMemo(\n () => ({\n data: isPaginated ? mergedPaginatedData : data,\n pageInfo: effectivePageInfo,\n source,\n error,\n loading,\n fetchNext,\n fetchPrevious,\n resetPagination,\n }),\n [\n data,\n effectivePageInfo,\n error,\n fetchNext,\n fetchPrevious,\n isPaginated,\n loading,\n mergedPaginatedData,\n source,\n ],\n )\n}\n"],"names":["STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY","RtsSsrRuntimeContext","createContext","hydrationDataStore","Map","hydrationPageInfoStore","makeStoreKey","modelName","queryKey","normalizeStringOrNull","value","normalized","trim","normalizePageInfo","Array","isArray","undefined","raw","hasNextPage","hasPrevPage","nextCursor","prevCursor","parseHydrationData","v","queries","entry","query","data","pageInfo","push","tenantId","uid","hydrateRtsFromWindow","window","browserWindow","parsed","clear","set","peekHydratedRtsQueryData","get","peekHydratedRtsQueryPageInfo","consumeHydratedRtsQueryData","key","delete","clearHydratedRtsQueryData","RtsSsrRuntimeProvider","t0","$","_c","children","t1","useRtsSsrRuntime","useContext","UNDERSCORE_PREFIX","DEFAULT_FIND_LIMIT","storeConfig","pouchDbPromise","lastAppliedPrefix","collections","dbNamesByPrefix","unwrapDefault","mod","maybe","default","ensureBrowser","Error","computeBasePrefix","appName","prefix","getDbNamesKey","getPrefixOverrideKey","readPrefixOverride","localStorage","getItem","endsWith","getPrefix","basePrefix","override","loadDbNames","existing","names","Set","JSON","parse","add","persistDbNames","size","removeItem","setItem","stringify","from","registerDbName","dbName","has","unregisterDbName","getPouchDb","core","indexedDbAdapter","findPlugin","Promise","all","PouchDB","plugin","applyPrefix","configureRtsPouchStore","config","getCollection","options","dbKey","db","adapter","revs_limit","replaceQueryKeys","replaceKey","map","item","obj","next","Object","create","getPrototypeOf","keys","test","newKey","getKeys","parentKey","nextKey","satisfiesProjection","doc","projection","docKeys","projectionKeys","filter","remapDocFromStorage","entries","startsWith","replace","runQuery","collection","replacedQuery","limit","Math","abs","docs","find","selector","mappedDocs","_rev","_revIgnored","rest","sort","a","b","hasOwn","dir","aVal","bVal","context","source","updateDocs","allIds","_id","Boolean","length","currentDocs","$in","fields","currentDocsById","reduce","acc","id","String","newDocs","mongoDoc","currentDoc","nextDoc","rev","bulkDocs","deleteDocs","ids","deletions","_deleted","destroyCollection","destroy","resetRtsPouchStore","oldPrefix","dbNames","openDbs","remaining","catch","PouchDBForPrefix","defaults","name","then","newPrefix","Date","now","toString","destroyAllCollections","dbs","values","computeRtsQueryKey","populate","pagination","TENANT_ID_QUERY_PARAM","RTS_CHANGES_ROUTE","MAX_TXN_BUF","SERVER_RECONNECT_DELAY_MIN_MS","SERVER_RECONNECT_DELAY_MAX_MS","RUN_NETWORK_QUERY_TIMEOUT_ERROR","socket","connectPromise","explicitDisconnect","currentTenantId","currentUid","connectOptions","localTxnBuf","queryCallbacks","subscriptions","messageCallbacks","reconnectTimer","reconnectAttempts","hasEstablishedConnection","pendingServerReconnectJitter","syncPromise","syncKey","buildSocketUrl","_uid","url","URL","searchParams","base","location","href","protocol","pathname","path","search","hash","sendToServer","message","readyState","WebSocket","OPEN","send","resubscribeAll","forceInitialQuery","sub","runInitialQuery","runInitialNetworkQuery","type","clearReconnectTimer","clearTimeout","scheduleReconnect","cfg","reconnect","maxAttempts","attempts","delayMs","delayMaxMs","delay","min","pow","span","floor","random","setTimeout","connectInternal","resetReconnectAttempts","isDocWithId","handleQueryPayload","payload","error","txnId","cbKey","callbacks","subscription","hasPopulate","hasPagination","isLocal","includes","cb","handleEvent","event","handleMessage","addLocalTxn","shift","getSyncStorageKey","readStoredSeq","num","Number","isFinite","writeStoredSeq","max","applyChangeBatch","changes","resetModels","deletesByModel","change","op","docId","syncRtsChanges","storageKey","sinceSeq","i","encodeURIComponent","response","fetch","method","credentials","headers","body","ok","json","payloadObj","latestSeq","needsFullResync","changesRaw","c","seq","lastSeq","ensureSynced","syncChanges","finally","resolve","configureStore","CONNECTING","reject","opened","settled","addEventListener","code","err","connect","disconnect","close","registerQuery","optionsOrCallback","callbackMaybe","behavior","callback","runInitialLocalQuery","makeRunQueryKey","slice","runNetworkQuery","timeoutMs","hasTimeout","timeoutStartedAt","connectAttempt","timeoutId","remainingTimeoutMs","resolvedOptions","cleanup","settle","sendMessage","onMessage","getDocId","dedupeById","seen","merged","flattenLoadedPages","previousPages","headPage","nextPages","page","nodes","useQuery","useId","enabled","ssrEnabled","ssr","refreshOnMount","queryJson","projectionJson","sortJson","limitStr","populateJson","paginationJson","isPaginated","ssrRuntime","seedDataRaw","useMemo","getQueryData","seedPageInfoRaw","getQueryPageInfo","hasSeedData","seedData","seedPageInfo","seedJson","seedPageInfoJson","setData","useState","setHeadPage","setPreviousPages","setNextPages","setSource","setError","loading","setLoading","pagingDirection","setPagingDirection","hasFirstReply","useRef","hasNetworkReply","lastDataJsonRef","previousPagesRef","nextPagesRef","headPageRef","pagingDirectionRef","useEffect","current","nextSeedData","unsubscribe","result","skipLocal","networkPageInfo","payloadForHash","nextJson","effectivePageInfo","firstPageInfo","lastPageInfo","mergedPaginatedData","fetchNext","currentHead","currentNextPages","cursor","direction","fetchPrevious","currentPreviousPages","resetPagination"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery-DImVXkBa.js","sources":["../src/rts/ssrHydration.tsx","../src/rts/pouchStore.ts","../src/rts/queryKey.ts","../src/rts/wsClient.ts","../src/rts/useQuery.ts"],"sourcesContent":["import { createContext, useContext, type ReactNode } from \"react\"\nimport type { PaginationPageInfo } from \"@rpcbase/api\"\n\nimport type { RtsModelName } from \"./modelTypes\"\nimport type { RtsQueryOptions } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport const STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY = \"__staticRpcbaseRtsHydrationData\"\n\nexport type RtsSsrHydrationQueryData = {\n modelName: RtsModelName\n queryKey: string\n data: unknown[]\n pageInfo?: PaginationPageInfo\n}\n\nexport type StaticRpcbaseRtsHydrationData = {\n v: 1\n tenantId: string | null\n uid: string | null\n queries: RtsSsrHydrationQueryData[]\n}\n\nexport type RtsSsrQueryRegistration = {\n modelName: RtsModelName\n query: JsonObject\n options: RtsQueryOptions\n queryKey: string\n}\n\nexport type RtsSsrRuntime = {\n registerQuery: (query: RtsSsrQueryRegistration) => void\n getQueryData: (modelName: RtsModelName, queryKey: string) => unknown[] | undefined\n getQueryPageInfo: (modelName: RtsModelName, queryKey: string) => PaginationPageInfo | undefined\n}\n\nconst RtsSsrRuntimeContext = createContext<RtsSsrRuntime | null>(null)\n\nconst hydrationDataStore = new Map<string, unknown[]>()\nconst hydrationPageInfoStore = new Map<string, PaginationPageInfo | undefined>()\n\nconst makeStoreKey = (modelName: string, queryKey: string): string => `${modelName}.${queryKey}`\n\nconst normalizeStringOrNull = (value: unknown): string | null => {\n if (typeof value !== \"string\") return null\n const normalized = value.trim()\n return normalized ? normalized : null\n}\n\nconst normalizePageInfo = (value: unknown): PaginationPageInfo | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n\n const raw = value as {\n nextCursor?: unknown\n prevCursor?: unknown\n hasNextPage?: unknown\n hasPrevPage?: unknown\n }\n\n if (typeof raw.hasNextPage !== \"boolean\" || typeof raw.hasPrevPage !== \"boolean\") return undefined\n\n const nextCursor = typeof raw.nextCursor === \"string\" && raw.nextCursor ? raw.nextCursor : undefined\n const prevCursor = typeof raw.prevCursor === \"string\" && raw.prevCursor ? raw.prevCursor : undefined\n\n return {\n hasNextPage: raw.hasNextPage,\n hasPrevPage: raw.hasPrevPage,\n ...(nextCursor ? { nextCursor } : {}),\n ...(prevCursor ? { prevCursor } : {}),\n }\n}\n\nconst parseHydrationData = (value: unknown): StaticRpcbaseRtsHydrationData | null => {\n if (!value || typeof value !== \"object\") return null\n\n const raw = value as {\n v?: unknown\n tenantId?: unknown\n uid?: unknown\n queries?: unknown\n }\n\n if (raw.v !== 1) return null\n if (!Array.isArray(raw.queries)) return null\n\n const queries: RtsSsrHydrationQueryData[] = []\n for (const entry of raw.queries) {\n if (!entry || typeof entry !== \"object\") continue\n\n const query = entry as {\n modelName?: unknown\n queryKey?: unknown\n data?: unknown\n pageInfo?: unknown\n }\n\n const modelName = normalizeStringOrNull(query.modelName)\n const queryKey = normalizeStringOrNull(query.queryKey)\n if (!modelName || !queryKey) continue\n if (!Array.isArray(query.data)) continue\n const pageInfo = normalizePageInfo(query.pageInfo)\n\n queries.push({\n modelName: modelName as RtsModelName,\n queryKey,\n data: query.data,\n ...(pageInfo ? { pageInfo } : {}),\n })\n }\n\n return {\n v: 1,\n tenantId: normalizeStringOrNull(raw.tenantId),\n uid: normalizeStringOrNull(raw.uid),\n queries,\n }\n}\n\nexport const hydrateRtsFromWindow = (): void => {\n if (typeof window === \"undefined\") return\n\n const browserWindow = window as unknown as Record<string, unknown>\n const raw = browserWindow[STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY]\n delete browserWindow[STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY]\n\n const parsed = parseHydrationData(raw)\n if (!parsed) return\n\n hydrationDataStore.clear()\n hydrationPageInfoStore.clear()\n for (const query of parsed.queries) {\n hydrationDataStore.set(makeStoreKey(query.modelName, query.queryKey), query.data)\n hydrationPageInfoStore.set(makeStoreKey(query.modelName, query.queryKey), query.pageInfo)\n }\n}\n\nexport const peekHydratedRtsQueryData = (\n modelName: RtsModelName,\n queryKey: string,\n): unknown[] | undefined => {\n return hydrationDataStore.get(makeStoreKey(modelName, queryKey))\n}\n\nexport const peekHydratedRtsQueryPageInfo = (\n modelName: RtsModelName,\n queryKey: string,\n): PaginationPageInfo | undefined => {\n return hydrationPageInfoStore.get(makeStoreKey(modelName, queryKey))\n}\n\nexport const consumeHydratedRtsQueryData = (\n modelName: RtsModelName,\n queryKey: string,\n): void => {\n const key = makeStoreKey(modelName, queryKey)\n hydrationDataStore.delete(key)\n hydrationPageInfoStore.delete(key)\n}\n\nexport const clearHydratedRtsQueryData = (): void => {\n hydrationDataStore.clear()\n hydrationPageInfoStore.clear()\n}\n\nexport const RtsSsrRuntimeProvider = ({\n value,\n children,\n}: {\n value: RtsSsrRuntime\n children: ReactNode\n}) => {\n return (\n <RtsSsrRuntimeContext.Provider value={value}>\n {children}\n </RtsSsrRuntimeContext.Provider>\n )\n}\n\nexport const useRtsSsrRuntime = (): RtsSsrRuntime | null => {\n return useContext(RtsSsrRuntimeContext)\n}\n","type PouchDbStatic = {\n plugin: (plugin: unknown) => void\n prefix?: string\n defaults?: (options: Record<string, unknown>) => PouchDbStatic\n new (name: string, options?: Record<string, unknown>): PouchDbDatabase\n}\n\ntype PouchDbDatabase = {\n find: (options: Record<string, unknown>) => Promise<{ docs: Record<string, unknown>[] }>\n bulkDocs: (docs: Record<string, unknown>[]) => Promise<unknown>\n destroy: () => Promise<unknown>\n}\n\nexport type RtsPouchStoreConfig = {\n tenantId: string\n appName?: string\n prefix?: string\n}\n\nexport type RtsPouchQueryOptions = {\n uid: string\n projection?: Record<string, 0 | 1>\n sort?: Record<string, 1 | -1>\n limit?: number\n}\n\nexport type RtsPouchQueryContext = {\n source: \"cache\"\n}\n\nconst UNDERSCORE_PREFIX = \"$_\"\nconst DEFAULT_FIND_LIMIT = 4096\n\nlet storeConfig: RtsPouchStoreConfig | null = null\n\nlet pouchDbPromise: Promise<PouchDbStatic> | null = null\nlet lastAppliedPrefix: string | null = null\n\nconst collections = new Map<string, PouchDbDatabase>()\nconst dbNamesByPrefix = new Map<string, Set<string>>()\n\nconst unwrapDefault = (mod: unknown): unknown => {\n if (!mod || typeof mod !== \"object\") return mod\n const maybe = mod as { default?: unknown }\n return maybe.default ?? mod\n}\n\nconst ensureBrowser = () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"RTS PouchDB store can only be used in the browser\")\n }\n}\n\nconst computeBasePrefix = ({ tenantId, appName }: { tenantId: string; appName?: string }): string => {\n let prefix = \"rb/\"\n if (appName) prefix += `${appName}/`\n prefix += `${tenantId}/`\n return prefix\n}\n\nconst getDbNamesKey = (prefix: string): string => `rb:rts:pouchDbs:${prefix}`\n\nconst getPrefixOverrideKey = ({ tenantId, appName }: { tenantId: string; appName?: string }): string =>\n `rb:rts:pouchPrefix:${appName ?? \"\"}:${tenantId}`\n\nconst readPrefixOverride = ({ tenantId, appName }: { tenantId: string; appName?: string }): string | null => {\n try {\n const value = window.localStorage.getItem(getPrefixOverrideKey({ tenantId, appName }))\n if (!value) return null\n if (!value.endsWith(\"/\")) return `${value}/`\n return value\n } catch {\n return null\n }\n}\n\nconst getPrefix = (): string => {\n if (!storeConfig) {\n throw new Error(\"RTS PouchDB store is not configured\")\n }\n\n if (storeConfig.prefix) return storeConfig.prefix\n\n const basePrefix = computeBasePrefix({ tenantId: storeConfig.tenantId, appName: storeConfig.appName })\n const override = readPrefixOverride({ tenantId: storeConfig.tenantId, appName: storeConfig.appName })\n return override ?? basePrefix\n}\n\nconst loadDbNames = (prefix: string): Set<string> => {\n const existing = dbNamesByPrefix.get(prefix)\n if (existing) return existing\n\n const names = new Set<string>()\n try {\n const raw = window.localStorage.getItem(getDbNamesKey(prefix))\n if (raw) {\n const parsed = JSON.parse(raw) as unknown\n if (Array.isArray(parsed)) {\n for (const value of parsed) {\n if (typeof value === \"string\" && value) names.add(value)\n }\n }\n }\n } catch {\n return names\n }\n\n dbNamesByPrefix.set(prefix, names)\n return names\n}\n\nconst persistDbNames = (prefix: string, names: Set<string>): void => {\n try {\n if (!names.size) {\n window.localStorage.removeItem(getDbNamesKey(prefix))\n dbNamesByPrefix.delete(prefix)\n return\n }\n\n window.localStorage.setItem(getDbNamesKey(prefix), JSON.stringify(Array.from(names)))\n dbNamesByPrefix.set(prefix, names)\n } catch {\n return\n }\n}\n\nconst registerDbName = (prefix: string, dbName: string): void => {\n if (!prefix || !dbName) return\n const names = loadDbNames(prefix)\n if (names.has(dbName)) return\n names.add(dbName)\n persistDbNames(prefix, names)\n}\n\nconst unregisterDbName = (prefix: string, dbName: string): void => {\n if (!prefix || !dbName) return\n const names = loadDbNames(prefix)\n if (!names.delete(dbName)) return\n persistDbNames(prefix, names)\n}\n\nconst getPouchDb = async (): Promise<PouchDbStatic> => {\n ensureBrowser()\n\n if (!pouchDbPromise) {\n pouchDbPromise = (async () => {\n const [core, indexedDbAdapter, findPlugin] = await Promise.all([\n import(\"pouchdb-core\"),\n import(\"pouchdb-adapter-indexeddb\"),\n import(\"pouchdb-find\"),\n ])\n\n const PouchDB = unwrapDefault(core) as PouchDbStatic\n PouchDB.plugin(unwrapDefault(indexedDbAdapter))\n PouchDB.plugin(unwrapDefault(findPlugin))\n\n return PouchDB\n })()\n }\n\n return pouchDbPromise\n}\n\nconst applyPrefix = (PouchDB: PouchDbStatic) => {\n const prefix = getPrefix()\n if (prefix === lastAppliedPrefix) return\n PouchDB.prefix = prefix\n lastAppliedPrefix = prefix\n}\n\nexport const configureRtsPouchStore = (config: RtsPouchStoreConfig | null) => {\n storeConfig = config\n lastAppliedPrefix = null\n collections.clear()\n}\n\nexport const getCollection = async (modelName: string, options: { uid: string }): Promise<PouchDbDatabase> => {\n const PouchDB = await getPouchDb()\n applyPrefix(PouchDB)\n\n const prefix = getPrefix()\n const dbName = `${options.uid}/${modelName}`\n const dbKey = `${prefix}${dbName}`\n\n const existing = collections.get(dbKey)\n if (existing) return existing\n\n registerDbName(prefix, dbName)\n const db = new PouchDB(dbName, { adapter: \"indexeddb\", revs_limit: 1 }) as PouchDbDatabase\n collections.set(dbKey, db)\n return db\n}\n\nconst replaceQueryKeys = (value: unknown, replaceKey: (key: string) => string): unknown => {\n if (typeof value !== \"object\" || value === null) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => replaceQueryKeys(item, replaceKey))\n }\n\n const obj = value as Record<string, unknown>\n const next: Record<string, unknown> = Object.create(Object.getPrototypeOf(obj))\n\n for (const key of Object.keys(obj)) {\n if (/^\\$/.test(key) || /\\.\\d+$/.test(key)) {\n throw new Error(`replaceQueryKeys: Unexpected key format: ${key}`)\n }\n\n const newKey = replaceKey(key)\n next[newKey] = replaceQueryKeys(obj[key], replaceKey)\n }\n\n return next\n}\n\nconst getKeys = (obj: Record<string, unknown>, parentKey = \"\"): string[] => {\n const keys: string[] = []\n\n for (const key of Object.keys(obj)) {\n const nextKey = parentKey ? `${parentKey}.${key}` : key\n const value = obj[key]\n\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n keys.push(...getKeys(value as Record<string, unknown>, nextKey))\n } else {\n keys.push(nextKey)\n }\n }\n\n return keys\n}\n\nconst satisfiesProjection = (doc: Record<string, unknown>, projection: Record<string, 0 | 1>): boolean => {\n const docKeys = new Set(getKeys(doc))\n const projectionKeys = new Set(Object.keys(projection).filter((key) => projection[key] === 1))\n\n if (!projectionKeys.has(\"_id\")) {\n docKeys.delete(\"_id\")\n }\n\n if (projectionKeys.size > docKeys.size) return false\n for (const key of projectionKeys) {\n if (!docKeys.has(key)) return false\n }\n return true\n}\n\nconst remapDocFromStorage = (doc: Record<string, unknown>): Record<string, unknown> => {\n const next: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(doc)) {\n const newKey = key.startsWith(UNDERSCORE_PREFIX) ? key.replace(/^\\$_/, \"\") : key\n next[newKey] = value\n }\n\n return next\n}\n\nexport const runQuery = async <T extends Record<string, unknown>>({\n modelName,\n query = {},\n options,\n}: {\n modelName: string\n query?: Record<string, unknown>\n options: RtsPouchQueryOptions\n}): Promise<{ data: T[]; context: RtsPouchQueryContext }> => {\n const collection = await getCollection(modelName, { uid: options.uid })\n\n const replacedQuery = replaceQueryKeys(query, (key) =>\n key.startsWith(\"_\") && key !== \"_id\" ? `${UNDERSCORE_PREFIX}${key}` : key,\n ) as Record<string, unknown>\n\n const limit = typeof options.limit === \"number\" ? Math.abs(options.limit) : DEFAULT_FIND_LIMIT\n\n const { docs } = await collection.find({\n selector: replacedQuery,\n limit,\n })\n\n let mappedDocs: T[] = docs.map(({ _rev: _revIgnored, ...rest }) => remapDocFromStorage(rest) as T)\n\n if (options.projection) {\n mappedDocs = mappedDocs.filter((doc) => satisfiesProjection(doc, options.projection!))\n }\n\n if (options.sort) {\n mappedDocs = mappedDocs.sort((a, b) => {\n for (const key of Object.keys(options.sort!)) {\n if (!Object.hasOwn(a, key) || !Object.hasOwn(b, key)) continue\n\n const dir = options.sort![key]\n const aVal = a[key]\n const bVal = b[key]\n\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n if (aVal < bVal) return -1 * dir\n if (aVal > bVal) return 1 * dir\n continue\n }\n\n if (typeof aVal === \"string\" && typeof bVal === \"string\") {\n if (aVal < bVal) return -1 * dir\n if (aVal > bVal) return 1 * dir\n continue\n }\n }\n return 0\n })\n }\n\n return { data: mappedDocs, context: { source: \"cache\" } }\n}\n\nexport const updateDocs = async (\n modelName: string,\n data: Array<Record<string, unknown> & { _id: string }>,\n uid: string,\n): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n\n const allIds = data.map((doc) => doc._id).filter(Boolean)\n if (!allIds.length) return\n\n const { docs: currentDocs } = await collection.find({\n selector: { _id: { $in: allIds } },\n fields: [\"_id\", \"_rev\"],\n limit: allIds.length,\n })\n\n const currentDocsById = currentDocs.reduce<Record<string, Record<string, unknown>>>((acc, doc) => {\n const id = String(doc._id ?? \"\")\n if (id) acc[id] = doc\n return acc\n }, {})\n\n const newDocs = data.map((mongoDoc) => {\n const currentDoc = currentDocsById[mongoDoc._id] ?? { _id: mongoDoc._id }\n const nextDoc = Object.entries(mongoDoc).reduce<Record<string, unknown>>((acc, [key, value]) => {\n const newKey = key !== \"_id\" && key.startsWith(\"_\") ? `${UNDERSCORE_PREFIX}${key}` : key\n acc[newKey] = value\n return acc\n }, { ...currentDoc })\n\n const rev = currentDoc._rev\n if (typeof rev === \"string\" && rev) {\n nextDoc._rev = rev\n } else {\n delete nextDoc._rev\n }\n\n return nextDoc\n })\n\n await collection.bulkDocs(newDocs)\n}\n\nexport const deleteDocs = async (modelName: string, ids: string[], uid: string): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n\n const allIds = ids.map((id) => String(id ?? \"\")).filter(Boolean)\n if (!allIds.length) return\n\n const { docs: currentDocs } = await collection.find({\n selector: { _id: { $in: allIds } },\n fields: [\"_id\", \"_rev\"],\n limit: allIds.length,\n })\n\n const deletions = currentDocs\n .map((doc) => ({\n _id: String((doc as { _id?: unknown })?._id ?? \"\"),\n _rev: (doc as { _rev?: unknown })?._rev,\n _deleted: true,\n }))\n .filter((doc) => doc._id && typeof doc._rev === \"string\" && doc._rev)\n\n if (!deletions.length) return\n await collection.bulkDocs(deletions)\n}\n\nexport const destroyCollection = async (modelName: string, uid: string): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n const prefix = getPrefix()\n const dbName = `${uid}/${modelName}`\n collections.delete(`${prefix}${dbName}`)\n unregisterDbName(prefix, dbName)\n await collection.destroy()\n}\n\nexport const resetRtsPouchStore = ({ tenantId, appName }: { tenantId: string; appName?: string }): string => {\n ensureBrowser()\n const basePrefix = computeBasePrefix({ tenantId, appName })\n const oldPrefix = readPrefixOverride({ tenantId, appName }) ?? basePrefix\n const dbNames = Array.from(loadDbNames(oldPrefix))\n const openDbs = Array.from(collections.entries())\n .filter(([key]) => key.startsWith(oldPrefix))\n .map(([, db]) => db)\n\n void (async () => {\n const remaining = new Set(dbNames)\n\n await Promise.all(openDbs.map((db) => db.destroy().catch(() => {})))\n\n if (remaining.size) {\n const PouchDB = await getPouchDb()\n const PouchDBForPrefix = (PouchDB.defaults?.({}) ?? PouchDB) as PouchDbStatic\n PouchDBForPrefix.prefix = oldPrefix\n\n await Promise.all(Array.from(remaining).map(async (name) => {\n const db = new PouchDBForPrefix(name, { adapter: \"indexeddb\", revs_limit: 1 }) as PouchDbDatabase\n await db.destroy().then(() => {\n remaining.delete(name)\n }).catch(() => {})\n }))\n }\n\n if (remaining.size) {\n persistDbNames(oldPrefix, remaining)\n } else {\n persistDbNames(oldPrefix, new Set())\n }\n })()\n\n const newPrefix = `${basePrefix}reset-${Date.now().toString(16)}/`\n try {\n window.localStorage.setItem(getPrefixOverrideKey({ tenantId, appName }), newPrefix)\n } catch {\n return newPrefix\n }\n\n lastAppliedPrefix = null\n collections.clear()\n return newPrefix\n}\n\nexport const destroyAllCollections = async (): Promise<void> => {\n const dbs = Array.from(collections.values())\n await Promise.all(dbs.map((db) => db.destroy()))\n collections.clear()\n}\n","import type { RtsQueryOptions } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport const computeRtsQueryKey = (query: JsonObject, options: RtsQueryOptions): string => {\n const key = options.key ?? \"\"\n const projection = options.projection ? JSON.stringify(options.projection) : \"\"\n const sort = options.sort ? JSON.stringify(options.sort) : \"\"\n const limit = typeof options.limit === \"number\" ? String(options.limit) : \"\"\n const populate = options.populate ? JSON.stringify(options.populate) : \"\"\n const pagination = options.pagination ? JSON.stringify(options.pagination) : \"\"\n return `${key}${JSON.stringify(query)}${projection}${sort}${limit}${populate}${pagination}`\n}\n","import type { PaginationPageInfo, PaginationSpec } from \"@rpcbase/api\"\n\nimport { configureRtsPouchStore, deleteDocs, destroyCollection, resetRtsPouchStore, runQuery, updateDocs } from \"./pouchStore\"\nimport type { RtsModelName } from \"./modelTypes\"\nimport { computeRtsQueryKey } from \"./queryKey\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport type RtsPopulateObject = {\n path: string\n model?: string\n select?: string | JsonObject\n match?: JsonObject\n options?: {\n sort?: Record<string, 1 | -1>\n limit?: number\n }\n populate?: RtsPopulateOption\n}\n\nexport type RtsPopulateOption =\n | string\n | RtsPopulateObject\n | Array<string | RtsPopulateObject>\n\nexport type RtsNetworkQueryContext = {\n source: \"network\"\n isLocal: boolean\n txnId?: string\n pageInfo?: PaginationPageInfo\n}\n\nexport type RtsCacheQueryContext = {\n source: \"cache\"\n}\n\nexport type RtsQueryContext = RtsNetworkQueryContext | RtsCacheQueryContext\n\nexport type RtsQueryOptions = {\n key?: string\n projection?: Record<string, 0 | 1>\n sort?: Record<string, 1 | -1>\n limit?: number\n populate?: RtsPopulateOption\n pagination?: PaginationSpec\n}\n\nexport type RtsConnectOptions = {\n url?: string\n path?: string\n appName?: string\n configureStore?: boolean\n syncChanges?: boolean\n reconnect?: {\n attempts?: number\n delayMs?: number\n delayMaxMs?: number\n }\n}\n\ntype QueryCallback = (error: unknown | null, data: unknown, context: RtsQueryContext) => void\n\ntype QuerySubscription = {\n modelName: RtsModelName\n query: JsonObject\n options: RtsQueryOptions\n queryKey: string\n runInitialNetworkQuery: boolean\n}\n\ntype ServerMessage =\n | {\n type: \"query-payload\"\n modelName: string\n queryKey: string\n data?: unknown\n error?: string\n txnId?: string\n pageInfo?: unknown\n }\n | { type: \"event\"; event: string; payload?: unknown }\n\ntype ClientMessage =\n | { type: \"run-query\"; modelName: string; queryKey: string; query: JsonObject; options?: RtsQueryOptions }\n | {\n type: \"register-query\"\n modelName: string\n queryKey: string\n query: JsonObject\n options?: RtsQueryOptions\n runInitialQuery?: boolean\n }\n | { type: \"remove-query\"; modelName: string; queryKey: string }\n | { type: \"event\"; event: string; payload?: unknown }\n\ntype DocWithId = Record<string, unknown> & { _id: string }\ntype SyncChangesPayload = {\n ok?: unknown\n latestSeq?: unknown\n needsFullResync?: unknown\n changes?: unknown\n}\ntype RawSyncChangeRecord = {\n seq?: unknown\n modelName?: unknown\n op?: unknown\n docId?: unknown\n}\n\nconst TENANT_ID_QUERY_PARAM = \"rb-tenant-id\"\nconst RTS_CHANGES_ROUTE = \"/api/rb/rts/changes\"\nconst MAX_TXN_BUF = 2048\nconst SERVER_RECONNECT_DELAY_MIN_MS = 10_000\nconst SERVER_RECONNECT_DELAY_MAX_MS = 15_000\n\nlet socket: WebSocket | null = null\nlet connectPromise: Promise<void> | null = null\nlet explicitDisconnect = false\n\nlet currentTenantId: string | null = null\nlet currentUid: string | null = null\nlet connectOptions: RtsConnectOptions = {}\n\nconst localTxnBuf: string[] = []\n\nconst queryCallbacks = new Map<string, Set<QueryCallback>>()\nconst subscriptions = new Map<string, QuerySubscription>()\nconst messageCallbacks = new Map<string, Set<(payload: unknown) => void>>()\n\nlet reconnectTimer: number | null = null\nlet reconnectAttempts = 0\nlet hasEstablishedConnection = false\nlet pendingServerReconnectJitter = false\n\nlet syncPromise: Promise<void> | null = null\nlet syncKey: string | null = null\n\nconst ensureBrowser = () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"RTS websocket client can only be used in the browser\")\n }\n}\n\nconst buildSocketUrl = (tenantId: string, _uid: string, options: RtsConnectOptions): string => {\n if (options.url) {\n const url = new URL(options.url)\n url.searchParams.set(TENANT_ID_QUERY_PARAM, tenantId)\n return url.toString()\n }\n\n const base = new URL(window.location.href)\n base.protocol = base.protocol === \"https:\" ? \"wss:\" : \"ws:\"\n base.pathname = options.path ?? \"/rts\"\n base.search = \"\"\n base.hash = \"\"\n base.searchParams.set(TENANT_ID_QUERY_PARAM, tenantId)\n return base.toString()\n}\n\nconst sendToServer = (message: ClientMessage): void => {\n if (!socket) return\n if (socket.readyState !== WebSocket.OPEN) return\n socket.send(JSON.stringify(message))\n}\n\nconst resubscribeAll = ({ forceInitialQuery }: { forceInitialQuery: boolean }): void => {\n for (const sub of subscriptions.values()) {\n const runInitialQuery = forceInitialQuery || sub.runInitialNetworkQuery\n sendToServer({\n type: \"register-query\",\n modelName: sub.modelName,\n queryKey: sub.queryKey,\n query: sub.query,\n options: sub.options,\n runInitialQuery,\n })\n }\n}\n\nconst clearReconnectTimer = () => {\n if (reconnectTimer === null) return\n if (typeof window !== \"undefined\") {\n window.clearTimeout(reconnectTimer)\n }\n reconnectTimer = null\n}\n\nconst scheduleReconnect = () => {\n clearReconnectTimer()\n if (explicitDisconnect) {\n pendingServerReconnectJitter = false\n return\n }\n if (!currentTenantId || !currentUid) return\n\n const cfg = connectOptions.reconnect ?? {}\n const maxAttempts = cfg.attempts ?? 128\n const delayMs = cfg.delayMs ?? 400\n const delayMaxMs = cfg.delayMaxMs ?? 10_000\n\n if (reconnectAttempts >= maxAttempts) return\n\n let delay = Math.min(delayMaxMs, delayMs * Math.pow(2, reconnectAttempts))\n if (pendingServerReconnectJitter) {\n const span = SERVER_RECONNECT_DELAY_MAX_MS - SERVER_RECONNECT_DELAY_MIN_MS\n delay = SERVER_RECONNECT_DELAY_MIN_MS + Math.floor(Math.random() * (span + 1))\n pendingServerReconnectJitter = false\n }\n reconnectAttempts += 1\n reconnectTimer = window.setTimeout(() => {\n void connectInternal(currentTenantId!, currentUid!, connectOptions, { resetReconnectAttempts: false })\n }, delay)\n}\n\nconst isDocWithId = (doc: unknown): doc is DocWithId => {\n if (!doc || typeof doc !== \"object\") return false\n return typeof (doc as { _id?: unknown })._id === \"string\"\n}\n\nconst normalizePageInfo = (value: unknown): PaginationPageInfo | undefined => {\n if (!value || typeof value !== \"object\") return undefined\n if (Array.isArray(value)) return undefined\n\n const raw = value as {\n nextCursor?: unknown\n prevCursor?: unknown\n hasNextPage?: unknown\n hasPrevPage?: unknown\n }\n\n if (typeof raw.hasNextPage !== \"boolean\" || typeof raw.hasPrevPage !== \"boolean\") return undefined\n\n const nextCursor = typeof raw.nextCursor === \"string\" && raw.nextCursor ? raw.nextCursor : undefined\n const prevCursor = typeof raw.prevCursor === \"string\" && raw.prevCursor ? raw.prevCursor : undefined\n\n return {\n hasNextPage: raw.hasNextPage,\n hasPrevPage: raw.hasPrevPage,\n ...(nextCursor ? { nextCursor } : {}),\n ...(prevCursor ? { prevCursor } : {}),\n }\n}\n\nconst handleQueryPayload = (payload: Extract<ServerMessage, { type: \"query-payload\" }>) => {\n const { modelName, queryKey, data, error, txnId } = payload\n const cbKey = `${modelName}.${queryKey}`\n const callbacks = queryCallbacks.get(cbKey)\n if (!callbacks || !callbacks.size) return\n const subscription = subscriptions.get(cbKey)\n const pageInfo = normalizePageInfo(payload.pageInfo)\n const hasPopulate = Boolean(subscription?.options?.populate)\n const hasPagination = Boolean(subscription?.options?.pagination || pageInfo)\n\n const isLocal = !!(txnId && localTxnBuf.includes(txnId))\n const context: RtsNetworkQueryContext = { source: \"network\", isLocal, txnId, ...(pageInfo ? { pageInfo } : {}) }\n\n if (error) {\n for (const cb of callbacks) cb(error, undefined, context)\n return\n }\n\n for (const cb of callbacks) cb(null, data, context)\n\n if (!currentUid) return\n\n const docs = Array.isArray(data) ? data.filter(isDocWithId) : []\n\n if (!docs.length) return\n if (hasPopulate) return\n if (hasPagination) return\n\n void updateDocs(modelName, docs, currentUid)\n .catch(() => {})\n}\n\nconst handleEvent = (payload: Extract<ServerMessage, { type: \"event\" }>) => {\n const callbacks = messageCallbacks.get(payload.event)\n if (!callbacks || !callbacks.size) return\n for (const cb of callbacks) cb(payload.payload)\n}\n\nconst handleMessage = (event: MessageEvent) => {\n let parsed: unknown\n try {\n parsed = JSON.parse(typeof event.data === \"string\" ? event.data : String(event.data))\n } catch {\n return\n }\n\n if (!parsed || typeof parsed !== \"object\") return\n const message = parsed as ServerMessage\n\n if (message.type === \"query-payload\") {\n handleQueryPayload(message)\n return\n }\n\n if (message.type === \"event\") {\n handleEvent(message)\n }\n}\n\nexport const addLocalTxn = (txnId: string): void => {\n if (!txnId) return\n localTxnBuf.push(txnId)\n if (localTxnBuf.length > MAX_TXN_BUF) {\n localTxnBuf.shift()\n }\n}\n\ntype RtsChangeRecord = {\n seq: number\n modelName: string\n op: \"delete\" | \"reset_model\"\n docId?: string\n}\n\nconst getSyncStorageKey = ({ tenantId, uid, appName }: { tenantId: string; uid: string; appName?: string }): string =>\n `rb:rts:changesSeq:${appName ?? \"\"}:${tenantId}:${uid}`\n\nconst readStoredSeq = (key: string): number => {\n try {\n const raw = window.localStorage.getItem(key)\n const num = raw ? Number(raw) : 0\n return Number.isFinite(num) && num >= 0 ? Math.floor(num) : 0\n } catch {\n return 0\n }\n}\n\nconst writeStoredSeq = (key: string, value: number): void => {\n try {\n window.localStorage.setItem(key, String(Math.max(0, Math.floor(value))))\n } catch {\n return\n }\n}\n\nconst applyChangeBatch = async (changes: RtsChangeRecord[], uid: string): Promise<void> => {\n const resetModels = new Set<string>()\n const deletesByModel = new Map<string, string[]>()\n\n for (const change of changes) {\n const modelName = typeof change.modelName === \"string\" ? change.modelName : \"\"\n if (!modelName) continue\n\n if (change.op === \"reset_model\") {\n resetModels.add(modelName)\n continue\n }\n\n if (change.op === \"delete\") {\n const docId = typeof change.docId === \"string\" ? change.docId : \"\"\n if (!docId) continue\n const existing = deletesByModel.get(modelName) ?? []\n existing.push(docId)\n deletesByModel.set(modelName, existing)\n }\n }\n\n for (const modelName of resetModels) {\n await destroyCollection(modelName, uid).catch(() => {})\n }\n\n for (const [modelName, ids] of deletesByModel.entries()) {\n if (resetModels.has(modelName)) continue\n await deleteDocs(modelName, ids, uid).catch(() => {})\n }\n}\n\nexport const syncRtsChanges = async (tenantId: string, uid: string, options: Pick<RtsConnectOptions, \"appName\"> = {}): Promise<void> => {\n ensureBrowser()\n if (!tenantId || !uid) return\n\n const storageKey = getSyncStorageKey({ tenantId, uid, appName: options.appName })\n let sinceSeq = readStoredSeq(storageKey)\n\n for (let i = 0; i < 32; i += 1) {\n const url = `${RTS_CHANGES_ROUTE}?${TENANT_ID_QUERY_PARAM}=${encodeURIComponent(tenantId)}`\n const response = await fetch(url, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ sinceSeq, limit: 2000 }),\n })\n\n if (!response.ok) return\n\n const payload: unknown = await response.json().catch(() => null)\n if (!payload || typeof payload !== \"object\") return\n const payloadObj = payload as SyncChangesPayload\n const ok = payloadObj.ok\n if (ok !== true) return\n\n const latestSeq = Number(payloadObj.latestSeq ?? 0)\n const needsFullResync = Boolean(payloadObj.needsFullResync)\n\n if (needsFullResync) {\n resetRtsPouchStore({ tenantId, appName: options.appName })\n writeStoredSeq(storageKey, latestSeq)\n return\n }\n\n const changesRaw = payloadObj.changes\n const changes = Array.isArray(changesRaw) ? changesRaw : []\n const normalized = changes\n .map((c): RtsChangeRecord | null => {\n if (!c || typeof c !== \"object\") return null\n const obj = c as RawSyncChangeRecord\n\n const seq = Number(obj.seq ?? 0)\n const modelName = typeof obj.modelName === \"string\" ? obj.modelName : String(obj.modelName ?? \"\")\n const op = obj.op === \"reset_model\" ? \"reset_model\" : \"delete\"\n const docId = typeof obj.docId === \"string\" && obj.docId ? obj.docId : obj.docId ? String(obj.docId) : undefined\n\n return { seq, modelName, op, ...(docId ? { docId } : {}) }\n })\n .filter((c): c is RtsChangeRecord => c !== null)\n .filter((c: RtsChangeRecord) =>\n Number.isFinite(c.seq) && c.seq > 0 && c.modelName && (c.op === \"reset_model\" || !!c.docId),\n )\n\n if (!normalized.length) {\n writeStoredSeq(storageKey, latestSeq)\n return\n }\n\n await applyChangeBatch(normalized, uid)\n\n const lastSeq = normalized.reduce((max, c) => (c.seq > max ? c.seq : max), sinceSeq)\n sinceSeq = lastSeq\n writeStoredSeq(storageKey, sinceSeq)\n\n if (latestSeq > 0 && sinceSeq >= latestSeq) {\n return\n }\n }\n}\n\nconst ensureSynced = (tenantId: string, uid: string, options: RtsConnectOptions): void => {\n if (options.syncChanges === false) return\n const key = `${options.appName ?? \"\"}:${tenantId}:${uid}`\n if (syncPromise && syncKey === key) return\n\n syncKey = key\n syncPromise = syncRtsChanges(tenantId, uid, { appName: options.appName })\n .catch(() => {})\n .finally(() => {\n if (syncKey === key) {\n syncPromise = null\n }\n })\n}\n\nconst connectInternal = (\n tenantId: string,\n uid: string,\n options: RtsConnectOptions,\n { resetReconnectAttempts }: { resetReconnectAttempts: boolean },\n): Promise<void> => {\n ensureBrowser()\n\n if (!tenantId) return Promise.resolve()\n if (!uid) throw new Error(\"Missing uid\")\n\n currentTenantId = tenantId\n currentUid = uid\n connectOptions = options\n\n if (options.configureStore !== false) {\n configureRtsPouchStore({ tenantId, appName: options.appName })\n }\n ensureSynced(tenantId, uid, options)\n\n if (socket && (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)) {\n return connectPromise ?? Promise.resolve()\n }\n\n explicitDisconnect = false\n clearReconnectTimer()\n\n const url = buildSocketUrl(tenantId, uid, options)\n\n connectPromise = new Promise((resolve, reject) => {\n if (resetReconnectAttempts) reconnectAttempts = 0\n\n let opened = false\n let settled = false\n socket = new WebSocket(url)\n\n socket.addEventListener(\"open\", () => {\n opened = true\n settled = true\n reconnectAttempts = 0\n pendingServerReconnectJitter = false\n const forceInitialQuery = hasEstablishedConnection\n resubscribeAll({ forceInitialQuery })\n hasEstablishedConnection = true\n resolve()\n })\n\n socket.addEventListener(\"message\", handleMessage)\n\n socket.addEventListener(\"close\", (event) => {\n if (!opened && !settled) {\n settled = true\n reject(new Error(`RTS WebSocket closed before opening (code=${event.code})`))\n }\n if (!explicitDisconnect) {\n pendingServerReconnectJitter = opened\n }\n\n socket = null\n connectPromise = null\n scheduleReconnect()\n })\n\n socket.addEventListener(\"error\", (err) => {\n if (settled) return\n settled = true\n reject(err instanceof Error ? err : new Error(\"RTS WebSocket error\"))\n })\n })\n\n return connectPromise\n}\n\nexport const connect = (tenantId: string, uid: string, options: RtsConnectOptions = {}): Promise<void> => {\n return connectInternal(tenantId, uid, options, { resetReconnectAttempts: true })\n}\n\nexport const disconnect = (): void => {\n explicitDisconnect = true\n clearReconnectTimer()\n hasEstablishedConnection = false\n pendingServerReconnectJitter = false\n if (socket) {\n try {\n socket.close()\n } catch {\n // ignore\n }\n }\n socket = null\n connectPromise = null\n}\n\nexport const reconnect = (tenantId: string, uid: string, options: RtsConnectOptions = {}): Promise<void> => {\n explicitDisconnect = true\n clearReconnectTimer()\n pendingServerReconnectJitter = false\n if (socket) {\n try {\n socket.close()\n } catch {\n // ignore\n }\n }\n socket = null\n connectPromise = null\n return connect(tenantId, uid, options)\n}\n\nexport const registerQuery = (\n modelName: RtsModelName,\n query: JsonObject,\n optionsOrCallback?: RtsQueryOptions | QueryCallback,\n callbackMaybe?: QueryCallback,\n behavior?: {\n runInitialNetworkQuery?: boolean\n runInitialLocalQuery?: boolean\n },\n): (() => void) | undefined => {\n let options: RtsQueryOptions\n let callback: QueryCallback | undefined\n\n if (typeof optionsOrCallback === \"function\") {\n options = {}\n callback = optionsOrCallback\n } else {\n options = optionsOrCallback ?? {}\n callback = callbackMaybe\n }\n\n if (!callback) return undefined\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"registerQuery: modelName must be a non-empty string\")\n }\n\n const queryKey = computeRtsQueryKey(query, options)\n const cbKey = `${modelName}.${queryKey}`\n const runInitialNetworkQuery = behavior?.runInitialNetworkQuery !== false\n const runInitialLocalQuery = behavior?.runInitialLocalQuery !== false\n const hasPopulate = Boolean(options.populate)\n const hasPagination = Boolean(options.pagination)\n\n const set = queryCallbacks.get(cbKey) ?? new Set<QueryCallback>()\n set.add(callback)\n queryCallbacks.set(cbKey, set)\n\n subscriptions.set(cbKey, { modelName, query, options, queryKey, runInitialNetworkQuery })\n\n if (currentUid && runInitialLocalQuery && !hasPopulate && !hasPagination) {\n void runQuery({\n modelName,\n query,\n options: {\n uid: currentUid,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n },\n }).then(({ data, context }) => {\n callback?.(null, data, context)\n }).catch(() => {\n // ignore\n })\n }\n\n sendToServer({ type: \"register-query\", modelName, queryKey, query, options, runInitialQuery: runInitialNetworkQuery })\n\n return () => {\n sendToServer({ type: \"remove-query\", modelName, queryKey })\n\n const callbacks = queryCallbacks.get(cbKey)\n callbacks?.delete(callback!)\n if (callbacks && callbacks.size === 0) {\n queryCallbacks.delete(cbKey)\n subscriptions.delete(cbKey)\n }\n }\n}\n\nconst makeRunQueryKey = (): string => `run-query.${Date.now().toString(36)}.${Math.random().toString(36).slice(2, 10)}`\n\nexport const runNetworkQuery = async ({\n modelName,\n query,\n options = {},\n timeoutMs = 10_000,\n}: {\n modelName: RtsModelName\n query: JsonObject\n options?: RtsQueryOptions\n timeoutMs?: number\n}): Promise<{ data: unknown; context: RtsQueryContext }> => {\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"runNetworkQuery: modelName must be a non-empty string\")\n }\n\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n throw new Error(\"runNetworkQuery: RTS socket is not connected\")\n }\n\n const resolvedOptions = options.key ? options : { ...options, key: makeRunQueryKey() }\n const queryKey = computeRtsQueryKey(query, resolvedOptions)\n const cbKey = `${modelName}.${queryKey}`\n\n return await new Promise<{ data: unknown; context: RtsQueryContext }>((resolve, reject) => {\n let settled = false\n let timeoutId: number | null = null\n\n const cleanup = () => {\n const callbacks = queryCallbacks.get(cbKey)\n callbacks?.delete(callback)\n if (callbacks && callbacks.size === 0) queryCallbacks.delete(cbKey)\n if (timeoutId !== null && typeof window !== \"undefined\") {\n window.clearTimeout(timeoutId)\n }\n }\n\n const settle = (next: () => void) => {\n if (settled) return\n settled = true\n cleanup()\n next()\n }\n\n const callback: QueryCallback = (error, data, context) => {\n if (error) {\n settle(() => reject(error))\n return\n }\n settle(() => resolve({ data, context }))\n }\n\n const callbacks = queryCallbacks.get(cbKey) ?? new Set<QueryCallback>()\n callbacks.add(callback)\n queryCallbacks.set(cbKey, callbacks)\n\n if (typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs) && timeoutMs > 0) {\n timeoutId = window.setTimeout(() => {\n settle(() => reject(new Error(\"runNetworkQuery: request timed out\")))\n }, timeoutMs)\n }\n\n sendToServer({ type: \"run-query\", modelName, queryKey, query, options: resolvedOptions })\n })\n}\n\nexport const sendMessage = (event: string, payload?: unknown): void => {\n sendToServer({ type: \"event\", event, payload })\n}\n\nexport const onMessage = (event: string, callback: (payload: unknown) => void): (() => void) => {\n const set = messageCallbacks.get(event) ?? new Set()\n set.add(callback)\n messageCallbacks.set(event, set)\n\n return () => {\n const callbacks = messageCallbacks.get(event)\n callbacks?.delete(callback)\n if (callbacks && callbacks.size === 0) messageCallbacks.delete(event)\n }\n}\n","import { useEffect, useId, useMemo, useRef, useState } from \"react\"\nimport type { PaginationPageInfo } from \"@rpcbase/api\"\n\nimport type { RtsModelName } from \"./modelTypes\"\nimport { computeRtsQueryKey } from \"./queryKey\"\nimport { consumeHydratedRtsQueryData, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, useRtsSsrRuntime } from \"./ssrHydration\"\nimport type { RtsQueryContext, RtsQueryOptions } from \"./wsClient\"\nimport { registerQuery, runNetworkQuery } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\ntype LoadedPage<T> = {\n nodes: T[]\n pageInfo?: PaginationPageInfo\n}\n\nconst normalizePageInfo = (value: unknown): PaginationPageInfo | undefined => {\n if (!value || typeof value !== \"object\") return undefined\n if (Array.isArray(value)) return undefined\n\n const raw = value as {\n nextCursor?: unknown\n prevCursor?: unknown\n hasNextPage?: unknown\n hasPrevPage?: unknown\n }\n\n if (typeof raw.hasNextPage !== \"boolean\" || typeof raw.hasPrevPage !== \"boolean\") return undefined\n\n const nextCursor = typeof raw.nextCursor === \"string\" && raw.nextCursor ? raw.nextCursor : undefined\n const prevCursor = typeof raw.prevCursor === \"string\" && raw.prevCursor ? raw.prevCursor : undefined\n\n return {\n hasNextPage: raw.hasNextPage,\n hasPrevPage: raw.hasPrevPage,\n ...(nextCursor ? { nextCursor } : {}),\n ...(prevCursor ? { prevCursor } : {}),\n }\n}\n\nconst getDocId = (doc: unknown): string => {\n if (!doc || typeof doc !== \"object\") return \"\"\n const id = (doc as { _id?: unknown })._id\n return typeof id === \"string\" ? id.trim() : \"\"\n}\n\nconst dedupeById = <T extends Record<string, unknown>>(docs: T[]): T[] => {\n const seen = new Set<string>()\n const merged: T[] = []\n\n for (const doc of docs) {\n const id = getDocId(doc)\n if (id && seen.has(id)) continue\n if (id) seen.add(id)\n merged.push(doc)\n }\n\n return merged\n}\n\nconst flattenLoadedPages = <T extends Record<string, unknown>>(\n previousPages: Array<LoadedPage<T>>,\n headPage: LoadedPage<T> | null,\n nextPages: Array<LoadedPage<T>>,\n): T[] => {\n const merged: T[] = []\n for (const page of previousPages) merged.push(...page.nodes)\n if (headPage) merged.push(...headPage.nodes)\n for (const page of nextPages) merged.push(...page.nodes)\n return dedupeById(merged)\n}\n\nexport type UseRtsQueryOptions = RtsQueryOptions & {\n enabled?: boolean\n skipLocal?: boolean\n ssr?: \"auto\" | boolean\n refreshOnMount?: boolean\n}\n\nexport type UseRtsQueryResult<T> = {\n data: T[] | undefined\n pageInfo?: PaginationPageInfo\n source: RtsQueryContext[\"source\"] | undefined\n error: unknown | undefined\n loading: boolean\n fetchNext: () => Promise<boolean>\n fetchPrevious: () => Promise<boolean>\n resetPagination: () => void\n}\n\nexport const useQuery = <T extends Record<string, unknown> = Record<string, unknown>>(\n modelName: RtsModelName,\n query: JsonObject = {},\n options: UseRtsQueryOptions = {},\n): UseRtsQueryResult<T> => {\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"useQuery: modelName must be a non-empty string\")\n }\n\n const id = useId()\n\n const enabled = options.enabled ?? true\n const ssrEnabled = options.ssr !== false\n const refreshOnMount = options.refreshOnMount === true\n const key = options.key ?? id\n const queryJson = JSON.stringify(query)\n const projectionJson = options.projection ? JSON.stringify(options.projection) : \"\"\n const sortJson = options.sort ? JSON.stringify(options.sort) : \"\"\n const limitStr = typeof options.limit === \"number\" ? String(options.limit) : \"\"\n const populateJson = options.populate ? JSON.stringify(options.populate) : \"\"\n const paginationJson = options.pagination ? JSON.stringify(options.pagination) : \"\"\n const hasPopulate = Boolean(options.populate)\n const isPaginated = Boolean(options.pagination)\n\n const queryKey = computeRtsQueryKey(query, {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: options.pagination,\n })\n\n const ssrRuntime = useRtsSsrRuntime()\n if (enabled && ssrEnabled && ssrRuntime) {\n ssrRuntime.registerQuery({\n modelName,\n query,\n options: {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: options.pagination,\n },\n queryKey,\n })\n }\n\n const seedDataRaw = useMemo(\n () => (\n enabled && ssrEnabled\n ? ssrRuntime\n ? ssrRuntime.getQueryData(modelName, queryKey)\n : peekHydratedRtsQueryData(modelName, queryKey)\n : undefined\n ),\n [enabled, ssrEnabled, ssrRuntime, modelName, queryKey],\n )\n\n const seedPageInfoRaw = useMemo(\n () => (\n enabled && ssrEnabled\n ? ssrRuntime\n ? ssrRuntime.getQueryPageInfo(modelName, queryKey)\n : peekHydratedRtsQueryPageInfo(modelName, queryKey)\n : undefined\n ),\n [enabled, ssrEnabled, ssrRuntime, modelName, queryKey],\n )\n\n const hasSeedData = Array.isArray(seedDataRaw)\n const seedData = hasSeedData ? seedDataRaw as T[] : undefined\n const seedPageInfo = normalizePageInfo(seedPageInfoRaw)\n const seedJson = (() => {\n if (!hasSeedData) return \"\"\n try {\n return JSON.stringify(seedDataRaw)\n } catch {\n return \"\"\n }\n })()\n const seedPageInfoJson = (() => {\n if (!seedPageInfo) return \"\"\n try {\n return JSON.stringify(seedPageInfo)\n } catch {\n return \"\"\n }\n })()\n\n const [data, setData] = useState<T[] | undefined>(() => (isPaginated ? undefined : seedData))\n const [headPage, setHeadPage] = useState<LoadedPage<T> | null>(() => (\n isPaginated && seedData ? { nodes: seedData, ...(seedPageInfo ? { pageInfo: seedPageInfo } : {}) } : null\n ))\n const [previousPages, setPreviousPages] = useState<Array<LoadedPage<T>>>([])\n const [nextPages, setNextPages] = useState<Array<LoadedPage<T>>>([])\n const [source, setSource] = useState<RtsQueryContext[\"source\"] | undefined>(() => (hasSeedData ? \"cache\" : undefined))\n const [error, setError] = useState<unknown | undefined>(undefined)\n const [loading, setLoading] = useState<boolean>(enabled && !hasSeedData)\n const [pagingDirection, setPagingDirection] = useState<\"next\" | \"prev\" | null>(null)\n\n const hasFirstReply = useRef(false)\n const hasNetworkReply = useRef(false)\n const lastDataJsonRef = useRef<string>(\"\")\n const previousPagesRef = useRef<Array<LoadedPage<T>>>([])\n const nextPagesRef = useRef<Array<LoadedPage<T>>>([])\n const headPageRef = useRef<LoadedPage<T> | null>(null)\n const pagingDirectionRef = useRef<\"next\" | \"prev\" | null>(null)\n\n useEffect(() => {\n previousPagesRef.current = previousPages\n }, [previousPages])\n\n useEffect(() => {\n nextPagesRef.current = nextPages\n }, [nextPages])\n\n useEffect(() => {\n headPageRef.current = headPage\n }, [headPage])\n\n useEffect(() => {\n pagingDirectionRef.current = pagingDirection\n }, [pagingDirection])\n\n useEffect(() => {\n if (!ssrRuntime && enabled && ssrEnabled && hasSeedData) {\n consumeHydratedRtsQueryData(modelName, queryKey)\n }\n\n hasFirstReply.current = hasSeedData\n hasNetworkReply.current = false\n lastDataJsonRef.current = seedJson\n setError(undefined)\n setPreviousPages([])\n setNextPages([])\n\n if (!enabled) {\n setLoading(false)\n setData(undefined)\n setHeadPage(null)\n setSource(undefined)\n return\n }\n\n if (hasSeedData) {\n const nextSeedData = seedData as T[]\n setLoading(false)\n setSource(\"cache\")\n if (isPaginated) {\n setHeadPage({\n nodes: nextSeedData,\n ...(seedPageInfo ? { pageInfo: seedPageInfo } : {}),\n })\n setData(undefined)\n } else {\n setData(nextSeedData)\n setHeadPage(null)\n }\n return\n }\n\n setData(undefined)\n setHeadPage(null)\n setLoading(true)\n }, [enabled, ssrEnabled, ssrRuntime, modelName, queryKey, hasSeedData, seedJson, seedPageInfoJson, isPaginated])\n\n useEffect(() => {\n if (!enabled) return\n\n const runInitialNetworkQuery = refreshOnMount || !hasSeedData\n const runInitialLocalQuery = !hasSeedData && !hasPopulate && !isPaginated\n\n const unsubscribe = registerQuery(\n modelName,\n query,\n {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: options.pagination,\n },\n (err, result, context) => {\n if (context.source === \"cache\" && hasNetworkReply.current) return\n\n if (context.source === \"network\") {\n hasNetworkReply.current = true\n }\n\n setLoading(false)\n\n if (err) {\n setError(err)\n return\n }\n\n if (!Array.isArray(result)) return\n\n if (context.source === \"network\" && context.isLocal && options.skipLocal && hasFirstReply.current) {\n return\n }\n\n hasFirstReply.current = true\n const networkPageInfo = context.source === \"network\" ? context.pageInfo : undefined\n\n const payloadForHash = isPaginated\n ? { result, pageInfo: networkPageInfo }\n : result\n\n let nextJson = \"\"\n try {\n nextJson = JSON.stringify(payloadForHash)\n } catch {\n nextJson = \"\"\n }\n\n if (nextJson && nextJson === lastDataJsonRef.current) {\n setSource(context.source)\n return\n }\n\n lastDataJsonRef.current = nextJson\n setSource(context.source)\n setError(undefined)\n\n if (isPaginated) {\n setHeadPage({\n nodes: result as T[],\n ...(networkPageInfo ? { pageInfo: networkPageInfo } : {}),\n })\n return\n }\n\n setData(result as T[])\n },\n {\n runInitialNetworkQuery,\n runInitialLocalQuery,\n },\n )\n\n return () => {\n unsubscribe?.()\n }\n }, [\n enabled,\n modelName,\n queryKey,\n queryJson,\n projectionJson,\n sortJson,\n limitStr,\n populateJson,\n paginationJson,\n hasSeedData,\n refreshOnMount,\n isPaginated,\n ])\n\n const effectivePageInfo = useMemo<PaginationPageInfo | undefined>(() => {\n if (!isPaginated) return undefined\n\n const firstPageInfo = previousPages.length > 0\n ? previousPages[0]?.pageInfo\n : headPage?.pageInfo\n\n const lastPageInfo = nextPages.length > 0\n ? nextPages[nextPages.length - 1]?.pageInfo\n : headPage?.pageInfo\n\n if (!firstPageInfo && !lastPageInfo) return undefined\n\n const hasPrevPage = Boolean(firstPageInfo?.hasPrevPage)\n const hasNextPage = Boolean(lastPageInfo?.hasNextPage)\n const prevCursor = firstPageInfo?.prevCursor\n const nextCursor = lastPageInfo?.nextCursor\n\n return {\n hasPrevPage,\n hasNextPage,\n ...(prevCursor ? { prevCursor } : {}),\n ...(nextCursor ? { nextCursor } : {}),\n }\n }, [headPage, isPaginated, nextPages, previousPages])\n\n const mergedPaginatedData = useMemo<T[] | undefined>(() => {\n if (!isPaginated) return undefined\n if (!headPage && previousPages.length === 0 && nextPages.length === 0) return undefined\n return flattenLoadedPages(previousPages, headPage, nextPages)\n }, [headPage, isPaginated, nextPages, previousPages])\n\n const fetchNext = async (): Promise<boolean> => {\n if (!enabled || !isPaginated || !options.pagination) return false\n if (pagingDirectionRef.current) return false\n\n const currentHead = headPageRef.current\n const currentNextPages = nextPagesRef.current\n const cursor = currentNextPages.length > 0\n ? currentNextPages[currentNextPages.length - 1]?.pageInfo?.nextCursor\n : currentHead?.pageInfo?.nextCursor\n\n const hasNextPage = currentNextPages.length > 0\n ? Boolean(currentNextPages[currentNextPages.length - 1]?.pageInfo?.hasNextPage)\n : Boolean(currentHead?.pageInfo?.hasNextPage)\n\n if (!cursor || !hasNextPage) return false\n\n setPagingDirection(\"next\")\n setLoading(true)\n setError(undefined)\n\n try {\n const response = await runNetworkQuery({\n modelName,\n query,\n options: {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: {\n ...options.pagination,\n direction: \"next\",\n cursor,\n },\n },\n })\n\n if (!Array.isArray(response.data)) return false\n\n const page: LoadedPage<T> = {\n nodes: response.data as T[],\n ...(response.context.source === \"network\" && response.context.pageInfo\n ? { pageInfo: response.context.pageInfo }\n : {}),\n }\n\n setSource(\"network\")\n setNextPages((current) => [...current, page])\n return true\n } catch (err) {\n setError(err)\n return false\n } finally {\n setPagingDirection(null)\n setLoading(false)\n }\n }\n\n const fetchPrevious = async (): Promise<boolean> => {\n if (!enabled || !isPaginated || !options.pagination) return false\n if (pagingDirectionRef.current) return false\n\n const currentHead = headPageRef.current\n const currentPreviousPages = previousPagesRef.current\n const cursor = currentPreviousPages.length > 0\n ? currentPreviousPages[0]?.pageInfo?.prevCursor\n : currentHead?.pageInfo?.prevCursor\n\n const hasPrevPage = currentPreviousPages.length > 0\n ? Boolean(currentPreviousPages[0]?.pageInfo?.hasPrevPage)\n : Boolean(currentHead?.pageInfo?.hasPrevPage)\n\n if (!cursor || !hasPrevPage) return false\n\n setPagingDirection(\"prev\")\n setLoading(true)\n setError(undefined)\n\n try {\n const response = await runNetworkQuery({\n modelName,\n query,\n options: {\n key,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n populate: options.populate,\n pagination: {\n ...options.pagination,\n direction: \"prev\",\n cursor,\n },\n },\n })\n\n if (!Array.isArray(response.data)) return false\n\n const page: LoadedPage<T> = {\n nodes: response.data as T[],\n ...(response.context.source === \"network\" && response.context.pageInfo\n ? { pageInfo: response.context.pageInfo }\n : {}),\n }\n\n setSource(\"network\")\n setPreviousPages((current) => [page, ...current])\n return true\n } catch (err) {\n setError(err)\n return false\n } finally {\n setPagingDirection(null)\n setLoading(false)\n }\n }\n\n const resetPagination = () => {\n if (!isPaginated) return\n setPreviousPages([])\n setNextPages([])\n }\n\n return useMemo(\n () => ({\n data: isPaginated ? mergedPaginatedData : data,\n pageInfo: effectivePageInfo,\n source,\n error,\n loading,\n fetchNext,\n fetchPrevious,\n resetPagination,\n }),\n [\n data,\n effectivePageInfo,\n error,\n fetchNext,\n fetchPrevious,\n isPaginated,\n loading,\n mergedPaginatedData,\n source,\n ],\n )\n}\n"],"names":["STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY","RtsSsrRuntimeContext","createContext","hydrationDataStore","Map","hydrationPageInfoStore","makeStoreKey","modelName","queryKey","normalizeStringOrNull","value","normalized","trim","normalizePageInfo","Array","isArray","undefined","raw","hasNextPage","hasPrevPage","nextCursor","prevCursor","parseHydrationData","v","queries","entry","query","data","pageInfo","push","tenantId","uid","hydrateRtsFromWindow","window","browserWindow","parsed","clear","set","peekHydratedRtsQueryData","get","peekHydratedRtsQueryPageInfo","consumeHydratedRtsQueryData","key","delete","clearHydratedRtsQueryData","RtsSsrRuntimeProvider","t0","$","_c","children","t1","useRtsSsrRuntime","useContext","UNDERSCORE_PREFIX","DEFAULT_FIND_LIMIT","storeConfig","pouchDbPromise","lastAppliedPrefix","collections","dbNamesByPrefix","unwrapDefault","mod","maybe","default","ensureBrowser","Error","computeBasePrefix","appName","prefix","getDbNamesKey","getPrefixOverrideKey","readPrefixOverride","localStorage","getItem","endsWith","getPrefix","basePrefix","override","loadDbNames","existing","names","Set","JSON","parse","add","persistDbNames","size","removeItem","setItem","stringify","from","registerDbName","dbName","has","unregisterDbName","getPouchDb","core","indexedDbAdapter","findPlugin","Promise","all","PouchDB","plugin","applyPrefix","configureRtsPouchStore","config","getCollection","options","dbKey","db","adapter","revs_limit","replaceQueryKeys","replaceKey","map","item","obj","next","Object","create","getPrototypeOf","keys","test","newKey","getKeys","parentKey","nextKey","satisfiesProjection","doc","projection","docKeys","projectionKeys","filter","remapDocFromStorage","entries","startsWith","replace","runQuery","collection","replacedQuery","limit","Math","abs","docs","find","selector","mappedDocs","_rev","_revIgnored","rest","sort","a","b","hasOwn","dir","aVal","bVal","context","source","updateDocs","allIds","_id","Boolean","length","currentDocs","$in","fields","currentDocsById","reduce","acc","id","String","newDocs","mongoDoc","currentDoc","nextDoc","rev","bulkDocs","deleteDocs","ids","deletions","_deleted","destroyCollection","destroy","resetRtsPouchStore","oldPrefix","dbNames","openDbs","remaining","catch","PouchDBForPrefix","defaults","name","then","newPrefix","Date","now","toString","destroyAllCollections","dbs","values","computeRtsQueryKey","populate","pagination","TENANT_ID_QUERY_PARAM","RTS_CHANGES_ROUTE","MAX_TXN_BUF","SERVER_RECONNECT_DELAY_MIN_MS","SERVER_RECONNECT_DELAY_MAX_MS","socket","connectPromise","explicitDisconnect","currentTenantId","currentUid","connectOptions","localTxnBuf","queryCallbacks","subscriptions","messageCallbacks","reconnectTimer","reconnectAttempts","hasEstablishedConnection","pendingServerReconnectJitter","syncPromise","syncKey","buildSocketUrl","_uid","url","URL","searchParams","base","location","href","protocol","pathname","path","search","hash","sendToServer","message","readyState","WebSocket","OPEN","send","resubscribeAll","forceInitialQuery","sub","runInitialQuery","runInitialNetworkQuery","type","clearReconnectTimer","clearTimeout","scheduleReconnect","cfg","reconnect","maxAttempts","attempts","delayMs","delayMaxMs","delay","min","pow","span","floor","random","setTimeout","connectInternal","resetReconnectAttempts","isDocWithId","handleQueryPayload","payload","error","txnId","cbKey","callbacks","subscription","hasPopulate","hasPagination","isLocal","includes","cb","handleEvent","event","handleMessage","addLocalTxn","shift","getSyncStorageKey","readStoredSeq","num","Number","isFinite","writeStoredSeq","max","applyChangeBatch","changes","resetModels","deletesByModel","change","op","docId","syncRtsChanges","storageKey","sinceSeq","i","encodeURIComponent","response","fetch","method","credentials","headers","body","ok","json","payloadObj","latestSeq","needsFullResync","changesRaw","c","seq","lastSeq","ensureSynced","syncChanges","finally","resolve","configureStore","CONNECTING","reject","opened","settled","addEventListener","code","err","connect","disconnect","close","registerQuery","optionsOrCallback","callbackMaybe","behavior","callback","runInitialLocalQuery","makeRunQueryKey","slice","runNetworkQuery","timeoutMs","resolvedOptions","timeoutId","cleanup","settle","sendMessage","onMessage","getDocId","dedupeById","seen","merged","flattenLoadedPages","previousPages","headPage","nextPages","page","nodes","useQuery","useId","enabled","ssrEnabled","ssr","refreshOnMount","queryJson","projectionJson","sortJson","limitStr","populateJson","paginationJson","isPaginated","ssrRuntime","seedDataRaw","useMemo","getQueryData","seedPageInfoRaw","getQueryPageInfo","hasSeedData","seedData","seedPageInfo","seedJson","seedPageInfoJson","setData","useState","setHeadPage","setPreviousPages","setNextPages","setSource","setError","loading","setLoading","pagingDirection","setPagingDirection","hasFirstReply","useRef","hasNetworkReply","lastDataJsonRef","previousPagesRef","nextPagesRef","headPageRef","pagingDirectionRef","useEffect","current","nextSeedData","unsubscribe","result","skipLocal","networkPageInfo","payloadForHash","nextJson","effectivePageInfo","firstPageInfo","lastPageInfo","mergedPaginatedData","fetchNext","currentHead","currentNextPages","cursor","direction","fetchPrevious","currentPreviousPages","resetPagination"],"mappings":"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"}
|