@terreno/rtk 0.13.0 → 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.
Files changed (147) hide show
  1. package/dist/authSlice.test.js +2 -10
  2. package/dist/authSlice.test.js.map +1 -1
  3. package/dist/authSliceNative.test.js +11 -3
  4. package/dist/authSliceNative.test.js.map +1 -1
  5. package/dist/betterAuthSlice.test.js +1 -25
  6. package/dist/betterAuthSlice.test.js.map +1 -1
  7. package/dist/buildNumber.test.js +19 -0
  8. package/dist/buildNumber.test.js.map +1 -1
  9. package/dist/constants.d.ts +3 -0
  10. package/dist/constants.d.ts.map +1 -1
  11. package/dist/constants.js +11 -3
  12. package/dist/constants.js.map +1 -1
  13. package/dist/constants.test.js +44 -2
  14. package/dist/constants.test.js.map +1 -1
  15. package/dist/emptyApi.d.ts +2 -0
  16. package/dist/emptyApi.d.ts.map +1 -1
  17. package/dist/emptyApi.js +5 -0
  18. package/dist/emptyApi.js.map +1 -1
  19. package/dist/index.d.ts +8 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +8 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/isolated/constants.isolated.js +7 -1
  24. package/dist/isolated/constants.isolated.js.map +1 -1
  25. package/dist/isolated/offlineMiddleware.isolated.d.ts +2 -0
  26. package/dist/isolated/offlineMiddleware.isolated.d.ts.map +1 -0
  27. package/dist/isolated/offlineMiddleware.isolated.js +516 -0
  28. package/dist/isolated/offlineMiddleware.isolated.js.map +1 -0
  29. package/dist/isolated/offlineMiddleware.native.isolated.d.ts +2 -0
  30. package/dist/isolated/offlineMiddleware.native.isolated.d.ts.map +1 -0
  31. package/dist/isolated/offlineMiddleware.native.isolated.js +70 -0
  32. package/dist/isolated/offlineMiddleware.native.isolated.js.map +1 -0
  33. package/dist/isolated/useUpgradeCheck.mobile.isolated.d.ts +2 -0
  34. package/dist/isolated/useUpgradeCheck.mobile.isolated.d.ts.map +1 -0
  35. package/dist/{useUpgradeCheck.mobile.test.js → isolated/useUpgradeCheck.mobile.isolated.js} +13 -5
  36. package/dist/isolated/useUpgradeCheck.mobile.isolated.js.map +1 -0
  37. package/dist/isolated/useUpgradeCheck.web.isolated.d.ts +2 -0
  38. package/dist/isolated/useUpgradeCheck.web.isolated.d.ts.map +1 -0
  39. package/dist/{useUpgradeCheck.test.js → isolated/useUpgradeCheck.web.isolated.js} +37 -7
  40. package/dist/isolated/useUpgradeCheck.web.isolated.js.map +1 -0
  41. package/dist/mongooseSlice.test.js +1 -1
  42. package/dist/mongooseSlice.test.js.map +1 -1
  43. package/dist/offlineGate.d.ts +8 -0
  44. package/dist/offlineGate.d.ts.map +1 -0
  45. package/dist/offlineGate.js +20 -0
  46. package/dist/offlineGate.js.map +1 -0
  47. package/dist/offlineGate.test.d.ts +2 -0
  48. package/dist/offlineGate.test.d.ts.map +1 -0
  49. package/dist/offlineGate.test.js +46 -0
  50. package/dist/offlineGate.test.js.map +1 -0
  51. package/dist/offlineMiddleware.d.ts +46 -0
  52. package/dist/offlineMiddleware.d.ts.map +1 -0
  53. package/dist/offlineMiddleware.js +591 -0
  54. package/dist/offlineMiddleware.js.map +1 -0
  55. package/dist/offlineMiddleware.test.d.ts +2 -0
  56. package/dist/offlineMiddleware.test.d.ts.map +1 -0
  57. package/dist/offlineMiddleware.test.js +145 -0
  58. package/dist/offlineMiddleware.test.js.map +1 -0
  59. package/dist/offlineSlice.d.ts +232 -0
  60. package/dist/offlineSlice.d.ts.map +1 -0
  61. package/dist/offlineSlice.js +65 -0
  62. package/dist/offlineSlice.js.map +1 -0
  63. package/dist/offlineSlice.test.d.ts +2 -0
  64. package/dist/offlineSlice.test.d.ts.map +1 -0
  65. package/dist/offlineSlice.test.js +153 -0
  66. package/dist/offlineSlice.test.js.map +1 -0
  67. package/dist/realtime.d.ts +123 -0
  68. package/dist/realtime.d.ts.map +1 -0
  69. package/dist/realtime.js +299 -0
  70. package/dist/realtime.js.map +1 -0
  71. package/dist/realtime.test.d.ts +2 -0
  72. package/dist/realtime.test.d.ts.map +1 -0
  73. package/dist/realtime.test.js +339 -0
  74. package/dist/realtime.test.js.map +1 -0
  75. package/dist/socket.d.ts.map +1 -1
  76. package/dist/socket.js +29 -28
  77. package/dist/socket.js.map +1 -1
  78. package/dist/sync.d.ts +35 -0
  79. package/dist/sync.d.ts.map +1 -0
  80. package/dist/sync.js +205 -0
  81. package/dist/sync.js.map +1 -0
  82. package/dist/tagGenerator.d.ts +20 -1
  83. package/dist/tagGenerator.d.ts.map +1 -1
  84. package/dist/tagGenerator.js +1 -2
  85. package/dist/tagGenerator.js.map +1 -1
  86. package/dist/useOfflineStatus.d.ts +33 -0
  87. package/dist/useOfflineStatus.d.ts.map +1 -0
  88. package/dist/useOfflineStatus.js +43 -0
  89. package/dist/useOfflineStatus.js.map +1 -0
  90. package/dist/useOfflineStatus.test.d.ts +2 -0
  91. package/dist/useOfflineStatus.test.d.ts.map +1 -0
  92. package/dist/useOfflineStatus.test.js +119 -0
  93. package/dist/useOfflineStatus.test.js.map +1 -0
  94. package/dist/useRealtimeDebug.d.ts +6 -0
  95. package/dist/useRealtimeDebug.d.ts.map +1 -0
  96. package/dist/useRealtimeDebug.js +41 -0
  97. package/dist/useRealtimeDebug.js.map +1 -0
  98. package/dist/useServerStatus.d.ts +29 -0
  99. package/dist/useServerStatus.d.ts.map +1 -0
  100. package/dist/useServerStatus.js +89 -0
  101. package/dist/useServerStatus.js.map +1 -0
  102. package/dist/useUpgradeCheck.d.ts +7 -3
  103. package/dist/useUpgradeCheck.d.ts.map +1 -1
  104. package/dist/useUpgradeCheck.js +27 -13
  105. package/dist/useUpgradeCheck.js.map +1 -1
  106. package/package.json +2 -2
  107. package/src/authSlice.test.ts +2 -11
  108. package/src/authSliceNative.test.ts +11 -4
  109. package/src/betterAuthSlice.test.ts +1 -25
  110. package/src/buildNumber.test.ts +19 -0
  111. package/src/constants.test.ts +54 -1
  112. package/src/constants.ts +14 -3
  113. package/src/emptyApi.ts +8 -0
  114. package/src/index.ts +8 -0
  115. package/src/isolated/constants.isolated.ts +7 -3
  116. package/src/isolated/offlineMiddleware.isolated.ts +696 -0
  117. package/src/isolated/offlineMiddleware.native.isolated.ts +80 -0
  118. package/src/{useUpgradeCheck.mobile.test.ts → isolated/useUpgradeCheck.mobile.isolated.ts} +13 -4
  119. package/src/{useUpgradeCheck.test.ts → isolated/useUpgradeCheck.web.isolated.ts} +48 -6
  120. package/src/mongooseSlice.test.ts +1 -1
  121. package/src/offlineGate.test.ts +55 -0
  122. package/src/offlineGate.ts +25 -0
  123. package/src/offlineMiddleware.test.ts +187 -0
  124. package/src/offlineMiddleware.ts +718 -0
  125. package/src/offlineSlice.test.ts +204 -0
  126. package/src/offlineSlice.ts +130 -0
  127. package/src/realtime.test.ts +404 -0
  128. package/src/realtime.ts +408 -0
  129. package/src/socket.ts +33 -32
  130. package/src/sync.ts +310 -0
  131. package/src/tagGenerator.ts +29 -11
  132. package/src/useOfflineStatus.test.ts +157 -0
  133. package/src/useOfflineStatus.ts +82 -0
  134. package/src/useRealtimeDebug.ts +51 -0
  135. package/src/useServerStatus.ts +122 -0
  136. package/src/useUpgradeCheck.ts +35 -13
  137. package/dist/isolated/useUpgradeCheck.isolated.d.ts +0 -2
  138. package/dist/isolated/useUpgradeCheck.isolated.d.ts.map +0 -1
  139. package/dist/isolated/useUpgradeCheck.isolated.js +0 -153
  140. package/dist/isolated/useUpgradeCheck.isolated.js.map +0 -1
  141. package/dist/useUpgradeCheck.mobile.test.d.ts +0 -2
  142. package/dist/useUpgradeCheck.mobile.test.d.ts.map +0 -1
  143. package/dist/useUpgradeCheck.mobile.test.js.map +0 -1
  144. package/dist/useUpgradeCheck.test.d.ts +0 -2
  145. package/dist/useUpgradeCheck.test.d.ts.map +0 -1
  146. package/dist/useUpgradeCheck.test.js.map +0 -1
  147. package/src/isolated/useUpgradeCheck.isolated.ts +0 -201
