@rpcbase/client 0.369.0 → 0.370.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 +7 -6
- package/dist/index.js.map +1 -1
- package/dist/notificationsRealtime.d.ts.map +1 -1
- package/dist/rts/index.d.ts +1 -0
- package/dist/rts/index.d.ts.map +1 -1
- package/dist/rts/index.js +1 -1
- package/dist/rts/modelTypes.d.ts +7 -0
- package/dist/rts/modelTypes.d.ts.map +1 -0
- package/dist/rts/useQuery.d.ts +3 -1
- package/dist/rts/useQuery.d.ts.map +1 -1
- package/dist/rts/wsClient.d.ts +2 -1
- package/dist/rts/wsClient.d.ts.map +1 -1
- package/dist/{useQuery-C2L-Rgat.js → useQuery-DnrhB9w2.js} +19 -7
- package/dist/useQuery-DnrhB9w2.js.map +1 -0
- package/package.json +1 -1
- package/dist/useQuery-C2L-Rgat.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notificationsRealtime.d.ts","sourceRoot":"","sources":["../src/notificationsRealtime.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAI7F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AA0BvD,MAAM,MAAM,0BAA0B,GAAG;IACvC,aAAa,EAAE,gBAAgB,EAAE,CAAA;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,eAAO,MAAM,4BAA4B,4DAAyD,CAAA;AAwClG,wBAAgB,6BAA6B,CAAC,EAC5C,MAAM,EACN,KAAW,EACX,UAAiB,EACjB,QAAQ,GACT,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,SAAS,CAAA;CACpB,
|
|
1
|
+
{"version":3,"file":"notificationsRealtime.d.ts","sourceRoot":"","sources":["../src/notificationsRealtime.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAI7F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AA0BvD,MAAM,MAAM,0BAA0B,GAAG;IACvC,aAAa,EAAE,gBAAgB,EAAE,CAAA;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,eAAO,MAAM,4BAA4B,4DAAyD,CAAA;AAwClG,wBAAgB,6BAA6B,CAAC,EAC5C,MAAM,EACN,KAAW,EACX,UAAiB,EACjB,QAAQ,GACT,EAAE;IACD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,SAAS,CAAA;CACpB,2CA4GA;AAED,eAAO,MAAM,wBAAwB,QAAO,0BAA0B,GAAG,IAExE,CAAA"}
|
package/dist/rts/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { configureRtsPouchStore, destroyAllCollections, destroyCollection, deleteDocs, getCollection, resetRtsPouchStore, runQuery, updateDocs, type RtsPouchQueryContext, type RtsPouchQueryOptions, type RtsPouchStoreConfig, } from './pouchStore';
|
|
2
2
|
export { addLocalTxn, connect, disconnect, onMessage, reconnect, registerQuery, sendMessage, syncRtsChanges, type RtsConnectOptions, type RtsQueryContext, type RtsQueryOptions, } from './wsClient';
|
|
3
|
+
export { type RtsModelMap, type RtsModelName, } from './modelTypes';
|
|
3
4
|
export { useQuery, type UseRtsQueryOptions, type UseRtsQueryResult, } from './useQuery';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/rts/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACV,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,WAAW,EACX,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,QAAQ,EACR,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACV,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,GACzB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,WAAW,EACX,OAAO,EACP,UAAU,EACV,SAAS,EACT,SAAS,EACT,aAAa,EACb,WAAW,EACX,cAAc,EACd,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,eAAe,GACrB,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,cAAc,CAAA;AAErB,OAAO,EACL,QAAQ,EACR,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,GACvB,MAAM,YAAY,CAAA"}
|
package/dist/rts/index.js
CHANGED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface RtsModelMap {
|
|
2
|
+
RBUploadSession: Record<string, unknown>;
|
|
3
|
+
RBNotification: Record<string, unknown>;
|
|
4
|
+
RBNotificationSettings: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export type RtsModelName = Extract<keyof RtsModelMap, string>;
|
|
7
|
+
//# sourceMappingURL=modelTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modelTypes.d.ts","sourceRoot":"","sources":["../../src/rts/modelTypes.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACxC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAChD;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,WAAW,EAAE,MAAM,CAAC,CAAA"}
|
package/dist/rts/useQuery.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { RtsModelName } from './modelTypes';
|
|
1
2
|
import { RtsQueryContext, RtsQueryOptions } from './wsClient';
|
|
2
3
|
type JsonObject = Record<string, unknown>;
|
|
3
4
|
export type UseRtsQueryOptions = RtsQueryOptions & {
|
|
5
|
+
enabled?: boolean;
|
|
4
6
|
skipLocal?: boolean;
|
|
5
7
|
};
|
|
6
8
|
export type UseRtsQueryResult<T> = {
|
|
@@ -9,6 +11,6 @@ export type UseRtsQueryResult<T> = {
|
|
|
9
11
|
error: unknown | undefined;
|
|
10
12
|
loading: boolean;
|
|
11
13
|
};
|
|
12
|
-
export declare const useQuery: <T extends Record<string, unknown> = Record<string, unknown>>(modelName:
|
|
14
|
+
export declare const useQuery: <T extends Record<string, unknown> = Record<string, unknown>>(modelName: RtsModelName, query?: JsonObject, options?: UseRtsQueryOptions) => UseRtsQueryResult<T>;
|
|
13
15
|
export {};
|
|
14
16
|
//# sourceMappingURL=useQuery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../src/rts/useQuery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAIlE,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzC,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG;IACjD,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAA;IACrB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAA;IAC7C,KAAK,EAAE,OAAO,GAAG,SAAS,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClF,WAAW,
|
|
1
|
+
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../src/rts/useQuery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAIlE,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzC,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG;IACjD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,IAAI,EAAE,CAAC,EAAE,GAAG,SAAS,CAAA;IACrB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAA;IAC7C,KAAK,EAAE,OAAO,GAAG,SAAS,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClF,WAAW,YAAY,EACvB,QAAO,UAAe,EACtB,UAAS,kBAAuB,KAC/B,iBAAiB,CAAC,CAAC,CAwGrB,CAAA"}
|
package/dist/rts/wsClient.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { RtsModelName } from './modelTypes';
|
|
1
2
|
type JsonObject = Record<string, unknown>;
|
|
2
3
|
export type RtsNetworkQueryContext = {
|
|
3
4
|
source: "network";
|
|
@@ -32,7 +33,7 @@ export declare const syncRtsChanges: (tenantId: string, uid: string, options?: P
|
|
|
32
33
|
export declare const connect: (tenantId: string, uid: string, options?: RtsConnectOptions) => Promise<void>;
|
|
33
34
|
export declare const disconnect: () => void;
|
|
34
35
|
export declare const reconnect: (tenantId: string, uid: string, options?: RtsConnectOptions) => Promise<void>;
|
|
35
|
-
export declare const registerQuery: (modelName:
|
|
36
|
+
export declare const registerQuery: (modelName: RtsModelName, query: JsonObject, optionsOrCallback?: RtsQueryOptions | QueryCallback, callbackMaybe?: QueryCallback) => (() => void) | undefined;
|
|
36
37
|
export declare const sendMessage: (event: string, payload?: unknown) => void;
|
|
37
38
|
export declare const onMessage: (event: string, callback: (payload: unknown) => void) => (() => void);
|
|
38
39
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../../src/rts/wsClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../../src/rts/wsClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAGhD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEzC,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,SAAS,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,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;CACf,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;AAuL7F,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,CAkElI,CAAA;AAoFD,eAAO,MAAM,OAAO,GAAI,UAAU,MAAM,EAAE,KAAK,MAAM,EAAE,UAAS,iBAAsB,KAAG,OAAO,CAAC,IAAI,CAEpG,CAAA;AAED,eAAO,MAAM,UAAU,QAAO,IAY7B,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,UAAU,MAAM,EAAE,KAAK,MAAM,EAAE,UAAS,iBAAsB,KAAG,OAAO,CAAC,IAAI,CAGtG,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,WAAW,YAAY,EACvB,OAAO,UAAU,EACjB,oBAAoB,eAAe,GAAG,aAAa,EACnD,gBAAgB,aAAa,KAC5B,CAAC,MAAM,IAAI,CAAC,GAAG,SAwDjB,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"}
|
|
@@ -645,7 +645,9 @@ const registerQuery = (modelName, query, optionsOrCallback, callbackMaybe) => {
|
|
|
645
645
|
callback = callbackMaybe;
|
|
646
646
|
}
|
|
647
647
|
if (!callback) return void 0;
|
|
648
|
-
if (
|
|
648
|
+
if (typeof modelName !== "string" || modelName.trim().length === 0) {
|
|
649
|
+
throw new Error("registerQuery: modelName must be a non-empty string");
|
|
650
|
+
}
|
|
649
651
|
const queryKey = computeQueryKey(query, options);
|
|
650
652
|
const cbKey = `${modelName}.${queryKey}`;
|
|
651
653
|
const set = queryCallbacks.get(cbKey) ?? /* @__PURE__ */ new Set();
|
|
@@ -693,7 +695,11 @@ const onMessage = (event, callback) => {
|
|
|
693
695
|
};
|
|
694
696
|
};
|
|
695
697
|
const useQuery = (modelName, query = {}, options = {}) => {
|
|
698
|
+
if (typeof modelName !== "string" || modelName.trim().length === 0) {
|
|
699
|
+
throw new Error("useQuery: modelName must be a non-empty string");
|
|
700
|
+
}
|
|
696
701
|
const id = useId();
|
|
702
|
+
const enabled = options.enabled ?? true;
|
|
697
703
|
const key = options.key ?? id;
|
|
698
704
|
const projectionJson = options.projection ? JSON.stringify(options.projection) : "";
|
|
699
705
|
const sortJson = options.sort ? JSON.stringify(options.sort) : "";
|
|
@@ -701,7 +707,7 @@ const useQuery = (modelName, query = {}, options = {}) => {
|
|
|
701
707
|
const [data, setData] = useState(void 0);
|
|
702
708
|
const [source, setSource] = useState(void 0);
|
|
703
709
|
const [error, setError] = useState(void 0);
|
|
704
|
-
const [loading, setLoading] = useState(
|
|
710
|
+
const [loading, setLoading] = useState(enabled);
|
|
705
711
|
const hasFirstReply = useRef(false);
|
|
706
712
|
const hasNetworkReply = useRef(false);
|
|
707
713
|
const lastDataJsonRef = useRef("");
|
|
@@ -709,11 +715,17 @@ const useQuery = (modelName, query = {}, options = {}) => {
|
|
|
709
715
|
hasFirstReply.current = false;
|
|
710
716
|
hasNetworkReply.current = false;
|
|
711
717
|
lastDataJsonRef.current = "";
|
|
712
|
-
setLoading(true);
|
|
713
718
|
setError(void 0);
|
|
714
|
-
|
|
719
|
+
if (!enabled) {
|
|
720
|
+
setLoading(false);
|
|
721
|
+
setData(void 0);
|
|
722
|
+
setSource(void 0);
|
|
723
|
+
return;
|
|
724
|
+
}
|
|
725
|
+
setLoading(true);
|
|
726
|
+
}, [enabled, modelName, key, JSON.stringify(query), projectionJson, sortJson, limitStr]);
|
|
715
727
|
useEffect(() => {
|
|
716
|
-
if (!
|
|
728
|
+
if (!enabled) return;
|
|
717
729
|
const unsubscribe = registerQuery(
|
|
718
730
|
modelName,
|
|
719
731
|
query,
|
|
@@ -756,7 +768,7 @@ const useQuery = (modelName, query = {}, options = {}) => {
|
|
|
756
768
|
return () => {
|
|
757
769
|
unsubscribe?.();
|
|
758
770
|
};
|
|
759
|
-
}, [modelName, key, JSON.stringify(query), projectionJson, sortJson, limitStr]);
|
|
771
|
+
}, [enabled, modelName, key, JSON.stringify(query), projectionJson, sortJson, limitStr]);
|
|
760
772
|
return useMemo(
|
|
761
773
|
() => ({
|
|
762
774
|
data,
|
|
@@ -786,4 +798,4 @@ export {
|
|
|
786
798
|
sendMessage as s,
|
|
787
799
|
updateDocs as u
|
|
788
800
|
};
|
|
789
|
-
//# sourceMappingURL=useQuery-
|
|
801
|
+
//# sourceMappingURL=useQuery-DnrhB9w2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuery-DnrhB9w2.js","sources":["../src/rts/pouchStore.ts","../src/rts/wsClient.ts","../src/rts/useQuery.ts"],"sourcesContent":["type PouchDbStatic = {\n plugin: (plugin: unknown) => void\n prefix?: string\n defaults?: (options: Record<string, unknown>) => PouchDbStatic\n new (name: string, options?: Record<string, unknown>): PouchDbDatabase\n}\n\ntype PouchDbDatabase = {\n find: (options: Record<string, unknown>) => Promise<{ docs: Record<string, unknown>[] }>\n bulkDocs: (docs: Record<string, unknown>[]) => Promise<unknown>\n destroy: () => Promise<unknown>\n}\n\nexport type RtsPouchStoreConfig = {\n tenantId: string\n appName?: string\n prefix?: string\n}\n\nexport type RtsPouchQueryOptions = {\n uid: string\n projection?: Record<string, 0 | 1>\n sort?: Record<string, 1 | -1>\n limit?: number\n}\n\nexport type RtsPouchQueryContext = {\n source: \"cache\"\n}\n\nconst UNDERSCORE_PREFIX = \"$_\"\nconst DEFAULT_FIND_LIMIT = 4096\n\nlet storeConfig: RtsPouchStoreConfig | null = null\n\nlet pouchDbPromise: Promise<PouchDbStatic> | null = null\nlet lastAppliedPrefix: string | null = null\n\nconst collections = new Map<string, PouchDbDatabase>()\nconst dbNamesByPrefix = new Map<string, Set<string>>()\n\nconst unwrapDefault = (mod: unknown): unknown => {\n if (!mod || typeof mod !== \"object\") return mod\n const maybe = mod as { default?: unknown }\n return maybe.default ?? mod\n}\n\nconst ensureBrowser = () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"RTS PouchDB store can only be used in the browser\")\n }\n}\n\nconst computeBasePrefix = ({ tenantId, appName }: { tenantId: string; appName?: string }): string => {\n let prefix = \"rb/\"\n if (appName) prefix += `${appName}/`\n prefix += `${tenantId}/`\n return prefix\n}\n\nconst getDbNamesKey = (prefix: string): string => `rb:rts:pouchDbs:${prefix}`\n\nconst getPrefixOverrideKey = ({ tenantId, appName }: { tenantId: string; appName?: string }): string =>\n `rb:rts:pouchPrefix:${appName ?? \"\"}:${tenantId}`\n\nconst readPrefixOverride = ({ tenantId, appName }: { tenantId: string; appName?: string }): string | null => {\n try {\n const value = window.localStorage.getItem(getPrefixOverrideKey({ tenantId, appName }))\n if (!value) return null\n if (!value.endsWith(\"/\")) return `${value}/`\n return value\n } catch {\n return null\n }\n}\n\nconst getPrefix = (): string => {\n if (!storeConfig) {\n throw new Error(\"RTS PouchDB store is not configured\")\n }\n\n if (storeConfig.prefix) return storeConfig.prefix\n\n const basePrefix = computeBasePrefix({ tenantId: storeConfig.tenantId, appName: storeConfig.appName })\n const override = readPrefixOverride({ tenantId: storeConfig.tenantId, appName: storeConfig.appName })\n return override ?? basePrefix\n}\n\nconst loadDbNames = (prefix: string): Set<string> => {\n const existing = dbNamesByPrefix.get(prefix)\n if (existing) return existing\n\n const names = new Set<string>()\n try {\n const raw = window.localStorage.getItem(getDbNamesKey(prefix))\n if (raw) {\n const parsed = JSON.parse(raw) as unknown\n if (Array.isArray(parsed)) {\n for (const value of parsed) {\n if (typeof value === \"string\" && value) names.add(value)\n }\n }\n }\n } catch {\n return names\n }\n\n dbNamesByPrefix.set(prefix, names)\n return names\n}\n\nconst persistDbNames = (prefix: string, names: Set<string>): void => {\n try {\n if (!names.size) {\n window.localStorage.removeItem(getDbNamesKey(prefix))\n dbNamesByPrefix.delete(prefix)\n return\n }\n\n window.localStorage.setItem(getDbNamesKey(prefix), JSON.stringify(Array.from(names)))\n dbNamesByPrefix.set(prefix, names)\n } catch {\n return\n }\n}\n\nconst registerDbName = (prefix: string, dbName: string): void => {\n if (!prefix || !dbName) return\n const names = loadDbNames(prefix)\n if (names.has(dbName)) return\n names.add(dbName)\n persistDbNames(prefix, names)\n}\n\nconst unregisterDbName = (prefix: string, dbName: string): void => {\n if (!prefix || !dbName) return\n const names = loadDbNames(prefix)\n if (!names.delete(dbName)) return\n persistDbNames(prefix, names)\n}\n\nconst getPouchDb = async (): Promise<PouchDbStatic> => {\n ensureBrowser()\n\n if (!pouchDbPromise) {\n pouchDbPromise = (async () => {\n const [core, indexedDbAdapter, findPlugin] = await Promise.all([\n import(\"pouchdb-core\"),\n import(\"pouchdb-adapter-indexeddb\"),\n import(\"pouchdb-find\"),\n ])\n\n const PouchDB = unwrapDefault(core) as PouchDbStatic\n PouchDB.plugin(unwrapDefault(indexedDbAdapter))\n PouchDB.plugin(unwrapDefault(findPlugin))\n\n return PouchDB\n })()\n }\n\n return pouchDbPromise\n}\n\nconst applyPrefix = (PouchDB: PouchDbStatic) => {\n const prefix = getPrefix()\n if (prefix === lastAppliedPrefix) return\n PouchDB.prefix = prefix\n lastAppliedPrefix = prefix\n}\n\nexport const configureRtsPouchStore = (config: RtsPouchStoreConfig | null) => {\n storeConfig = config\n lastAppliedPrefix = null\n collections.clear()\n}\n\nexport const getCollection = async (modelName: string, options: { uid: string }): Promise<PouchDbDatabase> => {\n const PouchDB = await getPouchDb()\n applyPrefix(PouchDB)\n\n const prefix = getPrefix()\n const dbName = `${options.uid}/${modelName}`\n const dbKey = `${prefix}${dbName}`\n\n const existing = collections.get(dbKey)\n if (existing) return existing\n\n registerDbName(prefix, dbName)\n const db = new PouchDB(dbName, { adapter: \"indexeddb\", revs_limit: 1 }) as PouchDbDatabase\n collections.set(dbKey, db)\n return db\n}\n\nconst replaceQueryKeys = (value: unknown, replaceKey: (key: string) => string): unknown => {\n if (typeof value !== \"object\" || value === null) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => replaceQueryKeys(item, replaceKey))\n }\n\n const obj = value as Record<string, unknown>\n const next: Record<string, unknown> = Object.create(Object.getPrototypeOf(obj))\n\n for (const key of Object.keys(obj)) {\n if (/^\\$/.test(key) || /\\.\\d+$/.test(key)) {\n throw new Error(`replaceQueryKeys: Unexpected key format: ${key}`)\n }\n\n const newKey = replaceKey(key)\n next[newKey] = replaceQueryKeys(obj[key], replaceKey)\n }\n\n return next\n}\n\nconst getKeys = (obj: Record<string, unknown>, parentKey = \"\"): string[] => {\n const keys: string[] = []\n\n for (const key of Object.keys(obj)) {\n const nextKey = parentKey ? `${parentKey}.${key}` : key\n const value = obj[key]\n\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n keys.push(...getKeys(value as Record<string, unknown>, nextKey))\n } else {\n keys.push(nextKey)\n }\n }\n\n return keys\n}\n\nconst satisfiesProjection = (doc: Record<string, unknown>, projection: Record<string, 0 | 1>): boolean => {\n const docKeys = new Set(getKeys(doc))\n const projectionKeys = new Set(Object.keys(projection).filter((key) => projection[key] === 1))\n\n if (!projectionKeys.has(\"_id\")) {\n docKeys.delete(\"_id\")\n }\n\n if (projectionKeys.size > docKeys.size) return false\n for (const key of projectionKeys) {\n if (!docKeys.has(key)) return false\n }\n return true\n}\n\nconst remapDocFromStorage = (doc: Record<string, unknown>): Record<string, unknown> => {\n const next: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(doc)) {\n const newKey = key.startsWith(UNDERSCORE_PREFIX) ? key.replace(/^\\$_/, \"\") : key\n next[newKey] = value\n }\n\n return next\n}\n\nexport const runQuery = async <T extends Record<string, unknown>>({\n modelName,\n query = {},\n options,\n}: {\n modelName: string\n query?: Record<string, unknown>\n options: RtsPouchQueryOptions\n}): Promise<{ data: T[]; context: RtsPouchQueryContext }> => {\n const collection = await getCollection(modelName, { uid: options.uid })\n\n const replacedQuery = replaceQueryKeys(query, (key) =>\n key.startsWith(\"_\") && key !== \"_id\" ? `${UNDERSCORE_PREFIX}${key}` : key,\n ) as Record<string, unknown>\n\n const limit = typeof options.limit === \"number\" ? Math.abs(options.limit) : DEFAULT_FIND_LIMIT\n\n const { docs } = await collection.find({\n selector: replacedQuery,\n limit,\n })\n\n let mappedDocs: T[] = docs.map(({ _rev: _revIgnored, ...rest }) => remapDocFromStorage(rest) as T)\n\n if (options.projection) {\n mappedDocs = mappedDocs.filter((doc) => satisfiesProjection(doc, options.projection!))\n }\n\n if (options.sort) {\n mappedDocs = mappedDocs.sort((a, b) => {\n for (const key of Object.keys(options.sort!)) {\n if (!Object.hasOwn(a, key) || !Object.hasOwn(b, key)) continue\n\n const dir = options.sort![key]\n const aVal = a[key]\n const bVal = b[key]\n\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n if (aVal < bVal) return -1 * dir\n if (aVal > bVal) return 1 * dir\n continue\n }\n\n if (typeof aVal === \"string\" && typeof bVal === \"string\") {\n if (aVal < bVal) return -1 * dir\n if (aVal > bVal) return 1 * dir\n continue\n }\n }\n return 0\n })\n }\n\n return { data: mappedDocs, context: { source: \"cache\" } }\n}\n\nexport const updateDocs = async (\n modelName: string,\n data: Array<Record<string, unknown> & { _id: string }>,\n uid: string,\n): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n\n const allIds = data.map((doc) => doc._id).filter(Boolean)\n if (!allIds.length) return\n\n const { docs: currentDocs } = await collection.find({\n selector: { _id: { $in: allIds } },\n fields: [\"_id\", \"_rev\"],\n limit: allIds.length,\n })\n\n const currentDocsById = currentDocs.reduce<Record<string, Record<string, unknown>>>((acc, doc) => {\n const id = String(doc._id ?? \"\")\n if (id) acc[id] = doc\n return acc\n }, {})\n\n const newDocs = data.map((mongoDoc) => {\n const currentDoc = currentDocsById[mongoDoc._id] ?? { _id: mongoDoc._id }\n const nextDoc = Object.entries(mongoDoc).reduce<Record<string, unknown>>((acc, [key, value]) => {\n const newKey = key !== \"_id\" && key.startsWith(\"_\") ? `${UNDERSCORE_PREFIX}${key}` : key\n acc[newKey] = value\n return acc\n }, { ...currentDoc })\n\n const rev = currentDoc._rev\n if (typeof rev === \"string\" && rev) {\n nextDoc._rev = rev\n } else {\n delete nextDoc._rev\n }\n\n return nextDoc\n })\n\n await collection.bulkDocs(newDocs)\n}\n\nexport const deleteDocs = async (modelName: string, ids: string[], uid: string): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n\n const allIds = ids.map((id) => String(id ?? \"\")).filter(Boolean)\n if (!allIds.length) return\n\n const { docs: currentDocs } = await collection.find({\n selector: { _id: { $in: allIds } },\n fields: [\"_id\", \"_rev\"],\n limit: allIds.length,\n })\n\n const deletions = currentDocs\n .map((doc) => ({\n _id: String((doc as { _id?: unknown })?._id ?? \"\"),\n _rev: (doc as { _rev?: unknown })?._rev,\n _deleted: true,\n }))\n .filter((doc) => doc._id && typeof doc._rev === \"string\" && doc._rev)\n\n if (!deletions.length) return\n await collection.bulkDocs(deletions)\n}\n\nexport const destroyCollection = async (modelName: string, uid: string): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n const prefix = getPrefix()\n const dbName = `${uid}/${modelName}`\n collections.delete(`${prefix}${dbName}`)\n unregisterDbName(prefix, dbName)\n await collection.destroy()\n}\n\nexport const resetRtsPouchStore = ({ tenantId, appName }: { tenantId: string; appName?: string }): string => {\n ensureBrowser()\n const basePrefix = computeBasePrefix({ tenantId, appName })\n const oldPrefix = readPrefixOverride({ tenantId, appName }) ?? basePrefix\n const dbNames = Array.from(loadDbNames(oldPrefix))\n const openDbs = Array.from(collections.entries())\n .filter(([key]) => key.startsWith(oldPrefix))\n .map(([, db]) => db)\n\n void (async () => {\n const remaining = new Set(dbNames)\n\n await Promise.all(openDbs.map((db) => db.destroy().catch(() => {})))\n\n if (remaining.size) {\n const PouchDB = await getPouchDb()\n const PouchDBForPrefix = (PouchDB.defaults?.({}) ?? PouchDB) as PouchDbStatic\n PouchDBForPrefix.prefix = oldPrefix\n\n await Promise.all(Array.from(remaining).map(async (name) => {\n const db = new PouchDBForPrefix(name, { adapter: \"indexeddb\", revs_limit: 1 }) as PouchDbDatabase\n await db.destroy().then(() => {\n remaining.delete(name)\n }).catch(() => {})\n }))\n }\n\n if (remaining.size) {\n persistDbNames(oldPrefix, remaining)\n } else {\n persistDbNames(oldPrefix, new Set())\n }\n })()\n\n const newPrefix = `${basePrefix}reset-${Date.now().toString(16)}/`\n try {\n window.localStorage.setItem(getPrefixOverrideKey({ tenantId, appName }), newPrefix)\n } catch {\n return newPrefix\n }\n\n lastAppliedPrefix = null\n collections.clear()\n return newPrefix\n}\n\nexport const destroyAllCollections = async (): Promise<void> => {\n const dbs = Array.from(collections.values())\n await Promise.all(dbs.map((db) => db.destroy()))\n collections.clear()\n}\n","import { configureRtsPouchStore, deleteDocs, destroyCollection, resetRtsPouchStore, runQuery, updateDocs } from \"./pouchStore\"\nimport type { RtsModelName } from \"./modelTypes\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport type RtsNetworkQueryContext = {\n source: \"network\"\n isLocal: boolean\n txnId?: string\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}\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}\n\ntype ServerMessage =\n | { type: \"query-payload\"; modelName: string; queryKey: string; data?: unknown; error?: string; txnId?: string }\n | { type: \"event\"; event: string; payload?: unknown }\n\ntype ClientMessage =\n | { type: \"run-query\"; modelName: string; queryKey: string; query: JsonObject; options?: RtsQueryOptions }\n | { type: \"register-query\"; modelName: string; queryKey: string; query: JsonObject; options?: RtsQueryOptions }\n | { type: \"remove-query\"; modelName: string; queryKey: string }\n | { type: \"event\"; event: string; payload?: unknown }\n\nconst TENANT_ID_QUERY_PARAM = \"rb-tenant-id\"\nconst RTS_CHANGES_ROUTE = \"/api/rb/rts/changes\"\nconst MAX_TXN_BUF = 2048\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\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 computeQueryKey = (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 return `${key}${JSON.stringify(query)}${projection}${sort}${limit}`\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 = (): void => {\n for (const sub of subscriptions.values()) {\n sendToServer({\n type: \"register-query\",\n modelName: sub.modelName,\n queryKey: sub.queryKey,\n query: sub.query,\n options: sub.options,\n })\n sendToServer({\n type: \"run-query\",\n modelName: sub.modelName,\n queryKey: sub.queryKey,\n query: sub.query,\n options: sub.options,\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) return\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 const delay = Math.min(delayMaxMs, delayMs * Math.pow(2, reconnectAttempts))\n reconnectAttempts += 1\n reconnectTimer = window.setTimeout(() => {\n void connectInternal(currentTenantId!, currentUid!, connectOptions, { resetReconnectAttempts: false })\n }, delay)\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\n const isLocal = !!(txnId && localTxnBuf.includes(txnId))\n const context: RtsNetworkQueryContext = { source: \"network\", isLocal, txnId }\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)\n ? data.filter((doc): doc is Record<string, unknown> & { _id: string } => {\n if (!doc || typeof doc !== \"object\") return false\n return typeof (doc as { _id?: unknown })._id === \"string\"\n })\n : []\n\n if (!docs.length) return\n\n void updateDocs(modelName, docs, currentUid)\n .catch(() => {})\n}\n\nconst handleEvent = (payload: Extract<ServerMessage, { type: \"event\" }>) => {\n const callbacks = messageCallbacks.get(payload.event)\n if (!callbacks || !callbacks.size) return\n for (const cb of callbacks) cb(payload.payload)\n}\n\nconst handleMessage = (event: MessageEvent) => {\n let parsed: unknown\n try {\n parsed = JSON.parse(typeof event.data === \"string\" ? event.data : String(event.data))\n } catch {\n return\n }\n\n if (!parsed || typeof parsed !== \"object\") return\n const message = parsed as ServerMessage\n\n if (message.type === \"query-payload\") {\n handleQueryPayload(message)\n return\n }\n\n if (message.type === \"event\") {\n handleEvent(message)\n }\n}\n\nexport const addLocalTxn = (txnId: string): void => {\n if (!txnId) return\n localTxnBuf.push(txnId)\n if (localTxnBuf.length > MAX_TXN_BUF) {\n localTxnBuf.shift()\n }\n}\n\ntype RtsChangeRecord = {\n seq: number\n modelName: string\n op: \"delete\" | \"reset_model\"\n docId?: string\n}\n\nconst getSyncStorageKey = ({ tenantId, uid, appName }: { tenantId: string; uid: string; appName?: string }): string =>\n `rb:rts:changesSeq:${appName ?? \"\"}:${tenantId}:${uid}`\n\nconst readStoredSeq = (key: string): number => {\n try {\n const raw = window.localStorage.getItem(key)\n const num = raw ? Number(raw) : 0\n return Number.isFinite(num) && num >= 0 ? Math.floor(num) : 0\n } catch {\n return 0\n }\n}\n\nconst writeStoredSeq = (key: string, value: number): void => {\n try {\n window.localStorage.setItem(key, String(Math.max(0, Math.floor(value))))\n } catch {\n return\n }\n}\n\nconst applyChangeBatch = async (changes: RtsChangeRecord[], uid: string): Promise<void> => {\n const resetModels = new Set<string>()\n const deletesByModel = new Map<string, string[]>()\n\n for (const change of changes) {\n const modelName = typeof change.modelName === \"string\" ? change.modelName : \"\"\n if (!modelName) continue\n\n if (change.op === \"reset_model\") {\n resetModels.add(modelName)\n continue\n }\n\n if (change.op === \"delete\") {\n const docId = typeof change.docId === \"string\" ? change.docId : \"\"\n if (!docId) continue\n const existing = deletesByModel.get(modelName) ?? []\n existing.push(docId)\n deletesByModel.set(modelName, existing)\n }\n }\n\n for (const modelName of resetModels) {\n await destroyCollection(modelName, uid).catch(() => {})\n }\n\n for (const [modelName, ids] of deletesByModel.entries()) {\n if (resetModels.has(modelName)) continue\n await deleteDocs(modelName, ids, uid).catch(() => {})\n }\n}\n\nexport const syncRtsChanges = async (tenantId: string, uid: string, options: Pick<RtsConnectOptions, \"appName\"> = {}): Promise<void> => {\n ensureBrowser()\n if (!tenantId || !uid) return\n\n const storageKey = getSyncStorageKey({ tenantId, uid, appName: options.appName })\n let sinceSeq = readStoredSeq(storageKey)\n\n for (let i = 0; i < 32; i += 1) {\n const url = `${RTS_CHANGES_ROUTE}?${TENANT_ID_QUERY_PARAM}=${encodeURIComponent(tenantId)}`\n const response = await fetch(url, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ sinceSeq, limit: 2000 }),\n })\n\n if (!response.ok) return\n\n const payload: unknown = await response.json().catch(() => null)\n if (!payload || typeof payload !== \"object\") return\n const ok = (payload as { ok?: unknown }).ok\n if (ok !== true) return\n\n const latestSeq = Number((payload as { latestSeq?: unknown }).latestSeq ?? 0)\n const needsFullResync = Boolean((payload as { needsFullResync?: unknown }).needsFullResync)\n\n if (needsFullResync) {\n resetRtsPouchStore({ tenantId, appName: options.appName })\n writeStoredSeq(storageKey, latestSeq)\n return\n }\n\n const changesRaw = (payload as { changes?: unknown }).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 { seq?: unknown; modelName?: unknown; op?: unknown; docId?: unknown }\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 resubscribeAll()\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\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 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 disconnect()\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): (() => 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 = computeQueryKey(query, options)\n const cbKey = `${modelName}.${queryKey}`\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 })\n\n if (currentUid) {\n void runQuery({\n modelName,\n query,\n options: {\n uid: currentUid,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n },\n }).then(({ data, context }) => {\n callback?.(null, data, context)\n }).catch(() => {\n // ignore\n })\n }\n\n sendToServer({ type: \"run-query\", modelName, queryKey, query, options })\n sendToServer({ type: \"register-query\", modelName, queryKey, query, options })\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\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\"\n\nimport type { RtsModelName } from \"./modelTypes\"\nimport type { RtsQueryContext, RtsQueryOptions } from \"./wsClient\"\nimport { registerQuery } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport type UseRtsQueryOptions = RtsQueryOptions & {\n enabled?: boolean\n skipLocal?: boolean\n}\n\nexport type UseRtsQueryResult<T> = {\n data: T[] | undefined\n source: RtsQueryContext[\"source\"] | undefined\n error: unknown | undefined\n loading: boolean\n}\n\nexport const useQuery = <T extends Record<string, unknown> = Record<string, unknown>>(\n modelName: RtsModelName,\n query: JsonObject = {},\n options: UseRtsQueryOptions = {},\n): UseRtsQueryResult<T> => {\n if (typeof modelName !== \"string\" || modelName.trim().length === 0) {\n throw new Error(\"useQuery: modelName must be a non-empty string\")\n }\n\n const id = useId()\n\n const enabled = options.enabled ?? true\n const key = options.key ?? id\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\n const [data, setData] = useState<T[] | undefined>(undefined)\n const [source, setSource] = useState<RtsQueryContext[\"source\"] | undefined>(undefined)\n const [error, setError] = useState<unknown | undefined>(undefined)\n const [loading, setLoading] = useState<boolean>(enabled)\n\n const hasFirstReply = useRef(false)\n const hasNetworkReply = useRef(false)\n const lastDataJsonRef = useRef<string>(\"\")\n\n useEffect(() => {\n hasFirstReply.current = false\n hasNetworkReply.current = false\n lastDataJsonRef.current = \"\"\n setError(undefined)\n\n if (!enabled) {\n setLoading(false)\n setData(undefined)\n setSource(undefined)\n return\n }\n\n setLoading(true)\n }, [enabled, modelName, key, JSON.stringify(query), projectionJson, sortJson, limitStr])\n\n useEffect(() => {\n if (!enabled) return\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 },\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\n let nextJson = \"\"\n try {\n nextJson = JSON.stringify(result)\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 setData(result as T[])\n },\n )\n\n return () => {\n unsubscribe?.()\n }\n }, [enabled, modelName, key, JSON.stringify(query), projectionJson, sortJson, limitStr])\n\n return useMemo(\n () => ({\n data,\n source,\n error,\n loading,\n }),\n [data, source, error, loading],\n )\n}\n"],"names":["ensureBrowser"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery-C2L-Rgat.js","sources":["../src/rts/pouchStore.ts","../src/rts/wsClient.ts","../src/rts/useQuery.ts"],"sourcesContent":["type PouchDbStatic = {\n plugin: (plugin: unknown) => void\n prefix?: string\n defaults?: (options: Record<string, unknown>) => PouchDbStatic\n new (name: string, options?: Record<string, unknown>): PouchDbDatabase\n}\n\ntype PouchDbDatabase = {\n find: (options: Record<string, unknown>) => Promise<{ docs: Record<string, unknown>[] }>\n bulkDocs: (docs: Record<string, unknown>[]) => Promise<unknown>\n destroy: () => Promise<unknown>\n}\n\nexport type RtsPouchStoreConfig = {\n tenantId: string\n appName?: string\n prefix?: string\n}\n\nexport type RtsPouchQueryOptions = {\n uid: string\n projection?: Record<string, 0 | 1>\n sort?: Record<string, 1 | -1>\n limit?: number\n}\n\nexport type RtsPouchQueryContext = {\n source: \"cache\"\n}\n\nconst UNDERSCORE_PREFIX = \"$_\"\nconst DEFAULT_FIND_LIMIT = 4096\n\nlet storeConfig: RtsPouchStoreConfig | null = null\n\nlet pouchDbPromise: Promise<PouchDbStatic> | null = null\nlet lastAppliedPrefix: string | null = null\n\nconst collections = new Map<string, PouchDbDatabase>()\nconst dbNamesByPrefix = new Map<string, Set<string>>()\n\nconst unwrapDefault = (mod: unknown): unknown => {\n if (!mod || typeof mod !== \"object\") return mod\n const maybe = mod as { default?: unknown }\n return maybe.default ?? mod\n}\n\nconst ensureBrowser = () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"RTS PouchDB store can only be used in the browser\")\n }\n}\n\nconst computeBasePrefix = ({ tenantId, appName }: { tenantId: string; appName?: string }): string => {\n let prefix = \"rb/\"\n if (appName) prefix += `${appName}/`\n prefix += `${tenantId}/`\n return prefix\n}\n\nconst getDbNamesKey = (prefix: string): string => `rb:rts:pouchDbs:${prefix}`\n\nconst getPrefixOverrideKey = ({ tenantId, appName }: { tenantId: string; appName?: string }): string =>\n `rb:rts:pouchPrefix:${appName ?? \"\"}:${tenantId}`\n\nconst readPrefixOverride = ({ tenantId, appName }: { tenantId: string; appName?: string }): string | null => {\n try {\n const value = window.localStorage.getItem(getPrefixOverrideKey({ tenantId, appName }))\n if (!value) return null\n if (!value.endsWith(\"/\")) return `${value}/`\n return value\n } catch {\n return null\n }\n}\n\nconst getPrefix = (): string => {\n if (!storeConfig) {\n throw new Error(\"RTS PouchDB store is not configured\")\n }\n\n if (storeConfig.prefix) return storeConfig.prefix\n\n const basePrefix = computeBasePrefix({ tenantId: storeConfig.tenantId, appName: storeConfig.appName })\n const override = readPrefixOverride({ tenantId: storeConfig.tenantId, appName: storeConfig.appName })\n return override ?? basePrefix\n}\n\nconst loadDbNames = (prefix: string): Set<string> => {\n const existing = dbNamesByPrefix.get(prefix)\n if (existing) return existing\n\n const names = new Set<string>()\n try {\n const raw = window.localStorage.getItem(getDbNamesKey(prefix))\n if (raw) {\n const parsed = JSON.parse(raw) as unknown\n if (Array.isArray(parsed)) {\n for (const value of parsed) {\n if (typeof value === \"string\" && value) names.add(value)\n }\n }\n }\n } catch {\n return names\n }\n\n dbNamesByPrefix.set(prefix, names)\n return names\n}\n\nconst persistDbNames = (prefix: string, names: Set<string>): void => {\n try {\n if (!names.size) {\n window.localStorage.removeItem(getDbNamesKey(prefix))\n dbNamesByPrefix.delete(prefix)\n return\n }\n\n window.localStorage.setItem(getDbNamesKey(prefix), JSON.stringify(Array.from(names)))\n dbNamesByPrefix.set(prefix, names)\n } catch {\n return\n }\n}\n\nconst registerDbName = (prefix: string, dbName: string): void => {\n if (!prefix || !dbName) return\n const names = loadDbNames(prefix)\n if (names.has(dbName)) return\n names.add(dbName)\n persistDbNames(prefix, names)\n}\n\nconst unregisterDbName = (prefix: string, dbName: string): void => {\n if (!prefix || !dbName) return\n const names = loadDbNames(prefix)\n if (!names.delete(dbName)) return\n persistDbNames(prefix, names)\n}\n\nconst getPouchDb = async (): Promise<PouchDbStatic> => {\n ensureBrowser()\n\n if (!pouchDbPromise) {\n pouchDbPromise = (async () => {\n const [core, indexedDbAdapter, findPlugin] = await Promise.all([\n import(\"pouchdb-core\"),\n import(\"pouchdb-adapter-indexeddb\"),\n import(\"pouchdb-find\"),\n ])\n\n const PouchDB = unwrapDefault(core) as PouchDbStatic\n PouchDB.plugin(unwrapDefault(indexedDbAdapter))\n PouchDB.plugin(unwrapDefault(findPlugin))\n\n return PouchDB\n })()\n }\n\n return pouchDbPromise\n}\n\nconst applyPrefix = (PouchDB: PouchDbStatic) => {\n const prefix = getPrefix()\n if (prefix === lastAppliedPrefix) return\n PouchDB.prefix = prefix\n lastAppliedPrefix = prefix\n}\n\nexport const configureRtsPouchStore = (config: RtsPouchStoreConfig | null) => {\n storeConfig = config\n lastAppliedPrefix = null\n collections.clear()\n}\n\nexport const getCollection = async (modelName: string, options: { uid: string }): Promise<PouchDbDatabase> => {\n const PouchDB = await getPouchDb()\n applyPrefix(PouchDB)\n\n const prefix = getPrefix()\n const dbName = `${options.uid}/${modelName}`\n const dbKey = `${prefix}${dbName}`\n\n const existing = collections.get(dbKey)\n if (existing) return existing\n\n registerDbName(prefix, dbName)\n const db = new PouchDB(dbName, { adapter: \"indexeddb\", revs_limit: 1 }) as PouchDbDatabase\n collections.set(dbKey, db)\n return db\n}\n\nconst replaceQueryKeys = (value: unknown, replaceKey: (key: string) => string): unknown => {\n if (typeof value !== \"object\" || value === null) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => replaceQueryKeys(item, replaceKey))\n }\n\n const obj = value as Record<string, unknown>\n const next: Record<string, unknown> = Object.create(Object.getPrototypeOf(obj))\n\n for (const key of Object.keys(obj)) {\n if (/^\\$/.test(key) || /\\.\\d+$/.test(key)) {\n throw new Error(`replaceQueryKeys: Unexpected key format: ${key}`)\n }\n\n const newKey = replaceKey(key)\n next[newKey] = replaceQueryKeys(obj[key], replaceKey)\n }\n\n return next\n}\n\nconst getKeys = (obj: Record<string, unknown>, parentKey = \"\"): string[] => {\n const keys: string[] = []\n\n for (const key of Object.keys(obj)) {\n const nextKey = parentKey ? `${parentKey}.${key}` : key\n const value = obj[key]\n\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n keys.push(...getKeys(value as Record<string, unknown>, nextKey))\n } else {\n keys.push(nextKey)\n }\n }\n\n return keys\n}\n\nconst satisfiesProjection = (doc: Record<string, unknown>, projection: Record<string, 0 | 1>): boolean => {\n const docKeys = new Set(getKeys(doc))\n const projectionKeys = new Set(Object.keys(projection).filter((key) => projection[key] === 1))\n\n if (!projectionKeys.has(\"_id\")) {\n docKeys.delete(\"_id\")\n }\n\n if (projectionKeys.size > docKeys.size) return false\n for (const key of projectionKeys) {\n if (!docKeys.has(key)) return false\n }\n return true\n}\n\nconst remapDocFromStorage = (doc: Record<string, unknown>): Record<string, unknown> => {\n const next: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(doc)) {\n const newKey = key.startsWith(UNDERSCORE_PREFIX) ? key.replace(/^\\$_/, \"\") : key\n next[newKey] = value\n }\n\n return next\n}\n\nexport const runQuery = async <T extends Record<string, unknown>>({\n modelName,\n query = {},\n options,\n}: {\n modelName: string\n query?: Record<string, unknown>\n options: RtsPouchQueryOptions\n}): Promise<{ data: T[]; context: RtsPouchQueryContext }> => {\n const collection = await getCollection(modelName, { uid: options.uid })\n\n const replacedQuery = replaceQueryKeys(query, (key) =>\n key.startsWith(\"_\") && key !== \"_id\" ? `${UNDERSCORE_PREFIX}${key}` : key,\n ) as Record<string, unknown>\n\n const limit = typeof options.limit === \"number\" ? Math.abs(options.limit) : DEFAULT_FIND_LIMIT\n\n const { docs } = await collection.find({\n selector: replacedQuery,\n limit,\n })\n\n let mappedDocs: T[] = docs.map(({ _rev: _revIgnored, ...rest }) => remapDocFromStorage(rest) as T)\n\n if (options.projection) {\n mappedDocs = mappedDocs.filter((doc) => satisfiesProjection(doc, options.projection!))\n }\n\n if (options.sort) {\n mappedDocs = mappedDocs.sort((a, b) => {\n for (const key of Object.keys(options.sort!)) {\n if (!Object.hasOwn(a, key) || !Object.hasOwn(b, key)) continue\n\n const dir = options.sort![key]\n const aVal = a[key]\n const bVal = b[key]\n\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n if (aVal < bVal) return -1 * dir\n if (aVal > bVal) return 1 * dir\n continue\n }\n\n if (typeof aVal === \"string\" && typeof bVal === \"string\") {\n if (aVal < bVal) return -1 * dir\n if (aVal > bVal) return 1 * dir\n continue\n }\n }\n return 0\n })\n }\n\n return { data: mappedDocs, context: { source: \"cache\" } }\n}\n\nexport const updateDocs = async (\n modelName: string,\n data: Array<Record<string, unknown> & { _id: string }>,\n uid: string,\n): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n\n const allIds = data.map((doc) => doc._id).filter(Boolean)\n if (!allIds.length) return\n\n const { docs: currentDocs } = await collection.find({\n selector: { _id: { $in: allIds } },\n fields: [\"_id\", \"_rev\"],\n limit: allIds.length,\n })\n\n const currentDocsById = currentDocs.reduce<Record<string, Record<string, unknown>>>((acc, doc) => {\n const id = String(doc._id ?? \"\")\n if (id) acc[id] = doc\n return acc\n }, {})\n\n const newDocs = data.map((mongoDoc) => {\n const currentDoc = currentDocsById[mongoDoc._id] ?? { _id: mongoDoc._id }\n const nextDoc = Object.entries(mongoDoc).reduce<Record<string, unknown>>((acc, [key, value]) => {\n const newKey = key !== \"_id\" && key.startsWith(\"_\") ? `${UNDERSCORE_PREFIX}${key}` : key\n acc[newKey] = value\n return acc\n }, { ...currentDoc })\n\n const rev = currentDoc._rev\n if (typeof rev === \"string\" && rev) {\n nextDoc._rev = rev\n } else {\n delete nextDoc._rev\n }\n\n return nextDoc\n })\n\n await collection.bulkDocs(newDocs)\n}\n\nexport const deleteDocs = async (modelName: string, ids: string[], uid: string): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n\n const allIds = ids.map((id) => String(id ?? \"\")).filter(Boolean)\n if (!allIds.length) return\n\n const { docs: currentDocs } = await collection.find({\n selector: { _id: { $in: allIds } },\n fields: [\"_id\", \"_rev\"],\n limit: allIds.length,\n })\n\n const deletions = currentDocs\n .map((doc) => ({\n _id: String((doc as { _id?: unknown })?._id ?? \"\"),\n _rev: (doc as { _rev?: unknown })?._rev,\n _deleted: true,\n }))\n .filter((doc) => doc._id && typeof doc._rev === \"string\" && doc._rev)\n\n if (!deletions.length) return\n await collection.bulkDocs(deletions)\n}\n\nexport const destroyCollection = async (modelName: string, uid: string): Promise<void> => {\n const collection = await getCollection(modelName, { uid })\n const prefix = getPrefix()\n const dbName = `${uid}/${modelName}`\n collections.delete(`${prefix}${dbName}`)\n unregisterDbName(prefix, dbName)\n await collection.destroy()\n}\n\nexport const resetRtsPouchStore = ({ tenantId, appName }: { tenantId: string; appName?: string }): string => {\n ensureBrowser()\n const basePrefix = computeBasePrefix({ tenantId, appName })\n const oldPrefix = readPrefixOverride({ tenantId, appName }) ?? basePrefix\n const dbNames = Array.from(loadDbNames(oldPrefix))\n const openDbs = Array.from(collections.entries())\n .filter(([key]) => key.startsWith(oldPrefix))\n .map(([, db]) => db)\n\n void (async () => {\n const remaining = new Set(dbNames)\n\n await Promise.all(openDbs.map((db) => db.destroy().catch(() => {})))\n\n if (remaining.size) {\n const PouchDB = await getPouchDb()\n const PouchDBForPrefix = (PouchDB.defaults?.({}) ?? PouchDB) as PouchDbStatic\n PouchDBForPrefix.prefix = oldPrefix\n\n await Promise.all(Array.from(remaining).map(async (name) => {\n const db = new PouchDBForPrefix(name, { adapter: \"indexeddb\", revs_limit: 1 }) as PouchDbDatabase\n await db.destroy().then(() => {\n remaining.delete(name)\n }).catch(() => {})\n }))\n }\n\n if (remaining.size) {\n persistDbNames(oldPrefix, remaining)\n } else {\n persistDbNames(oldPrefix, new Set())\n }\n })()\n\n const newPrefix = `${basePrefix}reset-${Date.now().toString(16)}/`\n try {\n window.localStorage.setItem(getPrefixOverrideKey({ tenantId, appName }), newPrefix)\n } catch {\n return newPrefix\n }\n\n lastAppliedPrefix = null\n collections.clear()\n return newPrefix\n}\n\nexport const destroyAllCollections = async (): Promise<void> => {\n const dbs = Array.from(collections.values())\n await Promise.all(dbs.map((db) => db.destroy()))\n collections.clear()\n}\n","import { configureRtsPouchStore, deleteDocs, destroyCollection, resetRtsPouchStore, runQuery, updateDocs } from \"./pouchStore\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport type RtsNetworkQueryContext = {\n source: \"network\"\n isLocal: boolean\n txnId?: string\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}\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: string\n query: JsonObject\n options: RtsQueryOptions\n queryKey: string\n}\n\ntype ServerMessage =\n | { type: \"query-payload\"; modelName: string; queryKey: string; data?: unknown; error?: string; txnId?: string }\n | { type: \"event\"; event: string; payload?: unknown }\n\ntype ClientMessage =\n | { type: \"run-query\"; modelName: string; queryKey: string; query: JsonObject; options?: RtsQueryOptions }\n | { type: \"register-query\"; modelName: string; queryKey: string; query: JsonObject; options?: RtsQueryOptions }\n | { type: \"remove-query\"; modelName: string; queryKey: string }\n | { type: \"event\"; event: string; payload?: unknown }\n\nconst TENANT_ID_QUERY_PARAM = \"rb-tenant-id\"\nconst RTS_CHANGES_ROUTE = \"/api/rb/rts/changes\"\nconst MAX_TXN_BUF = 2048\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\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 computeQueryKey = (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 return `${key}${JSON.stringify(query)}${projection}${sort}${limit}`\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 = (): void => {\n for (const sub of subscriptions.values()) {\n sendToServer({\n type: \"register-query\",\n modelName: sub.modelName,\n queryKey: sub.queryKey,\n query: sub.query,\n options: sub.options,\n })\n sendToServer({\n type: \"run-query\",\n modelName: sub.modelName,\n queryKey: sub.queryKey,\n query: sub.query,\n options: sub.options,\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) return\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 const delay = Math.min(delayMaxMs, delayMs * Math.pow(2, reconnectAttempts))\n reconnectAttempts += 1\n reconnectTimer = window.setTimeout(() => {\n void connectInternal(currentTenantId!, currentUid!, connectOptions, { resetReconnectAttempts: false })\n }, delay)\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\n const isLocal = !!(txnId && localTxnBuf.includes(txnId))\n const context: RtsNetworkQueryContext = { source: \"network\", isLocal, txnId }\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)\n ? data.filter((doc): doc is Record<string, unknown> & { _id: string } => {\n if (!doc || typeof doc !== \"object\") return false\n return typeof (doc as { _id?: unknown })._id === \"string\"\n })\n : []\n\n if (!docs.length) return\n\n void updateDocs(modelName, docs, currentUid)\n .catch(() => {})\n}\n\nconst handleEvent = (payload: Extract<ServerMessage, { type: \"event\" }>) => {\n const callbacks = messageCallbacks.get(payload.event)\n if (!callbacks || !callbacks.size) return\n for (const cb of callbacks) cb(payload.payload)\n}\n\nconst handleMessage = (event: MessageEvent) => {\n let parsed: unknown\n try {\n parsed = JSON.parse(typeof event.data === \"string\" ? event.data : String(event.data))\n } catch {\n return\n }\n\n if (!parsed || typeof parsed !== \"object\") return\n const message = parsed as ServerMessage\n\n if (message.type === \"query-payload\") {\n handleQueryPayload(message)\n return\n }\n\n if (message.type === \"event\") {\n handleEvent(message)\n }\n}\n\nexport const addLocalTxn = (txnId: string): void => {\n if (!txnId) return\n localTxnBuf.push(txnId)\n if (localTxnBuf.length > MAX_TXN_BUF) {\n localTxnBuf.shift()\n }\n}\n\ntype RtsChangeRecord = {\n seq: number\n modelName: string\n op: \"delete\" | \"reset_model\"\n docId?: string\n}\n\nconst getSyncStorageKey = ({ tenantId, uid, appName }: { tenantId: string; uid: string; appName?: string }): string =>\n `rb:rts:changesSeq:${appName ?? \"\"}:${tenantId}:${uid}`\n\nconst readStoredSeq = (key: string): number => {\n try {\n const raw = window.localStorage.getItem(key)\n const num = raw ? Number(raw) : 0\n return Number.isFinite(num) && num >= 0 ? Math.floor(num) : 0\n } catch {\n return 0\n }\n}\n\nconst writeStoredSeq = (key: string, value: number): void => {\n try {\n window.localStorage.setItem(key, String(Math.max(0, Math.floor(value))))\n } catch {\n return\n }\n}\n\nconst applyChangeBatch = async (changes: RtsChangeRecord[], uid: string): Promise<void> => {\n const resetModels = new Set<string>()\n const deletesByModel = new Map<string, string[]>()\n\n for (const change of changes) {\n const modelName = typeof change.modelName === \"string\" ? change.modelName : \"\"\n if (!modelName) continue\n\n if (change.op === \"reset_model\") {\n resetModels.add(modelName)\n continue\n }\n\n if (change.op === \"delete\") {\n const docId = typeof change.docId === \"string\" ? change.docId : \"\"\n if (!docId) continue\n const existing = deletesByModel.get(modelName) ?? []\n existing.push(docId)\n deletesByModel.set(modelName, existing)\n }\n }\n\n for (const modelName of resetModels) {\n await destroyCollection(modelName, uid).catch(() => {})\n }\n\n for (const [modelName, ids] of deletesByModel.entries()) {\n if (resetModels.has(modelName)) continue\n await deleteDocs(modelName, ids, uid).catch(() => {})\n }\n}\n\nexport const syncRtsChanges = async (tenantId: string, uid: string, options: Pick<RtsConnectOptions, \"appName\"> = {}): Promise<void> => {\n ensureBrowser()\n if (!tenantId || !uid) return\n\n const storageKey = getSyncStorageKey({ tenantId, uid, appName: options.appName })\n let sinceSeq = readStoredSeq(storageKey)\n\n for (let i = 0; i < 32; i += 1) {\n const url = `${RTS_CHANGES_ROUTE}?${TENANT_ID_QUERY_PARAM}=${encodeURIComponent(tenantId)}`\n const response = await fetch(url, {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ sinceSeq, limit: 2000 }),\n })\n\n if (!response.ok) return\n\n const payload: unknown = await response.json().catch(() => null)\n if (!payload || typeof payload !== \"object\") return\n const ok = (payload as { ok?: unknown }).ok\n if (ok !== true) return\n\n const latestSeq = Number((payload as { latestSeq?: unknown }).latestSeq ?? 0)\n const needsFullResync = Boolean((payload as { needsFullResync?: unknown }).needsFullResync)\n\n if (needsFullResync) {\n resetRtsPouchStore({ tenantId, appName: options.appName })\n writeStoredSeq(storageKey, latestSeq)\n return\n }\n\n const changesRaw = (payload as { changes?: unknown }).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 { seq?: unknown; modelName?: unknown; op?: unknown; docId?: unknown }\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 resubscribeAll()\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\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 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 disconnect()\n return connect(tenantId, uid, options)\n}\n\nexport const registerQuery = (\n modelName: string,\n query: JsonObject,\n optionsOrCallback?: RtsQueryOptions | QueryCallback,\n callbackMaybe?: QueryCallback,\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 (!modelName) return undefined\n\n const queryKey = computeQueryKey(query, options)\n const cbKey = `${modelName}.${queryKey}`\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 })\n\n if (currentUid) {\n void runQuery({\n modelName,\n query,\n options: {\n uid: currentUid,\n projection: options.projection,\n sort: options.sort,\n limit: options.limit,\n },\n }).then(({ data, context }) => {\n callback?.(null, data, context)\n }).catch(() => {\n // ignore\n })\n }\n\n sendToServer({ type: \"run-query\", modelName, queryKey, query, options })\n sendToServer({ type: \"register-query\", modelName, queryKey, query, options })\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\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\"\n\nimport type { RtsQueryContext, RtsQueryOptions } from \"./wsClient\"\nimport { registerQuery } from \"./wsClient\"\n\n\ntype JsonObject = Record<string, unknown>\n\nexport type UseRtsQueryOptions = RtsQueryOptions & {\n skipLocal?: boolean\n}\n\nexport type UseRtsQueryResult<T> = {\n data: T[] | undefined\n source: RtsQueryContext[\"source\"] | undefined\n error: unknown | undefined\n loading: boolean\n}\n\nexport const useQuery = <T extends Record<string, unknown> = Record<string, unknown>>(\n modelName: string,\n query: JsonObject = {},\n options: UseRtsQueryOptions = {},\n): UseRtsQueryResult<T> => {\n const id = useId()\n\n const key = options.key ?? id\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\n const [data, setData] = useState<T[] | undefined>(undefined)\n const [source, setSource] = useState<RtsQueryContext[\"source\"] | undefined>(undefined)\n const [error, setError] = useState<unknown | undefined>(undefined)\n const [loading, setLoading] = useState<boolean>(true)\n\n const hasFirstReply = useRef(false)\n const hasNetworkReply = useRef(false)\n const lastDataJsonRef = useRef<string>(\"\")\n\n useEffect(() => {\n hasFirstReply.current = false\n hasNetworkReply.current = false\n lastDataJsonRef.current = \"\"\n setLoading(true)\n setError(undefined)\n }, [modelName, key, JSON.stringify(query), projectionJson, sortJson, limitStr])\n\n useEffect(() => {\n if (!modelName) return\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 },\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\n let nextJson = \"\"\n try {\n nextJson = JSON.stringify(result)\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 setData(result as T[])\n },\n )\n\n return () => {\n unsubscribe?.()\n }\n }, [modelName, key, JSON.stringify(query), projectionJson, sortJson, limitStr])\n\n return useMemo(\n () => ({\n data,\n source,\n error,\n loading,\n }),\n [data, source, error, loading],\n )\n}\n\n"],"names":["ensureBrowser"],"mappings":"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"}
|