@timardex/cluemart-shared 1.5.813 → 1.5.822

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 (88) hide show
  1. package/dist/{ad-0muFV6oH.d.ts → ad-BFGA6SrQ.d.ts} +4 -123
  2. package/dist/{ad-Dlk9SFLw.d.mts → ad-BRC6KNgv.d.mts} +4 -123
  3. package/dist/apollo/index.cjs +1362 -0
  4. package/dist/apollo/index.cjs.map +1 -0
  5. package/dist/apollo/index.d.mts +337 -0
  6. package/dist/apollo/index.d.ts +337 -0
  7. package/dist/apollo/index.mjs +1273 -0
  8. package/dist/apollo/index.mjs.map +1 -0
  9. package/dist/auth/index.cjs +1425 -0
  10. package/dist/auth/index.cjs.map +1 -0
  11. package/dist/auth/index.d.mts +119 -0
  12. package/dist/auth/index.d.ts +119 -0
  13. package/dist/auth/index.mjs +317 -0
  14. package/dist/auth/index.mjs.map +1 -0
  15. package/dist/{chunk-LETM2YHF.mjs → chunk-D33VEY7Q.mjs} +3 -1
  16. package/dist/chunk-D33VEY7Q.mjs.map +1 -0
  17. package/dist/chunk-DQ7ZHIXW.mjs +26 -0
  18. package/dist/chunk-DQ7ZHIXW.mjs.map +1 -0
  19. package/dist/{chunk-LKMJ75YV.mjs → chunk-EUOLQ7SS.mjs} +2 -2
  20. package/dist/{chunk-GJO7X2Y4.mjs → chunk-IREUJYMR.mjs} +3 -3
  21. package/dist/{chunk-POXARN2X.mjs → chunk-KMLUQVNM.mjs} +1 -24
  22. package/dist/chunk-KMLUQVNM.mjs.map +1 -0
  23. package/dist/chunk-MIDSLTUJ.mjs +1214 -0
  24. package/dist/chunk-MIDSLTUJ.mjs.map +1 -0
  25. package/dist/{chunk-DLPDX4EH.mjs → chunk-N7KENXCS.mjs} +10 -49
  26. package/dist/chunk-N7KENXCS.mjs.map +1 -0
  27. package/dist/chunk-RAYUJODN.mjs +45 -0
  28. package/dist/chunk-RAYUJODN.mjs.map +1 -0
  29. package/dist/{chunk-4TP57ZL7.mjs → chunk-UHDYJBIX.mjs} +2 -2
  30. package/dist/{chunk-4ICKZHQA.mjs → chunk-WZPKYUSX.mjs} +361 -2328
  31. package/dist/chunk-WZPKYUSX.mjs.map +1 -0
  32. package/dist/{contactUs-CiXFYse5.d.ts → contactUs-Bwxzw-cB.d.ts} +1 -1
  33. package/dist/{contactUs-HPydW6BR.d.mts → contactUs-b5SfvqmJ.d.mts} +1 -1
  34. package/dist/enums/index.cjs +2 -0
  35. package/dist/enums/index.cjs.map +1 -1
  36. package/dist/enums/index.d.mts +3 -1
  37. package/dist/enums/index.d.ts +3 -1
  38. package/dist/enums/index.mjs +1 -1
  39. package/dist/formFields/index.cjs.map +1 -1
  40. package/dist/formFields/index.d.mts +1 -1
  41. package/dist/formFields/index.d.ts +1 -1
  42. package/dist/formFields/index.mjs +7 -5
  43. package/dist/{global-Dq6A7pNV.d.mts → global-959zf6qy.d.mts} +1 -1
  44. package/dist/{global-B2jacmZB.d.ts → global-wVC9VaCx.d.ts} +1 -1
  45. package/dist/graphql/index.cjs +2 -844
  46. package/dist/graphql/index.cjs.map +1 -1
  47. package/dist/graphql/index.d.mts +4 -3
  48. package/dist/graphql/index.d.ts +4 -3
  49. package/dist/graphql/index.mjs +23 -21
  50. package/dist/hooks/index.cjs +5 -0
  51. package/dist/hooks/index.cjs.map +1 -1
  52. package/dist/hooks/index.d.mts +4 -3
  53. package/dist/hooks/index.d.ts +4 -3
  54. package/dist/hooks/index.mjs +15 -12
  55. package/dist/hooks/index.mjs.map +1 -1
  56. package/dist/index.cjs +4 -844
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.d.mts +3 -1
  59. package/dist/index.d.ts +3 -1
  60. package/dist/index.mjs +3 -843
  61. package/dist/index.mjs.map +1 -1
  62. package/dist/map/index.d.mts +1 -1
  63. package/dist/map/index.d.ts +1 -1
  64. package/dist/{resourceActivities-DUR5JaaB.d.ts → resourceActivities-ChZcl5wJ.d.ts} +1 -1
  65. package/dist/{resourceActivities-BCZ6HU7U.d.mts → resourceActivities-ZPT9JlfH.d.mts} +1 -1
  66. package/dist/sharing/index.cjs.map +1 -1
  67. package/dist/sharing/index.d.mts +1 -1
  68. package/dist/sharing/index.d.ts +1 -1
  69. package/dist/sharing/index.mjs +3 -3
  70. package/dist/subscription-BU8GvH2K.d.ts +12 -0
  71. package/dist/subscription-bmAdrnfi.d.mts +12 -0
  72. package/dist/types/index.d.mts +9 -16
  73. package/dist/types/index.d.ts +9 -16
  74. package/dist/types/index.mjs +7 -5
  75. package/dist/user-CCN2IPDV.d.ts +124 -0
  76. package/dist/user-CadKvubI.d.mts +124 -0
  77. package/dist/utils/index.cjs.map +1 -1
  78. package/dist/utils/index.d.mts +1 -1
  79. package/dist/utils/index.d.ts +1 -1
  80. package/dist/utils/index.mjs +8 -5
  81. package/package.json +25 -9
  82. package/dist/chunk-4ICKZHQA.mjs.map +0 -1
  83. package/dist/chunk-DLPDX4EH.mjs.map +0 -1
  84. package/dist/chunk-LETM2YHF.mjs.map +0 -1
  85. package/dist/chunk-POXARN2X.mjs.map +0 -1
  86. /package/dist/{chunk-LKMJ75YV.mjs.map → chunk-EUOLQ7SS.mjs.map} +0 -0
  87. /package/dist/{chunk-GJO7X2Y4.mjs.map → chunk-IREUJYMR.mjs.map} +0 -0
  88. /package/dist/{chunk-4TP57ZL7.mjs.map → chunk-UHDYJBIX.mjs.map} +0 -0
