@rpcbase/client 0.395.0 → 0.396.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, w as useQuery } from "./useQuery-Q5Bygu9_.js";
10
- import { R, S, p, q, t, v } from "./useQuery-Q5Bygu9_.js";
9
+ import { n as hydrateRtsFromWindow, w as useQuery } from "./useQuery-RjGxHubQ.js";
10
+ import { R, S, p, q, t, v } from "./useQuery-RjGxHubQ.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, v, j, k, r, l, e, s, m, u, w } from "../useQuery-Q5Bygu9_.js";
1
+ import { R, S, f, p, c, h, b, d, a, i, g, n, o, q, t, v, j, k, r, l, e, s, m, u, w } from "../useQuery-RjGxHubQ.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":"pouchStore.d.ts","sourceRoot":"","sources":["../../src/rts/pouchStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pouchStore.d.ts","sourceRoot":"","sources":["../../src/rts/pouchStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ type RuntimeStorage = {
2
+ getItem: (key: string) => string | null;
3
+ setItem: (key: string, value: string) => void;
4
+ removeItem: (key: string) => void;
5
+ };
6
+ export declare const isReactNativeRuntime: () => boolean;
7
+ export declare const getRuntimeStorage: () => RuntimeStorage;
8
+ export {};
9
+ //# sourceMappingURL=runtimeStorage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtimeStorage.d.ts","sourceRoot":"","sources":["../../src/rts/runtimeStorage.ts"],"names":[],"mappings":"AAAA,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;IACvC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CAClC,CAAA;AA6CD,eAAO,MAAM,oBAAoB,QAAO,OAGvC,CAAA;AAsDD,eAAO,MAAM,iBAAiB,QAAO,cAYpC,CAAA"}
@@ -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;AAKtE,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;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,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;AA6Q7F,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,SAkFjB,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,CAsGtD,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"}
1
+ {"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../../src/rts/wsClient.ts"],"names":[],"mappings":"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"}
@@ -124,11 +124,97 @@ const RtsSsrRuntimeProvider = (t0) => {
124
124
  const useRtsSsrRuntime = () => {
125
125
  return useContext(RtsSsrRuntimeContext);
126
126
  };
127
+ const memoryStore = /* @__PURE__ */ new Map();
128
+ let reactNativeStorage = null;
129
+ const MMKV_STORAGE_ID = "rpcbase-rts";
130
+ const memoryStorage = {
131
+ getItem: (key) => memoryStore.get(key) ?? null,
132
+ setItem: (key, value) => {
133
+ memoryStore.set(key, String(value));
134
+ },
135
+ removeItem: (key) => {
136
+ memoryStore.delete(key);
137
+ }
138
+ };
139
+ const asRuntimeStorage = (value) => {
140
+ if (!value || typeof value !== "object") return null;
141
+ const candidate = value;
142
+ if (typeof candidate.getItem !== "function" || typeof candidate.setItem !== "function" || typeof candidate.removeItem !== "function") {
143
+ return null;
144
+ }
145
+ return {
146
+ getItem: candidate.getItem.bind(value),
147
+ setItem: candidate.setItem.bind(value),
148
+ removeItem: candidate.removeItem.bind(value)
149
+ };
150
+ };
151
+ const isReactNativeRuntime = () => {
152
+ if (typeof navigator === "undefined") return false;
153
+ return navigator.product === "ReactNative";
154
+ };
155
+ const getRuntimeRequire = () => {
156
+ const globalRequire = globalThis.require;
157
+ if (typeof globalRequire === "function") {
158
+ return globalRequire;
159
+ }
160
+ try {
161
+ return (0, eval)("require");
162
+ } catch {
163
+ return null;
164
+ }
165
+ };
166
+ const getReactNativeStorage = () => {
167
+ if (reactNativeStorage) return reactNativeStorage;
168
+ const runtimeRequire = getRuntimeRequire();
169
+ if (!runtimeRequire) {
170
+ throw new Error("RTS storage: react-native-mmkv is required in React Native runtime");
171
+ }
172
+ let mmkvModule;
173
+ try {
174
+ mmkvModule = runtimeRequire("react-native-mmkv");
175
+ } catch (error) {
176
+ const runtimeError = error instanceof Error ? ` ${error.message}` : "";
177
+ throw new Error(`RTS storage: react-native-mmkv is required in React Native runtime.${runtimeError}`);
178
+ }
179
+ const MMKV = mmkvModule.MMKV;
180
+ if (typeof MMKV !== "function") {
181
+ throw new Error("RTS storage: invalid react-native-mmkv module shape");
182
+ }
183
+ const mmkv = new MMKV({
184
+ id: MMKV_STORAGE_ID
185
+ });
186
+ reactNativeStorage = {
187
+ getItem: (key) => {
188
+ const value = mmkv.getString(key);
189
+ return typeof value === "string" ? value : null;
190
+ },
191
+ setItem: (key, value) => {
192
+ mmkv.set(key, String(value));
193
+ },
194
+ removeItem: (key) => {
195
+ mmkv.delete(key);
196
+ }
197
+ };
198
+ return reactNativeStorage;
199
+ };
200
+ const getRuntimeStorage = () => {
201
+ if (isReactNativeRuntime()) {
202
+ return getReactNativeStorage();
203
+ }
204
+ const direct = asRuntimeStorage(globalThis.localStorage);
205
+ if (direct) return direct;
206
+ const windowStorage = asRuntimeStorage(globalThis.window?.localStorage);
207
+ if (windowStorage) return windowStorage;
208
+ return memoryStorage;
209
+ };
127
210
  const UNDERSCORE_PREFIX = "$_";
128
211
  const DEFAULT_FIND_LIMIT = 4096;
212
+ const INDEXED_DB_ADAPTER = "indexeddb";
213
+ const REACT_NATIVE_SQLITE_ADAPTER = "react-native-sqlite";
129
214
  let storeConfig = null;
130
215
  let pouchDbPromise = null;
131
216
  let lastAppliedPrefix = null;
217
+ let activePouchAdapter = INDEXED_DB_ADAPTER;
132
218
  const collections = /* @__PURE__ */ new Map();
133
219
  const dbNamesByPrefix = /* @__PURE__ */ new Map();
134
220
  const unwrapDefault = (mod) => {
@@ -136,11 +222,6 @@ const unwrapDefault = (mod) => {
136
222
  const maybe = mod;
137
223
  return maybe.default ?? mod;
138
224
  };
139
- const ensureBrowser$1 = () => {
140
- if (typeof window === "undefined") {
141
- throw new Error("RTS PouchDB store can only be used in the browser");
142
- }
143
- };
144
225
  const computeBasePrefix = ({
145
226
  tenantId,
146
227
  appName
@@ -159,8 +240,9 @@ const readPrefixOverride = ({
159
240
  tenantId,
160
241
  appName
161
242
  }) => {
243
+ const storage = getRuntimeStorage();
162
244
  try {
163
- const value = window.localStorage.getItem(getPrefixOverrideKey({
245
+ const value = storage.getItem(getPrefixOverrideKey({
164
246
  tenantId,
165
247
  appName
166
248
  }));
@@ -190,8 +272,9 @@ const loadDbNames = (prefix) => {
190
272
  const existing = dbNamesByPrefix.get(prefix);
191
273
  if (existing) return existing;
192
274
  const names = /* @__PURE__ */ new Set();
275
+ const storage = getRuntimeStorage();
193
276
  try {
194
- const raw = window.localStorage.getItem(getDbNamesKey(prefix));
277
+ const raw = storage.getItem(getDbNamesKey(prefix));
195
278
  if (raw) {
196
279
  const parsed = JSON.parse(raw);
197
280
  if (Array.isArray(parsed)) {
@@ -207,13 +290,14 @@ const loadDbNames = (prefix) => {
207
290
  return names;
208
291
  };
209
292
  const persistDbNames = (prefix, names) => {
293
+ const storage = getRuntimeStorage();
210
294
  try {
211
295
  if (!names.size) {
212
- window.localStorage.removeItem(getDbNamesKey(prefix));
296
+ storage.removeItem(getDbNamesKey(prefix));
213
297
  dbNamesByPrefix.delete(prefix);
214
298
  return;
215
299
  }
216
- window.localStorage.setItem(getDbNamesKey(prefix), JSON.stringify(Array.from(names)));
300
+ storage.setItem(getDbNamesKey(prefix), JSON.stringify(Array.from(names)));
217
301
  dbNamesByPrefix.set(prefix, names);
218
302
  } catch {
219
303
  return;
@@ -233,12 +317,29 @@ const unregisterDbName = (prefix, dbName) => {
233
317
  persistDbNames(prefix, names);
234
318
  };
235
319
  const getPouchDb = async () => {
236
- ensureBrowser$1();
237
320
  if (!pouchDbPromise) {
238
321
  pouchDbPromise = (async () => {
239
- const [core, indexedDbAdapter, findPlugin] = await Promise.all([import("pouchdb-core"), import("pouchdb-adapter-indexeddb"), import("pouchdb-find")]);
322
+ const [core, findPlugin] = await Promise.all([import("pouchdb-core"), import("pouchdb-find")]);
240
323
  const PouchDB = unwrapDefault(core);
241
- PouchDB.plugin(unwrapDefault(indexedDbAdapter));
324
+ if (isReactNativeRuntime()) {
325
+ const moduleName = "pouchdb-adapter-react-native-sqlite";
326
+ let sqliteAdapterModule;
327
+ try {
328
+ sqliteAdapterModule = await import(
329
+ /* @vite-ignore */
330
+ moduleName
331
+ );
332
+ } catch (error) {
333
+ const runtimeError = error instanceof Error ? ` ${error.message}` : "";
334
+ throw new Error(`RTS PouchDB: missing react-native sqlite adapter. Install \`pouchdb-adapter-react-native-sqlite\` in the app.${runtimeError}`);
335
+ }
336
+ PouchDB.plugin(unwrapDefault(sqliteAdapterModule));
337
+ activePouchAdapter = REACT_NATIVE_SQLITE_ADAPTER;
338
+ } else {
339
+ const indexedDbAdapter = await import("pouchdb-adapter-indexeddb");
340
+ PouchDB.plugin(unwrapDefault(indexedDbAdapter));
341
+ activePouchAdapter = INDEXED_DB_ADAPTER;
342
+ }
242
343
  PouchDB.plugin(unwrapDefault(findPlugin));
243
344
  return PouchDB;
244
345
  })();
@@ -266,7 +367,7 @@ const getCollection = async (modelName, options) => {
266
367
  if (existing) return existing;
267
368
  registerDbName(prefix, dbName);
268
369
  const db = new PouchDB(dbName, {
269
- adapter: "indexeddb",
370
+ adapter: activePouchAdapter,
270
371
  revs_limit: 1
271
372
  });
272
373
  collections.set(dbKey, db);
@@ -843,7 +944,6 @@ const resetRtsPouchStore = ({
843
944
  tenantId,
844
945
  appName
845
946
  }) => {
846
- ensureBrowser$1();
847
947
  const basePrefix = computeBasePrefix({
848
948
  tenantId,
849
949
  appName
@@ -864,7 +964,7 @@ const resetRtsPouchStore = ({
864
964
  PouchDBForPrefix.prefix = oldPrefix;
865
965
  await Promise.all(Array.from(remaining).map(async (name) => {
866
966
  const db = new PouchDBForPrefix(name, {
867
- adapter: "indexeddb",
967
+ adapter: activePouchAdapter,
868
968
  revs_limit: 1
869
969
  });
870
970
  await db.destroy().then(() => {
@@ -880,8 +980,9 @@ const resetRtsPouchStore = ({
880
980
  }
881
981
  })();
882
982
  const newPrefix = `${basePrefix}reset-${Date.now().toString(16)}/`;
983
+ const storage = getRuntimeStorage();
883
984
  try {
884
- window.localStorage.setItem(getPrefixOverrideKey({
985
+ storage.setItem(getPrefixOverrideKey({
885
986
  tenantId,
886
987
  appName
887
988
  }), newPrefix);
@@ -1080,10 +1181,34 @@ let hasEstablishedConnection = false;
1080
1181
  let pendingServerReconnectJitter = false;
1081
1182
  let syncPromise = null;
1082
1183
  let syncKey = null;
1083
- const ensureBrowser = () => {
1084
- if (typeof window === "undefined") {
1085
- throw new Error("RTS websocket client can only be used in the browser");
1184
+ const ensureRealtimeRuntime = () => {
1185
+ if (typeof WebSocket !== "function") {
1186
+ throw new Error("RTS websocket client requires WebSocket support");
1086
1187
  }
1188
+ if (typeof globalThis.setTimeout !== "function" || typeof globalThis.clearTimeout !== "function") {
1189
+ throw new Error("RTS websocket client requires timer support");
1190
+ }
1191
+ };
1192
+ const ensureSyncRuntime = () => {
1193
+ if (typeof fetch !== "function") {
1194
+ throw new Error("syncRtsChanges requires fetch support");
1195
+ }
1196
+ };
1197
+ const getRuntimeLocationHref = () => {
1198
+ if (typeof window !== "undefined" && typeof window.location?.href === "string" && window.location.href) {
1199
+ return window.location.href;
1200
+ }
1201
+ const location = globalThis.location;
1202
+ if (typeof location?.href === "string" && location.href) {
1203
+ return location.href;
1204
+ }
1205
+ return null;
1206
+ };
1207
+ const setRuntimeTimeout = (handler, delayMs) => {
1208
+ return globalThis.setTimeout(handler, delayMs);
1209
+ };
1210
+ const clearRuntimeTimeout = (timer) => {
1211
+ globalThis.clearTimeout(timer);
1087
1212
  };
1088
1213
  const buildSocketUrl = (tenantId, _uid, options) => {
1089
1214
  if (options.url) {
@@ -1091,7 +1216,11 @@ const buildSocketUrl = (tenantId, _uid, options) => {
1091
1216
  url.searchParams.set(TENANT_ID_QUERY_PARAM, tenantId);
1092
1217
  return url.toString();
1093
1218
  }
1094
- const base = new URL(window.location.href);
1219
+ const locationHref = getRuntimeLocationHref();
1220
+ if (!locationHref) {
1221
+ throw new Error("connect: options.url is required when location.href is unavailable");
1222
+ }
1223
+ const base = new URL(locationHref);
1095
1224
  base.protocol = base.protocol === "https:" ? "wss:" : "ws:";
1096
1225
  base.pathname = options.path ?? "/rts";
1097
1226
  base.search = "";
@@ -1121,9 +1250,7 @@ const resubscribeAll = ({
1121
1250
  };
1122
1251
  const clearReconnectTimer = () => {
1123
1252
  if (reconnectTimer === null) return;
1124
- if (typeof window !== "undefined") {
1125
- window.clearTimeout(reconnectTimer);
1126
- }
1253
+ clearRuntimeTimeout(reconnectTimer);
1127
1254
  reconnectTimer = null;
1128
1255
  };
1129
1256
  const scheduleReconnect = () => {
@@ -1145,7 +1272,7 @@ const scheduleReconnect = () => {
1145
1272
  pendingServerReconnectJitter = false;
1146
1273
  }
1147
1274
  reconnectAttempts += 1;
1148
- reconnectTimer = window.setTimeout(() => {
1275
+ reconnectTimer = setRuntimeTimeout(() => {
1149
1276
  void connectInternal(currentTenantId, currentUid, connectOptions, {
1150
1277
  resetReconnectAttempts: false
1151
1278
  });
@@ -1264,8 +1391,9 @@ const getSyncStorageKey = ({
1264
1391
  appName
1265
1392
  }) => `rb:rts:changesSeq:${appName ?? ""}:${tenantId}:${uid}`;
1266
1393
  const readStoredSeq = (key) => {
1394
+ const storage = getRuntimeStorage();
1267
1395
  try {
1268
- const raw = window.localStorage.getItem(key);
1396
+ const raw = storage.getItem(key);
1269
1397
  const num = raw ? Number(raw) : 0;
1270
1398
  return Number.isFinite(num) && num >= 0 ? Math.floor(num) : 0;
1271
1399
  } catch {
@@ -1273,8 +1401,9 @@ const readStoredSeq = (key) => {
1273
1401
  }
1274
1402
  };
1275
1403
  const writeStoredSeq = (key, value) => {
1404
+ const storage = getRuntimeStorage();
1276
1405
  try {
1277
- window.localStorage.setItem(key, String(Math.max(0, Math.floor(value))));
1406
+ storage.setItem(key, String(Math.max(0, Math.floor(value))));
1278
1407
  } catch {
1279
1408
  return;
1280
1409
  }
@@ -1308,7 +1437,7 @@ const applyChangeBatch = async (changes, uid) => {
1308
1437
  }
1309
1438
  };
1310
1439
  const syncRtsChanges = async (tenantId, uid, options = {}) => {
1311
- ensureBrowser();
1440
+ ensureSyncRuntime();
1312
1441
  if (!tenantId || !uid) return;
1313
1442
  const storageKey = getSyncStorageKey({
1314
1443
  tenantId,
@@ -1393,7 +1522,7 @@ const ensureSynced = (tenantId, uid, options) => {
1393
1522
  const connectInternal = (tenantId, uid, options, {
1394
1523
  resetReconnectAttempts
1395
1524
  }) => {
1396
- ensureBrowser();
1525
+ ensureRealtimeRuntime();
1397
1526
  if (!tenantId) return Promise.resolve();
1398
1527
  if (!uid) throw new Error("Missing uid");
1399
1528
  currentTenantId = tenantId;
@@ -1606,14 +1735,14 @@ const runNetworkQuery = async ({
1606
1735
  });
1607
1736
  if (hasTimeout) {
1608
1737
  await new Promise((resolve, reject) => {
1609
- const timeoutId = window.setTimeout(() => {
1738
+ const timeoutId = setRuntimeTimeout(() => {
1610
1739
  reject(new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR));
1611
1740
  }, timeoutMs);
1612
1741
  connectAttempt.then(() => {
1613
- window.clearTimeout(timeoutId);
1742
+ clearRuntimeTimeout(timeoutId);
1614
1743
  resolve();
1615
1744
  }, (error) => {
1616
- window.clearTimeout(timeoutId);
1745
+ clearRuntimeTimeout(timeoutId);
1617
1746
  reject(error);
1618
1747
  });
1619
1748
  });
@@ -1647,8 +1776,8 @@ const runNetworkQuery = async ({
1647
1776
  const callbacks2 = queryCallbacks.get(cbKey);
1648
1777
  callbacks2?.delete(callback);
1649
1778
  if (callbacks2 && callbacks2.size === 0) queryCallbacks.delete(cbKey);
1650
- if (timeoutId !== null && typeof window !== "undefined") {
1651
- window.clearTimeout(timeoutId);
1779
+ if (timeoutId !== null) {
1780
+ clearRuntimeTimeout(timeoutId);
1652
1781
  }
1653
1782
  };
1654
1783
  const settle = (next) => {
@@ -1671,7 +1800,7 @@ const runNetworkQuery = async ({
1671
1800
  callbacks.add(callback);
1672
1801
  queryCallbacks.set(cbKey, callbacks);
1673
1802
  if (remainingTimeoutMs !== null) {
1674
- timeoutId = window.setTimeout(() => {
1803
+ timeoutId = setRuntimeTimeout(() => {
1675
1804
  settle(() => reject(new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR)));
1676
1805
  }, remainingTimeoutMs);
1677
1806
  }
@@ -2134,4 +2263,4 @@ export {
2134
2263
  peekHydratedRtsQueryTotalCount as v,
2135
2264
  useQuery as w
2136
2265
  };
2137
- //# sourceMappingURL=useQuery-Q5Bygu9_.js.map
2266
+ //# sourceMappingURL=useQuery-RjGxHubQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuery-RjGxHubQ.js","sources":["../src/rts/ssrHydration.tsx","../src/rts/runtimeStorage.ts","../src/rts/pouchStore.ts","../src/rts/populateCache.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 totalCount?: number\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 getQueryTotalCount: (modelName: RtsModelName, queryKey: string) => number | undefined\n}\n\nconst RtsSsrRuntimeContext = createContext<RtsSsrRuntime | null>(null)\n\nconst hydrationDataStore = new Map<string, unknown[]>()\nconst hydrationPageInfoStore = new Map<string, PaginationPageInfo | undefined>()\nconst hydrationTotalCountStore = new Map<string, number | 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 normalizeTotalCount = (value: unknown): number | undefined => {\n if (typeof value !== \"number\") return undefined\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\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 totalCount?: 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 const totalCount = normalizeTotalCount(query.totalCount)\n\n queries.push({\n modelName: modelName as RtsModelName,\n queryKey,\n data: query.data,\n ...(pageInfo ? { pageInfo } : {}),\n ...(totalCount !== undefined ? { totalCount } : {}),\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 hydrationTotalCountStore.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 hydrationTotalCountStore.set(makeStoreKey(query.modelName, query.queryKey), query.totalCount)\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 peekHydratedRtsQueryTotalCount = (\n modelName: RtsModelName,\n queryKey: string,\n): number | undefined => {\n return hydrationTotalCountStore.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 hydrationTotalCountStore.delete(key)\n}\n\nexport const clearHydratedRtsQueryData = (): void => {\n hydrationDataStore.clear()\n hydrationPageInfoStore.clear()\n hydrationTotalCountStore.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 RuntimeStorage = {\n getItem: (key: string) => string | null\n setItem: (key: string, value: string) => void\n removeItem: (key: string) => void\n}\n\ntype RuntimeRequire = (moduleName: string) => unknown\n\ntype MmkvInstance = {\n getString: (key: string) => string | undefined\n set: (key: string, value: string) => void\n delete: (key: string) => void\n}\n\ntype MmkvConstructor = new (options?: { id?: string }) => MmkvInstance\n\nconst memoryStore = new Map<string, string>()\nlet reactNativeStorage: RuntimeStorage | null = null\n\nconst MMKV_STORAGE_ID = \"rpcbase-rts\"\n\nconst memoryStorage: RuntimeStorage = {\n getItem: (key: string) => memoryStore.get(key) ?? null,\n setItem: (key: string, value: string) => {\n memoryStore.set(key, String(value))\n },\n removeItem: (key: string) => {\n memoryStore.delete(key)\n },\n}\n\nconst asRuntimeStorage = (value: unknown): RuntimeStorage | null => {\n if (!value || typeof value !== \"object\") return null\n const candidate = value as Partial<RuntimeStorage>\n if (\n typeof candidate.getItem !== \"function\"\n || typeof candidate.setItem !== \"function\"\n || typeof candidate.removeItem !== \"function\"\n ) {\n return null\n }\n\n return {\n getItem: candidate.getItem.bind(value),\n setItem: candidate.setItem.bind(value),\n removeItem: candidate.removeItem.bind(value),\n }\n}\n\nexport const isReactNativeRuntime = (): boolean => {\n if (typeof navigator === \"undefined\") return false\n return navigator.product === \"ReactNative\"\n}\n\nconst getRuntimeRequire = (): RuntimeRequire | null => {\n const globalRequire = (globalThis as { require?: unknown }).require\n if (typeof globalRequire === \"function\") {\n return globalRequire as RuntimeRequire\n }\n\n try {\n return (0, eval)(\"require\") as RuntimeRequire\n } catch {\n return null\n }\n}\n\nconst getReactNativeStorage = (): RuntimeStorage => {\n if (reactNativeStorage) return reactNativeStorage\n\n const runtimeRequire = getRuntimeRequire()\n if (!runtimeRequire) {\n throw new Error(\"RTS storage: react-native-mmkv is required in React Native runtime\")\n }\n\n let mmkvModule: unknown\n try {\n mmkvModule = runtimeRequire(\"react-native-mmkv\")\n } catch (error) {\n const runtimeError = error instanceof Error ? ` ${error.message}` : \"\"\n throw new Error(`RTS storage: react-native-mmkv is required in React Native runtime.${runtimeError}`)\n }\n\n const MMKV = (mmkvModule as { MMKV?: unknown }).MMKV\n if (typeof MMKV !== \"function\") {\n throw new Error(\"RTS storage: invalid react-native-mmkv module shape\")\n }\n\n const mmkv = new (MMKV as MmkvConstructor)({ id: MMKV_STORAGE_ID })\n\n reactNativeStorage = {\n getItem: (key: string) => {\n const value = mmkv.getString(key)\n return typeof value === \"string\" ? value : null\n },\n setItem: (key: string, value: string) => {\n mmkv.set(key, String(value))\n },\n removeItem: (key: string) => {\n mmkv.delete(key)\n },\n }\n\n return reactNativeStorage\n}\n\nexport const getRuntimeStorage = (): RuntimeStorage => {\n if (isReactNativeRuntime()) {\n return getReactNativeStorage()\n }\n\n const direct = asRuntimeStorage((globalThis as { localStorage?: unknown }).localStorage)\n if (direct) return direct\n\n const windowStorage = asRuntimeStorage((globalThis as { window?: { localStorage?: unknown } }).window?.localStorage)\n if (windowStorage) return windowStorage\n\n return memoryStorage\n}\n","import type { PreparedPopulateEntry, ProjectionSpec } from \"./populateCache\"\nimport { getRuntimeStorage, isReactNativeRuntime } from \"./runtimeStorage\"\n\n\ntype 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\nconst INDEXED_DB_ADAPTER = \"indexeddb\"\nconst REACT_NATIVE_SQLITE_ADAPTER = \"react-native-sqlite\"\n\nlet storeConfig: RtsPouchStoreConfig | null = null\n\nlet pouchDbPromise: Promise<PouchDbStatic> | null = null\nlet lastAppliedPrefix: string | null = null\nlet activePouchAdapter: typeof INDEXED_DB_ADAPTER | typeof REACT_NATIVE_SQLITE_ADAPTER = INDEXED_DB_ADAPTER\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 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 const storage = getRuntimeStorage()\n try {\n const value = storage.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 const storage = getRuntimeStorage()\n try {\n const raw = storage.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 const storage = getRuntimeStorage()\n try {\n if (!names.size) {\n storage.removeItem(getDbNamesKey(prefix))\n dbNamesByPrefix.delete(prefix)\n return\n }\n\n storage.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 if (!pouchDbPromise) {\n pouchDbPromise = (async () => {\n const [core, findPlugin] = await Promise.all([\n import(\"pouchdb-core\"),\n import(\"pouchdb-find\"),\n ])\n\n const PouchDB = unwrapDefault(core) as PouchDbStatic\n\n if (isReactNativeRuntime()) {\n const moduleName = \"pouchdb-adapter-react-native-sqlite\"\n let sqliteAdapterModule: unknown\n try {\n sqliteAdapterModule = await import(/* @vite-ignore */ moduleName)\n } catch (error) {\n const runtimeError = error instanceof Error ? ` ${error.message}` : \"\"\n throw new Error(`RTS PouchDB: missing react-native sqlite adapter. Install \\`pouchdb-adapter-react-native-sqlite\\` in the app.${runtimeError}`)\n }\n PouchDB.plugin(unwrapDefault(sqliteAdapterModule))\n activePouchAdapter = REACT_NATIVE_SQLITE_ADAPTER\n } else {\n const indexedDbAdapter = await import(\"pouchdb-adapter-indexeddb\")\n PouchDB.plugin(unwrapDefault(indexedDbAdapter))\n activePouchAdapter = INDEXED_DB_ADAPTER\n }\n\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: activePouchAdapter, 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 getValueAtPath = (doc: Record<string, unknown>, path: string): unknown => {\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return undefined\n\n let current: unknown = doc\n for (const part of parts) {\n if (!current || typeof current !== \"object\" || Array.isArray(current)) return undefined\n current = (current as Record<string, unknown>)[part]\n }\n return current\n}\n\nconst setValueAtPath = (doc: Record<string, unknown>, path: string, value: unknown): void => {\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return\n\n let current: Record<string, unknown> = doc\n for (let i = 0; i < parts.length - 1; i += 1) {\n const key = parts[i]!\n const existing = current[key]\n if (!existing || typeof existing !== \"object\" || Array.isArray(existing)) {\n current[key] = {}\n }\n current = current[key] as Record<string, unknown>\n }\n\n current[parts[parts.length - 1]!] = value\n}\n\nconst unsetValueAtPath = (doc: Record<string, unknown>, path: string): void => {\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return\n\n let current: Record<string, unknown> = doc\n for (let i = 0; i < parts.length - 1; i += 1) {\n const key = parts[i]!\n const next = current[key]\n if (!next || typeof next !== \"object\" || Array.isArray(next)) return\n current = next as Record<string, unknown>\n }\n\n delete current[parts[parts.length - 1]!]\n}\n\nconst cloneDoc = <T extends Record<string, unknown>>(doc: T): T => {\n try {\n return structuredClone(doc)\n } catch {\n return JSON.parse(JSON.stringify(doc)) as T\n }\n}\n\nconst toProjectionSpec = (projection: Record<string, 0 | 1>): ProjectionSpec => {\n const spec: ProjectionSpec = {}\n for (const [key, value] of Object.entries(projection)) {\n const path = key.trim()\n if (!path) continue\n if (value === 1 || value === 0) {\n spec[path] = value\n }\n }\n return spec\n}\n\nconst applyProjection = <T extends Record<string, unknown>>(\n doc: T,\n projection: Record<string, 0 | 1>,\n): T => {\n const spec = toProjectionSpec(projection)\n const includeKeys = Object.keys(spec).filter((key) => spec[key] === 1)\n const excludeKeys = Object.keys(spec).filter((key) => spec[key] === 0)\n\n if (includeKeys.length > 0) {\n const projected: Record<string, unknown> = {}\n for (const key of includeKeys) {\n const value = getValueAtPath(doc, key)\n if (value !== undefined) setValueAtPath(projected, key, value)\n }\n\n if (spec._id !== 0 && Object.hasOwn(doc, \"_id\")) {\n projected._id = doc._id\n }\n\n return projected as T\n }\n\n const projected = cloneDoc(doc)\n for (const key of excludeKeys) {\n unsetValueAtPath(projected, key)\n }\n return projected\n}\n\nconst compareSort = (\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n sort: Record<string, 1 | -1>,\n): number => {\n for (const key of Object.keys(sort)) {\n const dir = sort[key]\n const aVal = getValueAtPath(a, key)\n const bVal = getValueAtPath(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\nconst extractDocId = (value: unknown): string => {\n if (typeof value === \"string\") return value\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return \"\"\n const id = (value as { _id?: unknown })._id\n return typeof id === \"string\" ? id : \"\"\n}\n\nconst matchValue = (docValue: unknown, matchValueRaw: unknown): boolean | null => {\n if (Array.isArray(matchValueRaw)) {\n if (!Array.isArray(docValue)) return false\n if (docValue.length !== matchValueRaw.length) return false\n for (let i = 0; i < matchValueRaw.length; i += 1) {\n const matched = matchValue(docValue[i], matchValueRaw[i])\n if (matched === null) return null\n if (!matched) return false\n }\n return true\n }\n\n if (matchValueRaw && typeof matchValueRaw === \"object\") {\n const matchObj = matchValueRaw as Record<string, unknown>\n if (Object.keys(matchObj).some((key) => key.startsWith(\"$\"))) return null\n if (!docValue || typeof docValue !== \"object\" || Array.isArray(docValue)) return false\n const docObj = docValue as Record<string, unknown>\n for (const key of Object.keys(matchObj)) {\n const matched = matchValue(docObj[key], matchObj[key])\n if (matched === null) return null\n if (!matched) return false\n }\n return true\n }\n\n return Object.is(docValue, matchValueRaw)\n}\n\nconst matchesSimpleQuery = (doc: Record<string, unknown>, query: Record<string, unknown>): boolean | null => {\n for (const [key, expected] of Object.entries(query)) {\n if (key.startsWith(\"$\")) return null\n const actual = getValueAtPath(doc, key)\n const matched = matchValue(actual, expected)\n if (matched === null) return null\n if (!matched) 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\nconst runQueryInternal = async <T extends Record<string, unknown>>({\n modelName,\n query = {},\n options,\n strictProjection = false,\n}: {\n modelName: string\n query?: Record<string, unknown>\n options: RtsPouchQueryOptions\n strictProjection?: boolean\n}): Promise<{ data: T[]; context: RtsPouchQueryContext; projectionMismatch: boolean }> => {\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 const mappedDocs = docs.map(({ _rev: _revIgnored, ...rest }) => remapDocFromStorage(rest) as T)\n let filteredDocs = mappedDocs\n\n if (options.projection) {\n if (strictProjection && mappedDocs.some((entry) => !satisfiesProjection(entry, options.projection!))) {\n return {\n data: [],\n context: { source: \"cache\" },\n projectionMismatch: true,\n }\n }\n\n filteredDocs = filteredDocs.filter((entry) => satisfiesProjection(entry, options.projection!))\n }\n\n let result: T[] = filteredDocs\n\n if (options.sort) {\n result = result.sort((a, b) => compareSort(a, b, options.sort!))\n }\n\n return { data: result, context: { source: \"cache\" }, projectionMismatch: false }\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 result = await runQueryInternal<T>({ modelName, query, options })\n return { data: result.data, context: result.context }\n}\n\nconst addWriteDoc = (\n writes: Map<string, Map<string, Record<string, unknown> & { _id: string }>>,\n modelName: string,\n doc: Record<string, unknown> & { _id: string },\n): void => {\n const docsById = writes.get(modelName) ?? new Map()\n docsById.set(doc._id, doc)\n writes.set(modelName, docsById)\n}\n\nconst sanitizePopulatedDoc = (\n doc: Record<string, unknown> & { _id: string },\n populate: PreparedPopulateEntry[],\n writes: Map<string, Map<string, Record<string, unknown> & { _id: string }>>,\n): Record<string, unknown> & { _id: string } => {\n const next = cloneDoc(doc)\n\n for (const entry of populate) {\n const value = getValueAtPath(next, entry.path)\n if (value === undefined) continue\n\n if (Array.isArray(value)) {\n const ids: string[] = []\n for (const candidate of value) {\n const id = extractDocId(candidate)\n if (!id) continue\n ids.push(id)\n\n if (!entry.model) continue\n if (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) continue\n\n const candidateDoc = candidate as Record<string, unknown> & { _id: string }\n const nested = entry.populate?.length ? sanitizePopulatedDoc(candidateDoc, entry.populate, writes) : cloneDoc(candidateDoc)\n addWriteDoc(writes, entry.model, nested)\n }\n\n setValueAtPath(next, entry.path, ids)\n continue\n }\n\n const id = extractDocId(value)\n setValueAtPath(next, entry.path, id || null)\n if (!id) continue\n if (!entry.model) continue\n if (!value || typeof value !== \"object\" || Array.isArray(value)) continue\n\n const valueDoc = value as Record<string, unknown> & { _id: string }\n const nested = entry.populate?.length ? sanitizePopulatedDoc(valueDoc, entry.populate, writes) : cloneDoc(valueDoc)\n addWriteDoc(writes, entry.model, nested)\n }\n\n return next\n}\n\nexport const updatePopulatedDocs = async ({\n modelName,\n data,\n uid,\n populate,\n}: {\n modelName: string\n data: Array<Record<string, unknown> & { _id: string }>\n uid: string\n populate: PreparedPopulateEntry[]\n}): Promise<void> => {\n if (!data.length) return\n\n const writes = new Map<string, Map<string, Record<string, unknown> & { _id: string }>>()\n const roots = data.map((doc) => sanitizePopulatedDoc(doc, populate, writes))\n await updateDocs(modelName, roots, uid)\n\n for (const [targetModelName, docsById] of writes.entries()) {\n if (!docsById.size) continue\n await updateDocs(\n targetModelName,\n Array.from(docsById.values()),\n uid,\n )\n }\n}\n\nconst loadProjectedDocsByIds = async ({\n modelName,\n ids,\n uid,\n projection,\n}: {\n modelName: string\n ids: string[]\n uid: string\n projection: ProjectionSpec\n}): Promise<{\n rawDocsById: Map<string, Record<string, unknown>>\n projectedDocsById: Map<string, Record<string, unknown>>\n projectionMismatch: boolean\n}> => {\n const uniqueIds = Array.from(new Set(ids.filter(Boolean)))\n if (!uniqueIds.length) {\n return { rawDocsById: new Map(), projectedDocsById: new Map(), projectionMismatch: false }\n }\n\n const collection = await getCollection(modelName, { uid })\n const { docs } = await collection.find({\n selector: { _id: { $in: uniqueIds } },\n limit: uniqueIds.length,\n })\n\n const rawDocsById = new Map<string, Record<string, unknown>>()\n const projectedDocsById = new Map<string, Record<string, unknown>>()\n let projectionMismatch = false\n\n for (const rawDoc of docs) {\n const id = typeof rawDoc._id === \"string\" ? rawDoc._id : \"\"\n if (!id) continue\n\n const { _rev: _revIgnored, ...rest } = rawDoc\n const remapped = remapDocFromStorage(rest)\n if (!satisfiesProjection(remapped, projection)) {\n projectionMismatch = true\n continue\n }\n\n rawDocsById.set(id, remapped)\n projectedDocsById.set(id, applyProjection(remapped, projection))\n }\n\n if (projectedDocsById.size < uniqueIds.length) {\n projectionMismatch = true\n }\n\n return { rawDocsById, projectedDocsById, projectionMismatch }\n}\n\nconst hydratePopulateEntries = async ({\n docs,\n populate,\n uid,\n}: {\n docs: Array<Record<string, unknown>>\n populate: PreparedPopulateEntry[]\n uid: string\n}): Promise<{ hit: boolean; data: Array<Record<string, unknown>> }> => {\n const currentDocs = docs\n\n for (const entry of populate) {\n if (!entry.model) {\n return { hit: false, data: [] }\n }\n\n const descriptors = currentDocs.map((doc) => {\n const rawValue = getValueAtPath(doc, entry.path)\n const isArray = Array.isArray(rawValue)\n const ids = (isArray ? rawValue : [rawValue])\n .map((candidate) => extractDocId(candidate))\n .filter(Boolean)\n\n return {\n doc,\n hasValue: rawValue !== undefined,\n isArray,\n ids,\n }\n })\n\n const allIds = descriptors.flatMap((descriptor) => descriptor.ids)\n const loaded = await loadProjectedDocsByIds({\n modelName: entry.model,\n ids: allIds,\n uid,\n projection: entry.select,\n })\n\n if (loaded.projectionMismatch) {\n return { hit: false, data: [] }\n }\n\n let populatedDocsById = loaded.projectedDocsById\n\n if (entry.match) {\n const filtered = new Map<string, Record<string, unknown>>()\n for (const [id, candidate] of loaded.rawDocsById.entries()) {\n const matched = matchesSimpleQuery(candidate, entry.match)\n if (matched === null) return { hit: false, data: [] }\n if (!matched) continue\n const projected = populatedDocsById.get(id)\n if (projected) filtered.set(id, projected)\n }\n populatedDocsById = filtered\n }\n\n if (entry.populate?.length) {\n const nestedResult = await hydratePopulateEntries({\n docs: Array.from(populatedDocsById.values()).map((candidate) => cloneDoc(candidate)),\n populate: entry.populate,\n uid,\n })\n if (!nestedResult.hit) {\n return { hit: false, data: [] }\n }\n\n populatedDocsById = nestedResult.data.reduce((acc, candidate) => {\n const id = extractDocId(candidate)\n if (id) acc.set(id, candidate)\n return acc\n }, new Map<string, Record<string, unknown>>())\n }\n\n for (const descriptor of descriptors) {\n if (!descriptor.hasValue) continue\n\n if (!descriptor.ids.length) {\n setValueAtPath(descriptor.doc, entry.path, descriptor.isArray ? [] : null)\n continue\n }\n\n if (descriptor.isArray) {\n let values = descriptor.ids\n .map((id) => populatedDocsById.get(id))\n .filter((candidate): candidate is Record<string, unknown> => Boolean(candidate))\n\n if (entry.options?.sort) {\n values = values.sort((a, b) => compareSort(a, b, entry.options!.sort!))\n }\n\n if (typeof entry.options?.limit === \"number\" && Number.isFinite(entry.options.limit)) {\n values = values.slice(0, Math.max(0, Math.floor(Math.abs(entry.options.limit))))\n }\n\n setValueAtPath(descriptor.doc, entry.path, values)\n continue\n }\n\n const value = populatedDocsById.get(descriptor.ids[0]!)\n setValueAtPath(descriptor.doc, entry.path, value ?? null)\n }\n }\n\n return { hit: true, data: currentDocs }\n}\n\nexport const runPopulatedQuery = 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 projection: ProjectionSpec\n populate: PreparedPopulateEntry[]\n }\n}): Promise<{ hit: boolean; data: T[]; context: RtsPouchQueryContext }> => {\n const rootResult = await runQueryInternal<Record<string, unknown>>({\n modelName,\n query,\n options: {\n uid: options.uid,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n },\n strictProjection: true,\n })\n\n if (rootResult.projectionMismatch) {\n return {\n hit: false,\n data: [],\n context: rootResult.context,\n }\n }\n\n const projectedRoots = rootResult.data.map((doc) => applyProjection(doc, options.projection))\n const hydrated = await hydratePopulateEntries({\n docs: projectedRoots.map((doc) => cloneDoc(doc)),\n populate: options.populate,\n uid: options.uid,\n })\n\n if (!hydrated.hit) {\n return {\n hit: false,\n data: [],\n context: rootResult.context,\n }\n }\n\n return {\n hit: true,\n data: hydrated.data as T[],\n context: rootResult.context,\n }\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 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: activePouchAdapter, 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 const storage = getRuntimeStorage()\n try {\n storage.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 { RtsPopulateObject, RtsPopulateOption, RtsQueryOptions } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport type ProjectionSpec = Record<string, 0 | 1>\nconst EXCLUDE_PROJECTION_ERROR = \"must be include-only (value 1); exclusion projection is not supported\"\n\nexport type PreparedPopulateEntry = {\n path: string\n model?: string\n select: ProjectionSpec\n match?: JsonObject\n options?: {\n sort?: Record<string, 1 | -1>\n limit?: number\n }\n populate?: PreparedPopulateEntry[]\n}\n\nexport type PreparedPopulateCacheOptions = {\n rootProjection: ProjectionSpec\n populate: PreparedPopulateEntry[]\n}\n\nconst sortProjectionSpec = (projection: ProjectionSpec): ProjectionSpec => {\n const sorted: ProjectionSpec = {}\n for (const key of Object.keys(projection).sort()) {\n sorted[key] = projection[key]\n }\n return sorted\n}\n\nconst normalizeProjectionSpec = (\n value: unknown,\n source: string,\n label: string,\n): ProjectionSpec | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n const raw = value as Record<string, unknown>\n const normalized: ProjectionSpec = {}\n let hasExclude = false\n\n for (const [key, rawValue] of Object.entries(raw)) {\n const path = key.trim()\n if (!path) continue\n if (rawValue === 1 || rawValue === true) {\n normalized[path] = 1\n continue\n }\n if (rawValue === 0 || rawValue === false) {\n hasExclude = true\n continue\n }\n if (typeof rawValue === \"number\" && Number.isFinite(rawValue)) {\n if (rawValue === 1) normalized[path] = 1\n if (rawValue === 0) hasExclude = true\n }\n }\n\n if (hasExclude) {\n throw new Error(`${source}: ${label} ${EXCLUDE_PROJECTION_ERROR}`)\n }\n\n return Object.keys(normalized).length > 0 ? sortProjectionSpec(normalized) : undefined\n}\n\nconst normalizeSelectString = (value: string, source: string): ProjectionSpec | undefined => {\n const tokens = value\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter(Boolean)\n\n if (!tokens.length) return undefined\n const normalized: ProjectionSpec = {}\n\n for (const token of tokens) {\n let path = token\n\n if (token.startsWith(\"-\")) {\n throw new Error(`${source}: populate select ${EXCLUDE_PROJECTION_ERROR}`)\n } else if (token.startsWith(\"+\")) {\n path = token.slice(1)\n }\n\n path = path.trim()\n if (!path) continue\n normalized[path] = 1\n }\n\n return Object.keys(normalized).length > 0 ? sortProjectionSpec(normalized) : undefined\n}\n\nconst normalizePopulateSelect = (value: unknown, source: string): ProjectionSpec | undefined => {\n if (typeof value === \"string\") {\n return normalizeSelectString(value, source)\n }\n return normalizeProjectionSpec(value, source, \"populate select\")\n}\n\nconst normalizePopulateOptions = (value: unknown): PreparedPopulateEntry[\"options\"] | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n const raw = value as Record<string, unknown>\n const normalized: PreparedPopulateEntry[\"options\"] = {}\n\n if (raw.sort && typeof raw.sort === \"object\" && !Array.isArray(raw.sort)) {\n const sortRaw = raw.sort as Record<string, unknown>\n const sort: Record<string, 1 | -1> = {}\n\n for (const [key, rawDirection] of Object.entries(sortRaw)) {\n const path = key.trim()\n if (!path) continue\n if (rawDirection === 1 || rawDirection === \"asc\") {\n sort[path] = 1\n continue\n }\n if (rawDirection === -1 || rawDirection === \"desc\") {\n sort[path] = -1\n }\n }\n\n if (Object.keys(sort).length > 0) {\n normalized.sort = sort\n }\n }\n\n if (typeof raw.limit === \"number\" && Number.isFinite(raw.limit)) {\n normalized.limit = Math.max(0, Math.floor(Math.abs(raw.limit)))\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined\n}\n\nconst normalizeString = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") return undefined\n const normalized = value.trim()\n return normalized || undefined\n}\n\nconst normalizeObject = (value: unknown): JsonObject | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n return value as JsonObject\n}\n\nconst normalizePopulateObject = (\n value: RtsPopulateObject,\n source: string,\n): PreparedPopulateEntry => {\n const path = normalizeString(value.path)\n if (!path) {\n throw new Error(`${source}: populate entries must define a non-empty path`)\n }\n\n const select = normalizePopulateSelect(value.select, source)\n if (!select) {\n throw new Error(`${source}: populate entries must define a select projection`)\n }\n\n const nested = value.populate !== undefined\n ? normalizePopulateOption(value.populate, source)\n : undefined\n\n return {\n path,\n select,\n ...(normalizeString(value.model) ? { model: normalizeString(value.model) } : {}),\n ...(normalizeObject(value.match) ? { match: normalizeObject(value.match) } : {}),\n ...(normalizePopulateOptions(value.options) ? { options: normalizePopulateOptions(value.options) } : {}),\n ...(nested && nested.length > 0 ? { populate: nested } : {}),\n }\n}\n\nconst normalizePopulateOption = (\n value: RtsPopulateOption,\n source: string,\n): PreparedPopulateEntry[] => {\n if (typeof value === \"string\") {\n throw new Error(`${source}: populate string syntax is not supported; use object entries with select`)\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n throw new Error(`${source}: populate must contain at least one entry`)\n }\n return value.map((entry) => {\n if (typeof entry === \"string\") {\n throw new Error(`${source}: populate string syntax is not supported; use object entries with select`)\n }\n return normalizePopulateObject(entry, source)\n })\n }\n\n return [normalizePopulateObject(value, source)]\n}\n\nexport const preparePopulateCacheOptions = (\n options: Pick<RtsQueryOptions, \"projection\" | \"populate\">,\n source: string,\n): PreparedPopulateCacheOptions | undefined => {\n if (!options.populate) return undefined\n\n const rootProjection = normalizeProjectionSpec(options.projection, source, \"projection\")\n if (!rootProjection) {\n throw new Error(`${source}: projection is required when populate is used`)\n }\n\n const populate = normalizePopulateOption(options.populate, source)\n if (!populate.length) {\n throw new Error(`${source}: populate must contain at least one entry`)\n }\n\n return {\n rootProjection,\n populate,\n }\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 { preparePopulateCacheOptions } from \"./populateCache\"\nimport type { PreparedPopulateCacheOptions } from \"./populateCache\"\nimport { configureRtsPouchStore, deleteDocs, destroyCollection, resetRtsPouchStore, runPopulatedQuery, runQuery, updateDocs, updatePopulatedDocs } from \"./pouchStore\"\nimport type { RtsModelName } from \"./modelTypes\"\nimport { computeRtsQueryKey } from \"./queryKey\"\nimport { getRuntimeStorage } from \"./runtimeStorage\"\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 totalCount?: number\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 populateCache?: PreparedPopulateCacheOptions\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 totalCount?: 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 ensureRealtimeRuntime = () => {\n if (typeof WebSocket !== \"function\") {\n throw new Error(\"RTS websocket client requires WebSocket support\")\n }\n if (typeof globalThis.setTimeout !== \"function\" || typeof globalThis.clearTimeout !== \"function\") {\n throw new Error(\"RTS websocket client requires timer support\")\n }\n}\n\nconst ensureSyncRuntime = () => {\n if (typeof fetch !== \"function\") {\n throw new Error(\"syncRtsChanges requires fetch support\")\n }\n}\n\nconst getRuntimeLocationHref = (): string | null => {\n if (typeof window !== \"undefined\" && typeof window.location?.href === \"string\" && window.location.href) {\n return window.location.href\n }\n const location = (globalThis as { location?: { href?: unknown } }).location\n if (typeof location?.href === \"string\" && location.href) {\n return location.href\n }\n return null\n}\n\nconst setRuntimeTimeout = (handler: () => void, delayMs: number): number => {\n return globalThis.setTimeout(handler, delayMs) as unknown as number\n}\n\nconst clearRuntimeTimeout = (timer: number): void => {\n globalThis.clearTimeout(timer)\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 locationHref = getRuntimeLocationHref()\n if (!locationHref) {\n throw new Error(\"connect: options.url is required when location.href is unavailable\")\n }\n\n const base = new URL(locationHref)\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 clearRuntimeTimeout(reconnectTimer)\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 = setRuntimeTimeout(() => {\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 normalizeTotalCount = (value: unknown): number | undefined => {\n if (typeof value !== \"number\") return undefined\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\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 totalCount = normalizeTotalCount(payload.totalCount)\n const populateCache = subscription?.populateCache\n const hasPopulate = Boolean(populateCache)\n const hasPagination = Boolean(subscription?.options?.pagination || pageInfo || totalCount !== undefined)\n\n const isLocal = !!(txnId && localTxnBuf.includes(txnId))\n const context: RtsNetworkQueryContext = {\n source: \"network\",\n isLocal,\n txnId,\n ...(pageInfo ? { pageInfo } : {}),\n ...(totalCount !== undefined ? { totalCount } : {}),\n }\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 (hasPagination) return\n\n if (!docs.length) return\n\n if (hasPopulate && populateCache) {\n void updatePopulatedDocs({\n modelName,\n data: docs,\n uid: currentUid,\n populate: populateCache.populate,\n }).catch(() => {})\n return\n }\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 const storage = getRuntimeStorage()\n try {\n const raw = storage.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 const storage = getRuntimeStorage()\n try {\n storage.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 ensureSyncRuntime()\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 ensureRealtimeRuntime()\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 populateCache = preparePopulateCacheOptions(\n { projection: options.projection, populate: options.populate },\n \"registerQuery\",\n )\n const hasPopulate = Boolean(populateCache)\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, ...(populateCache ? { populateCache } : {}) })\n\n if (currentUid && runInitialLocalQuery && !hasPagination) {\n if (hasPopulate && populateCache) {\n void runPopulatedQuery({\n modelName,\n query,\n options: {\n uid: currentUid,\n projection: populateCache.rootProjection,\n sort: options.sort,\n limit: options.limit,\n populate: populateCache.populate,\n },\n }).then(({ hit, data, context }) => {\n if (!hit) return\n callback?.(null, data, context)\n }).catch(() => {\n // ignore\n })\n } else {\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\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 preparePopulateCacheOptions(\n { projection: options.projection, populate: options.populate },\n \"runNetworkQuery\",\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 = setRuntimeTimeout(() => {\n reject(new Error(RUN_NETWORK_QUERY_TIMEOUT_ERROR))\n }, timeoutMs)\n connectAttempt.then(\n () => {\n clearRuntimeTimeout(timeoutId)\n resolve()\n },\n (error) => {\n clearRuntimeTimeout(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) {\n clearRuntimeTimeout(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 = setRuntimeTimeout(() => {\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 { preparePopulateCacheOptions } from \"./populateCache\"\nimport { computeRtsQueryKey } from \"./queryKey\"\nimport { consumeHydratedRtsQueryData, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, peekHydratedRtsQueryTotalCount, 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 normalizeTotalCount = (value: unknown): number | undefined => {\n if (typeof value !== \"number\") return undefined\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\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\nconst assertIncludeOnlyProjection = (\n projection: Record<string, 0 | 1> | undefined,\n): void => {\n if (!projection) return\n\n for (const [path, value] of Object.entries(projection)) {\n if (!path.trim()) continue\n if (value !== 1) {\n throw new Error(\"useQuery: projection must be include-only (value 1); exclusion projection is not supported\")\n }\n }\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 totalCount?: number\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 assertIncludeOnlyProjection(options.projection)\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 preparePopulateCacheOptions(\n { projection: options.projection, populate: options.populate },\n \"useQuery\",\n )\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 seedTotalCountRaw = useMemo(\n () => (\n enabled && ssrEnabled\n ? ssrRuntime\n ? ssrRuntime.getQueryTotalCount(modelName, queryKey)\n : peekHydratedRtsQueryTotalCount(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 seedTotalCount = normalizeTotalCount(seedTotalCountRaw)\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 const seedTotalCountStr = seedTotalCount !== undefined ? String(seedTotalCount) : \"\"\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 [totalCount, setTotalCount] = useState<number | undefined>(() => (isPaginated ? seedTotalCount : undefined))\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 setTotalCount(undefined)\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 setTotalCount(seedTotalCount)\n setData(undefined)\n } else {\n setData(nextSeedData)\n setTotalCount(undefined)\n setHeadPage(null)\n }\n return\n }\n\n setData(undefined)\n setHeadPage(null)\n setTotalCount(undefined)\n setLoading(true)\n }, [enabled, ssrEnabled, ssrRuntime, modelName, queryKey, hasSeedData, seedJson, seedPageInfoJson, seedTotalCountStr, isPaginated])\n\n useEffect(() => {\n if (!enabled) return\n\n const runInitialNetworkQuery = refreshOnMount || !hasSeedData\n const runInitialLocalQuery = !hasSeedData && !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 const networkTotalCount = context.source === \"network\" ? context.totalCount : undefined\n\n const payloadForHash = isPaginated\n ? { result, pageInfo: networkPageInfo, totalCount: networkTotalCount }\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 setTotalCount((current) => (networkTotalCount === undefined ? current : networkTotalCount))\n return\n }\n\n setData(result as T[])\n setTotalCount(undefined)\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 if (response.context.source === \"network\" && response.context.totalCount !== undefined) {\n setTotalCount(response.context.totalCount)\n }\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 if (response.context.source === \"network\" && response.context.totalCount !== undefined) {\n setTotalCount(response.context.totalCount)\n }\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 totalCount: isPaginated ? totalCount : undefined,\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 totalCount,\n ],\n )\n}\n"],"names":["STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY","RtsSsrRuntimeContext","createContext","hydrationDataStore","Map","hydrationPageInfoStore","hydrationTotalCountStore","makeStoreKey","modelName","queryKey","normalizeStringOrNull","value","normalized","trim","normalizePageInfo","Array","isArray","undefined","raw","hasNextPage","hasPrevPage","nextCursor","prevCursor","normalizeTotalCount","Number","isFinite","Math","floor","parseHydrationData","v","queries","entry","query","data","pageInfo","totalCount","push","tenantId","uid","hydrateRtsFromWindow","window","browserWindow","parsed","clear","set","peekHydratedRtsQueryData","get","peekHydratedRtsQueryPageInfo","peekHydratedRtsQueryTotalCount","consumeHydratedRtsQueryData","key","delete","clearHydratedRtsQueryData","RtsSsrRuntimeProvider","t0","$","_c","children","t1","useRtsSsrRuntime","useContext","memoryStore","reactNativeStorage","MMKV_STORAGE_ID","memoryStorage","getItem","setItem","String","removeItem","asRuntimeStorage","candidate","bind","isReactNativeRuntime","navigator","product","getRuntimeRequire","globalRequire","globalThis","require","eval","getReactNativeStorage","runtimeRequire","Error","mmkvModule","error","runtimeError","message","MMKV","mmkv","id","getString","getRuntimeStorage","direct","localStorage","windowStorage","UNDERSCORE_PREFIX","DEFAULT_FIND_LIMIT","INDEXED_DB_ADAPTER","REACT_NATIVE_SQLITE_ADAPTER","storeConfig","pouchDbPromise","lastAppliedPrefix","activePouchAdapter","collections","dbNamesByPrefix","unwrapDefault","mod","maybe","default","computeBasePrefix","appName","prefix","getDbNamesKey","getPrefixOverrideKey","readPrefixOverride","storage","endsWith","getPrefix","basePrefix","override","loadDbNames","existing","names","Set","JSON","parse","add","persistDbNames","size","stringify","from","registerDbName","dbName","has","unregisterDbName","getPouchDb","core","findPlugin","Promise","all","PouchDB","moduleName","sqliteAdapterModule","plugin","indexedDbAdapter","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","getValueAtPath","path","parts","split","part","Boolean","length","current","setValueAtPath","i","unsetValueAtPath","cloneDoc","structuredClone","toProjectionSpec","spec","entries","applyProjection","includeKeys","excludeKeys","projected","_id","hasOwn","compareSort","a","b","sort","dir","aVal","bVal","extractDocId","matchValue","docValue","matchValueRaw","matched","matchObj","some","startsWith","docObj","is","matchesSimpleQuery","expected","actual","remapDocFromStorage","replace","runQueryInternal","strictProjection","collection","replacedQuery","limit","abs","docs","find","selector","mappedDocs","_rev","_revIgnored","rest","filteredDocs","context","source","projectionMismatch","result","runQuery","addWriteDoc","writes","docsById","sanitizePopulatedDoc","populate","ids","model","candidateDoc","nested","valueDoc","updatePopulatedDocs","roots","updateDocs","targetModelName","values","loadProjectedDocsByIds","uniqueIds","rawDocsById","projectedDocsById","$in","rawDoc","remapped","hydratePopulateEntries","currentDocs","hit","descriptors","rawValue","hasValue","allIds","flatMap","descriptor","loaded","select","populatedDocsById","match","filtered","nestedResult","reduce","acc","slice","max","runPopulatedQuery","rootResult","projectedRoots","hydrated","fields","currentDocsById","newDocs","mongoDoc","currentDoc","nextDoc","rev","bulkDocs","deleteDocs","deletions","_deleted","destroyCollection","destroy","resetRtsPouchStore","oldPrefix","dbNames","openDbs","remaining","catch","PouchDBForPrefix","defaults","name","then","newPrefix","Date","now","toString","destroyAllCollections","dbs","EXCLUDE_PROJECTION_ERROR","sortProjectionSpec","sorted","normalizeProjectionSpec","label","hasExclude","normalizeSelectString","tokens","token","normalizePopulateSelect","normalizePopulateOptions","sortRaw","rawDirection","normalizeString","normalizeObject","normalizePopulateObject","normalizePopulateOption","preparePopulateCacheOptions","rootProjection","computeRtsQueryKey","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","ensureRealtimeRuntime","WebSocket","setTimeout","clearTimeout","ensureSyncRuntime","fetch","getRuntimeLocationHref","location","href","setRuntimeTimeout","handler","delayMs","clearRuntimeTimeout","timer","buildSocketUrl","_uid","url","URL","searchParams","locationHref","base","protocol","pathname","search","hash","sendToServer","readyState","OPEN","send","resubscribeAll","forceInitialQuery","sub","runInitialQuery","runInitialNetworkQuery","type","clearReconnectTimer","scheduleReconnect","cfg","reconnect","maxAttempts","attempts","delayMaxMs","delay","min","pow","span","random","connectInternal","resetReconnectAttempts","isDocWithId","handleQueryPayload","payload","txnId","cbKey","callbacks","subscription","populateCache","hasPopulate","hasPagination","isLocal","includes","cb","handleEvent","event","handleMessage","addLocalTxn","shift","getSyncStorageKey","readStoredSeq","num","writeStoredSeq","applyChangeBatch","changes","resetModels","deletesByModel","change","op","docId","syncRtsChanges","storageKey","sinceSeq","encodeURIComponent","response","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","runNetworkQuery","timeoutMs","hasTimeout","timeoutStartedAt","connectAttempt","timeoutId","remainingTimeoutMs","resolvedOptions","cleanup","settle","sendMessage","onMessage","getDocId","dedupeById","seen","merged","flattenLoadedPages","previousPages","headPage","nextPages","page","nodes","assertIncludeOnlyProjection","useQuery","useId","enabled","ssrEnabled","ssr","refreshOnMount","queryJson","projectionJson","sortJson","limitStr","populateJson","paginationJson","isPaginated","ssrRuntime","seedDataRaw","useMemo","getQueryData","seedPageInfoRaw","getQueryPageInfo","seedTotalCountRaw","getQueryTotalCount","hasSeedData","seedData","seedPageInfo","seedTotalCount","seedJson","seedPageInfoJson","seedTotalCountStr","setData","useState","setHeadPage","setTotalCount","setPreviousPages","setNextPages","setSource","setError","loading","setLoading","pagingDirection","setPagingDirection","hasFirstReply","useRef","hasNetworkReply","lastDataJsonRef","previousPagesRef","nextPagesRef","headPageRef","pagingDirectionRef","useEffect","nextSeedData","unsubscribe","skipLocal","networkPageInfo","networkTotalCount","payloadForHash","nextJson","effectivePageInfo","firstPageInfo","lastPageInfo","mergedPaginatedData","fetchNext","currentHead","currentNextPages","cursor","direction","fetchPrevious","currentPreviousPages","resetPagination"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/client",
3
- "version": "0.395.0",
3
+ "version": "0.396.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -1 +0,0 @@
1
- {"version":3,"file":"useQuery-Q5Bygu9_.js","sources":["../src/rts/ssrHydration.tsx","../src/rts/pouchStore.ts","../src/rts/populateCache.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 totalCount?: number\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 getQueryTotalCount: (modelName: RtsModelName, queryKey: string) => number | undefined\n}\n\nconst RtsSsrRuntimeContext = createContext<RtsSsrRuntime | null>(null)\n\nconst hydrationDataStore = new Map<string, unknown[]>()\nconst hydrationPageInfoStore = new Map<string, PaginationPageInfo | undefined>()\nconst hydrationTotalCountStore = new Map<string, number | 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 normalizeTotalCount = (value: unknown): number | undefined => {\n if (typeof value !== \"number\") return undefined\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\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 totalCount?: 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 const totalCount = normalizeTotalCount(query.totalCount)\n\n queries.push({\n modelName: modelName as RtsModelName,\n queryKey,\n data: query.data,\n ...(pageInfo ? { pageInfo } : {}),\n ...(totalCount !== undefined ? { totalCount } : {}),\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 hydrationTotalCountStore.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 hydrationTotalCountStore.set(makeStoreKey(query.modelName, query.queryKey), query.totalCount)\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 peekHydratedRtsQueryTotalCount = (\n modelName: RtsModelName,\n queryKey: string,\n): number | undefined => {\n return hydrationTotalCountStore.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 hydrationTotalCountStore.delete(key)\n}\n\nexport const clearHydratedRtsQueryData = (): void => {\n hydrationDataStore.clear()\n hydrationPageInfoStore.clear()\n hydrationTotalCountStore.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","import type { PreparedPopulateEntry, ProjectionSpec } from \"./populateCache\"\n\n\ntype 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 getValueAtPath = (doc: Record<string, unknown>, path: string): unknown => {\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return undefined\n\n let current: unknown = doc\n for (const part of parts) {\n if (!current || typeof current !== \"object\" || Array.isArray(current)) return undefined\n current = (current as Record<string, unknown>)[part]\n }\n return current\n}\n\nconst setValueAtPath = (doc: Record<string, unknown>, path: string, value: unknown): void => {\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return\n\n let current: Record<string, unknown> = doc\n for (let i = 0; i < parts.length - 1; i += 1) {\n const key = parts[i]!\n const existing = current[key]\n if (!existing || typeof existing !== \"object\" || Array.isArray(existing)) {\n current[key] = {}\n }\n current = current[key] as Record<string, unknown>\n }\n\n current[parts[parts.length - 1]!] = value\n}\n\nconst unsetValueAtPath = (doc: Record<string, unknown>, path: string): void => {\n const parts = path.split(\".\").map((part) => part.trim()).filter(Boolean)\n if (!parts.length) return\n\n let current: Record<string, unknown> = doc\n for (let i = 0; i < parts.length - 1; i += 1) {\n const key = parts[i]!\n const next = current[key]\n if (!next || typeof next !== \"object\" || Array.isArray(next)) return\n current = next as Record<string, unknown>\n }\n\n delete current[parts[parts.length - 1]!]\n}\n\nconst cloneDoc = <T extends Record<string, unknown>>(doc: T): T => {\n try {\n return structuredClone(doc)\n } catch {\n return JSON.parse(JSON.stringify(doc)) as T\n }\n}\n\nconst toProjectionSpec = (projection: Record<string, 0 | 1>): ProjectionSpec => {\n const spec: ProjectionSpec = {}\n for (const [key, value] of Object.entries(projection)) {\n const path = key.trim()\n if (!path) continue\n if (value === 1 || value === 0) {\n spec[path] = value\n }\n }\n return spec\n}\n\nconst applyProjection = <T extends Record<string, unknown>>(\n doc: T,\n projection: Record<string, 0 | 1>,\n): T => {\n const spec = toProjectionSpec(projection)\n const includeKeys = Object.keys(spec).filter((key) => spec[key] === 1)\n const excludeKeys = Object.keys(spec).filter((key) => spec[key] === 0)\n\n if (includeKeys.length > 0) {\n const projected: Record<string, unknown> = {}\n for (const key of includeKeys) {\n const value = getValueAtPath(doc, key)\n if (value !== undefined) setValueAtPath(projected, key, value)\n }\n\n if (spec._id !== 0 && Object.hasOwn(doc, \"_id\")) {\n projected._id = doc._id\n }\n\n return projected as T\n }\n\n const projected = cloneDoc(doc)\n for (const key of excludeKeys) {\n unsetValueAtPath(projected, key)\n }\n return projected\n}\n\nconst compareSort = (\n a: Record<string, unknown>,\n b: Record<string, unknown>,\n sort: Record<string, 1 | -1>,\n): number => {\n for (const key of Object.keys(sort)) {\n const dir = sort[key]\n const aVal = getValueAtPath(a, key)\n const bVal = getValueAtPath(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\nconst extractDocId = (value: unknown): string => {\n if (typeof value === \"string\") return value\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return \"\"\n const id = (value as { _id?: unknown })._id\n return typeof id === \"string\" ? id : \"\"\n}\n\nconst matchValue = (docValue: unknown, matchValueRaw: unknown): boolean | null => {\n if (Array.isArray(matchValueRaw)) {\n if (!Array.isArray(docValue)) return false\n if (docValue.length !== matchValueRaw.length) return false\n for (let i = 0; i < matchValueRaw.length; i += 1) {\n const matched = matchValue(docValue[i], matchValueRaw[i])\n if (matched === null) return null\n if (!matched) return false\n }\n return true\n }\n\n if (matchValueRaw && typeof matchValueRaw === \"object\") {\n const matchObj = matchValueRaw as Record<string, unknown>\n if (Object.keys(matchObj).some((key) => key.startsWith(\"$\"))) return null\n if (!docValue || typeof docValue !== \"object\" || Array.isArray(docValue)) return false\n const docObj = docValue as Record<string, unknown>\n for (const key of Object.keys(matchObj)) {\n const matched = matchValue(docObj[key], matchObj[key])\n if (matched === null) return null\n if (!matched) return false\n }\n return true\n }\n\n return Object.is(docValue, matchValueRaw)\n}\n\nconst matchesSimpleQuery = (doc: Record<string, unknown>, query: Record<string, unknown>): boolean | null => {\n for (const [key, expected] of Object.entries(query)) {\n if (key.startsWith(\"$\")) return null\n const actual = getValueAtPath(doc, key)\n const matched = matchValue(actual, expected)\n if (matched === null) return null\n if (!matched) 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\nconst runQueryInternal = async <T extends Record<string, unknown>>({\n modelName,\n query = {},\n options,\n strictProjection = false,\n}: {\n modelName: string\n query?: Record<string, unknown>\n options: RtsPouchQueryOptions\n strictProjection?: boolean\n}): Promise<{ data: T[]; context: RtsPouchQueryContext; projectionMismatch: boolean }> => {\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 const mappedDocs = docs.map(({ _rev: _revIgnored, ...rest }) => remapDocFromStorage(rest) as T)\n let filteredDocs = mappedDocs\n\n if (options.projection) {\n if (strictProjection && mappedDocs.some((entry) => !satisfiesProjection(entry, options.projection!))) {\n return {\n data: [],\n context: { source: \"cache\" },\n projectionMismatch: true,\n }\n }\n\n filteredDocs = filteredDocs.filter((entry) => satisfiesProjection(entry, options.projection!))\n }\n\n let result: T[] = filteredDocs\n\n if (options.sort) {\n result = result.sort((a, b) => compareSort(a, b, options.sort!))\n }\n\n return { data: result, context: { source: \"cache\" }, projectionMismatch: false }\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 result = await runQueryInternal<T>({ modelName, query, options })\n return { data: result.data, context: result.context }\n}\n\nconst addWriteDoc = (\n writes: Map<string, Map<string, Record<string, unknown> & { _id: string }>>,\n modelName: string,\n doc: Record<string, unknown> & { _id: string },\n): void => {\n const docsById = writes.get(modelName) ?? new Map()\n docsById.set(doc._id, doc)\n writes.set(modelName, docsById)\n}\n\nconst sanitizePopulatedDoc = (\n doc: Record<string, unknown> & { _id: string },\n populate: PreparedPopulateEntry[],\n writes: Map<string, Map<string, Record<string, unknown> & { _id: string }>>,\n): Record<string, unknown> & { _id: string } => {\n const next = cloneDoc(doc)\n\n for (const entry of populate) {\n const value = getValueAtPath(next, entry.path)\n if (value === undefined) continue\n\n if (Array.isArray(value)) {\n const ids: string[] = []\n for (const candidate of value) {\n const id = extractDocId(candidate)\n if (!id) continue\n ids.push(id)\n\n if (!entry.model) continue\n if (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) continue\n\n const candidateDoc = candidate as Record<string, unknown> & { _id: string }\n const nested = entry.populate?.length ? sanitizePopulatedDoc(candidateDoc, entry.populate, writes) : cloneDoc(candidateDoc)\n addWriteDoc(writes, entry.model, nested)\n }\n\n setValueAtPath(next, entry.path, ids)\n continue\n }\n\n const id = extractDocId(value)\n setValueAtPath(next, entry.path, id || null)\n if (!id) continue\n if (!entry.model) continue\n if (!value || typeof value !== \"object\" || Array.isArray(value)) continue\n\n const valueDoc = value as Record<string, unknown> & { _id: string }\n const nested = entry.populate?.length ? sanitizePopulatedDoc(valueDoc, entry.populate, writes) : cloneDoc(valueDoc)\n addWriteDoc(writes, entry.model, nested)\n }\n\n return next\n}\n\nexport const updatePopulatedDocs = async ({\n modelName,\n data,\n uid,\n populate,\n}: {\n modelName: string\n data: Array<Record<string, unknown> & { _id: string }>\n uid: string\n populate: PreparedPopulateEntry[]\n}): Promise<void> => {\n if (!data.length) return\n\n const writes = new Map<string, Map<string, Record<string, unknown> & { _id: string }>>()\n const roots = data.map((doc) => sanitizePopulatedDoc(doc, populate, writes))\n await updateDocs(modelName, roots, uid)\n\n for (const [targetModelName, docsById] of writes.entries()) {\n if (!docsById.size) continue\n await updateDocs(\n targetModelName,\n Array.from(docsById.values()),\n uid,\n )\n }\n}\n\nconst loadProjectedDocsByIds = async ({\n modelName,\n ids,\n uid,\n projection,\n}: {\n modelName: string\n ids: string[]\n uid: string\n projection: ProjectionSpec\n}): Promise<{\n rawDocsById: Map<string, Record<string, unknown>>\n projectedDocsById: Map<string, Record<string, unknown>>\n projectionMismatch: boolean\n}> => {\n const uniqueIds = Array.from(new Set(ids.filter(Boolean)))\n if (!uniqueIds.length) {\n return { rawDocsById: new Map(), projectedDocsById: new Map(), projectionMismatch: false }\n }\n\n const collection = await getCollection(modelName, { uid })\n const { docs } = await collection.find({\n selector: { _id: { $in: uniqueIds } },\n limit: uniqueIds.length,\n })\n\n const rawDocsById = new Map<string, Record<string, unknown>>()\n const projectedDocsById = new Map<string, Record<string, unknown>>()\n let projectionMismatch = false\n\n for (const rawDoc of docs) {\n const id = typeof rawDoc._id === \"string\" ? rawDoc._id : \"\"\n if (!id) continue\n\n const { _rev: _revIgnored, ...rest } = rawDoc\n const remapped = remapDocFromStorage(rest)\n if (!satisfiesProjection(remapped, projection)) {\n projectionMismatch = true\n continue\n }\n\n rawDocsById.set(id, remapped)\n projectedDocsById.set(id, applyProjection(remapped, projection))\n }\n\n if (projectedDocsById.size < uniqueIds.length) {\n projectionMismatch = true\n }\n\n return { rawDocsById, projectedDocsById, projectionMismatch }\n}\n\nconst hydratePopulateEntries = async ({\n docs,\n populate,\n uid,\n}: {\n docs: Array<Record<string, unknown>>\n populate: PreparedPopulateEntry[]\n uid: string\n}): Promise<{ hit: boolean; data: Array<Record<string, unknown>> }> => {\n const currentDocs = docs\n\n for (const entry of populate) {\n if (!entry.model) {\n return { hit: false, data: [] }\n }\n\n const descriptors = currentDocs.map((doc) => {\n const rawValue = getValueAtPath(doc, entry.path)\n const isArray = Array.isArray(rawValue)\n const ids = (isArray ? rawValue : [rawValue])\n .map((candidate) => extractDocId(candidate))\n .filter(Boolean)\n\n return {\n doc,\n hasValue: rawValue !== undefined,\n isArray,\n ids,\n }\n })\n\n const allIds = descriptors.flatMap((descriptor) => descriptor.ids)\n const loaded = await loadProjectedDocsByIds({\n modelName: entry.model,\n ids: allIds,\n uid,\n projection: entry.select,\n })\n\n if (loaded.projectionMismatch) {\n return { hit: false, data: [] }\n }\n\n let populatedDocsById = loaded.projectedDocsById\n\n if (entry.match) {\n const filtered = new Map<string, Record<string, unknown>>()\n for (const [id, candidate] of loaded.rawDocsById.entries()) {\n const matched = matchesSimpleQuery(candidate, entry.match)\n if (matched === null) return { hit: false, data: [] }\n if (!matched) continue\n const projected = populatedDocsById.get(id)\n if (projected) filtered.set(id, projected)\n }\n populatedDocsById = filtered\n }\n\n if (entry.populate?.length) {\n const nestedResult = await hydratePopulateEntries({\n docs: Array.from(populatedDocsById.values()).map((candidate) => cloneDoc(candidate)),\n populate: entry.populate,\n uid,\n })\n if (!nestedResult.hit) {\n return { hit: false, data: [] }\n }\n\n populatedDocsById = nestedResult.data.reduce((acc, candidate) => {\n const id = extractDocId(candidate)\n if (id) acc.set(id, candidate)\n return acc\n }, new Map<string, Record<string, unknown>>())\n }\n\n for (const descriptor of descriptors) {\n if (!descriptor.hasValue) continue\n\n if (!descriptor.ids.length) {\n setValueAtPath(descriptor.doc, entry.path, descriptor.isArray ? [] : null)\n continue\n }\n\n if (descriptor.isArray) {\n let values = descriptor.ids\n .map((id) => populatedDocsById.get(id))\n .filter((candidate): candidate is Record<string, unknown> => Boolean(candidate))\n\n if (entry.options?.sort) {\n values = values.sort((a, b) => compareSort(a, b, entry.options!.sort!))\n }\n\n if (typeof entry.options?.limit === \"number\" && Number.isFinite(entry.options.limit)) {\n values = values.slice(0, Math.max(0, Math.floor(Math.abs(entry.options.limit))))\n }\n\n setValueAtPath(descriptor.doc, entry.path, values)\n continue\n }\n\n const value = populatedDocsById.get(descriptor.ids[0]!)\n setValueAtPath(descriptor.doc, entry.path, value ?? null)\n }\n }\n\n return { hit: true, data: currentDocs }\n}\n\nexport const runPopulatedQuery = 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 projection: ProjectionSpec\n populate: PreparedPopulateEntry[]\n }\n}): Promise<{ hit: boolean; data: T[]; context: RtsPouchQueryContext }> => {\n const rootResult = await runQueryInternal<Record<string, unknown>>({\n modelName,\n query,\n options: {\n uid: options.uid,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n },\n strictProjection: true,\n })\n\n if (rootResult.projectionMismatch) {\n return {\n hit: false,\n data: [],\n context: rootResult.context,\n }\n }\n\n const projectedRoots = rootResult.data.map((doc) => applyProjection(doc, options.projection))\n const hydrated = await hydratePopulateEntries({\n docs: projectedRoots.map((doc) => cloneDoc(doc)),\n populate: options.populate,\n uid: options.uid,\n })\n\n if (!hydrated.hit) {\n return {\n hit: false,\n data: [],\n context: rootResult.context,\n }\n }\n\n return {\n hit: true,\n data: hydrated.data as T[],\n context: rootResult.context,\n }\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 { RtsPopulateObject, RtsPopulateOption, RtsQueryOptions } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport type ProjectionSpec = Record<string, 0 | 1>\nconst EXCLUDE_PROJECTION_ERROR = \"must be include-only (value 1); exclusion projection is not supported\"\n\nexport type PreparedPopulateEntry = {\n path: string\n model?: string\n select: ProjectionSpec\n match?: JsonObject\n options?: {\n sort?: Record<string, 1 | -1>\n limit?: number\n }\n populate?: PreparedPopulateEntry[]\n}\n\nexport type PreparedPopulateCacheOptions = {\n rootProjection: ProjectionSpec\n populate: PreparedPopulateEntry[]\n}\n\nconst sortProjectionSpec = (projection: ProjectionSpec): ProjectionSpec => {\n const sorted: ProjectionSpec = {}\n for (const key of Object.keys(projection).sort()) {\n sorted[key] = projection[key]\n }\n return sorted\n}\n\nconst normalizeProjectionSpec = (\n value: unknown,\n source: string,\n label: string,\n): ProjectionSpec | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n const raw = value as Record<string, unknown>\n const normalized: ProjectionSpec = {}\n let hasExclude = false\n\n for (const [key, rawValue] of Object.entries(raw)) {\n const path = key.trim()\n if (!path) continue\n if (rawValue === 1 || rawValue === true) {\n normalized[path] = 1\n continue\n }\n if (rawValue === 0 || rawValue === false) {\n hasExclude = true\n continue\n }\n if (typeof rawValue === \"number\" && Number.isFinite(rawValue)) {\n if (rawValue === 1) normalized[path] = 1\n if (rawValue === 0) hasExclude = true\n }\n }\n\n if (hasExclude) {\n throw new Error(`${source}: ${label} ${EXCLUDE_PROJECTION_ERROR}`)\n }\n\n return Object.keys(normalized).length > 0 ? sortProjectionSpec(normalized) : undefined\n}\n\nconst normalizeSelectString = (value: string, source: string): ProjectionSpec | undefined => {\n const tokens = value\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter(Boolean)\n\n if (!tokens.length) return undefined\n const normalized: ProjectionSpec = {}\n\n for (const token of tokens) {\n let path = token\n\n if (token.startsWith(\"-\")) {\n throw new Error(`${source}: populate select ${EXCLUDE_PROJECTION_ERROR}`)\n } else if (token.startsWith(\"+\")) {\n path = token.slice(1)\n }\n\n path = path.trim()\n if (!path) continue\n normalized[path] = 1\n }\n\n return Object.keys(normalized).length > 0 ? sortProjectionSpec(normalized) : undefined\n}\n\nconst normalizePopulateSelect = (value: unknown, source: string): ProjectionSpec | undefined => {\n if (typeof value === \"string\") {\n return normalizeSelectString(value, source)\n }\n return normalizeProjectionSpec(value, source, \"populate select\")\n}\n\nconst normalizePopulateOptions = (value: unknown): PreparedPopulateEntry[\"options\"] | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n const raw = value as Record<string, unknown>\n const normalized: PreparedPopulateEntry[\"options\"] = {}\n\n if (raw.sort && typeof raw.sort === \"object\" && !Array.isArray(raw.sort)) {\n const sortRaw = raw.sort as Record<string, unknown>\n const sort: Record<string, 1 | -1> = {}\n\n for (const [key, rawDirection] of Object.entries(sortRaw)) {\n const path = key.trim()\n if (!path) continue\n if (rawDirection === 1 || rawDirection === \"asc\") {\n sort[path] = 1\n continue\n }\n if (rawDirection === -1 || rawDirection === \"desc\") {\n sort[path] = -1\n }\n }\n\n if (Object.keys(sort).length > 0) {\n normalized.sort = sort\n }\n }\n\n if (typeof raw.limit === \"number\" && Number.isFinite(raw.limit)) {\n normalized.limit = Math.max(0, Math.floor(Math.abs(raw.limit)))\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined\n}\n\nconst normalizeString = (value: unknown): string | undefined => {\n if (typeof value !== \"string\") return undefined\n const normalized = value.trim()\n return normalized || undefined\n}\n\nconst normalizeObject = (value: unknown): JsonObject | undefined => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return undefined\n return value as JsonObject\n}\n\nconst normalizePopulateObject = (\n value: RtsPopulateObject,\n source: string,\n): PreparedPopulateEntry => {\n const path = normalizeString(value.path)\n if (!path) {\n throw new Error(`${source}: populate entries must define a non-empty path`)\n }\n\n const select = normalizePopulateSelect(value.select, source)\n if (!select) {\n throw new Error(`${source}: populate entries must define a select projection`)\n }\n\n const nested = value.populate !== undefined\n ? normalizePopulateOption(value.populate, source)\n : undefined\n\n return {\n path,\n select,\n ...(normalizeString(value.model) ? { model: normalizeString(value.model) } : {}),\n ...(normalizeObject(value.match) ? { match: normalizeObject(value.match) } : {}),\n ...(normalizePopulateOptions(value.options) ? { options: normalizePopulateOptions(value.options) } : {}),\n ...(nested && nested.length > 0 ? { populate: nested } : {}),\n }\n}\n\nconst normalizePopulateOption = (\n value: RtsPopulateOption,\n source: string,\n): PreparedPopulateEntry[] => {\n if (typeof value === \"string\") {\n throw new Error(`${source}: populate string syntax is not supported; use object entries with select`)\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n throw new Error(`${source}: populate must contain at least one entry`)\n }\n return value.map((entry) => {\n if (typeof entry === \"string\") {\n throw new Error(`${source}: populate string syntax is not supported; use object entries with select`)\n }\n return normalizePopulateObject(entry, source)\n })\n }\n\n return [normalizePopulateObject(value, source)]\n}\n\nexport const preparePopulateCacheOptions = (\n options: Pick<RtsQueryOptions, \"projection\" | \"populate\">,\n source: string,\n): PreparedPopulateCacheOptions | undefined => {\n if (!options.populate) return undefined\n\n const rootProjection = normalizeProjectionSpec(options.projection, source, \"projection\")\n if (!rootProjection) {\n throw new Error(`${source}: projection is required when populate is used`)\n }\n\n const populate = normalizePopulateOption(options.populate, source)\n if (!populate.length) {\n throw new Error(`${source}: populate must contain at least one entry`)\n }\n\n return {\n rootProjection,\n populate,\n }\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 { preparePopulateCacheOptions } from \"./populateCache\"\nimport type { PreparedPopulateCacheOptions } from \"./populateCache\"\nimport { configureRtsPouchStore, deleteDocs, destroyCollection, resetRtsPouchStore, runPopulatedQuery, runQuery, updateDocs, updatePopulatedDocs } 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 totalCount?: number\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 populateCache?: PreparedPopulateCacheOptions\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 totalCount?: 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 normalizeTotalCount = (value: unknown): number | undefined => {\n if (typeof value !== \"number\") return undefined\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\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 totalCount = normalizeTotalCount(payload.totalCount)\n const populateCache = subscription?.populateCache\n const hasPopulate = Boolean(populateCache)\n const hasPagination = Boolean(subscription?.options?.pagination || pageInfo || totalCount !== undefined)\n\n const isLocal = !!(txnId && localTxnBuf.includes(txnId))\n const context: RtsNetworkQueryContext = {\n source: \"network\",\n isLocal,\n txnId,\n ...(pageInfo ? { pageInfo } : {}),\n ...(totalCount !== undefined ? { totalCount } : {}),\n }\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 (hasPagination) return\n\n if (!docs.length) return\n\n if (hasPopulate && populateCache) {\n void updatePopulatedDocs({\n modelName,\n data: docs,\n uid: currentUid,\n populate: populateCache.populate,\n }).catch(() => {})\n return\n }\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 populateCache = preparePopulateCacheOptions(\n { projection: options.projection, populate: options.populate },\n \"registerQuery\",\n )\n const hasPopulate = Boolean(populateCache)\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, ...(populateCache ? { populateCache } : {}) })\n\n if (currentUid && runInitialLocalQuery && !hasPagination) {\n if (hasPopulate && populateCache) {\n void runPopulatedQuery({\n modelName,\n query,\n options: {\n uid: currentUid,\n projection: populateCache.rootProjection,\n sort: options.sort,\n limit: options.limit,\n populate: populateCache.populate,\n },\n }).then(({ hit, data, context }) => {\n if (!hit) return\n callback?.(null, data, context)\n }).catch(() => {\n // ignore\n })\n } else {\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\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 preparePopulateCacheOptions(\n { projection: options.projection, populate: options.populate },\n \"runNetworkQuery\",\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 { preparePopulateCacheOptions } from \"./populateCache\"\nimport { computeRtsQueryKey } from \"./queryKey\"\nimport { consumeHydratedRtsQueryData, peekHydratedRtsQueryData, peekHydratedRtsQueryPageInfo, peekHydratedRtsQueryTotalCount, 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 normalizeTotalCount = (value: unknown): number | undefined => {\n if (typeof value !== \"number\") return undefined\n if (!Number.isFinite(value) || value < 0) return undefined\n return Math.floor(value)\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\nconst assertIncludeOnlyProjection = (\n projection: Record<string, 0 | 1> | undefined,\n): void => {\n if (!projection) return\n\n for (const [path, value] of Object.entries(projection)) {\n if (!path.trim()) continue\n if (value !== 1) {\n throw new Error(\"useQuery: projection must be include-only (value 1); exclusion projection is not supported\")\n }\n }\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 totalCount?: number\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 assertIncludeOnlyProjection(options.projection)\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 preparePopulateCacheOptions(\n { projection: options.projection, populate: options.populate },\n \"useQuery\",\n )\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 seedTotalCountRaw = useMemo(\n () => (\n enabled && ssrEnabled\n ? ssrRuntime\n ? ssrRuntime.getQueryTotalCount(modelName, queryKey)\n : peekHydratedRtsQueryTotalCount(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 seedTotalCount = normalizeTotalCount(seedTotalCountRaw)\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 const seedTotalCountStr = seedTotalCount !== undefined ? String(seedTotalCount) : \"\"\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 [totalCount, setTotalCount] = useState<number | undefined>(() => (isPaginated ? seedTotalCount : undefined))\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 setTotalCount(undefined)\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 setTotalCount(seedTotalCount)\n setData(undefined)\n } else {\n setData(nextSeedData)\n setTotalCount(undefined)\n setHeadPage(null)\n }\n return\n }\n\n setData(undefined)\n setHeadPage(null)\n setTotalCount(undefined)\n setLoading(true)\n }, [enabled, ssrEnabled, ssrRuntime, modelName, queryKey, hasSeedData, seedJson, seedPageInfoJson, seedTotalCountStr, isPaginated])\n\n useEffect(() => {\n if (!enabled) return\n\n const runInitialNetworkQuery = refreshOnMount || !hasSeedData\n const runInitialLocalQuery = !hasSeedData && !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 const networkTotalCount = context.source === \"network\" ? context.totalCount : undefined\n\n const payloadForHash = isPaginated\n ? { result, pageInfo: networkPageInfo, totalCount: networkTotalCount }\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 setTotalCount((current) => (networkTotalCount === undefined ? current : networkTotalCount))\n return\n }\n\n setData(result as T[])\n setTotalCount(undefined)\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 if (response.context.source === \"network\" && response.context.totalCount !== undefined) {\n setTotalCount(response.context.totalCount)\n }\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 if (response.context.source === \"network\" && response.context.totalCount !== undefined) {\n setTotalCount(response.context.totalCount)\n }\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 totalCount: isPaginated ? totalCount : undefined,\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 totalCount,\n ],\n )\n}\n"],"names":["STATIC_RPCBASE_RTS_HYDRATION_DATA_KEY","RtsSsrRuntimeContext","createContext","hydrationDataStore","Map","hydrationPageInfoStore","hydrationTotalCountStore","makeStoreKey","modelName","queryKey","normalizeStringOrNull","value","normalized","trim","normalizePageInfo","Array","isArray","undefined","raw","hasNextPage","hasPrevPage","nextCursor","prevCursor","normalizeTotalCount","Number","isFinite","Math","floor","parseHydrationData","v","queries","entry","query","data","pageInfo","totalCount","push","tenantId","uid","hydrateRtsFromWindow","window","browserWindow","parsed","clear","set","peekHydratedRtsQueryData","get","peekHydratedRtsQueryPageInfo","peekHydratedRtsQueryTotalCount","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","getValueAtPath","path","parts","split","part","Boolean","length","current","setValueAtPath","i","unsetValueAtPath","cloneDoc","structuredClone","toProjectionSpec","spec","entries","applyProjection","includeKeys","excludeKeys","projected","_id","hasOwn","compareSort","a","b","sort","dir","aVal","bVal","extractDocId","id","matchValue","docValue","matchValueRaw","matched","matchObj","some","startsWith","docObj","is","matchesSimpleQuery","expected","actual","remapDocFromStorage","replace","runQueryInternal","strictProjection","collection","replacedQuery","limit","abs","docs","find","selector","mappedDocs","_rev","_revIgnored","rest","filteredDocs","context","source","projectionMismatch","result","runQuery","addWriteDoc","writes","docsById","sanitizePopulatedDoc","populate","ids","candidate","model","candidateDoc","nested","valueDoc","updatePopulatedDocs","roots","updateDocs","targetModelName","values","loadProjectedDocsByIds","uniqueIds","rawDocsById","projectedDocsById","$in","rawDoc","remapped","hydratePopulateEntries","currentDocs","hit","descriptors","rawValue","hasValue","allIds","flatMap","descriptor","loaded","select","populatedDocsById","match","filtered","nestedResult","reduce","acc","slice","max","runPopulatedQuery","rootResult","projectedRoots","hydrated","fields","currentDocsById","String","newDocs","mongoDoc","currentDoc","nextDoc","rev","bulkDocs","deleteDocs","deletions","_deleted","destroyCollection","destroy","resetRtsPouchStore","oldPrefix","dbNames","openDbs","remaining","catch","PouchDBForPrefix","defaults","name","then","newPrefix","Date","now","toString","destroyAllCollections","dbs","EXCLUDE_PROJECTION_ERROR","sortProjectionSpec","sorted","normalizeProjectionSpec","label","hasExclude","normalizeSelectString","tokens","token","normalizePopulateSelect","normalizePopulateOptions","sortRaw","rawDirection","normalizeString","normalizeObject","normalizePopulateObject","normalizePopulateOption","preparePopulateCacheOptions","rootProjection","computeRtsQueryKey","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","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","random","setTimeout","connectInternal","resetReconnectAttempts","isDocWithId","handleQueryPayload","payload","error","txnId","cbKey","callbacks","subscription","populateCache","hasPopulate","hasPagination","isLocal","includes","cb","handleEvent","event","handleMessage","addLocalTxn","shift","getSyncStorageKey","readStoredSeq","num","writeStoredSeq","applyChangeBatch","changes","resetModels","deletesByModel","change","op","docId","syncRtsChanges","storageKey","sinceSeq","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","runNetworkQuery","timeoutMs","hasTimeout","timeoutStartedAt","connectAttempt","timeoutId","remainingTimeoutMs","resolvedOptions","cleanup","settle","sendMessage","onMessage","getDocId","dedupeById","seen","merged","flattenLoadedPages","previousPages","headPage","nextPages","page","nodes","assertIncludeOnlyProjection","useQuery","useId","enabled","ssrEnabled","ssr","refreshOnMount","queryJson","projectionJson","sortJson","limitStr","populateJson","paginationJson","isPaginated","ssrRuntime","seedDataRaw","useMemo","getQueryData","seedPageInfoRaw","getQueryPageInfo","seedTotalCountRaw","getQueryTotalCount","hasSeedData","seedData","seedPageInfo","seedTotalCount","seedJson","seedPageInfoJson","seedTotalCountStr","setData","useState","setHeadPage","setTotalCount","setPreviousPages","setNextPages","setSource","setError","loading","setLoading","pagingDirection","setPagingDirection","hasFirstReply","useRef","hasNetworkReply","lastDataJsonRef","previousPagesRef","nextPagesRef","headPageRef","pagingDirectionRef","useEffect","nextSeedData","unsubscribe","skipLocal","networkPageInfo","networkTotalCount","payloadForHash","nextJson","effectivePageInfo","firstPageInfo","lastPageInfo","mergedPaginatedData","fetchNext","currentHead","currentNextPages","cursor","direction","fetchPrevious","currentPreviousPages","resetPagination"],"mappings":"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"}