@@ -0,0 +1,591 @@
1
+ import { createListenerMiddleware } from "@reduxjs/toolkit";
2
+ import { DateTime } from "luxon";
3
+ import { getAuthToken, selectCurrentUserId } from "./authSlice";
4
+ import { baseUrl, LOGOUT_ACTION_TYPE } from "./constants";
5
+ import { configureOfflineMutationEndpoints } from "./offlineGate";
6
+ import { addConflict, clearConflicts, clearQueue, dequeue, enqueue, offlineReducer, offlineSlice, selectIsOnline, selectIsSyncing, selectOfflineQueue, setOnlineStatus, setSyncing, } from "./offlineSlice";
7
+ import { IsWeb } from "./platform";
8
+ /**
9
+ * Infer the CRUD operation type from an RTK Query endpoint name.
10
+ * Convention: postX = create, patchX = update, deleteX = delete.
11
+ */
12
+ const inferMutationType = (endpointName) => {
13
+ if (endpointName.startsWith("post")) {
14
+ return "create";
15
+ }
16
+ if (endpointName.startsWith("patch")) {
17
+ return "update";
18
+ }
19
+ if (endpointName.startsWith("delete")) {
20
+ return "delete";
21
+ }
22
+ return "update";
23
+ };
24
+ /**
25
+ * True when a rejected RTK Query action failed due to a network/transport error,
26
+ * not an auth or application-level FETCH_ERROR from emptyApi.
27
+ */
28
+ export const isNetworkFetchError = (
29
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query error shapes vary by source
30
+ source) => {
31
+ if (source?.error?.name === "TypeError") {
32
+ return true;
33
+ }
34
+ const NETWORK_PATTERNS = [
35
+ "failed to fetch",
36
+ "fetch failed",
37
+ "network error",
38
+ "network unavailable",
39
+ "load failed",
40
+ ];
41
+ const candidates = [];
42
+ if (typeof source?.error?.message === "string") {
43
+ candidates.push(source.error.message);
44
+ }
45
+ if (typeof source?.error === "string") {
46
+ candidates.push(source.error);
47
+ }
48
+ if (typeof source?.payload?.error === "string") {
49
+ candidates.push(source.payload.error);
50
+ }
51
+ if (typeof source?.status === "string" && source.status === "FETCH_ERROR") {
52
+ if (typeof source?.error === "string") {
53
+ candidates.push(source.error);
54
+ }
55
+ }
56
+ const combined = candidates.join(" ").toLowerCase();
57
+ return NETWORK_PATTERNS.some((p) => combined.includes(p));
58
+ };
59
+ /**
60
+ * Whether a queued mutation may be replayed for the currently signed-in user.
61
+ * Legacy entries without userId are discarded to avoid cross-account replay after account switch.
62
+ */
63
+ export const shouldReplayQueuedMutation = (mutation, currentUserId) => {
64
+ if (!currentUserId) {
65
+ return false;
66
+ }
67
+ if (mutation.userId === undefined) {
68
+ return false;
69
+ }
70
+ return mutation.userId === currentUserId;
71
+ };
72
+ /** Optimistic list item for a queued create; temp IDs are applied after body spread. */
73
+ export const buildOptimisticCreateItem = (mutation, body) => {
74
+ const tempId = `temp-${mutation.id}`;
75
+ return {
76
+ ...(body ?? {}),
77
+ _id: tempId,
78
+ created: mutation.timestamp,
79
+ id: tempId,
80
+ updated: mutation.timestamp,
81
+ };
82
+ };
83
+ const inferTagType = (endpointName) => {
84
+ // Infer tag type from endpoint name for cache invalidation.
85
+ // Convention: patchTodosById -> "todos", postTodos -> "todos", deleteTodosById -> "todos"
86
+ let name = endpointName.replace(/^(post|patch|delete)/, "").replace(/ById$/, "");
87
+ // Convert first char to lowercase
88
+ name = name.charAt(0).toLowerCase() + name.slice(1);
89
+ return name;
90
+ };
91
+ const inferGetByIdEndpointName = (endpointName) => {
92
+ const tagType = inferTagType(endpointName);
93
+ const capitalized = tagType.charAt(0).toUpperCase() + tagType.slice(1);
94
+ return `get${capitalized}ById`;
95
+ };
96
+ /**
97
+ * Last-seen document `updated` timestamp for conflict headers on replay.
98
+ * Prefer the patch body's `_updatedAt`, then a cached get-by-id entry.
99
+ */
100
+ const extractBaseUpdatedAt = (endpointName, originalArgs,
101
+ // biome-ignore lint/suspicious/noExplicitAny: Generic getState
102
+ getState,
103
+ // biome-ignore lint/suspicious/noExplicitAny: Generic API type
104
+ api) => {
105
+ if (inferMutationType(endpointName) !== "update") {
106
+ return undefined;
107
+ }
108
+ const args = originalArgs;
109
+ const bodyUpdatedAt = args?.body?._updatedAt;
110
+ if (typeof bodyUpdatedAt === "string") {
111
+ return bodyUpdatedAt;
112
+ }
113
+ if (!args?.id) {
114
+ return undefined;
115
+ }
116
+ const getByIdEndpoint = inferGetByIdEndpointName(endpointName);
117
+ const state = getState();
118
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query internal state shape
119
+ const queries = state[api.reducerPath]?.queries ?? {};
120
+ for (const key of Object.keys(queries)) {
121
+ if (!key.startsWith(`${getByIdEndpoint}(`)) {
122
+ continue;
123
+ }
124
+ const queryEntry = queries[key];
125
+ if (queryEntry?.originalArgs?.id !== args.id) {
126
+ continue;
127
+ }
128
+ const data = queryEntry?.data;
129
+ const updated = data?.data?.updated;
130
+ if (typeof updated === "string") {
131
+ return updated;
132
+ }
133
+ }
134
+ return undefined;
135
+ };
136
+ /**
137
+ * Collect all cached query args for a given list endpoint so optimistic
138
+ * updates are applied to every active cache entry (regardless of the
139
+ * args the consumer passed to the query hook, e.g. `{}` vs `undefined`).
140
+ */
141
+ const getCachedQueryArgs = (
142
+ // biome-ignore lint/suspicious/noExplicitAny: Generic API state shape
143
+ getState,
144
+ // biome-ignore lint/suspicious/noExplicitAny: Generic API type
145
+ api, listEndpointName) => {
146
+ const state = getState();
147
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query internal state shape
148
+ const queries = state[api.reducerPath]?.queries ?? {};
149
+ const cachedArgs = [];
150
+ for (const key of Object.keys(queries)) {
151
+ if (key.startsWith(`${listEndpointName}(`)) {
152
+ cachedArgs.push(queries[key]?.originalArgs);
153
+ }
154
+ }
155
+ if (cachedArgs.length === 0) {
156
+ cachedArgs.push(undefined);
157
+ }
158
+ return cachedArgs;
159
+ };
160
+ /**
161
+ * Apply an optimistic update to the RTK Query cache for a queued mutation.
162
+ */
163
+ const applyOptimisticUpdate = (
164
+ // biome-ignore lint/suspicious/noExplicitAny: Generic API type
165
+ api,
166
+ // biome-ignore lint/suspicious/noExplicitAny: Generic dispatch
167
+ dispatch,
168
+ // biome-ignore lint/suspicious/noExplicitAny: Generic getState
169
+ getState, mutation) => {
170
+ const tagType = inferTagType(mutation.endpointName);
171
+ const listEndpointName = `get${tagType.charAt(0).toUpperCase() + tagType.slice(1)}`;
172
+ const cachedArgs = getCachedQueryArgs(getState, api, listEndpointName);
173
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query cache shape varies by endpoint
174
+ const updateAllCacheEntries = (updater) => {
175
+ for (const queryArg of cachedArgs) {
176
+ dispatch(
177
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query cache shape varies by endpoint
178
+ api.util.updateQueryData(listEndpointName, queryArg, updater));
179
+ }
180
+ };
181
+ if (mutation.type === "create") {
182
+ const args = mutation.args;
183
+ const tempItem = buildOptimisticCreateItem(mutation, args?.body);
184
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query cache shape varies by endpoint
185
+ updateAllCacheEntries((draft) => {
186
+ if (draft?.data && Array.isArray(draft.data)) {
187
+ draft.data.unshift(tempItem);
188
+ }
189
+ });
190
+ }
191
+ else if (mutation.type === "update") {
192
+ const args = mutation.args;
193
+ if (args?.id && args?.body) {
194
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query cache shape varies by endpoint
195
+ updateAllCacheEntries((draft) => {
196
+ if (draft?.data && Array.isArray(draft.data)) {
197
+ const item = draft.data.find((d) => d._id === args.id || d.id === args.id);
198
+ if (item) {
199
+ Object.assign(item, args.body);
200
+ }
201
+ }
202
+ });
203
+ }
204
+ }
205
+ else if (mutation.type === "delete") {
206
+ const args = mutation.args;
207
+ if (args?.id) {
208
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query cache shape varies by endpoint
209
+ updateAllCacheEntries((draft) => {
210
+ if (draft?.data && Array.isArray(draft.data)) {
211
+ draft.data = draft.data.filter((d) => d._id !== args.id && d.id !== args.id);
212
+ }
213
+ });
214
+ }
215
+ }
216
+ };
217
+ /**
218
+ * Remove optimistic temp items from the cache after they've been replayed.
219
+ */
220
+ const removeTempItems = (
221
+ // biome-ignore lint/suspicious/noExplicitAny: Generic API type
222
+ api,
223
+ // biome-ignore lint/suspicious/noExplicitAny: Generic dispatch
224
+ dispatch,
225
+ // biome-ignore lint/suspicious/noExplicitAny: Generic getState
226
+ getState, mutations) => {
227
+ const tempIds = new Set(mutations.map((m) => `temp-${m.id}`));
228
+ const tagTypes = [...new Set(mutations.map((m) => inferTagType(m.endpointName)))];
229
+ for (const tagType of tagTypes) {
230
+ const listEndpointName = `get${tagType.charAt(0).toUpperCase() + tagType.slice(1)}`;
231
+ const cachedArgs = getCachedQueryArgs(getState, api, listEndpointName);
232
+ for (const queryArg of cachedArgs) {
233
+ dispatch(
234
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query cache shape varies by endpoint
235
+ api.util.updateQueryData(listEndpointName, queryArg, (draft) => {
236
+ if (draft?.data && Array.isArray(draft.data)) {
237
+ draft.data = draft.data.filter((d) => !tempIds.has(d._id) && !tempIds.has(d.id));
238
+ }
239
+ }));
240
+ }
241
+ }
242
+ };
243
+ /**
244
+ * Replay a single queued mutation by making a direct API call.
245
+ * Returns the response status and data for conflict handling.
246
+ */
247
+ const replayMutation = async (mutation) => {
248
+ const token = await getAuthToken();
249
+ const headers = {
250
+ "Content-Type": "application/json",
251
+ };
252
+ if (token) {
253
+ headers.authorization = `Bearer ${token}`;
254
+ }
255
+ // For update operations, include If-Unmodified-Since from the document version at queue time
256
+ if (mutation.type === "update" && mutation.baseUpdatedAt) {
257
+ const timestamp = DateTime.fromISO(mutation.baseUpdatedAt);
258
+ if (timestamp.isValid) {
259
+ headers["If-Unmodified-Since"] = timestamp.toHTTP();
260
+ headers["X-Unmodified-Since-ISO"] = mutation.baseUpdatedAt;
261
+ }
262
+ }
263
+ const args = mutation.args;
264
+ const tagType = inferTagType(mutation.endpointName);
265
+ const basePath = `/${tagType}`;
266
+ let url;
267
+ let method;
268
+ let body;
269
+ if (mutation.type === "create") {
270
+ url = `${baseUrl}${basePath}`;
271
+ method = "POST";
272
+ body = JSON.stringify(args?.body);
273
+ }
274
+ else if (mutation.type === "update") {
275
+ url = `${baseUrl}${basePath}/${args?.id}`;
276
+ method = "PATCH";
277
+ body = JSON.stringify(args?.body);
278
+ }
279
+ else {
280
+ url = `${baseUrl}${basePath}/${args?.id}`;
281
+ method = "DELETE";
282
+ }
283
+ const response = await fetch(url, { body, headers, method });
284
+ if (response.status === 204) {
285
+ return { status: 204 };
286
+ }
287
+ const data = await response.json();
288
+ return { data, status: response.status };
289
+ };
290
+ /**
291
+ * Set up native-only network monitoring (expo-network).
292
+ * Web apps should use `useServerStatus` for server-level health checking.
293
+ */
294
+ const setupNativeNetworkMonitoring = (
295
+ // biome-ignore lint/suspicious/noExplicitAny: Generic dispatch
296
+ dispatch) => {
297
+ if (IsWeb) {
298
+ return () => { };
299
+ }
300
+ let cleanup = () => { };
301
+ void import("expo-network").then((Network) => {
302
+ Network.getNetworkStateAsync().then((state) => {
303
+ dispatch(setOnlineStatus(state.isConnected ?? true));
304
+ });
305
+ const subscription = Network.addNetworkStateListener((state) => {
306
+ dispatch(setOnlineStatus(state.isConnected ?? true));
307
+ });
308
+ cleanup = () => subscription.remove();
309
+ });
310
+ return () => cleanup();
311
+ };
312
+ /**
313
+ * Creates an offline middleware system for RTK Query mutations.
314
+ *
315
+ * When the device is offline, configured mutation endpoints are queued instead of
316
+ * failing. When connectivity returns, queued mutations are replayed in order with
317
+ * LWW (Last-Writer-Wins) conflict detection via If-Unmodified-Since headers.
318
+ *
319
+ * Usage:
320
+ * ```typescript
321
+ * const offline = createOfflineMiddleware({
322
+ * endpoints: ["postTodos", "patchTodosById", "deleteTodosById"],
323
+ * api: terrenoApi,
324
+ * });
325
+ *
326
+ * // Add to store:
327
+ * // reducer: { offline: offline.offlineReducer }
328
+ * // middleware: [..., offline.middleware]
329
+ * ```
330
+ */
331
+ export const createOfflineMiddleware = (config) => {
332
+ const { endpoints, api } = config;
333
+ const endpointSet = new Set(endpoints);
334
+ configureOfflineMutationEndpoints(endpoints);
335
+ const listenerMiddleware = createListenerMiddleware();
336
+ let _networkCleanup;
337
+ let isReplayInProgress = false;
338
+ // Listener 1: Set up native network monitoring on first action (lazy init)
339
+ let networkInitialized = false;
340
+ listenerMiddleware.startListening({
341
+ effect: (_action, listenerApi) => {
342
+ networkInitialized = true;
343
+ _networkCleanup = setupNativeNetworkMonitoring(listenerApi.dispatch);
344
+ },
345
+ predicate: () => !networkInitialized,
346
+ });
347
+ // Listener 2: Intercept failed mutations on network errors (offline or server unreachable)
348
+ // RTK Query dispatches actions with type "terreno-rtk/executeMutation/rejected"
349
+ // when a mutation fails. Queue the mutation and apply an optimistic cache update.
350
+ listenerMiddleware.startListening({
351
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query action types are complex
352
+ effect: async (action, listenerApi) => {
353
+ const state = listenerApi.getState();
354
+ const isOnline = selectIsOnline(state);
355
+ if (!isNetworkFetchError(action)) {
356
+ return;
357
+ }
358
+ const endpointName = action.meta.arg.endpointName;
359
+ const originalArgs = action.meta.arg.originalArgs;
360
+ const mutationType = inferMutationType(endpointName);
361
+ // For updates, use the document's last-known `updated` timestamp from cache
362
+ // rather than the current time. This ensures conflict detection compares against
363
+ // when the document was last fetched, not when the mutation was queued.
364
+ let timestamp = DateTime.now().toISO();
365
+ let listCacheBaseUpdatedAt;
366
+ if (mutationType === "update") {
367
+ const args = originalArgs;
368
+ if (args?.id) {
369
+ const tagType = inferTagType(endpointName);
370
+ const listEndpointName = `get${tagType.charAt(0).toUpperCase() + tagType.slice(1)}`;
371
+ const cachedArgs = getCachedQueryArgs(listenerApi.getState, api, listEndpointName);
372
+ for (const queryArg of cachedArgs) {
373
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query cache shape and endpoint types vary
374
+ const endpoint = api.endpoints[listEndpointName];
375
+ if (!endpoint?.select) {
376
+ continue;
377
+ }
378
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query cache shape varies
379
+ const cacheEntry = endpoint.select(queryArg)(listenerApi.getState());
380
+ const items = cacheEntry?.data?.data;
381
+ if (Array.isArray(items)) {
382
+ const doc = items.find((d) => d._id === args.id || d.id === args.id);
383
+ if (doc?.updated) {
384
+ timestamp =
385
+ typeof doc.updated === "string"
386
+ ? doc.updated
387
+ : DateTime.fromJSDate(doc.updated).toISO();
388
+ listCacheBaseUpdatedAt = timestamp ?? undefined;
389
+ break;
390
+ }
391
+ }
392
+ }
393
+ }
394
+ }
395
+ const baseUpdatedAt = extractBaseUpdatedAt(endpointName, originalArgs, listenerApi.getState, api) ??
396
+ listCacheBaseUpdatedAt;
397
+ const currentUserId = selectCurrentUserId(listenerApi.getState());
398
+ const mutation = {
399
+ args: originalArgs,
400
+ baseUpdatedAt,
401
+ endpointName,
402
+ id: `${endpointName}-${DateTime.now().toMillis()}-${Math.random().toString(36).slice(2, 8)}`,
403
+ timestamp,
404
+ type: mutationType,
405
+ userId: currentUserId,
406
+ };
407
+ listenerApi.dispatch(enqueue(mutation));
408
+ applyOptimisticUpdate(api, listenerApi.dispatch, listenerApi.getState, mutation);
409
+ // Browser may still report online when the API server is unreachable
410
+ if (isOnline) {
411
+ listenerApi.dispatch(setOnlineStatus(false));
412
+ }
413
+ },
414
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query internal action shape
415
+ predicate: (action) => {
416
+ if (typeof action?.type !== "string") {
417
+ return false;
418
+ }
419
+ // Match RTK Query mutation rejected actions
420
+ return (action.type.includes("/executeMutation/rejected") &&
421
+ action?.meta?.arg?.endpointName &&
422
+ endpointSet.has(action.meta.arg.endpointName));
423
+ },
424
+ });
425
+ // Listener 3: Mark offline when any API request fails with a network error
426
+ listenerMiddleware.startListening({
427
+ effect: (_action, listenerApi) => {
428
+ const state = listenerApi.getState();
429
+ if (selectIsOnline(state)) {
430
+ listenerApi.dispatch(setOnlineStatus(false));
431
+ }
432
+ },
433
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query internal action shape
434
+ predicate: (action) => {
435
+ if (typeof action?.type !== "string") {
436
+ return false;
437
+ }
438
+ return (action.type.startsWith(`${api.reducerPath}/`) &&
439
+ (action.type.includes("/executeQuery/rejected") ||
440
+ action.type.includes("/executeMutation/rejected")) &&
441
+ isNetworkFetchError(action));
442
+ },
443
+ });
444
+ // Listener 4: Mark online when any API request succeeds (server reachable again)
445
+ listenerMiddleware.startListening({
446
+ effect: (_action, listenerApi) => {
447
+ const state = listenerApi.getState();
448
+ if (!selectIsOnline(state)) {
449
+ listenerApi.dispatch(setOnlineStatus(true));
450
+ }
451
+ },
452
+ // biome-ignore lint/suspicious/noExplicitAny: RTK Query internal action shape
453
+ predicate: (action) => {
454
+ if (typeof action?.type !== "string") {
455
+ return false;
456
+ }
457
+ return (action.type.startsWith(`${api.reducerPath}/`) &&
458
+ action.type.endsWith("/fulfilled") &&
459
+ (action.type.includes("/executeQuery/") || action.type.includes("/executeMutation/")));
460
+ },
461
+ });
462
+ // Listener 5: Sync queue when coming back online
463
+ listenerMiddleware.startListening({
464
+ actionCreator: setOnlineStatus,
465
+ effect: async (action, listenerApi) => {
466
+ if (!action.payload) {
467
+ // Going offline, nothing to do
468
+ return;
469
+ }
470
+ if (isReplayInProgress) {
471
+ return;
472
+ }
473
+ listenerApi.cancelActiveListeners();
474
+ const state = listenerApi.getState();
475
+ const queue = selectOfflineQueue(state);
476
+ const currentUserId = selectCurrentUserId(listenerApi.getState());
477
+ if (queue.length === 0) {
478
+ // Reset isSyncing if it was stuck from a crash/reload during sync
479
+ if (selectIsSyncing(state)) {
480
+ listenerApi.dispatch(setSyncing(false));
481
+ }
482
+ return;
483
+ }
484
+ isReplayInProgress = true;
485
+ listenerApi.dispatch(setSyncing(true));
486
+ const replayedCreates = [];
487
+ try {
488
+ // Replay mutations in FIFO order
489
+ for (const mutation of queue) {
490
+ if (!shouldReplayQueuedMutation(mutation, currentUserId)) {
491
+ console.warn(`[offline] Dropping queued mutation ${mutation.endpointName} — not owned by current user`);
492
+ listenerApi.dispatch(dequeue(mutation.id));
493
+ continue;
494
+ }
495
+ try {
496
+ const result = await replayMutation(mutation);
497
+ if (result.status === 409) {
498
+ const conflict = {
499
+ args: mutation.args,
500
+ dismissed: false,
501
+ endpointName: mutation.endpointName,
502
+ id: mutation.id,
503
+ serverDocument: result.data?.data ?? result.data,
504
+ timestamp: DateTime.now().toISO(),
505
+ };
506
+ listenerApi.dispatch(addConflict(conflict));
507
+ listenerApi.dispatch(dequeue(mutation.id));
508
+ if (mutation.type === "create") {
509
+ replayedCreates.push(mutation);
510
+ }
511
+ }
512
+ else if (result.status >= 200 && result.status < 300) {
513
+ listenerApi.dispatch(dequeue(mutation.id));
514
+ if (mutation.type === "create") {
515
+ replayedCreates.push(mutation);
516
+ }
517
+ }
518
+ else {
519
+ console.warn(`[offline] Replay failed for ${mutation.endpointName}: status ${result.status}`);
520
+ if (result.status >= 400 && result.status < 500 && result.status !== 409) {
521
+ listenerApi.dispatch(dequeue(mutation.id));
522
+ if (mutation.type === "create") {
523
+ replayedCreates.push(mutation);
524
+ }
525
+ }
526
+ }
527
+ }
528
+ catch (_error) {
529
+ console.warn(`[offline] Replay network error for ${mutation.endpointName}`);
530
+ break;
531
+ }
532
+ }
533
+ // Remove optimistic temp items for creates that were replayed
534
+ if (replayedCreates.length > 0) {
535
+ removeTempItems(api, listenerApi.dispatch, listenerApi.getState, replayedCreates);
536
+ }
537
+ // Invalidate tags to refresh cache with server state
538
+ const tagTypes = [...new Set(queue.map((m) => inferTagType(m.endpointName)))];
539
+ for (const tagType of tagTypes) {
540
+ listenerApi.dispatch(api.util.invalidateTags([tagType]));
541
+ }
542
+ }
543
+ finally {
544
+ isReplayInProgress = false;
545
+ listenerApi.dispatch(setSyncing(false));
546
+ }
547
+ },
548
+ });
549
+ // Listener 6: Clear persisted queue on logout so mutations are not replayed for the next user
550
+ listenerMiddleware.startListening({
551
+ effect: (_action, listenerApi) => {
552
+ listenerApi.dispatch(clearQueue());
553
+ listenerApi.dispatch(clearConflicts());
554
+ },
555
+ type: LOGOUT_ACTION_TYPE,
556
+ });
557
+ // Listener 7: On startup, if the persisted queue has items and we're online,
558
+ // trigger a replay. This handles the case where the app reloads while online
559
+ // with a non-empty queue (rehydrated state already has isOnline: true, so no
560
+ // offline→online transition would otherwise occur).
561
+ let startupReplayTriggered = false;
562
+ listenerMiddleware.startListening({
563
+ effect: (_action, listenerApi) => {
564
+ startupReplayTriggered = true;
565
+ const state = listenerApi.getState();
566
+ const queue = selectOfflineQueue(state);
567
+ const isOnline = selectIsOnline(state);
568
+ // Reset stuck isSyncing from a crash during prior sync
569
+ if (selectIsSyncing(state) && !isReplayInProgress) {
570
+ listenerApi.dispatch(setSyncing(false));
571
+ }
572
+ if (queue.length > 0 && isOnline && !isReplayInProgress) {
573
+ // Re-dispatch setOnlineStatus(true) to trigger the sync listener
574
+ listenerApi.dispatch(setOnlineStatus(true));
575
+ }
576
+ },
577
+ predicate: (action) => {
578
+ if (startupReplayTriggered) {
579
+ return false;
580
+ }
581
+ // redux-persist dispatches "persist/REHYDRATE" after loading stored state
582
+ return typeof action?.type === "string" && action.type === "persist/REHYDRATE";
583
+ },
584
+ });
585
+ return {
586
+ middleware: listenerMiddleware.middleware,
587
+ offlineReducer,
588
+ offlineSlice,
589
+ };
590
+ };
591
+ //# sourceMappingURL=offlineMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offlineMiddleware.js","sourceRoot":"","sources":["../src/offlineMiddleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=offlineMiddleware.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offlineMiddleware.test.d.ts","sourceRoot":"","sources":["../src/offlineMiddleware.test.ts"],"names":[],"mappings":""}