@@ -0,0 +1,1362 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/apollo/index.ts
21
+ var apollo_exports = {};
22
+ __export(apollo_exports, {
23
+ MIN_BACKGROUND_MS: () => MIN_BACKGROUND_MS,
24
+ NON_RETRYABLE_REFRESH_AUTH_CODES: () => NON_RETRYABLE_REFRESH_AUTH_CODES,
25
+ REFETCH_DELAY_MS: () => REFETCH_DELAY_MS,
26
+ createApolloErrorLoggingLink: () => createApolloErrorLoggingLink,
27
+ createApolloManager: () => createApolloManager,
28
+ createAuthLink: () => createAuthLink,
29
+ createErrorLink: () => createErrorLink,
30
+ createNetworkLog: () => createNetworkLog,
31
+ createNetworkRecoveryLink: () => createNetworkRecoveryLink,
32
+ createRecoveryCore: () => createRecoveryCore,
33
+ createRefreshAccessToken: () => createRefreshAccessToken,
34
+ createWsManager: () => createWsManager,
35
+ decideRefreshNextStep: () => decideRefreshNextStep,
36
+ getRefreshErrorCode: () => getRefreshErrorCode,
37
+ getStatusCode: () => getStatusCode,
38
+ isExpectedRefreshAuthFailure: () => isExpectedRefreshAuthFailure,
39
+ isRefreshAuthFailureMessage: () => isRefreshAuthFailureMessage,
40
+ isUnauthenticatedError: () => isUnauthenticatedError,
41
+ isUnauthenticatedGraphQLError: () => isUnauthenticatedGraphQLError,
42
+ readErrorResponseFields: () => readErrorResponseFields,
43
+ refreshGraphqlErrorsWarrantRetry: () => refreshGraphqlErrorsWarrantRetry,
44
+ safeJsonStringify: () => safeJsonStringify,
45
+ swapApolloClientRef: () => swapApolloClientRef,
46
+ toStructuredError: () => toStructuredError
47
+ });
48
+ module.exports = __toCommonJS(apollo_exports);
49
+
50
+ // src/apollo/createApolloManager.ts
51
+ function createApolloManager(adapters = {}) {
52
+ const { onAuthRecoveryEvent } = adapters;
53
+ let resetClientFn = null;
54
+ let pendingReset = false;
55
+ return {
56
+ resetClient() {
57
+ if (!resetClientFn) {
58
+ pendingReset = true;
59
+ return;
60
+ }
61
+ pendingReset = false;
62
+ onAuthRecoveryEvent?.({ type: "reset_client" });
63
+ resetClientFn();
64
+ },
65
+ setResetClient(fn) {
66
+ resetClientFn = fn;
67
+ if (fn && pendingReset) {
68
+ pendingReset = false;
69
+ onAuthRecoveryEvent?.({ type: "reset_client" });
70
+ fn();
71
+ }
72
+ }
73
+ };
74
+ }
75
+
76
+ // src/apollo/createAuthLink.ts
77
+ var import_client = require("@apollo/client");
78
+ function maskedTokenInfo(token) {
79
+ const len = token.length;
80
+ const start = token.slice(0, 4);
81
+ const end = token.slice(-4);
82
+ return { end, len, start };
83
+ }
84
+ function createAuthLink(adapters) {
85
+ const { awaitReady, getAccessToken, onError: onError3, onDebug } = adapters;
86
+ return new import_client.ApolloLink((operation, forward) => {
87
+ return new import_client.Observable((observer) => {
88
+ let innerSub = null;
89
+ let closed = false;
90
+ const teardown = () => {
91
+ closed = true;
92
+ innerSub?.unsubscribe();
93
+ innerSub = null;
94
+ };
95
+ void (async () => {
96
+ if (awaitReady) {
97
+ try {
98
+ await awaitReady();
99
+ } catch (err) {
100
+ onError3?.(err, { action: "awaitReady" });
101
+ }
102
+ }
103
+ if (closed) return;
104
+ const token = await getAccessToken();
105
+ if (token) {
106
+ operation.setContext(({ headers = {} }) => {
107
+ const hasAuthHeader = Object.hasOwn(headers, "Authorization") || Object.hasOwn(headers, "authorization");
108
+ if (hasAuthHeader) {
109
+ onDebug?.("Preserving existing Authorization header", {
110
+ operationName: operation.operationName
111
+ });
112
+ return { headers };
113
+ }
114
+ return {
115
+ headers: {
116
+ ...headers,
117
+ Authorization: `Bearer ${token}`
118
+ }
119
+ };
120
+ });
121
+ onDebug?.("Attached Authorization header", {
122
+ operationName: operation.operationName,
123
+ token: maskedTokenInfo(token)
124
+ });
125
+ } else {
126
+ onDebug?.("Proceeding without Authorization header", {
127
+ operationName: operation.operationName
128
+ });
129
+ }
130
+ if (closed) return;
131
+ try {
132
+ innerSub = forward(operation).subscribe({
133
+ complete: () => {
134
+ if (!closed) observer.complete();
135
+ },
136
+ error: (error) => {
137
+ if (!closed) observer.error(error);
138
+ },
139
+ next: (result) => {
140
+ if (!closed) observer.next(result);
141
+ }
142
+ });
143
+ } catch (err) {
144
+ if (closed) return;
145
+ onError3?.(err, { action: "forward" });
146
+ observer.error(err);
147
+ }
148
+ })();
149
+ return teardown;
150
+ });
151
+ });
152
+ }
153
+
154
+ // src/apollo/createErrorLink.ts
155
+ var import_client2 = require("@apollo/client");
156
+ var import_error = require("@apollo/client/link/error");
157
+
158
+ // src/apollo/readErrorResponseFields.ts
159
+ function readErrorResponseFields(errorResponse) {
160
+ const record = errorResponse;
161
+ return {
162
+ graphQLErrors: record["graphQLErrors"],
163
+ networkError: record["networkError"],
164
+ response: record["response"]
165
+ };
166
+ }
167
+
168
+ // src/apollo/unauthHelpers.ts
169
+ function getStatusCode(networkError) {
170
+ const anyErr = networkError;
171
+ const status = anyErr?.["statusCode"] ?? anyErr?.["status"] ?? anyErr?.["response"]?.status;
172
+ return typeof status === "number" ? status : null;
173
+ }
174
+ function isUnauthenticatedGraphQLError(graphQLErrors) {
175
+ return Boolean(
176
+ graphQLErrors?.some(
177
+ (err) => err.extensions?.code === "UNAUTHENTICATED" || err.message?.includes("You must be logged in.")
178
+ )
179
+ );
180
+ }
181
+ function isUnauthenticatedError(input) {
182
+ const statusCode = input.networkError ? getStatusCode(input.networkError) : null;
183
+ return isUnauthenticatedGraphQLError(input.graphQLErrors) || statusCode === 401 || statusCode === 403;
184
+ }
185
+ var NON_RETRYABLE_REFRESH_AUTH_CODES = /* @__PURE__ */ new Set(["FORBIDDEN", "TOKEN_EXPIRED", "UNAUTHENTICATED"]);
186
+ var REFRESH_AUTH_FAILURE_MESSAGE_PATTERNS = [
187
+ /invalid.*refresh token/i,
188
+ /jwt expired/i,
189
+ /jwt malformed/i,
190
+ /invalid signature/i
191
+ ];
192
+ function isRefreshAuthFailureMessage(message) {
193
+ if (!message) return false;
194
+ return REFRESH_AUTH_FAILURE_MESSAGE_PATTERNS.some(
195
+ (pattern) => pattern.test(message)
196
+ );
197
+ }
198
+ function getRefreshErrorCode(errors) {
199
+ for (const err of errors) {
200
+ const code = err.extensions?.code;
201
+ if (typeof code === "string") return code;
202
+ }
203
+ return void 0;
204
+ }
205
+ function isExpectedRefreshAuthFailure(errors, errorCode) {
206
+ if (errorCode != null && NON_RETRYABLE_REFRESH_AUTH_CODES.has(errorCode)) {
207
+ return true;
208
+ }
209
+ return errors.some((err) => isRefreshAuthFailureMessage(err.message));
210
+ }
211
+ function refreshGraphqlErrorsWarrantRetry(errors) {
212
+ if (errors.some(
213
+ (e) => e.extensions != null && e.extensions.retryable === true
214
+ )) {
215
+ return true;
216
+ }
217
+ for (const err of errors) {
218
+ if (isRefreshAuthFailureMessage(err.message)) {
219
+ return false;
220
+ }
221
+ const code = err.extensions?.code;
222
+ if (typeof code === "string" && NON_RETRYABLE_REFRESH_AUTH_CODES.has(code)) {
223
+ return false;
224
+ }
225
+ }
226
+ return true;
227
+ }
228
+ function decideRefreshNextStep(result) {
229
+ if (!result.token && !result.retryable) return { kind: "logout" };
230
+ if (!result.token) return { kind: "complete" };
231
+ return { kind: "retry", token: result.token };
232
+ }
233
+
234
+ // src/apollo/createErrorLink.ts
235
+ function handleRetryableRefreshFailure(observer) {
236
+ if (!observer.isClosed()) observer.complete();
237
+ }
238
+ function retryOperationWithToken(operation, forward, token, observer, setInnerSubscriber) {
239
+ operation.setContext(({ headers = {} }) => ({
240
+ __authRetryAttempted: true,
241
+ headers: {
242
+ ...headers,
243
+ Authorization: `Bearer ${token}`
244
+ }
245
+ }));
246
+ if (observer.isClosed()) return;
247
+ setInnerSubscriber(
248
+ forward(operation).subscribe({
249
+ complete: () => {
250
+ if (!observer.isClosed()) observer.complete();
251
+ },
252
+ error: (error) => {
253
+ if (!observer.isClosed()) observer.error(error);
254
+ },
255
+ next: (value) => {
256
+ if (!observer.isClosed()) observer.next(value);
257
+ }
258
+ })
259
+ );
260
+ }
261
+ function createErrorLink(adapters) {
262
+ const {
263
+ refreshAccessToken,
264
+ clearAccessToken,
265
+ logout,
266
+ onError: reportError,
267
+ onDebug,
268
+ onAuthRecoveryEvent
269
+ } = adapters;
270
+ function scheduleSessionLogout(reason) {
271
+ onAuthRecoveryEvent?.({ reason, type: "logout_scheduled" });
272
+ setTimeout(() => {
273
+ void logout();
274
+ }, 0);
275
+ }
276
+ async function handleTerminalRefreshFailure(observer) {
277
+ clearAccessToken?.("refresh_failed");
278
+ if (!observer.isClosed()) observer.complete();
279
+ scheduleSessionLogout("refresh_failed");
280
+ }
281
+ async function handleRefreshResult(result, operation, forward, observer, setInnerSubscriber) {
282
+ const decision = decideRefreshNextStep(result);
283
+ if (decision.kind === "logout") {
284
+ await handleTerminalRefreshFailure(observer);
285
+ return;
286
+ }
287
+ if (decision.kind === "complete") {
288
+ handleRetryableRefreshFailure(observer);
289
+ return;
290
+ }
291
+ retryOperationWithToken(
292
+ operation,
293
+ forward,
294
+ decision.token,
295
+ observer,
296
+ setInnerSubscriber
297
+ );
298
+ }
299
+ async function recoverFromAuthError(operation, forward, authContext, observer, setInnerSubscriber) {
300
+ const ctx = operation.getContext();
301
+ if (ctx.__authRetryAttempted) {
302
+ onDebug?.("Auth retry suppressed (already retried)", {
303
+ operationName: operation.operationName,
304
+ statusCode: authContext.statusCode
305
+ });
306
+ if (!observer.isClosed()) {
307
+ observer.error(
308
+ new Error(
309
+ `Auth failed after retry (status ${authContext.statusCode ?? "unknown"})`
310
+ )
311
+ );
312
+ }
313
+ return;
314
+ }
315
+ onDebug?.("Auth error detected; attempting refresh", {
316
+ operationName: operation.operationName,
317
+ statusCode: authContext.statusCode
318
+ });
319
+ const result = await refreshAccessToken();
320
+ if (observer.isClosed()) return;
321
+ await handleRefreshResult(
322
+ result,
323
+ operation,
324
+ forward,
325
+ observer,
326
+ setInnerSubscriber
327
+ );
328
+ }
329
+ async function handleAuthRecoveryError(err, observer) {
330
+ reportError?.(err, { action: "tokenRefresh" });
331
+ console.error("Token refresh failed", err);
332
+ clearAccessToken?.("refresh_exception");
333
+ if (!observer.isClosed()) observer.complete();
334
+ scheduleSessionLogout("refresh_exception");
335
+ }
336
+ return (0, import_error.onError)((errorResponse) => {
337
+ const { operation, forward } = errorResponse;
338
+ const { graphQLErrors, networkError } = readErrorResponseFields(errorResponse);
339
+ if (!isUnauthenticatedError({
340
+ graphQLErrors,
341
+ networkError
342
+ })) {
343
+ return;
344
+ }
345
+ const statusCode = networkError ? getStatusCode(networkError) : null;
346
+ const authContext = {
347
+ graphQLErrors,
348
+ networkError,
349
+ statusCode
350
+ };
351
+ return new import_client2.Observable((observer) => {
352
+ let innerSubscriber = null;
353
+ let closed = false;
354
+ const recoveryObserver = {
355
+ complete: () => observer.complete(),
356
+ error: (error) => observer.error(error),
357
+ isClosed: () => closed,
358
+ next: (value) => observer.next(value)
359
+ };
360
+ const teardown = () => {
361
+ closed = true;
362
+ innerSubscriber?.unsubscribe();
363
+ innerSubscriber = null;
364
+ };
365
+ void recoverFromAuthError(
366
+ operation,
367
+ forward,
368
+ authContext,
369
+ recoveryObserver,
370
+ (subscriber) => {
371
+ innerSubscriber = subscriber;
372
+ }
373
+ ).catch((err) => handleAuthRecoveryError(err, recoveryObserver));
374
+ return teardown;
375
+ });
376
+ });
377
+ }
378
+
379
+ // src/apollo/createRefreshAccessToken.ts
380
+ var REFRESH_TOKEN_QUERY = `
381
+ mutation refreshToken($input: RefreshTokenInputType!) {
382
+ refreshToken(input: $input) {
383
+ token
384
+ refreshToken
385
+ }
386
+ }
387
+ `;
388
+ var RETRY_DELAY_MS = 1500;
389
+ var MAX_REFRESH_ATTEMPTS = 5;
390
+ var wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
391
+ function createRefreshAccessToken(adapters) {
392
+ const {
393
+ apiUrl,
394
+ storage,
395
+ onTokensUpdated,
396
+ onTokensCleared,
397
+ onError: onError3,
398
+ onDebug,
399
+ onAuthRecoveryEvent,
400
+ refreshCoordination
401
+ } = adapters;
402
+ let inFlightRefresh = null;
403
+ async function clearRefreshCredentials(reason) {
404
+ await storage.clearTokens();
405
+ onTokensCleared?.(reason);
406
+ }
407
+ async function clearOrAdoptNewerAccessToken(reason, accessTokenAtStart, errorCode) {
408
+ const currentAccess = await storage.getAccessToken();
409
+ if (currentAccess != null && currentAccess !== accessTokenAtStart) {
410
+ onAuthRecoveryEvent?.({ reason, type: "stale_clear_skipped" });
411
+ return { hadRefreshToken: true, token: currentAccess };
412
+ }
413
+ await clearRefreshCredentials(reason);
414
+ onAuthRecoveryEvent?.({
415
+ errorCode,
416
+ reason,
417
+ type: "refresh_failed"
418
+ });
419
+ return {
420
+ hadRefreshToken: true,
421
+ token: null
422
+ };
423
+ }
424
+ async function abortAfterRefreshGraphqlErrors(errors, errorCode, accessTokenAtStart) {
425
+ const sanitizedErrors = errors.map((error) => ({
426
+ message: error?.message
427
+ }));
428
+ if (isExpectedRefreshAuthFailure(errors, errorCode)) {
429
+ console.warn(
430
+ "[refreshAccessToken] Refresh rejected:",
431
+ errorCode ?? sanitizedErrors.map((e) => e.message).join(", ")
432
+ );
433
+ } else {
434
+ console.error("[refreshAccessToken] GraphQL errors:", sanitizedErrors);
435
+ onError3?.(new Error("GraphQL errors during refresh"), {
436
+ action: "refresh_graphql_error",
437
+ errorCode,
438
+ errors: sanitizedErrors
439
+ });
440
+ }
441
+ const outcome = await clearOrAdoptNewerAccessToken(
442
+ "refresh_graphql_error",
443
+ accessTokenAtStart,
444
+ errorCode
445
+ );
446
+ return {
447
+ ...outcome,
448
+ errorCode
449
+ };
450
+ }
451
+ async function runRefreshAttempt(refreshToken, attempt) {
452
+ const res = await fetch(`${apiUrl}/graphql`, {
453
+ body: JSON.stringify({
454
+ query: REFRESH_TOKEN_QUERY,
455
+ variables: { input: { refreshToken } }
456
+ }),
457
+ headers: { "Content-Type": "application/json" },
458
+ method: "POST"
459
+ });
460
+ const json = await res.json();
461
+ if (json.errors?.length) {
462
+ const errors = json.errors;
463
+ const errorCode = getRefreshErrorCode(errors);
464
+ const warrantRetry = refreshGraphqlErrorsWarrantRetry(errors) && attempt < MAX_REFRESH_ATTEMPTS;
465
+ if (warrantRetry) {
466
+ onDebug?.(
467
+ `GraphQL errors (attempt ${attempt}/${MAX_REFRESH_ATTEMPTS}), retrying`,
468
+ { errorCode }
469
+ );
470
+ return { kind: "retry" };
471
+ }
472
+ return { errorCode, errors, kind: "terminal_graphql" };
473
+ }
474
+ const newToken = json?.data?.refreshToken?.token;
475
+ const newRefreshToken = json?.data?.refreshToken?.refreshToken;
476
+ if (newToken && newRefreshToken) {
477
+ await storage.setTokens(newToken, newRefreshToken);
478
+ onTokensUpdated?.(newToken);
479
+ return { kind: "success", token: newToken };
480
+ }
481
+ if (attempt < MAX_REFRESH_ATTEMPTS) {
482
+ onDebug?.(
483
+ `Invalid refresh response (attempt ${attempt}/${MAX_REFRESH_ATTEMPTS}), retrying`
484
+ );
485
+ return { kind: "retry" };
486
+ }
487
+ return { kind: "terminal_invalid" };
488
+ }
489
+ async function refreshAccessTokenInternal() {
490
+ const accessTokenAtStart = await storage.getAccessToken();
491
+ for (let attempt = 1; attempt <= MAX_REFRESH_ATTEMPTS; attempt += 1) {
492
+ const refreshToken = await storage.getRefreshToken();
493
+ if (!refreshToken) return { hadRefreshToken: false, token: null };
494
+ try {
495
+ const result = await runRefreshAttempt(refreshToken, attempt);
496
+ if (result.kind === "success") {
497
+ onAuthRecoveryEvent?.({ type: "refresh_succeeded" });
498
+ return { hadRefreshToken: true, token: result.token };
499
+ }
500
+ if (result.kind === "retry") {
501
+ await wait(RETRY_DELAY_MS);
502
+ continue;
503
+ }
504
+ if (result.kind === "terminal_graphql") {
505
+ return abortAfterRefreshGraphqlErrors(
506
+ result.errors,
507
+ result.errorCode,
508
+ accessTokenAtStart
509
+ );
510
+ }
511
+ return clearOrAdoptNewerAccessToken(
512
+ "refresh_invalid_response",
513
+ accessTokenAtStart
514
+ );
515
+ } catch (err) {
516
+ if (attempt < MAX_REFRESH_ATTEMPTS) {
517
+ await wait(RETRY_DELAY_MS);
518
+ continue;
519
+ }
520
+ onError3?.(err, {
521
+ action: "refreshAccessToken",
522
+ attempt,
523
+ maxAttempts: MAX_REFRESH_ATTEMPTS
524
+ });
525
+ console.error("Token refresh failed:", err);
526
+ onAuthRecoveryEvent?.({
527
+ reason: "refresh_network_exhausted",
528
+ retryable: true,
529
+ type: "refresh_failed"
530
+ });
531
+ return { hadRefreshToken: true, retryable: true, token: null };
532
+ }
533
+ }
534
+ throw new Error("refreshAccessToken: unreachable");
535
+ }
536
+ return function refreshAccessToken() {
537
+ if (inFlightRefresh !== null) {
538
+ return inFlightRefresh;
539
+ }
540
+ const startCoalesced = () => {
541
+ inFlightRefresh ??= refreshAccessTokenInternal().finally(() => {
542
+ inFlightRefresh = null;
543
+ });
544
+ return inFlightRefresh;
545
+ };
546
+ if (refreshCoordination) {
547
+ return refreshCoordination.withLock(async () => {
548
+ if (inFlightRefresh !== null) {
549
+ return inFlightRefresh;
550
+ }
551
+ return startCoalesced();
552
+ });
553
+ }
554
+ return startCoalesced();
555
+ };
556
+ }
557
+
558
+ // src/apollo/createApolloErrorLoggingLink.ts
559
+ var import_error2 = require("@apollo/client/link/error");
560
+
561
+ // src/apollo/toStructuredError.ts
562
+ function safeJsonStringify(value) {
563
+ const seen = /* @__PURE__ */ new WeakSet();
564
+ return JSON.stringify(
565
+ value,
566
+ (_key, v) => {
567
+ if (typeof v === "bigint") return v.toString();
568
+ if (typeof v === "function") return `[Function ${v.name || "anonymous"}]`;
569
+ if (v && typeof v === "object") {
570
+ if (seen.has(v)) return "[Circular]";
571
+ seen.add(v);
572
+ }
573
+ if (v instanceof Error) {
574
+ return {
575
+ message: v.message,
576
+ name: v.name,
577
+ stack: v.stack,
578
+ ...v
579
+ };
580
+ }
581
+ return v;
582
+ },
583
+ 2
584
+ );
585
+ }
586
+ function pickKnownFields(src, dst) {
587
+ const keys = [
588
+ "message",
589
+ "code",
590
+ "reason",
591
+ "type",
592
+ "name",
593
+ "stack",
594
+ "status",
595
+ "statusCode",
596
+ "readyState",
597
+ "url",
598
+ "wasClean"
599
+ ];
600
+ for (const k of keys) {
601
+ if (k in src) dst[k] = src[k];
602
+ }
603
+ }
604
+ function objectToJson(anyErr) {
605
+ const out = {};
606
+ pickKnownFields(anyErr, out);
607
+ for (const [k, v] of Object.entries(anyErr)) {
608
+ if (!(k in out)) out[k] = v;
609
+ }
610
+ return out;
611
+ }
612
+ function toStructuredError(err) {
613
+ if (err == null) return null;
614
+ if (typeof err === "string") return { message: err };
615
+ if (typeof err === "number" || typeof err === "boolean")
616
+ return { value: err };
617
+ if (typeof err === "symbol") return { value: err.toString() };
618
+ if (err instanceof Error) {
619
+ const details = objectToJson(err);
620
+ if (details && typeof details === "object" && !Array.isArray(details)) {
621
+ return {
622
+ ...details,
623
+ message: err.message,
624
+ name: err.name,
625
+ stack: err.stack ?? null
626
+ };
627
+ }
628
+ return {
629
+ message: err.message,
630
+ name: err.name,
631
+ stack: err.stack ?? null
632
+ };
633
+ }
634
+ if (typeof err === "object") return objectToJson(err);
635
+ return { value: safeJsonStringify({ value: err }) };
636
+ }
637
+
638
+ // src/apollo/createApolloErrorLoggingLink.ts
639
+ var SCOPE = "apollo";
640
+ var REDACTED = "[REDACTED]";
641
+ var MAX_DEPTH = 4;
642
+ var MAX_ARRAY_ITEMS = 20;
643
+ var SENSITIVE_KEY_RE = /(pass(word)?|token|secret|auth(orization)?|cookie|session|otp|pin|email|phone|ssn|credit|card|cvv|iban|refresh)/i;
644
+ var GRAPHQL_EXTENSION_ALLOWLIST = /* @__PURE__ */ new Set(["category", "code", "httpStatus"]);
645
+ function resolveIsDev(isDev) {
646
+ return typeof isDev === "function" ? isDev() : isDev;
647
+ }
648
+ function isSensitiveKey(key) {
649
+ return SENSITIVE_KEY_RE.test(key);
650
+ }
651
+ function isSensitiveExtensionKey(key) {
652
+ return isSensitiveKey(key) || /stack|trace|debug|exception|internals|snippet|query|variables|body/i.test(
653
+ key
654
+ );
655
+ }
656
+ function redactValue(value, depth = 0) {
657
+ if (value == null) return value;
658
+ if (depth >= MAX_DEPTH) return "[Truncated]";
659
+ if (Array.isArray(value)) {
660
+ return value.slice(0, MAX_ARRAY_ITEMS).map((item) => redactValue(item, depth + 1));
661
+ }
662
+ if (typeof value === "object") {
663
+ const input = value;
664
+ const out = {};
665
+ for (const [key, nested] of Object.entries(input)) {
666
+ out[key] = isSensitiveKey(key) ? REDACTED : redactValue(nested, depth + 1);
667
+ }
668
+ return out;
669
+ }
670
+ return value;
671
+ }
672
+ function pickAllowlistedExtensions(ext) {
673
+ const out = {};
674
+ for (const key of GRAPHQL_EXTENSION_ALLOWLIST) {
675
+ if (key in ext && ext[key] !== void 0) {
676
+ out[key] = ext[key];
677
+ }
678
+ }
679
+ return Object.keys(out).length > 0 ? out : void 0;
680
+ }
681
+ function redactGraphQLExtensionsForDev(ext) {
682
+ const out = {};
683
+ for (const [key, value] of Object.entries(ext)) {
684
+ if (GRAPHQL_EXTENSION_ALLOWLIST.has(key)) {
685
+ out[key] = value != null && typeof value === "object" ? redactValue(value) : value;
686
+ continue;
687
+ }
688
+ if (isSensitiveExtensionKey(key)) {
689
+ out[key] = REDACTED;
690
+ continue;
691
+ }
692
+ out[key] = redactValue(value);
693
+ }
694
+ return Object.keys(out).length > 0 ? out : void 0;
695
+ }
696
+ function safeExtensionsForLogs(extensions, isDev) {
697
+ if (extensions == null) return void 0;
698
+ if (typeof extensions !== "object" || Array.isArray(extensions)) {
699
+ return "[NonObjectExtensions]";
700
+ }
701
+ const ext = extensions;
702
+ if (!isDev) {
703
+ return pickAllowlistedExtensions(ext);
704
+ }
705
+ return redactGraphQLExtensionsForDev(ext);
706
+ }
707
+ function serializeGraphQLError(err, isDev) {
708
+ return {
709
+ extensions: safeExtensionsForLogs(err.extensions, isDev),
710
+ locations: err.locations,
711
+ message: err.message,
712
+ path: err.path
713
+ };
714
+ }
715
+ function safeVariablesForLogs(variables, isDev) {
716
+ if (!variables) return void 0;
717
+ if (!isDev) {
718
+ return {
719
+ keys: Object.keys(variables),
720
+ present: true
721
+ };
722
+ }
723
+ return redactValue(variables);
724
+ }
725
+ function safeResponseForLogs(response, isDev) {
726
+ if (!response) return null;
727
+ if (!isDev) return { present: true };
728
+ return redactValue(toStructuredError(response));
729
+ }
730
+ function createApolloErrorLoggingLink(adapters) {
731
+ const { isDev, onLog } = adapters;
732
+ return (0, import_error2.onError)((errorHandler) => {
733
+ const { operation } = errorHandler;
734
+ const { graphQLErrors, networkError, response } = readErrorResponseFields(errorHandler);
735
+ const dev = resolveIsDev(isDev);
736
+ if (graphQLErrors?.length) {
737
+ onLog("error", SCOPE, "GraphQL error(s)", {
738
+ graphQLErrors: graphQLErrors.map(
739
+ (err) => serializeGraphQLError(err, dev)
740
+ ),
741
+ operationName: operation.operationName,
742
+ variables: safeVariablesForLogs(operation.variables, dev)
743
+ });
744
+ }
745
+ if (networkError) {
746
+ onLog("error", SCOPE, "Network error", {
747
+ networkError: toStructuredError(networkError),
748
+ operationName: operation.operationName,
749
+ response: safeResponseForLogs(response, dev),
750
+ variables: safeVariablesForLogs(operation.variables, dev)
751
+ });
752
+ }
753
+ return void 0;
754
+ });
755
+ }
756
+
757
+ // src/apollo/createNetworkRecoveryLink.ts
758
+ var import_client3 = require("@apollo/client");
759
+ var import_utilities = require("@apollo/client/utilities");
760
+
761
+ // src/utils/isTransientNetworkError.ts
762
+ var TRANSIENT_NETWORK_PATTERNS = [
763
+ /network connection was lost/i,
764
+ /network request failed/i,
765
+ /fetch failed/i,
766
+ /failed to fetch/i,
767
+ /internet connection appears to be offline/i,
768
+ // Transport-layer timeouts only — avoid generic "timeout" (backend/query timeouts).
769
+ /\b(request|connection|network)\s+timed\s+out\b/i,
770
+ /\b(connect|read|write|socket)\s+timeout\b/i,
771
+ /\bsocket\s+timed\s+out\b/i,
772
+ /\betimedout\b/i,
773
+ /\benotfound\b/i,
774
+ /\beconnreset\b/i,
775
+ /\beconnrefused\b/i
776
+ ];
777
+ function extractErrorMessage(err) {
778
+ if (err instanceof Error) return err.message;
779
+ if (typeof err === "string") return err;
780
+ if (err && typeof err === "object") {
781
+ const obj = err;
782
+ if (typeof obj.message === "string") return obj.message;
783
+ if (obj.networkError) return extractErrorMessage(obj.networkError);
784
+ try {
785
+ return JSON.stringify(err);
786
+ } catch {
787
+ return "[object]";
788
+ }
789
+ }
790
+ if (err == null) return "";
791
+ if (typeof err === "number" || typeof err === "boolean" || typeof err === "bigint") {
792
+ return String(err);
793
+ }
794
+ if (typeof err === "symbol") return err.toString();
795
+ return "";
796
+ }
797
+ function isTransientNetworkError(err) {
798
+ const message = extractErrorMessage(err);
799
+ return TRANSIENT_NETWORK_PATTERNS.some((pattern) => pattern.test(message));
800
+ }
801
+
802
+ // src/apollo/createNetworkRecoveryLink.ts
803
+ var MAX_RETRIES = 4;
804
+ var BACKOFF_MS = [500, 1500, 3e3, 4e3];
805
+ function emitNext(state, value) {
806
+ if (state.unsubscribed) return;
807
+ state.observer.next(value);
808
+ }
809
+ function emitComplete(state) {
810
+ if (state.unsubscribed) return;
811
+ state.observer.complete();
812
+ }
813
+ function emitError(state, err) {
814
+ if (state.unsubscribed) return;
815
+ state.observer.error(err);
816
+ }
817
+ function isQueryOperation(op) {
818
+ const def = (0, import_utilities.getMainDefinition)(op.query);
819
+ return def.kind === "OperationDefinition" && def.operation === "query";
820
+ }
821
+ function wait2(ms) {
822
+ return new Promise((resolve) => setTimeout(resolve, ms));
823
+ }
824
+ function isRetryableNetworkFailure(err) {
825
+ if (isTransientNetworkError(err)) return true;
826
+ const networkError = err && typeof err === "object" ? err.networkError : void 0;
827
+ if (!networkError) return false;
828
+ if (typeof networkError === "object" && networkError !== null && !(networkError instanceof Error) && Object.keys(networkError).length === 0) {
829
+ return false;
830
+ }
831
+ return isTransientNetworkError(networkError);
832
+ }
833
+ function waitForOnline(adapters, aborted) {
834
+ return new Promise((resolve) => {
835
+ if (aborted()) {
836
+ resolve();
837
+ return;
838
+ }
839
+ let intervalId = null;
840
+ const unsub = adapters.subscribeIsOnline((online) => {
841
+ if (aborted()) {
842
+ if (intervalId !== null) {
843
+ clearInterval(intervalId);
844
+ intervalId = null;
845
+ }
846
+ unsub();
847
+ resolve();
848
+ return;
849
+ }
850
+ if (online) {
851
+ if (intervalId !== null) {
852
+ clearInterval(intervalId);
853
+ intervalId = null;
854
+ }
855
+ unsub();
856
+ resolve();
857
+ }
858
+ });
859
+ intervalId = setInterval(() => {
860
+ if (aborted()) {
861
+ if (intervalId !== null) {
862
+ clearInterval(intervalId);
863
+ intervalId = null;
864
+ }
865
+ unsub();
866
+ resolve();
867
+ }
868
+ }, 500);
869
+ });
870
+ }
871
+ function cleanupRecoveryState(state) {
872
+ state.innerSub?.unsubscribe();
873
+ state.innerSub = null;
874
+ }
875
+ async function ensureOnlineOrWait(state) {
876
+ const online = await state.adapters.forceRefreshIsOnline();
877
+ if (online) return !state.unsubscribed;
878
+ await waitForOnline(state.adapters, () => state.unsubscribed);
879
+ return !state.unsubscribed;
880
+ }
881
+ async function handleQueryNetworkError(state, err, attempt) {
882
+ if (state.unsubscribed) return;
883
+ if (!isRetryableNetworkFailure(err)) {
884
+ emitError(state, err);
885
+ return;
886
+ }
887
+ const nowOnline = await state.adapters.forceRefreshIsOnline();
888
+ if (state.unsubscribed) return;
889
+ if (!nowOnline) {
890
+ await waitForOnline(state.adapters, () => state.unsubscribed);
891
+ if (state.unsubscribed) return;
892
+ cleanupRecoveryState(state);
893
+ void runQueryAttempt(state, attempt);
894
+ return;
895
+ }
896
+ if (attempt >= MAX_RETRIES) {
897
+ emitError(state, err);
898
+ return;
899
+ }
900
+ await wait2(BACKOFF_MS[attempt] ?? 4e3);
901
+ if (state.unsubscribed) return;
902
+ cleanupRecoveryState(state);
903
+ void runQueryAttempt(state, attempt + 1);
904
+ }
905
+ async function runQueryAttempt(state, attempt) {
906
+ if (state.unsubscribed) return;
907
+ const canContinue = await ensureOnlineOrWait(state);
908
+ if (!canContinue) return;
909
+ try {
910
+ state.innerSub = state.forward(state.operation).subscribe({
911
+ complete: () => emitComplete(state),
912
+ error: (err) => {
913
+ if (!isRetryableNetworkFailure(err)) {
914
+ emitError(state, err);
915
+ return;
916
+ }
917
+ void handleQueryNetworkError(state, err, attempt);
918
+ },
919
+ next: (value) => emitNext(state, value)
920
+ });
921
+ } catch (e) {
922
+ emitError(state, e);
923
+ }
924
+ }
925
+ function createNetworkRecoveryLink(adapters) {
926
+ return new import_client3.ApolloLink((operation, forward) => {
927
+ if (!forward) {
928
+ return null;
929
+ }
930
+ if (!isQueryOperation(operation)) {
931
+ return forward(operation);
932
+ }
933
+ return new import_client3.Observable((observer) => {
934
+ const state = {
935
+ adapters,
936
+ forward,
937
+ innerSub: null,
938
+ observer,
939
+ operation,
940
+ unsubscribed: false
941
+ };
942
+ void runQueryAttempt(state, 0);
943
+ return () => {
944
+ state.unsubscribed = true;
945
+ cleanupRecoveryState(state);
946
+ };
947
+ });
948
+ });
949
+ }
950
+
951
+ // src/apollo/createNetworkLog.ts
952
+ function resolveEnabled(enabled) {
953
+ return typeof enabled === "function" ? enabled() : enabled;
954
+ }
955
+ function createNetworkLog(adapters) {
956
+ const { enabled } = adapters;
957
+ return function networkLog(level, scope, message, details) {
958
+ if (!resolveEnabled(enabled)) return;
959
+ const payload = details ? safeJsonStringify(details) : "";
960
+ const prefix = `[${scope}] ${message}`;
961
+ let logger;
962
+ switch (level) {
963
+ case "debug":
964
+ logger = console.debug;
965
+ break;
966
+ case "info":
967
+ logger = console.info;
968
+ break;
969
+ case "warn":
970
+ logger = console.warn;
971
+ break;
972
+ case "error":
973
+ default:
974
+ logger = console.error;
975
+ break;
976
+ }
977
+ logger(payload ? `${prefix}
978
+ ${payload}` : prefix);
979
+ };
980
+ }
981
+
982
+ // src/apollo/createWsManager.ts
983
+ var import_graphql_ws = require("graphql-ws");
984
+ var WS_SCOPE = "ws";
985
+ var MIN_RECONNECT_MS = 1e3;
986
+ var MAX_RECONNECT_MS = 1e4;
987
+ var WS_CLIENT_RESTART_CODE = 4205;
988
+ var MAX_WS_RETRY_ATTEMPTS = 30;
989
+ var WS_READY_STATE_OPEN = 1;
990
+ var WS_READY_STATE_CONNECTING = 0;
991
+ function resolveIsDev2(isDev) {
992
+ if (isDev == null) return false;
993
+ return typeof isDev === "function" ? isDev() : isDev;
994
+ }
995
+ function maskedTokenInfo2(token) {
996
+ const len = token.length;
997
+ const start = token.slice(0, 4);
998
+ const end = token.slice(-4);
999
+ return { end, len, start };
1000
+ }
1001
+ function computeBackoffMs(attempt) {
1002
+ const exp = Math.min(MIN_RECONNECT_MS * 2 ** attempt, MAX_RECONNECT_MS);
1003
+ const jitter = (attempt * 37 + 17) % 250;
1004
+ return Math.min(exp + jitter, MAX_RECONNECT_MS);
1005
+ }
1006
+ function wsCloseReason(reason) {
1007
+ const trimmed = reason.trim().slice(0, 100);
1008
+ return trimmed || "restart";
1009
+ }
1010
+ function createWsManager(adapters) {
1011
+ const {
1012
+ getWsUrl,
1013
+ awaitReady,
1014
+ getAccessToken,
1015
+ isActive,
1016
+ subscribeLifecycle,
1017
+ onLog,
1018
+ isDev
1019
+ } = adapters;
1020
+ const log = (level, message, details) => {
1021
+ onLog?.(level, WS_SCOPE, message, details);
1022
+ };
1023
+ let client = null;
1024
+ let activeSocket = null;
1025
+ let unsubscribeLifecycle = null;
1026
+ const ensureConnectedRef = {
1027
+ current: () => void 0
1028
+ };
1029
+ const close = (reason) => {
1030
+ activeSocket = null;
1031
+ if (client) {
1032
+ try {
1033
+ log("debug", "Disposing WS client", { reason });
1034
+ client.dispose();
1035
+ } catch (e) {
1036
+ log("warn", "Error while disposing WS client", {
1037
+ error: toStructuredError(e),
1038
+ reason
1039
+ });
1040
+ }
1041
+ }
1042
+ client = null;
1043
+ };
1044
+ const createNewClient = () => {
1045
+ const url = getWsUrl();
1046
+ return (0, import_graphql_ws.createClient)({
1047
+ connectionParams: async () => {
1048
+ try {
1049
+ await awaitReady();
1050
+ } catch (e) {
1051
+ log("error", "WS auth params: awaitReady failed", {
1052
+ error: toStructuredError(e)
1053
+ });
1054
+ return {};
1055
+ }
1056
+ const token = getAccessToken();
1057
+ if (!token) {
1058
+ if (resolveIsDev2(isDev)) {
1059
+ log("warn", "WS auth params: missing token", {});
1060
+ }
1061
+ return {};
1062
+ }
1063
+ if (resolveIsDev2(isDev)) {
1064
+ log("debug", "WS connecting with token", {
1065
+ token: maskedTokenInfo2(token)
1066
+ });
1067
+ }
1068
+ const bearer = `Bearer ${token}`;
1069
+ return { Authorization: bearer, authorization: bearer };
1070
+ },
1071
+ keepAlive: 2e4,
1072
+ lazy: true,
1073
+ on: {
1074
+ closed: (ev) => {
1075
+ activeSocket = null;
1076
+ log("warn", "WS closed", {
1077
+ close: toStructuredError(ev),
1078
+ url
1079
+ });
1080
+ },
1081
+ connected: (socket) => {
1082
+ activeSocket = socket;
1083
+ log("info", "WS connected", { url });
1084
+ },
1085
+ connecting: () => {
1086
+ log("debug", "WS connecting", { url });
1087
+ },
1088
+ error: (err) => {
1089
+ const structuredError = toStructuredError(err);
1090
+ const hasStructuredDetails = structuredError != null && (typeof structuredError !== "object" || Array.isArray(structuredError) || Object.keys(structuredError).length > 0);
1091
+ const logLevel = hasStructuredDetails ? "error" : "warn";
1092
+ const logMessage = hasStructuredDetails ? "WS error" : "WS error (empty payload)";
1093
+ log(
1094
+ logLevel,
1095
+ logMessage,
1096
+ hasStructuredDetails ? { error: structuredError, url } : { url }
1097
+ );
1098
+ }
1099
+ },
1100
+ retryAttempts: MAX_WS_RETRY_ATTEMPTS,
1101
+ retryWait: async (retries) => {
1102
+ await new Promise(
1103
+ (resolve) => setTimeout(resolve, computeBackoffMs(retries))
1104
+ );
1105
+ },
1106
+ url
1107
+ });
1108
+ };
1109
+ const initLifecycleListener = () => {
1110
+ if (unsubscribeLifecycle) return;
1111
+ unsubscribeLifecycle = subscribeLifecycle({
1112
+ onActive: () => {
1113
+ log("debug", "Lifecycle active; allowing reconnect", {});
1114
+ ensureConnectedRef.current("lifecycle_active");
1115
+ },
1116
+ onInactive: () => {
1117
+ log("debug", "Lifecycle inactive; closing WS", {});
1118
+ close("lifecycle_inactive");
1119
+ }
1120
+ });
1121
+ };
1122
+ const getClient = () => {
1123
+ initLifecycleListener();
1124
+ if (!client) {
1125
+ client = createNewClient();
1126
+ }
1127
+ return client;
1128
+ };
1129
+ const nudgeSocketReconnect = (reason) => {
1130
+ if (!isActive()) return;
1131
+ const token = getAccessToken();
1132
+ if (!token) {
1133
+ if (resolveIsDev2(isDev)) {
1134
+ log("warn", "WS restart blocked (missing token)", { reason });
1135
+ }
1136
+ close(`blocked_missing_token:${reason}`);
1137
+ return;
1138
+ }
1139
+ if (client === null) {
1140
+ client = createNewClient();
1141
+ log("debug", "WS client created", { reason });
1142
+ return;
1143
+ }
1144
+ const socket = activeSocket;
1145
+ if (socket !== null) {
1146
+ const { readyState } = socket;
1147
+ if (readyState === WS_READY_STATE_OPEN || readyState === WS_READY_STATE_CONNECTING) {
1148
+ try {
1149
+ socket.close(WS_CLIENT_RESTART_CODE, wsCloseReason(reason));
1150
+ log("debug", "WS socket restart (same client)", { reason });
1151
+ } catch (e) {
1152
+ log("warn", "WS socket close failed", {
1153
+ error: toStructuredError(e),
1154
+ reason
1155
+ });
1156
+ }
1157
+ }
1158
+ return;
1159
+ }
1160
+ if (resolveIsDev2(isDev)) {
1161
+ log("debug", "WS nudge: no open socket (library retry)", { reason });
1162
+ }
1163
+ };
1164
+ const ensureConnected = (reason) => {
1165
+ initLifecycleListener();
1166
+ if (!isActive()) {
1167
+ log("debug", "Skip ensureConnected while inactive", { reason });
1168
+ return;
1169
+ }
1170
+ awaitReady().then(() => {
1171
+ const token = getAccessToken();
1172
+ if (!token) {
1173
+ if (resolveIsDev2(isDev)) {
1174
+ log("warn", "WS blocked (missing token)", { reason });
1175
+ }
1176
+ return;
1177
+ }
1178
+ getClient();
1179
+ }).catch((e) => {
1180
+ log("error", "WS ensureConnected failed", {
1181
+ error: toStructuredError(e),
1182
+ reason
1183
+ });
1184
+ });
1185
+ };
1186
+ ensureConnectedRef.current = ensureConnected;
1187
+ const onAuthTokenChanged = (reason) => {
1188
+ if (resolveIsDev2(isDev)) {
1189
+ log("debug", "Auth token changed; reconnecting WS", { reason });
1190
+ }
1191
+ nudgeSocketReconnect(`auth_token_changed:${reason}`);
1192
+ };
1193
+ const dispose = () => {
1194
+ close("dispose");
1195
+ if (unsubscribeLifecycle) {
1196
+ unsubscribeLifecycle();
1197
+ unsubscribeLifecycle = null;
1198
+ }
1199
+ };
1200
+ return {
1201
+ close,
1202
+ dispose,
1203
+ ensureConnected,
1204
+ getClient,
1205
+ initLifecycleListener,
1206
+ onAuthTokenChanged
1207
+ };
1208
+ }
1209
+
1210
+ // src/apollo/recoveryConstants.ts
1211
+ var MIN_BACKGROUND_MS = 3e4;
1212
+ var REFETCH_DELAY_MS = 500;
1213
+
1214
+ // src/apollo/createRecoveryCore.ts
1215
+ var DEFAULT_SHORT_BG_REASON = "short_background";
1216
+ var DEFAULT_RECOVER_REASON = "apollo_recover";
1217
+ function createRecoveryCore(adapters) {
1218
+ const {
1219
+ refreshSession,
1220
+ ensureWsConnected,
1221
+ disposeWs,
1222
+ refetchActiveQueries,
1223
+ isActive,
1224
+ isOnline,
1225
+ subscribeLifecycle,
1226
+ shortBackgroundWsReason = DEFAULT_SHORT_BG_REASON,
1227
+ recoverWsReason = DEFAULT_RECOVER_REASON,
1228
+ now = () => Date.now(),
1229
+ schedule = (fn, ms) => setTimeout(fn, ms),
1230
+ cancelSchedule = (id) => clearTimeout(id)
1231
+ } = adapters;
1232
+ let recovering = false;
1233
+ let resetGeneration = 0;
1234
+ let backgroundTime = null;
1235
+ let wsDisposeTimer = null;
1236
+ let refetchTimer = null;
1237
+ let unsubscribeLifecycle = null;
1238
+ const clearRefetchTimer = () => {
1239
+ if (refetchTimer !== null) {
1240
+ cancelSchedule(refetchTimer);
1241
+ refetchTimer = null;
1242
+ }
1243
+ };
1244
+ const clearWsDisposeTimer = () => {
1245
+ if (wsDisposeTimer !== null) {
1246
+ cancelSchedule(wsDisposeTimer);
1247
+ wsDisposeTimer = null;
1248
+ }
1249
+ };
1250
+ const canUseNetwork = () => isOnline?.() ?? true;
1251
+ const scheduleActiveQueryRefetch = (generationAtStart) => {
1252
+ clearRefetchTimer();
1253
+ refetchTimer = schedule(() => {
1254
+ refetchTimer = null;
1255
+ if (!isActive()) return;
1256
+ if (generationAtStart !== resetGeneration) return;
1257
+ if (!canUseNetwork()) return;
1258
+ refetchActiveQueries();
1259
+ }, REFETCH_DELAY_MS);
1260
+ };
1261
+ const handleMovedToBackground = () => {
1262
+ clearRefetchTimer();
1263
+ backgroundTime = now();
1264
+ clearWsDisposeTimer();
1265
+ wsDisposeTimer = schedule(() => {
1266
+ wsDisposeTimer = null;
1267
+ disposeWs();
1268
+ }, MIN_BACKGROUND_MS);
1269
+ };
1270
+ async function recoverApollo() {
1271
+ if (recovering) return;
1272
+ recovering = true;
1273
+ const generationAtStart = resetGeneration;
1274
+ try {
1275
+ const shouldRefetch = await refreshSession();
1276
+ if (generationAtStart !== resetGeneration) return;
1277
+ ensureWsConnected(recoverWsReason);
1278
+ if (!isActive()) return;
1279
+ if (shouldRefetch) {
1280
+ scheduleActiveQueryRefetch(generationAtStart);
1281
+ }
1282
+ } finally {
1283
+ if (generationAtStart === resetGeneration) {
1284
+ recovering = false;
1285
+ }
1286
+ }
1287
+ }
1288
+ const handleReturnedToForeground = () => {
1289
+ clearWsDisposeTimer();
1290
+ const bgTime = backgroundTime;
1291
+ const elapsed = bgTime != null ? now() - bgTime : MIN_BACKGROUND_MS;
1292
+ backgroundTime = null;
1293
+ if (elapsed >= MIN_BACKGROUND_MS) {
1294
+ void recoverApollo();
1295
+ return;
1296
+ }
1297
+ ensureWsConnected(shortBackgroundWsReason);
1298
+ };
1299
+ return {
1300
+ prepareClientReset() {
1301
+ clearRefetchTimer();
1302
+ clearWsDisposeTimer();
1303
+ backgroundTime = null;
1304
+ recovering = false;
1305
+ resetGeneration += 1;
1306
+ },
1307
+ recoverApollo,
1308
+ start() {
1309
+ if (unsubscribeLifecycle) return;
1310
+ unsubscribeLifecycle = subscribeLifecycle({
1311
+ onActive: handleReturnedToForeground,
1312
+ onInactive: handleMovedToBackground
1313
+ });
1314
+ },
1315
+ stop() {
1316
+ if (unsubscribeLifecycle) {
1317
+ unsubscribeLifecycle();
1318
+ unsubscribeLifecycle = null;
1319
+ }
1320
+ clearRefetchTimer();
1321
+ clearWsDisposeTimer();
1322
+ backgroundTime = null;
1323
+ recovering = false;
1324
+ }
1325
+ };
1326
+ }
1327
+
1328
+ // src/apollo/swapApolloClientRef.ts
1329
+ function swapApolloClientRef(clientRef, createNextBundle) {
1330
+ clientRef.current.stop();
1331
+ const next = createNextBundle();
1332
+ clientRef.current = next.client;
1333
+ return next;
1334
+ }
1335
+ // Annotate the CommonJS export names for ESM import in node:
1336
+ 0 && (module.exports = {
1337
+ MIN_BACKGROUND_MS,
1338
+ NON_RETRYABLE_REFRESH_AUTH_CODES,
1339
+ REFETCH_DELAY_MS,
1340
+ createApolloErrorLoggingLink,
1341
+ createApolloManager,
1342
+ createAuthLink,
1343
+ createErrorLink,
1344
+ createNetworkLog,
1345
+ createNetworkRecoveryLink,
1346
+ createRecoveryCore,
1347
+ createRefreshAccessToken,
1348
+ createWsManager,
1349
+ decideRefreshNextStep,
1350
+ getRefreshErrorCode,
1351
+ getStatusCode,
1352
+ isExpectedRefreshAuthFailure,
1353
+ isRefreshAuthFailureMessage,
1354
+ isUnauthenticatedError,
1355
+ isUnauthenticatedGraphQLError,
1356
+ readErrorResponseFields,
1357
+ refreshGraphqlErrorsWarrantRetry,
1358
+ safeJsonStringify,
1359
+ swapApolloClientRef,
1360
+ toStructuredError
1361
+ });
1362
+ //# sourceMappingURL=index.cjs.map