@terreno/rtk 0.13.3 → 0.14.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/authSlice.test.js +2 -10
- package/dist/authSlice.test.js.map +1 -1
- package/dist/authSliceNative.test.js +11 -3
- package/dist/authSliceNative.test.js.map +1 -1
- package/dist/betterAuthSlice.test.js +1 -25
- package/dist/betterAuthSlice.test.js.map +1 -1
- package/dist/constants.d.ts +3 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +11 -3
- package/dist/constants.js.map +1 -1
- package/dist/constants.test.js +44 -2
- package/dist/constants.test.js.map +1 -1
- package/dist/emptyApi.d.ts +2 -0
- package/dist/emptyApi.d.ts.map +1 -1
- package/dist/emptyApi.js +5 -0
- package/dist/emptyApi.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/isolated/constants.isolated.js +7 -1
- package/dist/isolated/constants.isolated.js.map +1 -1
- package/dist/isolated/offlineMiddleware.isolated.d.ts +2 -0
- package/dist/isolated/offlineMiddleware.isolated.d.ts.map +1 -0
- package/dist/isolated/offlineMiddleware.isolated.js +516 -0
- package/dist/isolated/offlineMiddleware.isolated.js.map +1 -0
- package/dist/isolated/offlineMiddleware.native.isolated.d.ts +2 -0
- package/dist/isolated/offlineMiddleware.native.isolated.d.ts.map +1 -0
- package/dist/isolated/offlineMiddleware.native.isolated.js +70 -0
- package/dist/isolated/offlineMiddleware.native.isolated.js.map +1 -0
- package/dist/isolated/useUpgradeCheck.mobile.isolated.d.ts +2 -0
- package/dist/isolated/useUpgradeCheck.mobile.isolated.d.ts.map +1 -0
- package/dist/{useUpgradeCheck.mobile.test.js → isolated/useUpgradeCheck.mobile.isolated.js} +13 -5
- package/dist/isolated/useUpgradeCheck.mobile.isolated.js.map +1 -0
- package/dist/isolated/useUpgradeCheck.web.isolated.d.ts +2 -0
- package/dist/isolated/useUpgradeCheck.web.isolated.d.ts.map +1 -0
- package/dist/{useUpgradeCheck.test.js → isolated/useUpgradeCheck.web.isolated.js} +37 -7
- package/dist/isolated/useUpgradeCheck.web.isolated.js.map +1 -0
- package/dist/mongooseSlice.test.js +1 -1
- package/dist/mongooseSlice.test.js.map +1 -1
- package/dist/offlineGate.d.ts +8 -0
- package/dist/offlineGate.d.ts.map +1 -0
- package/dist/offlineGate.js +20 -0
- package/dist/offlineGate.js.map +1 -0
- package/dist/offlineGate.test.d.ts +2 -0
- package/dist/offlineGate.test.d.ts.map +1 -0
- package/dist/offlineGate.test.js +46 -0
- package/dist/offlineGate.test.js.map +1 -0
- package/dist/offlineMiddleware.d.ts +46 -0
- package/dist/offlineMiddleware.d.ts.map +1 -0
- package/dist/offlineMiddleware.js +591 -0
- package/dist/offlineMiddleware.js.map +1 -0
- package/dist/offlineMiddleware.test.d.ts +2 -0
- package/dist/offlineMiddleware.test.d.ts.map +1 -0
- package/dist/offlineMiddleware.test.js +145 -0
- package/dist/offlineMiddleware.test.js.map +1 -0
- package/dist/offlineSlice.d.ts +232 -0
- package/dist/offlineSlice.d.ts.map +1 -0
- package/dist/offlineSlice.js +65 -0
- package/dist/offlineSlice.js.map +1 -0
- package/dist/offlineSlice.test.d.ts +2 -0
- package/dist/offlineSlice.test.d.ts.map +1 -0
- package/dist/offlineSlice.test.js +153 -0
- package/dist/offlineSlice.test.js.map +1 -0
- package/dist/realtime.d.ts +123 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +299 -0
- package/dist/realtime.js.map +1 -0
- package/dist/realtime.test.d.ts +2 -0
- package/dist/realtime.test.d.ts.map +1 -0
- package/dist/realtime.test.js +339 -0
- package/dist/realtime.test.js.map +1 -0
- package/dist/socket.d.ts.map +1 -1
- package/dist/socket.js +29 -28
- package/dist/socket.js.map +1 -1
- package/dist/sync.d.ts +35 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +205 -0
- package/dist/sync.js.map +1 -0
- package/dist/tagGenerator.d.ts +20 -1
- package/dist/tagGenerator.d.ts.map +1 -1
- package/dist/tagGenerator.js +1 -2
- package/dist/tagGenerator.js.map +1 -1
- package/dist/useOfflineStatus.d.ts +33 -0
- package/dist/useOfflineStatus.d.ts.map +1 -0
- package/dist/useOfflineStatus.js +43 -0
- package/dist/useOfflineStatus.js.map +1 -0
- package/dist/useOfflineStatus.test.d.ts +2 -0
- package/dist/useOfflineStatus.test.d.ts.map +1 -0
- package/dist/useOfflineStatus.test.js +119 -0
- package/dist/useOfflineStatus.test.js.map +1 -0
- package/dist/useRealtimeDebug.d.ts +6 -0
- package/dist/useRealtimeDebug.d.ts.map +1 -0
- package/dist/useRealtimeDebug.js +41 -0
- package/dist/useRealtimeDebug.js.map +1 -0
- package/dist/useServerStatus.d.ts +29 -0
- package/dist/useServerStatus.d.ts.map +1 -0
- package/dist/useServerStatus.js +89 -0
- package/dist/useServerStatus.js.map +1 -0
- package/dist/useUpgradeCheck.d.ts +7 -3
- package/dist/useUpgradeCheck.d.ts.map +1 -1
- package/dist/useUpgradeCheck.js +27 -13
- package/dist/useUpgradeCheck.js.map +1 -1
- package/package.json +2 -2
- package/src/authSlice.test.ts +2 -11
- package/src/authSliceNative.test.ts +11 -4
- package/src/betterAuthSlice.test.ts +1 -25
- package/src/constants.test.ts +54 -1
- package/src/constants.ts +14 -3
- package/src/emptyApi.ts +8 -0
- package/src/index.ts +8 -0
- package/src/isolated/constants.isolated.ts +7 -3
- package/src/isolated/offlineMiddleware.isolated.ts +696 -0
- package/src/isolated/offlineMiddleware.native.isolated.ts +80 -0
- package/src/{useUpgradeCheck.mobile.test.ts → isolated/useUpgradeCheck.mobile.isolated.ts} +13 -4
- package/src/{useUpgradeCheck.test.ts → isolated/useUpgradeCheck.web.isolated.ts} +48 -6
- package/src/mongooseSlice.test.ts +1 -1
- package/src/offlineGate.test.ts +55 -0
- package/src/offlineGate.ts +25 -0
- package/src/offlineMiddleware.test.ts +187 -0
- package/src/offlineMiddleware.ts +718 -0
- package/src/offlineSlice.test.ts +204 -0
- package/src/offlineSlice.ts +130 -0
- package/src/realtime.test.ts +404 -0
- package/src/realtime.ts +408 -0
- package/src/socket.ts +33 -32
- package/src/sync.ts +310 -0
- package/src/tagGenerator.ts +29 -11
- package/src/useOfflineStatus.test.ts +157 -0
- package/src/useOfflineStatus.ts +82 -0
- package/src/useRealtimeDebug.ts +51 -0
- package/src/useServerStatus.ts +122 -0
- package/src/useUpgradeCheck.ts +35 -13
- package/dist/isolated/useUpgradeCheck.isolated.d.ts +0 -2
- package/dist/isolated/useUpgradeCheck.isolated.d.ts.map +0 -1
- package/dist/isolated/useUpgradeCheck.isolated.js +0 -153
- package/dist/isolated/useUpgradeCheck.isolated.js.map +0 -1
- package/dist/useUpgradeCheck.mobile.test.d.ts +0 -2
- package/dist/useUpgradeCheck.mobile.test.d.ts.map +0 -1
- package/dist/useUpgradeCheck.mobile.test.js.map +0 -1
- package/dist/useUpgradeCheck.test.d.ts +0 -2
- package/dist/useUpgradeCheck.test.d.ts.map +0 -1
- package/dist/useUpgradeCheck.test.js.map +0 -1
- package/src/isolated/useUpgradeCheck.isolated.ts +0 -201
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { Socket } from "socket.io-client";
|
|
2
|
+
interface DocumentData {
|
|
3
|
+
_id?: string;
|
|
4
|
+
id?: string;
|
|
5
|
+
updated?: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
interface ListCacheDraft {
|
|
9
|
+
data?: DocumentData[];
|
|
10
|
+
total?: number;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
}
|
|
13
|
+
interface CacheLifecycleApi<TDraft> {
|
|
14
|
+
updateCachedData: (updateRecipe: (draft: TDraft) => void) => void;
|
|
15
|
+
cacheDataLoaded: Promise<unknown>;
|
|
16
|
+
cacheEntryRemoved: Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A real-time sync event received from the server via WebSocket.
|
|
20
|
+
* Must be kept in sync with the backend RealtimeEvent in @terreno/api.
|
|
21
|
+
*/
|
|
22
|
+
export interface RealtimeEvent {
|
|
23
|
+
/** Mongoose model name (e.g. "Todo") */
|
|
24
|
+
model: string;
|
|
25
|
+
/** Route path used as tag type (e.g. "todos") */
|
|
26
|
+
collection: string;
|
|
27
|
+
/** The CRUD method that triggered this event */
|
|
28
|
+
method: "create" | "update" | "delete";
|
|
29
|
+
/** Document ID */
|
|
30
|
+
id: string;
|
|
31
|
+
/** Serialized document data (omitted for hard deletes) */
|
|
32
|
+
data?: DocumentData;
|
|
33
|
+
/** Fields that were updated (for update events) */
|
|
34
|
+
updatedFields?: string[];
|
|
35
|
+
/** Epoch milliseconds when the event was generated */
|
|
36
|
+
timestamp: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Provide the Socket.io client instance used by `realtimeDocument` and `realtimeList`.
|
|
40
|
+
*
|
|
41
|
+
* Call this once after your socket connects (e.g. inside `useSocketConnection`'s `onConnect`
|
|
42
|
+
* callback, or in a `useEffect` that watches the socket ref).
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```typescript
|
|
46
|
+
* const { socket } = useSocketConnection({ ... });
|
|
47
|
+
*
|
|
48
|
+
* useEffect(() => {
|
|
49
|
+
* setRealtimeSocket(socket);
|
|
50
|
+
* return () => setRealtimeSocket(null);
|
|
51
|
+
* }, [socket]);
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare const setRealtimeSocket: (socket: Socket | null) => void;
|
|
55
|
+
/** Get the current socket instance (may be null). */
|
|
56
|
+
export declare const getRealtimeSocket: () => Socket | null;
|
|
57
|
+
interface RealtimeDocumentOptions {
|
|
58
|
+
/**
|
|
59
|
+
* Extract the document ID from the RTK Query argument.
|
|
60
|
+
* Defaults to `arg` if string, or `arg.id ?? arg._id`.
|
|
61
|
+
*/
|
|
62
|
+
getId?: (arg: unknown) => string | undefined;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Factory that returns an `onCacheEntryAdded` callback for real-time
|
|
66
|
+
* updates on a **single document**.
|
|
67
|
+
*
|
|
68
|
+
* Subscribes to `document:{collection}:{id}` room on the server. When a sync
|
|
69
|
+
* event arrives for this document, patches the RTK Query cache in-place.
|
|
70
|
+
*
|
|
71
|
+
* @param collection - The collection tag (e.g. "todos")
|
|
72
|
+
* @param options - Optional configuration
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* const api = generatedApi.enhanceEndpoints({
|
|
77
|
+
* endpoints: {
|
|
78
|
+
* getTodosIdRead: {
|
|
79
|
+
* onCacheEntryAdded: realtimeDocument("todos"),
|
|
80
|
+
* },
|
|
81
|
+
* },
|
|
82
|
+
* });
|
|
83
|
+
* ```
|
|
84
|
+
*/
|
|
85
|
+
export declare const realtimeDocument: (collection: string, options?: RealtimeDocumentOptions) => (arg: unknown, api: CacheLifecycleApi<DocumentData>) => Promise<void>;
|
|
86
|
+
interface RealtimeListOptions {
|
|
87
|
+
/**
|
|
88
|
+
* Extract the query filter from the RTK Query argument.
|
|
89
|
+
* Defaults to stripping pagination keys (limit, page, sort, skip, offset, cursor).
|
|
90
|
+
* Return undefined to subscribe to the model room instead of a query room.
|
|
91
|
+
*/
|
|
92
|
+
getQuery?: (arg: unknown) => Record<string, unknown> | undefined;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Factory that returns an `onCacheEntryAdded` callback for real-time
|
|
96
|
+
* updates on a **list of documents**, optionally filtered by query.
|
|
97
|
+
*
|
|
98
|
+
* If the query argument contains filter fields (after stripping pagination params),
|
|
99
|
+
* subscribes to `query:{queryId}` so the server only sends matching events.
|
|
100
|
+
* Otherwise subscribes to `model:{collection}` for all events.
|
|
101
|
+
*
|
|
102
|
+
* Handles:
|
|
103
|
+
* - **create** → prepends new document to the list
|
|
104
|
+
* - **update** → patches existing document in-place, or adds it if newly matching
|
|
105
|
+
* - **delete** → removes document from the list
|
|
106
|
+
*
|
|
107
|
+
* @param collection - The collection tag (e.g. "todos")
|
|
108
|
+
* @param options - Optional configuration
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* const api = generatedApi.enhanceEndpoints({
|
|
113
|
+
* endpoints: {
|
|
114
|
+
* getTodosList: {
|
|
115
|
+
* onCacheEntryAdded: realtimeList("todos"),
|
|
116
|
+
* },
|
|
117
|
+
* },
|
|
118
|
+
* });
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
export declare const realtimeList: (collection: string, options?: RealtimeListOptions) => (arg: unknown, api: CacheLifecycleApi<ListCacheDraft>) => Promise<void>;
|
|
122
|
+
export {};
|
|
123
|
+
//# sourceMappingURL=realtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAC;AAI7C,UAAU,YAAY;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,UAAU,iBAAiB,CAAC,MAAM;IAChC,gBAAgB,EAAE,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;IAClE,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,iBAAiB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACvC,kBAAkB;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;CACnB;AASD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,GAAG,IAAI,KAAG,IAQzD,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,iBAAiB,QAAO,MAAM,GAAG,IAAe,CAAC;AAoE9D,UAAU,uBAAuB;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;CAC9C;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,gBAAgB,GAAI,YAAY,MAAM,EAAE,UAAU,uBAAuB,MAWtE,KAAK,OAAO,EAAE,KAAK,iBAAiB,CAAC,YAAY,CAAC,KAAG,OAAO,CAAC,IAAI,CA+ChF,CAAC;AAEF,UAAU,mBAAmB;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAClE;AAQD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,YAAY,GAAI,YAAY,MAAM,EAAE,UAAU,mBAAmB,MAK9D,KAAK,OAAO,EAAE,KAAK,iBAAiB,CAAC,cAAc,CAAC,KAAG,OAAO,CAAC,IAAI,CA4HlF,CAAC"}
|
package/dist/realtime.js
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { DateTime } from "luxon";
|
|
2
|
+
import { isWebsocketsDebugEnabled, logSocket } from "./constants";
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Socket management
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
let _socket = null;
|
|
7
|
+
const _socketWaiters = [];
|
|
8
|
+
/**
|
|
9
|
+
* Provide the Socket.io client instance used by `realtimeDocument` and `realtimeList`.
|
|
10
|
+
*
|
|
11
|
+
* Call this once after your socket connects (e.g. inside `useSocketConnection`'s `onConnect`
|
|
12
|
+
* callback, or in a `useEffect` that watches the socket ref).
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const { socket } = useSocketConnection({ ... });
|
|
17
|
+
*
|
|
18
|
+
* useEffect(() => {
|
|
19
|
+
* setRealtimeSocket(socket);
|
|
20
|
+
* return () => setRealtimeSocket(null);
|
|
21
|
+
* }, [socket]);
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export const setRealtimeSocket = (socket) => {
|
|
25
|
+
_socket = socket;
|
|
26
|
+
if (socket) {
|
|
27
|
+
while (_socketWaiters.length > 0) {
|
|
28
|
+
const waiter = _socketWaiters.shift();
|
|
29
|
+
waiter?.(socket);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
/** Get the current socket instance (may be null). */
|
|
34
|
+
export const getRealtimeSocket = () => _socket;
|
|
35
|
+
/**
|
|
36
|
+
* Returns a promise that resolves as soon as a socket is available.
|
|
37
|
+
* Accepts an optional abort promise — if it resolves first, returns null
|
|
38
|
+
* so the caller can bail out (e.g. when the cache entry is removed).
|
|
39
|
+
*/
|
|
40
|
+
const waitForSocket = (abort) => {
|
|
41
|
+
if (_socket) {
|
|
42
|
+
return Promise.resolve(_socket);
|
|
43
|
+
}
|
|
44
|
+
const socketPromise = new Promise((resolve) => {
|
|
45
|
+
_socketWaiters.push(resolve);
|
|
46
|
+
});
|
|
47
|
+
if (!abort) {
|
|
48
|
+
return socketPromise;
|
|
49
|
+
}
|
|
50
|
+
return Promise.race([socketPromise, abort.then(() => null)]);
|
|
51
|
+
};
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Helpers
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
/** Keys that represent pagination/sorting, not document field filters. */
|
|
56
|
+
const PAGINATION_KEYS = new Set(["limit", "page", "sort", "skip", "offset", "cursor"]);
|
|
57
|
+
/**
|
|
58
|
+
* Strip pagination params from a query argument to get just the filter.
|
|
59
|
+
* Returns undefined if no filter fields remain.
|
|
60
|
+
*/
|
|
61
|
+
const extractQueryFilter = (arg) => {
|
|
62
|
+
if (!arg || typeof arg !== "object") {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
const filter = {};
|
|
66
|
+
for (const [key, value] of Object.entries(arg)) {
|
|
67
|
+
if (!PAGINATION_KEYS.has(key)) {
|
|
68
|
+
filter[key] = value;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return Object.keys(filter).length > 0 ? filter : undefined;
|
|
72
|
+
};
|
|
73
|
+
/** Normalize websocket document payloads to match REST API shape (`id` from `_id`). */
|
|
74
|
+
const normalizeRealtimeData = (data) => {
|
|
75
|
+
if (data._id != null && data.id == null) {
|
|
76
|
+
return { ...data, id: data._id };
|
|
77
|
+
}
|
|
78
|
+
return data;
|
|
79
|
+
};
|
|
80
|
+
/** Deterministic hash for a query object — used as the room ID. */
|
|
81
|
+
const hashQuery = (collection, query) => {
|
|
82
|
+
const sortedKeys = Object.keys(query).sort();
|
|
83
|
+
const normalized = {};
|
|
84
|
+
for (const key of sortedKeys) {
|
|
85
|
+
normalized[key] = query[key];
|
|
86
|
+
}
|
|
87
|
+
return `${collection}:${JSON.stringify(normalized)}`;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Factory that returns an `onCacheEntryAdded` callback for real-time
|
|
91
|
+
* updates on a **single document**.
|
|
92
|
+
*
|
|
93
|
+
* Subscribes to `document:{collection}:{id}` room on the server. When a sync
|
|
94
|
+
* event arrives for this document, patches the RTK Query cache in-place.
|
|
95
|
+
*
|
|
96
|
+
* @param collection - The collection tag (e.g. "todos")
|
|
97
|
+
* @param options - Optional configuration
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* const api = generatedApi.enhanceEndpoints({
|
|
102
|
+
* endpoints: {
|
|
103
|
+
* getTodosIdRead: {
|
|
104
|
+
* onCacheEntryAdded: realtimeDocument("todos"),
|
|
105
|
+
* },
|
|
106
|
+
* },
|
|
107
|
+
* });
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export const realtimeDocument = (collection, options) => {
|
|
111
|
+
const getId = options?.getId ??
|
|
112
|
+
((arg) => {
|
|
113
|
+
if (typeof arg === "string") {
|
|
114
|
+
return arg;
|
|
115
|
+
}
|
|
116
|
+
const obj = arg;
|
|
117
|
+
return obj?.id ?? obj?._id;
|
|
118
|
+
});
|
|
119
|
+
return async (arg, api) => {
|
|
120
|
+
const { updateCachedData, cacheDataLoaded, cacheEntryRemoved } = api;
|
|
121
|
+
const id = getId(arg);
|
|
122
|
+
if (!id) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
await cacheDataLoaded;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const socket = await waitForSocket(cacheEntryRemoved);
|
|
132
|
+
if (!socket) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
socket.emit("subscribe:document", { collection, id });
|
|
136
|
+
const handleSync = (event) => {
|
|
137
|
+
if (isWebsocketsDebugEnabled()) {
|
|
138
|
+
logSocket(true, `realtimeDocument(${collection}/${id}) sync: ${JSON.stringify(event)}`);
|
|
139
|
+
}
|
|
140
|
+
if (event.collection !== collection || event.id !== id) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (event.method === "update" && event.data) {
|
|
144
|
+
const data = normalizeRealtimeData(event.data);
|
|
145
|
+
updateCachedData((draft) => {
|
|
146
|
+
Object.assign(draft, data);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// For deletes, the cache entry will be invalidated by tag invalidation
|
|
150
|
+
// or the consuming component can handle the deleted state.
|
|
151
|
+
};
|
|
152
|
+
socket.on("sync", handleSync);
|
|
153
|
+
await cacheEntryRemoved;
|
|
154
|
+
socket.off("sync", handleSync);
|
|
155
|
+
socket.emit("unsubscribe:document", { collection, id });
|
|
156
|
+
};
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* Factory that returns an `onCacheEntryAdded` callback for real-time
|
|
160
|
+
* updates on a **list of documents**, optionally filtered by query.
|
|
161
|
+
*
|
|
162
|
+
* If the query argument contains filter fields (after stripping pagination params),
|
|
163
|
+
* subscribes to `query:{queryId}` so the server only sends matching events.
|
|
164
|
+
* Otherwise subscribes to `model:{collection}` for all events.
|
|
165
|
+
*
|
|
166
|
+
* Handles:
|
|
167
|
+
* - **create** → prepends new document to the list
|
|
168
|
+
* - **update** → patches existing document in-place, or adds it if newly matching
|
|
169
|
+
* - **delete** → removes document from the list
|
|
170
|
+
*
|
|
171
|
+
* @param collection - The collection tag (e.g. "todos")
|
|
172
|
+
* @param options - Optional configuration
|
|
173
|
+
*
|
|
174
|
+
* @example
|
|
175
|
+
* ```typescript
|
|
176
|
+
* const api = generatedApi.enhanceEndpoints({
|
|
177
|
+
* endpoints: {
|
|
178
|
+
* getTodosList: {
|
|
179
|
+
* onCacheEntryAdded: realtimeList("todos"),
|
|
180
|
+
* },
|
|
181
|
+
* },
|
|
182
|
+
* });
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
export const realtimeList = (collection, options) => {
|
|
186
|
+
const getQuery = options?.getQuery ??
|
|
187
|
+
((arg) => extractQueryFilter(arg));
|
|
188
|
+
return async (arg, api) => {
|
|
189
|
+
const { updateCachedData, cacheDataLoaded, cacheEntryRemoved } = api;
|
|
190
|
+
try {
|
|
191
|
+
await cacheDataLoaded;
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const socket = await waitForSocket(cacheEntryRemoved);
|
|
197
|
+
if (!socket) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const query = getQuery(arg);
|
|
201
|
+
let queryId;
|
|
202
|
+
let canonicalQueryId;
|
|
203
|
+
let handleQuerySubscribed;
|
|
204
|
+
if (query) {
|
|
205
|
+
queryId = hashQuery(collection, query);
|
|
206
|
+
handleQuerySubscribed = (payload) => {
|
|
207
|
+
if (payload.collection !== collection) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
if (payload.clientQueryId && payload.clientQueryId !== queryId) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
canonicalQueryId = payload.queryId;
|
|
214
|
+
};
|
|
215
|
+
socket.on("query:subscribed", handleQuerySubscribed);
|
|
216
|
+
socket.emit("subscribe:query", { collection, query, queryId });
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
socket.emit("subscribe:model", collection);
|
|
220
|
+
}
|
|
221
|
+
const handleSync = (event) => {
|
|
222
|
+
if (isWebsocketsDebugEnabled()) {
|
|
223
|
+
logSocket(true, `realtimeList(${collection}) sync: ${JSON.stringify(event)}`);
|
|
224
|
+
}
|
|
225
|
+
if (event.collection !== collection) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
switch (event.method) {
|
|
229
|
+
case "create": {
|
|
230
|
+
if (event.data) {
|
|
231
|
+
const data = normalizeRealtimeData(event.data);
|
|
232
|
+
updateCachedData((draft) => {
|
|
233
|
+
if (draft?.data && Array.isArray(draft.data)) {
|
|
234
|
+
draft.data.unshift(data);
|
|
235
|
+
if (typeof draft.total === "number") {
|
|
236
|
+
draft.total += 1;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
case "update": {
|
|
244
|
+
if (event.data) {
|
|
245
|
+
const data = normalizeRealtimeData(event.data);
|
|
246
|
+
updateCachedData((draft) => {
|
|
247
|
+
if (draft?.data && Array.isArray(draft.data)) {
|
|
248
|
+
const index = draft.data.findIndex((item) => item._id === event.id || item.id === event.id);
|
|
249
|
+
if (index !== -1) {
|
|
250
|
+
// Stale event check
|
|
251
|
+
const cachedUpdated = draft.data[index].updated;
|
|
252
|
+
if (cachedUpdated &&
|
|
253
|
+
data.updated &&
|
|
254
|
+
DateTime.fromISO(cachedUpdated) > DateTime.fromISO(data.updated)) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
Object.assign(draft.data[index], data);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
// Document newly matches query — add it to the list
|
|
261
|
+
draft.data.unshift(data);
|
|
262
|
+
if (typeof draft.total === "number") {
|
|
263
|
+
draft.total += 1;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
case "delete": {
|
|
272
|
+
updateCachedData((draft) => {
|
|
273
|
+
if (draft?.data && Array.isArray(draft.data)) {
|
|
274
|
+
const before = draft.data.length;
|
|
275
|
+
draft.data = draft.data.filter((item) => item._id !== event.id && item.id !== event.id);
|
|
276
|
+
if (draft.data.length < before && typeof draft.total === "number") {
|
|
277
|
+
draft.total = Math.max(0, draft.total - 1);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
socket.on("sync", handleSync);
|
|
286
|
+
await cacheEntryRemoved;
|
|
287
|
+
socket.off("sync", handleSync);
|
|
288
|
+
if (handleQuerySubscribed) {
|
|
289
|
+
socket.off("query:subscribed", handleQuerySubscribed);
|
|
290
|
+
}
|
|
291
|
+
if (queryId) {
|
|
292
|
+
socket.emit("unsubscribe:query", { queryId: canonicalQueryId ?? queryId });
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
socket.emit("unsubscribe:model", collection);
|
|
296
|
+
}
|
|
297
|
+
};
|
|
298
|
+
};
|
|
299
|
+
//# sourceMappingURL=realtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime.js","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime.test.d.ts","sourceRoot":"","sources":["../src/realtime.test.ts"],"names":[],"mappings":""}
|