@terreno/rtk 0.0.9

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/socket.js ADDED
@@ -0,0 +1,317 @@
1
+ import { useToast } from "@terreno/ui";
2
+ import { DateTime } from "luxon";
3
+ import { useCallback, useEffect, useRef, useState } from "react";
4
+ import { useSelector } from "react-redux";
5
+ import { io } from "socket.io-client";
6
+ import { selectLastTokenRefreshTimestamp } from "./authSlice";
7
+ import { logAuth } from "./constants";
8
+ import { getFriendlyExpirationInfo, getTokenExpirationTimes, refreshAuthToken } from "./emptyApi";
9
+ export const useSocketConnection = ({ baseUrl, onConnect, onDisconnect, onConnectError, onReconnectFailed, getAuthToken, shouldConnect, // Whether we have a logged in user.
10
+ captureEvent, }) => {
11
+ const toast = useToast();
12
+ const [socket, setSocket] = useState(null);
13
+ const isConnectedRef = useRef(undefined);
14
+ const [isSocketConnected, setIsSocketConnected] = useState({
15
+ isConnected: socket?.connected ?? false,
16
+ lastDisconnectedAt: null,
17
+ });
18
+ const disconnectedToastId = useRef(null);
19
+ const tokenErrorToastId = useRef(null);
20
+ // Keep ref updated with latest socket connection state
21
+ useEffect(() => {
22
+ isConnectedRef.current = isSocketConnected;
23
+ }, [isSocketConnected]);
24
+ // Initialize socket connection
25
+ useEffect(() => {
26
+ const socketIo = io(baseUrl, {
27
+ autoConnect: false,
28
+ reconnection: true,
29
+ reconnectionAttempts: 5,
30
+ reconnectionDelay: 1000,
31
+ reconnectionDelayMax: 5000,
32
+ transports: ["websocket"],
33
+ });
34
+ setSocket(socketIo);
35
+ return () => {
36
+ socketIo.disconnect();
37
+ };
38
+ }, [baseUrl]);
39
+ const hideDisconnectedToast = useCallback(() => {
40
+ if (disconnectedToastId.current) {
41
+ toast.hide(disconnectedToastId.current);
42
+ disconnectedToastId.current = null;
43
+ }
44
+ }, [toast]);
45
+ const hideTokenErrorToast = useCallback(() => {
46
+ if (tokenErrorToastId.current) {
47
+ toast.hide(tokenErrorToastId.current);
48
+ tokenErrorToastId.current = null;
49
+ }
50
+ }, [toast]);
51
+ // Connect the socket with the current auth token
52
+ const connectSocket = useCallback(async () => {
53
+ const token = await getAuthToken();
54
+ if (!token) {
55
+ console.warn("[SocketConnection] Attempting to connect socket, but getAuthToken returned no token.");
56
+ // Don't capture this event because it's expected when the user is logged out.
57
+ return;
58
+ }
59
+ else {
60
+ logAuth("[SocketConnection] Token received from getAuthToken.");
61
+ }
62
+ if (socket) {
63
+ // Enhanced logging for Option 1 (token status)
64
+ logAuth(`[SocketConnection] Socket connecting ${token ? "with" : "without"} token. Current socket state: ${socket.connected ? "connected" : "disconnected"}`);
65
+ socket.auth = { token: `Bearer ${token}` };
66
+ socket.connect();
67
+ }
68
+ else {
69
+ console.warn("[SocketConnection] connectSocket called but socket instance is null.");
70
+ }
71
+ }, [socket, getAuthToken]);
72
+ // Extracted logic for checking token expiration, refreshing token, and handling related UI
73
+ const checkAndRefreshTokenLogic = useCallback(async (context) => {
74
+ let authRemainingSecs;
75
+ let refreshRemainingSecs;
76
+ try {
77
+ const expirationTimes = await getTokenExpirationTimes();
78
+ authRemainingSecs = expirationTimes.authRemainingSecs;
79
+ refreshRemainingSecs = expirationTimes.refreshRemainingSecs;
80
+ logAuth(`[SocketConnection] Token status on ${context}: authRemainingSecs: ${authRemainingSecs}, refreshRemainingSecs: ${refreshRemainingSecs}`);
81
+ if ((authRemainingSecs !== undefined && authRemainingSecs < 60) ||
82
+ (refreshRemainingSecs !== undefined && refreshRemainingSecs < 60)) {
83
+ logAuth(`[SocketConnection] Auth or refresh token nearing expiration or expired on ${context}, attempting refresh.`);
84
+ await refreshAuthToken();
85
+ // Attempt to reconnect after token refresh
86
+ if (shouldConnect && socket && !socket.connected) {
87
+ logAuth(`[SocketConnection] Attempting to reconnect socket after token refresh due to ${context}.`);
88
+ socket.connect();
89
+ }
90
+ }
91
+ }
92
+ catch (error) {
93
+ const socketError = error;
94
+ console.error(`[SocketConnection] Error checking/refreshing token on ${context}:`, socketError);
95
+ if (refreshRemainingSecs !== undefined && refreshRemainingSecs > 0) {
96
+ const tokenInfo = await getFriendlyExpirationInfo();
97
+ // Only capture this event if the refresh token is still valid,
98
+ // otherwise it's expected it will fail.
99
+ captureEvent?.(`WebSocket Token Check/Refresh Error on ${context === "disconnect" ? "Disconnect" : "ConnectError"}`, {
100
+ authRemainingSecs,
101
+ error: socketError.message,
102
+ refreshRemainingSecs,
103
+ time: DateTime.now().toISO(),
104
+ tokenInfo,
105
+ });
106
+ }
107
+ hideDisconnectedToast();
108
+ if (!tokenErrorToastId.current) {
109
+ tokenErrorToastId.current = toast.show("Error refreshing token. Please log out and log back in if reconnections fail. Your work may not be saved if you continue.", {
110
+ onDismiss: () => hideTokenErrorToast(),
111
+ persistent: true,
112
+ variant: "error",
113
+ });
114
+ }
115
+ }
116
+ }, [shouldConnect, socket, captureEvent, hideDisconnectedToast, toast, hideTokenErrorToast]);
117
+ // Use Redux state for token refresh signal
118
+ const lastTokenRefreshTimestamp = useSelector(selectLastTokenRefreshTimestamp);
119
+ const previousTokenRefreshTimestampRef = useRef(null);
120
+ // Effect to handle token refresh events from Redux state
121
+ useEffect(() => {
122
+ if (lastTokenRefreshTimestamp &&
123
+ lastTokenRefreshTimestamp !== previousTokenRefreshTimestampRef.current) {
124
+ if (tokenErrorToastId.current) {
125
+ logAuth("[SocketConnection] Token refresh detected via Redux state, dismissing error toast and attempting reconnect.");
126
+ hideTokenErrorToast();
127
+ }
128
+ if (shouldConnect && !socket?.connected) {
129
+ logAuth("[SocketConnection] Attempting to connect socket after token refresh detected via Redux state.");
130
+ void connectSocket();
131
+ }
132
+ }
133
+ previousTokenRefreshTimestampRef.current = lastTokenRefreshTimestamp;
134
+ }, [lastTokenRefreshTimestamp, socket, shouldConnect, connectSocket, hideTokenErrorToast]);
135
+ // Connect/disconnect socket based on shouldConnect flag
136
+ useEffect(() => {
137
+ if (shouldConnect) {
138
+ if (!isSocketConnected.isConnected) {
139
+ logAuth(`[SocketConnection] Attempting to connect socket because shouldConnect is true and socket is not connected.`);
140
+ void connectSocket();
141
+ }
142
+ else {
143
+ logAuth(`[SocketConnection] Socket is already connected and shouldConnect is true. No action needed.`);
144
+ }
145
+ }
146
+ else {
147
+ if (isSocketConnected.isConnected) {
148
+ logAuth(`[SocketConnection] Attempting to disconnect socket because shouldConnect is false and socket is connected.`);
149
+ socket?.disconnect();
150
+ setIsSocketConnected({
151
+ isConnected: false,
152
+ lastDisconnectedAt: null, // null because this was intentional
153
+ });
154
+ }
155
+ else {
156
+ logAuth(`[SocketConnection] Socket is already disconnected and shouldConnect is false. No action needed.`);
157
+ }
158
+ }
159
+ }, [connectSocket, shouldConnect, isSocketConnected, socket]);
160
+ // Attempt to reconnect if token was refreshed and we are disconnected
161
+ useEffect(() => {
162
+ if (shouldConnect && !isSocketConnected.isConnected && socket) {
163
+ logAuth("[SocketConnection] Token refresh detected, attempting to reconnect socket.");
164
+ // We might want to ensure the socket isn't already in a connecting state here
165
+ // if socket.io-client provides such a state.
166
+ // Forcing a disconnect first can help if it's stuck in a bad state.
167
+ socket.disconnect();
168
+ void connectSocket();
169
+ }
170
+ }, [shouldConnect, isSocketConnected.isConnected, socket, connectSocket]);
171
+ // Show toast when disconnected
172
+ useEffect(() => {
173
+ if (!shouldConnect) {
174
+ return;
175
+ }
176
+ const checkShowToast = async () => {
177
+ // if there is an error toast, don't show the disconnect toast
178
+ if (tokenErrorToastId.current) {
179
+ return;
180
+ }
181
+ const shouldShowDisconnectToast = !isConnectedRef.current?.isConnected &&
182
+ isConnectedRef.current?.lastDisconnectedAt &&
183
+ DateTime.now().diff(DateTime.fromISO(isConnectedRef.current.lastDisconnectedAt), "seconds")
184
+ .seconds > 9;
185
+ if (shouldShowDisconnectToast && !disconnectedToastId.current) {
186
+ disconnectedToastId.current = toast.show("You have been disconnected. Attempting to reconnect...", {
187
+ onDismiss: () => hideDisconnectedToast(),
188
+ persistent: true,
189
+ });
190
+ }
191
+ else if (!shouldShowDisconnectToast && disconnectedToastId.current) {
192
+ // If we should no longer show the toast but it is still showing, hide it
193
+ hideDisconnectedToast();
194
+ }
195
+ };
196
+ let intervalId = null;
197
+ // Check every second if we've reconnected
198
+ const startCheckingConnection = () => {
199
+ if (!isConnectedRef.current?.isConnected && !intervalId) {
200
+ intervalId = setInterval(async () => {
201
+ await checkShowToast();
202
+ if (isConnectedRef.current?.isConnected && intervalId) {
203
+ clearInterval(intervalId);
204
+ intervalId = null;
205
+ }
206
+ }, 1000);
207
+ }
208
+ };
209
+ startCheckingConnection();
210
+ return () => {
211
+ if (intervalId) {
212
+ clearInterval(intervalId);
213
+ }
214
+ };
215
+ }, [hideDisconnectedToast, shouldConnect, toast]);
216
+ // Set up basic socket event listeners
217
+ useEffect(() => {
218
+ if (!socket)
219
+ return;
220
+ const handleConnect = () => {
221
+ logAuth("[SocketConnection] Socket connected");
222
+ hideDisconnectedToast();
223
+ hideTokenErrorToast();
224
+ // don't show toast if was disconnected and now connected within 10 seconds
225
+ if (isSocketConnected.lastDisconnectedAt &&
226
+ DateTime.now().diff(DateTime.fromISO(isSocketConnected.lastDisconnectedAt), "seconds")
227
+ .seconds > 10) {
228
+ toast.show("You have been reconnected.");
229
+ }
230
+ setIsSocketConnected({
231
+ isConnected: true,
232
+ lastDisconnectedAt: null,
233
+ });
234
+ onConnect?.();
235
+ };
236
+ const handleDisconnect = async (reason) => {
237
+ const tokenInfo = await getFriendlyExpirationInfo();
238
+ // Enhanced logging for Option 1 (disconnect reason)
239
+ logAuth(`[SocketConnection] Socket disconnected, reason: ${reason}, token status: ${tokenInfo}`);
240
+ setIsSocketConnected({
241
+ isConnected: false,
242
+ lastDisconnectedAt: DateTime.now().toISO(),
243
+ });
244
+ captureEvent?.("WebSocket Disconnection", {
245
+ reason,
246
+ time: DateTime.now().toISO(),
247
+ tokenInfo,
248
+ });
249
+ // Check token status on disconnect
250
+ await checkAndRefreshTokenLogic("disconnect");
251
+ await onDisconnect?.();
252
+ };
253
+ const handleConnectError = async (connectionError) => {
254
+ const tokenInfo = await getFriendlyExpirationInfo();
255
+ console.error("[SocketConnection] Socket connection error:", connectionError, "Token status:", tokenInfo);
256
+ captureEvent?.("WebSocket Connection Error", {
257
+ error: connectionError.message,
258
+ time: DateTime.now().toISO(),
259
+ tokenInfo,
260
+ });
261
+ // Check token status on connect_error
262
+ await checkAndRefreshTokenLogic("connect_error");
263
+ onConnectError?.(connectionError);
264
+ };
265
+ const handleReconnectFailed = async () => {
266
+ const tokenInfo = await getFriendlyExpirationInfo();
267
+ console.error("[SocketConnection] Socket reconnection failed after exhausting reconnection attempts.", "Token status:", tokenInfo);
268
+ captureEvent?.("WebSocket Reconnect Failed", {
269
+ time: DateTime.now().toISO(),
270
+ tokenInfo,
271
+ });
272
+ // Force a new connection attempt
273
+ socket.disconnect();
274
+ setTimeout(() => {
275
+ // Check shouldConnect and if still disconnected using the ref for the most current state
276
+ if (shouldConnect && isConnectedRef.current && !isConnectedRef.current.isConnected) {
277
+ logAuth("[SocketConnection] Attempting to force a new connection after reconnect_failed event.");
278
+ void connectSocket();
279
+ }
280
+ else if (!shouldConnect) {
281
+ logAuth("[SocketConnection] Not attempting to reconnect after reconnect_failed because shouldConnect is false.");
282
+ }
283
+ else if (isConnectedRef.current?.isConnected) {
284
+ logAuth("[SocketConnection] Not attempting to reconnect after reconnect_failed because socket is now connected.");
285
+ }
286
+ }, 2000);
287
+ onReconnectFailed?.();
288
+ };
289
+ // Attach event listeners
290
+ socket.on("connect", handleConnect);
291
+ socket.on("disconnect", handleDisconnect);
292
+ socket.on("connect_error", handleConnectError);
293
+ socket.on("reconnect_failed", handleReconnectFailed);
294
+ return () => {
295
+ socket.off("connect", handleConnect);
296
+ socket.off("disconnect", handleDisconnect);
297
+ socket.off("connect_error", handleConnectError);
298
+ socket.off("reconnect_failed", handleReconnectFailed);
299
+ };
300
+ }, [
301
+ socket,
302
+ hideDisconnectedToast,
303
+ isSocketConnected.lastDisconnectedAt,
304
+ captureEvent,
305
+ onConnect,
306
+ onDisconnect,
307
+ onConnectError,
308
+ onReconnectFailed,
309
+ shouldConnect,
310
+ connectSocket,
311
+ toast,
312
+ hideTokenErrorToast,
313
+ checkAndRefreshTokenLogic,
314
+ ]);
315
+ return { isSocketConnected, socket };
316
+ };
317
+ //# sourceMappingURL=socket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.js","sourceRoot":"","sources":["../src/socket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const generateTags: (api: any, tagTypes: string[]) => any;
2
+ //# sourceMappingURL=tagGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tagGenerator.d.ts","sourceRoot":"","sources":["../src/tagGenerator.ts"],"names":[],"mappings":"AAmCA,eAAO,MAAM,YAAY,GAAI,KAAK,GAAG,EAAE,UAAU,MAAM,EAAE,KAAG,GA8C3D,CAAC"}
@@ -0,0 +1,60 @@
1
+ // biome-ignore-all lint/suspicious/noExplicitAny: Generics
2
+ // use this with enhanceEndpoints since the code generator doesn't invalidate by individual ids,
3
+ // only at the full collection level
4
+ const providesIdTags = (path) => (result) => result ? [...(result?.data?.map(({ _id }) => ({ id: _id, type: path })) ?? []), path] : [path];
5
+ const providesIdTag = (path) => (result) => {
6
+ return result ? [{ id: result._id, type: path }] : [path];
7
+ };
8
+ const invalidatesIdTags = (path) => (result) => result ? [...(result?.data?.map(({ _id }) => ({ id: _id, type: path })) ?? []), path] : [path];
9
+ const cleanEndpointStringToGenerateTag = (string) => {
10
+ // Define the prefixes and suffix
11
+ const prefixes = ["patch", "get", "delete"];
12
+ const suffix = "ById";
13
+ // Create a regular expression to match the prefixes and suffix
14
+ const prefixPattern = `^(${prefixes.join("|")})`;
15
+ const suffixPattern = `${suffix}$`;
16
+ const regex = new RegExp(`${prefixPattern}|${suffixPattern}`, "gi");
17
+ // Replace the matched parts and convert to lowercase
18
+ return string.replace(regex, "")?.toLowerCase();
19
+ };
20
+ export const generateTags = (api, tagTypes) => {
21
+ // take the api, and for each get and list endpoint, generate tags that invalidate the cache by id
22
+ // and by the list endpoint
23
+ const endpoints = api.endpoints;
24
+ const tags = {};
25
+ Object.keys(endpoints).forEach((endpoint) => {
26
+ if (endpoint === "getConversations") {
27
+ tags[endpoint] = { invalidatesTags: ["conversations", "messages"] };
28
+ }
29
+ if (endpoint.toLowerCase().includes("get")) {
30
+ // List endpoints
31
+ if (!endpoint.toLowerCase().includes("byid")) {
32
+ const tag = tagTypes.find((t) =>
33
+ // remove "get" from the endpoint name and "ById" from the endpoint name
34
+ t
35
+ .toLowerCase()
36
+ .includes(cleanEndpointStringToGenerateTag(endpoint)));
37
+ if (tag) {
38
+ tags[endpoint] = { providesTags: providesIdTags(tag) };
39
+ }
40
+ }
41
+ // Read endpoints
42
+ else {
43
+ const tag = tagTypes.find((t) => t.toLowerCase().includes(cleanEndpointStringToGenerateTag(endpoint)));
44
+ if (tag) {
45
+ tags[endpoint] = { providesTags: providesIdTag(tag) };
46
+ }
47
+ }
48
+ }
49
+ // Patch and delete endpoints
50
+ else if (endpoint.toLowerCase().includes("patch") ||
51
+ endpoint.toLowerCase().includes("delete")) {
52
+ const tag = tagTypes.find((t) => t.toLowerCase().includes(cleanEndpointStringToGenerateTag(endpoint)));
53
+ if (tag) {
54
+ tags[endpoint] = { invalidatesTags: invalidatesIdTags(tag) };
55
+ }
56
+ }
57
+ });
58
+ return tags;
59
+ };
60
+ //# sourceMappingURL=tagGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tagGenerator.js","sourceRoot":"","sources":["../src/tagGenerator.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "dependencies": {
3
+ "@react-native-async-storage/async-storage": "2.2.0",
4
+ "@reduxjs/toolkit": "^2.11.1",
5
+ "@terreno/ui": "0.0.4",
6
+ "async-mutex": "^0.5.0",
7
+ "axios": "^1.13.2",
8
+ "axios-retry": "^4.5.0",
9
+ "expo-constants": "~18.0.12",
10
+ "expo-secure-store": "^15.0.8",
11
+ "jwt-decode": "^4.0.0",
12
+ "luxon": "^3.7.2",
13
+ "qs": "^6.14.0",
14
+ "react-native": "0.81.5",
15
+ "react-redux": "^9.2.0",
16
+ "socket.io-client": "^4.8.1"
17
+ },
18
+ "description": "Redux Toolkit Query utilities for @terreno/api backends",
19
+ "devDependencies": {
20
+ "@biomejs/biome": "^2.3.6",
21
+ "@types/luxon": "^3.7.1",
22
+ "@types/node": "^25.0.3",
23
+ "@types/qs": "^6.14.0",
24
+ "@types/react": "~19.1.10",
25
+ "react": "19.1.0",
26
+ "typescript": "~5.9.2"
27
+ },
28
+ "files": [
29
+ "dist/**/*",
30
+ "src/**/*"
31
+ ],
32
+ "license": "Apache-2.0",
33
+ "main": "dist/index.js",
34
+ "name": "@terreno/rtk",
35
+ "peerDependencies": {
36
+ "react": "19.1.0"
37
+ },
38
+ "scripts": {
39
+ "compile": "tsc",
40
+ "dev": "tsc -w",
41
+ "lint": "biome check .",
42
+ "lint:fix": "biome check --write .",
43
+ "lint:unsafefix": "biome check --write --unsafe ."
44
+ },
45
+ "types": "dist/index.d.ts",
46
+ "version": "0.0.9"
47
+ }