@timardex/cluemart-shared 2.2.14 → 2.2.21

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 (46) hide show
  1. package/dist/{ad-Ogzb0O0U.d.ts → ad-C4L_-r-4.d.ts} +10 -1
  2. package/dist/{ad-BdPabW-h.d.mts → ad-XtBAH4rD.d.mts} +10 -1
  3. package/dist/apollo/index.cjs +12 -7
  4. package/dist/apollo/index.cjs.map +1 -1
  5. package/dist/apollo/index.d.mts +11 -0
  6. package/dist/apollo/index.d.ts +11 -0
  7. package/dist/apollo/index.mjs +12 -7
  8. package/dist/apollo/index.mjs.map +1 -1
  9. package/dist/auth/index.cjs +36 -0
  10. package/dist/auth/index.cjs.map +1 -1
  11. package/dist/auth/index.mjs +1 -1
  12. package/dist/{chunk-OSSBKFNH.mjs → chunk-BR4XNXE7.mjs} +52 -1
  13. package/dist/chunk-BR4XNXE7.mjs.map +1 -0
  14. package/dist/{chunk-MRBTCICB.mjs → chunk-FWKZZMQR.mjs} +1 -1
  15. package/dist/chunk-FWKZZMQR.mjs.map +1 -0
  16. package/dist/{chunk-TJF64MYL.mjs → chunk-KHC57ZNS.mjs} +2 -2
  17. package/dist/{chunk-NX5E6VQO.mjs → chunk-PUX53EZX.mjs} +2 -2
  18. package/dist/{chunk-QSBAN3V5.mjs → chunk-TCV735VY.mjs} +2 -2
  19. package/dist/formFields/index.mjs +3 -3
  20. package/dist/graphql/index.cjs +54 -0
  21. package/dist/graphql/index.cjs.map +1 -1
  22. package/dist/graphql/index.d.mts +29 -2
  23. package/dist/graphql/index.d.ts +29 -2
  24. package/dist/graphql/index.mjs +8 -2
  25. package/dist/hooks/index.cjs +36 -0
  26. package/dist/hooks/index.cjs.map +1 -1
  27. package/dist/hooks/index.d.mts +1 -1
  28. package/dist/hooks/index.d.ts +1 -1
  29. package/dist/hooks/index.mjs +5 -5
  30. package/dist/index.cjs +54 -0
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.mts +37 -1
  33. package/dist/index.d.ts +37 -1
  34. package/dist/index.mjs +51 -0
  35. package/dist/index.mjs.map +1 -1
  36. package/dist/types/index.cjs.map +1 -1
  37. package/dist/types/index.d.mts +1 -1
  38. package/dist/types/index.d.ts +1 -1
  39. package/dist/types/index.mjs +1 -1
  40. package/dist/utils/index.mjs +2 -2
  41. package/package.json +1 -1
  42. package/dist/chunk-MRBTCICB.mjs.map +0 -1
  43. package/dist/chunk-OSSBKFNH.mjs.map +0 -1
  44. /package/dist/{chunk-TJF64MYL.mjs.map → chunk-KHC57ZNS.mjs.map} +0 -0
  45. /package/dist/{chunk-NX5E6VQO.mjs.map → chunk-PUX53EZX.mjs.map} +0 -0
  46. /package/dist/{chunk-QSBAN3V5.mjs.map → chunk-TCV735VY.mjs.map} +0 -0
@@ -124,6 +124,15 @@ type RefreshTokenPayloadType = {
124
124
  token: string;
125
125
  };
126
126
  type RefreshTokenMutationResponse = MutationResponse<RefreshTokenPayloadType>;
127
+ type StartImpersonationPayloadType = {
128
+ expiresAt: Date;
129
+ refreshToken: string;
130
+ sessionId: string;
131
+ token: string;
132
+ user: SafeUserType;
133
+ };
134
+ type StartImpersonationMutationResponse = MutationResponse<StartImpersonationPayloadType>;
135
+ type RefreshImpersonationMutationResponse = MutationResponse<RefreshTokenPayloadType>;
127
136
 
128
137
  declare enum EnumAdShowOn {
129
138
  EVENTS_PAGE = "Events_page",
@@ -256,4 +265,4 @@ type AdSettingsType = {
256
265
  rotationSeconds: number;
257
266
  };
258
267
 
259
- export { type AuthMutationResponse as A, EnumAdApprovalStatus as B, type CreateLoginFormData as C, EnumAdBookingSlotKind as D, EnumAdPlatform as E, EnumAdBookingState as F, EnumAdEntitlementSource as G, EnumAdPaymentStatus as H, EnumAdStatus as I, EnumAdStyle as J, EnumAdType as K, EnumVerificationType as L, type LoginFormData as M, type MarketingMaterialRequestInputType as N, type PosterInputType as O, type PartnerType as P, type RefreshTokenPayloadType as Q, type RefreshTokenMutationResponse as R, type SchoolType as S, type RegisterFormData as T, type RequestPasswordResetFormData as U, type ResetPasswordFormData as V, type SchoolCampaignType as W, type SchoolRegisteredUserType as X, type ValidateVerificationTokenFormData as Y, type AdType as a, EnumAdShowOn as b, type AppSettingsType as c, type SchoolReturnType as d, type CreateRegisterFormData as e, type CreateRequestPasswordResetFormData as f, type CreateValidateVerificationTokenFormData as g, type CreateResetPasswordFormData as h, type PartnerFormData as i, type AdFormData as j, type CreateAdFormState as k, type CreatePartnerFormData as l, type AppSettingsFormData as m, type CreateAppSettingsFormData as n, type SchoolFormData as o, type CreateSchoolFormData as p, type AdBookingType as q, type AdDailyPriceKey as r, type AdDailyPriceType as s, type AdFormState as t, type AdPlacement as u, type AdResource as v, type AdSettingsFormData as w, type AdSettingsType as x, type AuthPayloadType as y, type CreateAdFormData as z };
268
+ export { type ValidateVerificationTokenFormData as $, type AuthMutationResponse as A, type AuthPayloadType as B, type CreateLoginFormData as C, type CreateAdFormData as D, EnumAdPlatform as E, EnumAdApprovalStatus as F, EnumAdBookingSlotKind as G, EnumAdBookingState as H, EnumAdEntitlementSource as I, EnumAdPaymentStatus as J, EnumAdStatus as K, EnumAdStyle as L, EnumAdType as M, EnumVerificationType as N, type LoginFormData as O, type PartnerType as P, type MarketingMaterialRequestInputType as Q, type RefreshImpersonationMutationResponse as R, type StartImpersonationMutationResponse as S, type PosterInputType as T, type RefreshTokenPayloadType as U, type RegisterFormData as V, type RequestPasswordResetFormData as W, type ResetPasswordFormData as X, type SchoolCampaignType as Y, type SchoolRegisteredUserType as Z, type StartImpersonationPayloadType as _, type RefreshTokenMutationResponse as a, type AdType as b, EnumAdShowOn as c, type AppSettingsType as d, type SchoolType as e, type SchoolReturnType as f, type CreateRegisterFormData as g, type CreateRequestPasswordResetFormData as h, type CreateValidateVerificationTokenFormData as i, type CreateResetPasswordFormData as j, type PartnerFormData as k, type AdFormData as l, type CreateAdFormState as m, type CreatePartnerFormData as n, type AppSettingsFormData as o, type CreateAppSettingsFormData as p, type SchoolFormData as q, type CreateSchoolFormData as r, type AdBookingType as s, type AdDailyPriceKey as t, type AdDailyPriceType as u, type AdFormState as v, type AdPlacement as w, type AdResource as x, type AdSettingsFormData as y, type AdSettingsType as z };
@@ -124,6 +124,15 @@ type RefreshTokenPayloadType = {
124
124
  token: string;
125
125
  };
126
126
  type RefreshTokenMutationResponse = MutationResponse<RefreshTokenPayloadType>;
127
+ type StartImpersonationPayloadType = {
128
+ expiresAt: Date;
129
+ refreshToken: string;
130
+ sessionId: string;
131
+ token: string;
132
+ user: SafeUserType;
133
+ };
134
+ type StartImpersonationMutationResponse = MutationResponse<StartImpersonationPayloadType>;
135
+ type RefreshImpersonationMutationResponse = MutationResponse<RefreshTokenPayloadType>;
127
136
 
128
137
  declare enum EnumAdShowOn {
129
138
  EVENTS_PAGE = "Events_page",
@@ -256,4 +265,4 @@ type AdSettingsType = {
256
265
  rotationSeconds: number;
257
266
  };
258
267
 
259
- export { type AuthMutationResponse as A, EnumAdApprovalStatus as B, type CreateLoginFormData as C, EnumAdBookingSlotKind as D, EnumAdPlatform as E, EnumAdBookingState as F, EnumAdEntitlementSource as G, EnumAdPaymentStatus as H, EnumAdStatus as I, EnumAdStyle as J, EnumAdType as K, EnumVerificationType as L, type LoginFormData as M, type MarketingMaterialRequestInputType as N, type PosterInputType as O, type PartnerType as P, type RefreshTokenPayloadType as Q, type RefreshTokenMutationResponse as R, type SchoolType as S, type RegisterFormData as T, type RequestPasswordResetFormData as U, type ResetPasswordFormData as V, type SchoolCampaignType as W, type SchoolRegisteredUserType as X, type ValidateVerificationTokenFormData as Y, type AdType as a, EnumAdShowOn as b, type AppSettingsType as c, type SchoolReturnType as d, type CreateRegisterFormData as e, type CreateRequestPasswordResetFormData as f, type CreateValidateVerificationTokenFormData as g, type CreateResetPasswordFormData as h, type PartnerFormData as i, type AdFormData as j, type CreateAdFormState as k, type CreatePartnerFormData as l, type AppSettingsFormData as m, type CreateAppSettingsFormData as n, type SchoolFormData as o, type CreateSchoolFormData as p, type AdBookingType as q, type AdDailyPriceKey as r, type AdDailyPriceType as s, type AdFormState as t, type AdPlacement as u, type AdResource as v, type AdSettingsFormData as w, type AdSettingsType as x, type AuthPayloadType as y, type CreateAdFormData as z };
268
+ export { type ValidateVerificationTokenFormData as $, type AuthMutationResponse as A, type AuthPayloadType as B, type CreateLoginFormData as C, type CreateAdFormData as D, EnumAdPlatform as E, EnumAdApprovalStatus as F, EnumAdBookingSlotKind as G, EnumAdBookingState as H, EnumAdEntitlementSource as I, EnumAdPaymentStatus as J, EnumAdStatus as K, EnumAdStyle as L, EnumAdType as M, EnumVerificationType as N, type LoginFormData as O, type PartnerType as P, type MarketingMaterialRequestInputType as Q, type RefreshImpersonationMutationResponse as R, type StartImpersonationMutationResponse as S, type PosterInputType as T, type RefreshTokenPayloadType as U, type RegisterFormData as V, type RequestPasswordResetFormData as W, type ResetPasswordFormData as X, type SchoolCampaignType as Y, type SchoolRegisteredUserType as Z, type StartImpersonationPayloadType as _, type RefreshTokenMutationResponse as a, type AdType as b, EnumAdShowOn as c, type AppSettingsType as d, type SchoolType as e, type SchoolReturnType as f, type CreateRegisterFormData as g, type CreateRequestPasswordResetFormData as h, type CreateValidateVerificationTokenFormData as i, type CreateResetPasswordFormData as j, type PartnerFormData as k, type AdFormData as l, type CreateAdFormState as m, type CreatePartnerFormData as n, type AppSettingsFormData as o, type CreateAppSettingsFormData as p, type SchoolFormData as q, type CreateSchoolFormData as r, type AdBookingType as s, type AdDailyPriceKey as t, type AdDailyPriceType as u, type AdFormState as v, type AdPlacement as w, type AdResource as x, type AdSettingsFormData as y, type AdSettingsType as z };
@@ -399,9 +399,9 @@ function createErrorLink(adapters) {
399
399
  }
400
400
 
401
401
  // src/apollo/createRefreshAccessToken.ts
402
- var REFRESH_TOKEN_QUERY = `
403
- mutation refreshToken($input: RefreshTokenInputType!) {
404
- refreshToken(input: $input) {
402
+ var buildRefreshQuery = (mutationName, inputTypeName) => `
403
+ mutation ${mutationName}($input: ${inputTypeName}!) {
404
+ ${mutationName}(input: $input) {
405
405
  data {
406
406
  token
407
407
  refreshToken
@@ -410,6 +410,8 @@ var REFRESH_TOKEN_QUERY = `
410
410
  }
411
411
  }
412
412
  `;
413
+ var DEFAULT_REFRESH_MUTATION_NAME = "refreshToken";
414
+ var DEFAULT_REFRESH_INPUT_TYPE_NAME = "RefreshTokenInputType";
413
415
  var RETRY_DELAY_MS = 1500;
414
416
  var MAX_REFRESH_ATTEMPTS = 5;
415
417
  var wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
@@ -422,7 +424,9 @@ function createRefreshAccessToken(adapters) {
422
424
  onError: onError3,
423
425
  onDebug,
424
426
  onAuthRecoveryEvent,
425
- refreshCoordination
427
+ refreshCoordination,
428
+ refreshMutationName = DEFAULT_REFRESH_MUTATION_NAME,
429
+ refreshInputTypeName = DEFAULT_REFRESH_INPUT_TYPE_NAME
426
430
  } = adapters;
427
431
  let inFlightRefresh = null;
428
432
  async function clearRefreshCredentials(reason) {
@@ -476,7 +480,7 @@ function createRefreshAccessToken(adapters) {
476
480
  async function runRefreshAttempt(refreshToken, attempt) {
477
481
  const res = await fetch(`${apiUrl}/graphql`, {
478
482
  body: JSON.stringify({
479
- query: REFRESH_TOKEN_QUERY,
483
+ query: buildRefreshQuery(refreshMutationName, refreshInputTypeName),
480
484
  variables: { input: { refreshToken } }
481
485
  }),
482
486
  headers: { "Content-Type": "application/json" },
@@ -496,8 +500,9 @@ function createRefreshAccessToken(adapters) {
496
500
  }
497
501
  return { errorCode, errors, kind: "terminal_graphql" };
498
502
  }
499
- const newToken = json?.data?.refreshToken?.data?.token;
500
- const newRefreshToken = json?.data?.refreshToken?.data?.refreshToken;
503
+ const refreshResponse = json?.data?.[refreshMutationName];
504
+ const newToken = refreshResponse?.data?.token;
505
+ const newRefreshToken = refreshResponse?.data?.refreshToken;
501
506
  if (newToken && newRefreshToken) {
502
507
  await storage.setTokens(newToken, newRefreshToken);
503
508
  onTokensUpdated?.(newToken);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/apollo/index.ts","../../src/apollo/createApolloManager.ts","../../src/apollo/createAuthLink.ts","../../src/apollo/createErrorLink.ts","../../src/apollo/readErrorResponseFields.ts","../../src/apollo/unauthHelpers.ts","../../src/apollo/createRefreshAccessToken.ts","../../src/apollo/createApolloErrorLoggingLink.ts","../../src/apollo/toStructuredError.ts","../../src/apollo/createNetworkRecoveryLink.ts","../../src/utils/isTransientNetworkError.ts","../../src/apollo/createNetworkLog.ts","../../src/apollo/createWsManager.ts","../../src/apollo/recoveryConstants.ts","../../src/apollo/createRecoveryCore.ts"],"sourcesContent":["export { createApolloManager } from \"./createApolloManager\";\nexport type {\n ApolloManager,\n CreateApolloManagerAdapters,\n} from \"./createApolloManager\";\nexport type {\n AuthRecoveryEvent,\n OnAuthRecoveryEvent,\n} from \"./authRecoveryEvents\";\nexport { createAuthLink } from \"./createAuthLink\";\nexport { createErrorLink } from \"./createErrorLink\";\nexport { createRefreshAccessToken } from \"./createRefreshAccessToken\";\nexport { createApolloErrorLoggingLink } from \"./createApolloErrorLoggingLink\";\nexport type {\n ApolloErrorLogLevel,\n CreateApolloErrorLoggingLinkAdapters,\n} from \"./createApolloErrorLoggingLink\";\nexport { createNetworkRecoveryLink } from \"./createNetworkRecoveryLink\";\nexport type { CreateNetworkRecoveryLinkAdapters } from \"./createNetworkRecoveryLink\";\nexport { createNetworkLog } from \"./createNetworkLog\";\nexport type {\n CreateNetworkLogAdapters,\n NetworkLogLevel,\n} from \"./createNetworkLog\";\nexport { createWsManager } from \"./createWsManager\";\nexport type { CreateWsManagerAdapters, WsManager } from \"./createWsManager\";\nexport { createRecoveryCore } from \"./createRecoveryCore\";\nexport type {\n CreateRecoveryCoreAdapters,\n RecoveryCore,\n} from \"./createRecoveryCore\";\nexport { MIN_BACKGROUND_MS, REFETCH_DELAY_MS } from \"./recoveryConstants\";\nexport { readErrorResponseFields } from \"./readErrorResponseFields\";\nexport { safeJsonStringify, toStructuredError } from \"./toStructuredError\";\nexport type {\n ApolloTokenStorage,\n CreateAuthLinkAdapters,\n CreateErrorLinkAdapters,\n CreateRefreshAccessTokenAdapters,\n GraphQLErrorLike,\n RefreshAccessTokenResult,\n RefreshCoordination,\n RefreshErrorCode,\n} from \"./types\";\nexport {\n decideRefreshNextStep,\n getRefreshErrorCode,\n getStatusCode,\n isExpectedRefreshAuthFailure,\n isRefreshAuthFailureMessage,\n isUnauthenticatedError,\n isUnauthenticatedGraphQLError,\n NON_RETRYABLE_REFRESH_AUTH_CODES,\n refreshGraphqlErrorsWarrantRetry,\n} from \"./unauthHelpers\";\nexport type { RefreshDecision } from \"./unauthHelpers\";\n","import type { OnAuthRecoveryEvent } from \"./authRecoveryEvents\";\n\nexport type ApolloManager = {\n resetClient: () => void;\n setResetClient: (fn: (() => void) | null) => void;\n};\n\nexport type CreateApolloManagerAdapters = {\n /** Optional recovery telemetry when resetClient runs (default: no-op). */\n onAuthRecoveryEvent?: OnAuthRecoveryEvent;\n};\n\n/**\n * Lets logout recreate the Apollo client without importing React hooks.\n * Apps register a reset handler (mobile: useApolloRecovery).\n */\nexport function createApolloManager(\n adapters: CreateApolloManagerAdapters = {},\n): ApolloManager {\n const { onAuthRecoveryEvent } = adapters;\n let resetClientFn: (() => void) | null = null;\n let pendingReset = false;\n\n return {\n resetClient(): void {\n if (!resetClientFn) {\n pendingReset = true;\n return;\n }\n pendingReset = false;\n onAuthRecoveryEvent?.({ type: \"reset_client\" });\n resetClientFn();\n },\n\n setResetClient(fn: (() => void) | null): void {\n resetClientFn = fn;\n if (fn && pendingReset) {\n pendingReset = false;\n onAuthRecoveryEvent?.({ type: \"reset_client\" });\n fn();\n }\n },\n };\n}\n","import { ApolloLink, Observable } from \"@apollo/client\";\n\nimport type { CreateAuthLinkAdapters } from \"./types\";\n\nfunction maskedTokenInfo(token: string) {\n const len = token.length;\n const start = token.slice(0, 4);\n const end = token.slice(-4);\n return { end, len, start };\n}\n\n/**\n * Auth link that attaches Bearer token after optional awaitReady.\n * Does not overwrite an Authorization header already set on the operation.\n */\nexport function createAuthLink(adapters: CreateAuthLinkAdapters): ApolloLink {\n const { awaitReady, getAccessToken, onError, onDebug } = adapters;\n\n return new ApolloLink((operation, forward) => {\n return new Observable((observer) => {\n let innerSub: { unsubscribe: () => void } | null = null;\n let closed = false;\n\n const teardown = () => {\n closed = true;\n innerSub?.unsubscribe();\n innerSub = null;\n };\n\n void (async () => {\n if (awaitReady) {\n try {\n await awaitReady();\n } catch (err) {\n onError?.(err, { action: \"awaitReady\" });\n }\n }\n\n if (closed) return;\n\n const token = await getAccessToken();\n\n if (token) {\n operation.setContext(({ headers = {} }) => {\n const hasAuthHeader =\n Object.hasOwn(headers, \"Authorization\") ||\n Object.hasOwn(headers, \"authorization\");\n\n if (hasAuthHeader) {\n onDebug?.(\"Preserving existing Authorization header\", {\n operationName: operation.operationName,\n });\n return { headers };\n }\n\n return {\n headers: {\n ...headers,\n Authorization: `Bearer ${token}`,\n },\n };\n });\n onDebug?.(\"Attached Authorization header\", {\n operationName: operation.operationName,\n token: maskedTokenInfo(token),\n });\n } else {\n onDebug?.(\"Proceeding without Authorization header\", {\n operationName: operation.operationName,\n });\n }\n\n if (closed) return;\n\n try {\n innerSub = forward(operation).subscribe({\n complete: () => {\n if (!closed) observer.complete();\n },\n error: (error) => {\n if (!closed) observer.error(error);\n },\n next: (result) => {\n if (!closed) observer.next(result);\n },\n });\n } catch (err) {\n if (closed) return;\n onError?.(err, { action: \"forward\" });\n observer.error(err);\n }\n })();\n\n return teardown;\n });\n });\n}\n","import { Observable } from \"@apollo/client\";\nimport type { FetchResult, NextLink, Operation } from \"@apollo/client/core\";\nimport { onError } from \"@apollo/client/link/error\";\n\nimport { readErrorResponseFields } from \"./readErrorResponseFields\";\nimport type {\n CreateErrorLinkAdapters,\n GraphQLErrorLike,\n RefreshAccessTokenResult,\n} from \"./types\";\nimport {\n decideRefreshNextStep,\n getStatusCode,\n isUnauthenticatedError,\n} from \"./unauthHelpers\";\n\ntype AuthErrorContext = {\n graphQLErrors: ReadonlyArray<GraphQLErrorLike> | undefined;\n networkError: unknown;\n statusCode: number | null;\n};\n\ntype AuthRecoveryObserver = {\n complete: () => void;\n error: (error: Error) => void;\n isClosed: () => boolean;\n next: (value: FetchResult) => void;\n};\n\n/**\n * Emits a transient error when the token refresh failed due to a temporary\n * problem (e.g. offline). Marking it with a `networkError` lets the network\n * recovery link retry the query automatically once connectivity returns.\n */\nfunction emitRetryableRefreshError(observer: AuthRecoveryObserver): void {\n if (observer.isClosed()) return;\n const error = new Error(\n \"Couldn't refresh your session. Please check your connection and try again.\",\n ) as Error & { networkError?: Error };\n error.networkError = new Error(\"Network request failed\");\n observer.error(error);\n}\n\n/**\n * Emits a terminal session error when there is no session to recover (no\n * refresh token). Completing silently would leave Apollo stuck in `loading`\n * with no data and no error, so surface an error instead.\n */\nfunction emitSessionExpiredError(observer: AuthRecoveryObserver): void {\n if (!observer.isClosed()) {\n observer.error(new Error(\"Session expired. Please sign in again.\"));\n }\n}\n\nfunction retryOperationWithToken(\n operation: Operation,\n forward: NextLink,\n token: string,\n observer: AuthRecoveryObserver,\n setInnerSubscriber: (subscriber: { unsubscribe: () => void }) => void,\n): void {\n operation.setContext(({ headers = {} }) => ({\n __authRetryAttempted: true,\n headers: {\n ...headers,\n Authorization: `Bearer ${token}`,\n },\n }));\n\n if (observer.isClosed()) return;\n\n setInnerSubscriber(\n forward(operation).subscribe({\n complete: () => {\n if (!observer.isClosed()) observer.complete();\n },\n error: (error) => {\n if (!observer.isClosed()) observer.error(error);\n },\n next: (value) => {\n if (!observer.isClosed()) observer.next(value);\n },\n }),\n );\n}\n\n/**\n * Error link with mobile auth recovery: refresh once, retry op, or deferred logout.\n */\nexport function createErrorLink(adapters: CreateErrorLinkAdapters) {\n const {\n refreshAccessToken,\n clearAccessToken,\n logout,\n onError: reportError,\n onDebug,\n onAuthRecoveryEvent,\n } = adapters;\n\n function scheduleSessionLogout(reason: string): void {\n onAuthRecoveryEvent?.({ reason, type: \"logout_scheduled\" });\n // End the link chain before logout clears the Apollo store (avoids invariant 42).\n setTimeout(() => {\n void logout();\n }, 0);\n }\n\n async function handleTerminalRefreshFailure(\n observer: AuthRecoveryObserver,\n ): Promise<void> {\n clearAccessToken?.(\"refresh_failed\");\n if (!observer.isClosed()) observer.complete();\n scheduleSessionLogout(\"refresh_failed\");\n }\n\n async function handleRefreshResult(\n result: RefreshAccessTokenResult,\n operation: Operation,\n forward: NextLink,\n observer: AuthRecoveryObserver,\n setInnerSubscriber: (subscriber: { unsubscribe: () => void }) => void,\n ): Promise<void> {\n const decision = decideRefreshNextStep(result);\n if (decision.kind === \"logout\") {\n await handleTerminalRefreshFailure(observer);\n return;\n }\n if (decision.kind === \"complete\") {\n if (result.retryable) {\n emitRetryableRefreshError(observer);\n } else {\n emitSessionExpiredError(observer);\n }\n return;\n }\n retryOperationWithToken(\n operation,\n forward,\n decision.token,\n observer,\n setInnerSubscriber,\n );\n }\n\n async function recoverFromAuthError(\n operation: Operation,\n forward: NextLink,\n authContext: AuthErrorContext,\n observer: AuthRecoveryObserver,\n setInnerSubscriber: (subscriber: { unsubscribe: () => void }) => void,\n ): Promise<void> {\n const ctx = operation.getContext() as Record<string, unknown>;\n if (ctx.__authRetryAttempted) {\n onDebug?.(\"Auth retry suppressed (already retried)\", {\n operationName: operation.operationName,\n statusCode: authContext.statusCode,\n });\n if (!observer.isClosed()) {\n observer.error(\n new Error(\n `Auth failed after retry (status ${authContext.statusCode ?? \"unknown\"})`,\n ),\n );\n }\n return;\n }\n\n onDebug?.(\"Auth error detected; attempting refresh\", {\n operationName: operation.operationName,\n statusCode: authContext.statusCode,\n });\n\n const result = await refreshAccessToken();\n if (observer.isClosed()) return;\n\n await handleRefreshResult(\n result,\n operation,\n forward,\n observer,\n setInnerSubscriber,\n );\n }\n\n async function handleAuthRecoveryError(\n err: unknown,\n observer: AuthRecoveryObserver,\n ): Promise<void> {\n reportError?.(err, { action: \"tokenRefresh\" });\n console.error(\"Token refresh failed\", err);\n clearAccessToken?.(\"refresh_exception\");\n if (!observer.isClosed()) observer.complete();\n scheduleSessionLogout(\"refresh_exception\");\n }\n\n return onError((errorResponse) => {\n const { operation, forward } = errorResponse;\n const { graphQLErrors, networkError } =\n readErrorResponseFields(errorResponse);\n\n if (\n !isUnauthenticatedError({\n graphQLErrors,\n networkError,\n })\n ) {\n return;\n }\n\n const statusCode = networkError ? getStatusCode(networkError) : null;\n const authContext: AuthErrorContext = {\n graphQLErrors,\n networkError,\n statusCode,\n };\n\n return new Observable((observer) => {\n let innerSubscriber: { unsubscribe: () => void } | null = null;\n let closed = false;\n\n const recoveryObserver: AuthRecoveryObserver = {\n complete: () => {\n if (!closed) observer.complete();\n },\n error: (error) => {\n if (!closed) observer.error(error);\n },\n isClosed: () => closed,\n next: (value) => {\n if (!closed) observer.next(value);\n },\n };\n\n const teardown = () => {\n closed = true;\n innerSubscriber?.unsubscribe();\n innerSubscriber = null;\n };\n\n void recoverFromAuthError(\n operation,\n forward,\n authContext,\n recoveryObserver,\n (subscriber) => {\n innerSubscriber = subscriber;\n },\n ).catch((err) => handleAuthRecoveryError(err, recoveryObserver));\n\n return teardown;\n });\n });\n}\n","import type { GraphQLErrorLike } from \"./types\";\n\n/**\n * Reads AC3 ErrorResponse fields via property access instead of destructuring\n * (`graphQLErrors`, `networkError`, `response`) to avoid Apollo Client warnings.\n */\nexport function readErrorResponseFields(errorResponse: unknown): {\n graphQLErrors: GraphQLErrorLike[] | undefined;\n networkError: unknown;\n response: unknown;\n} {\n const record = errorResponse as Record<string, unknown>;\n return {\n graphQLErrors: record[\"graphQLErrors\"] as GraphQLErrorLike[] | undefined,\n networkError: record[\"networkError\"],\n response: record[\"response\"],\n };\n}\n","import type { GraphQLErrorLike, RefreshErrorCode } from \"./types\";\n\nexport function getStatusCode(networkError: unknown): number | null {\n const anyErr = networkError as Record<string, unknown> | null;\n const status =\n (anyErr?.[\"statusCode\"] as number | undefined) ??\n (anyErr?.[\"status\"] as number | undefined) ??\n (anyErr?.[\"response\"] as { status?: number } | undefined)?.status;\n return typeof status === \"number\" ? status : null;\n}\n\nexport function isUnauthenticatedGraphQLError(\n graphQLErrors?: ReadonlyArray<GraphQLErrorLike> | null,\n): boolean {\n return Boolean(\n graphQLErrors?.some(\n (err) =>\n err.extensions?.code === \"UNAUTHENTICATED\" ||\n err.message?.includes(\"You must be logged in.\"),\n ),\n );\n}\n\n/**\n * True when GraphQL unauth signals and/or HTTP 401/403 indicate auth recovery is needed.\n */\nexport function isUnauthenticatedError(input: {\n graphQLErrors?: ReadonlyArray<GraphQLErrorLike> | null;\n networkError?: unknown;\n}): boolean {\n const statusCode = input.networkError\n ? getStatusCode(input.networkError)\n : null;\n return (\n isUnauthenticatedGraphQLError(input.graphQLErrors) ||\n statusCode === 401 ||\n statusCode === 403\n );\n}\n\nexport const NON_RETRYABLE_REFRESH_AUTH_CODES: ReadonlySet<string> =\n new Set<RefreshErrorCode>([\"FORBIDDEN\", \"TOKEN_EXPIRED\", \"UNAUTHENTICATED\"]);\n\nconst REFRESH_AUTH_FAILURE_MESSAGE_PATTERNS: ReadonlyArray<RegExp> = [\n /invalid.*refresh token/i,\n /jwt expired/i,\n /jwt malformed/i,\n /invalid signature/i,\n];\n\nexport function isRefreshAuthFailureMessage(\n message: string | undefined,\n): boolean {\n if (!message) return false;\n return REFRESH_AUTH_FAILURE_MESSAGE_PATTERNS.some((pattern) =>\n pattern.test(message),\n );\n}\n\nexport function getRefreshErrorCode(\n errors: ReadonlyArray<GraphQLErrorLike>,\n): string | undefined {\n for (const err of errors) {\n const code = err.extensions?.code;\n if (typeof code === \"string\") return code;\n }\n return undefined;\n}\n\nexport function isExpectedRefreshAuthFailure(\n errors: ReadonlyArray<GraphQLErrorLike>,\n errorCode: string | undefined,\n): boolean {\n if (errorCode != null && NON_RETRYABLE_REFRESH_AUTH_CODES.has(errorCode)) {\n return true;\n }\n return errors.some((err) => isRefreshAuthFailureMessage(err.message));\n}\n\n/**\n * Whether GraphQL `errors` from the refresh mutation warrant another HTTP attempt.\n */\nexport function refreshGraphqlErrorsWarrantRetry(\n errors: ReadonlyArray<GraphQLErrorLike>,\n): boolean {\n if (\n errors.some(\n (e) =>\n e.extensions != null &&\n (e.extensions as Record<string, unknown>).retryable === true,\n )\n ) {\n return true;\n }\n\n for (const err of errors) {\n if (isRefreshAuthFailureMessage(err.message)) {\n return false;\n }\n const code = err.extensions?.code;\n if (\n typeof code === \"string\" &&\n NON_RETRYABLE_REFRESH_AUTH_CODES.has(code)\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport type RefreshDecision =\n | { kind: \"complete\" }\n | { kind: \"logout\" }\n | { kind: \"retry\"; token: string };\n\n/** Maps refresh outcome to error-link next step (mobile behavior). */\nexport function decideRefreshNextStep(result: {\n hadRefreshToken?: boolean;\n token: string | null;\n retryable?: boolean;\n}): RefreshDecision {\n if (!result.token && !result.retryable) {\n // No credentials left (e.g. intentional logout cleared storage) — do not\n // schedule another session logout; matches createRecoveryCore refreshSession.\n if (result.hadRefreshToken === false) return { kind: \"complete\" };\n return { kind: \"logout\" };\n }\n if (!result.token) return { kind: \"complete\" };\n return { kind: \"retry\", token: result.token };\n}\n","import type { RefreshTokenMutationResponse } from \"../types/auth\";\n\nimport type {\n CreateRefreshAccessTokenAdapters,\n GraphQLErrorLike,\n RefreshAccessTokenResult,\n} from \"./types\";\nimport {\n getRefreshErrorCode,\n isExpectedRefreshAuthFailure,\n refreshGraphqlErrorsWarrantRetry,\n} from \"./unauthHelpers\";\n\n/** Plain query string avoids host `graphql` DocumentNode type conflicts. */\nconst REFRESH_TOKEN_QUERY = `\n mutation refreshToken($input: RefreshTokenInputType!) {\n refreshToken(input: $input) {\n data {\n token\n refreshToken\n }\n message\n }\n }\n`;\n\nconst RETRY_DELAY_MS = 1500;\nconst MAX_REFRESH_ATTEMPTS = 5;\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\ntype RefreshAttemptResult =\n | { kind: \"success\"; token: string }\n | { kind: \"retry\" }\n | {\n errorCode?: string;\n errors: GraphQLErrorLike[];\n kind: \"terminal_graphql\";\n }\n | { kind: \"terminal_invalid\" };\n\n/**\n * Creates a coalesced refreshAccessToken() using mobile multi-attempt behavior.\n * Storage and token/WS side effects are injected via adapters.\n *\n * Optional `refreshCoordination` serializes refresh across realms (admin tabs).\n * Before clearing credentials on terminal failure, skips wipe if storage already\n * holds a newer access token (another actor recovered).\n */\nexport function createRefreshAccessToken(\n adapters: CreateRefreshAccessTokenAdapters,\n): () => Promise<RefreshAccessTokenResult> {\n const {\n apiUrl,\n storage,\n onTokensUpdated,\n onTokensCleared,\n onError,\n onDebug,\n onAuthRecoveryEvent,\n refreshCoordination,\n } = adapters;\n\n let inFlightRefresh: Promise<RefreshAccessTokenResult> | null = null;\n\n async function clearRefreshCredentials(reason: string): Promise<void> {\n await storage.clearTokens();\n onTokensCleared?.(reason);\n }\n\n /**\n * Avoid wiping a winning tab's rotated tokens when this attempt lost the race.\n * If access token changed since we started, return it as success for retry.\n */\n async function clearOrAdoptNewerAccessToken(\n reason: string,\n accessTokenAtStart: string | null,\n errorCode?: string,\n ): Promise<RefreshAccessTokenResult> {\n const currentAccess = await storage.getAccessToken();\n if (currentAccess != null && currentAccess !== accessTokenAtStart) {\n onAuthRecoveryEvent?.({ reason, type: \"stale_clear_skipped\" });\n return { hadRefreshToken: true, token: currentAccess };\n }\n\n await clearRefreshCredentials(reason);\n onAuthRecoveryEvent?.({\n errorCode,\n reason,\n type: \"refresh_failed\",\n });\n return {\n hadRefreshToken: true,\n token: null,\n };\n }\n\n async function abortAfterRefreshGraphqlErrors(\n errors: GraphQLErrorLike[],\n errorCode: string | undefined,\n accessTokenAtStart: string | null,\n ): Promise<RefreshAccessTokenResult> {\n const sanitizedErrors = errors.map((error) => ({\n message: error?.message,\n }));\n\n if (isExpectedRefreshAuthFailure(errors, errorCode)) {\n console.warn(\n \"[refreshAccessToken] Refresh rejected:\",\n errorCode ?? sanitizedErrors.map((e) => e.message).join(\", \"),\n );\n } else {\n console.error(\"[refreshAccessToken] GraphQL errors:\", sanitizedErrors);\n onError?.(new Error(\"GraphQL errors during refresh\"), {\n action: \"refresh_graphql_error\",\n errorCode,\n errors: sanitizedErrors,\n });\n }\n\n const outcome = await clearOrAdoptNewerAccessToken(\n \"refresh_graphql_error\",\n accessTokenAtStart,\n errorCode,\n );\n return {\n ...outcome,\n errorCode,\n };\n }\n\n async function runRefreshAttempt(\n refreshToken: string,\n attempt: number,\n ): Promise<RefreshAttemptResult> {\n const res = await fetch(`${apiUrl}/graphql`, {\n body: JSON.stringify({\n query: REFRESH_TOKEN_QUERY,\n variables: { input: { refreshToken } },\n }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n });\n\n const json = (await res.json()) as {\n data?: {\n refreshToken?: RefreshTokenMutationResponse;\n };\n errors?: GraphQLErrorLike[];\n };\n\n if (json.errors?.length) {\n const errors = json.errors;\n const errorCode = getRefreshErrorCode(errors);\n const warrantRetry =\n refreshGraphqlErrorsWarrantRetry(errors) &&\n attempt < MAX_REFRESH_ATTEMPTS;\n\n if (warrantRetry) {\n onDebug?.(\n `GraphQL errors (attempt ${attempt}/${MAX_REFRESH_ATTEMPTS}), retrying`,\n { errorCode },\n );\n return { kind: \"retry\" };\n }\n return { errorCode, errors, kind: \"terminal_graphql\" };\n }\n\n const newToken = json?.data?.refreshToken?.data?.token;\n const newRefreshToken = json?.data?.refreshToken?.data?.refreshToken;\n\n if (newToken && newRefreshToken) {\n await storage.setTokens(newToken, newRefreshToken);\n onTokensUpdated?.(newToken);\n return { kind: \"success\", token: newToken };\n }\n\n if (attempt < MAX_REFRESH_ATTEMPTS) {\n onDebug?.(\n `Invalid refresh response (attempt ${attempt}/${MAX_REFRESH_ATTEMPTS}), retrying`,\n );\n return { kind: \"retry\" };\n }\n\n return { kind: \"terminal_invalid\" };\n }\n\n async function refreshAccessTokenInternal(): Promise<RefreshAccessTokenResult> {\n const accessTokenAtStart = await storage.getAccessToken();\n\n for (let attempt = 1; attempt <= MAX_REFRESH_ATTEMPTS; attempt += 1) {\n const refreshToken = await storage.getRefreshToken();\n if (!refreshToken) return { hadRefreshToken: false, token: null };\n\n try {\n const result = await runRefreshAttempt(refreshToken, attempt);\n if (result.kind === \"success\") {\n onAuthRecoveryEvent?.({ type: \"refresh_succeeded\" });\n return { hadRefreshToken: true, token: result.token };\n }\n if (result.kind === \"retry\") {\n await wait(RETRY_DELAY_MS);\n continue;\n }\n if (result.kind === \"terminal_graphql\") {\n return abortAfterRefreshGraphqlErrors(\n result.errors,\n result.errorCode,\n accessTokenAtStart,\n );\n }\n return clearOrAdoptNewerAccessToken(\n \"refresh_invalid_response\",\n accessTokenAtStart,\n );\n } catch (err) {\n if (attempt < MAX_REFRESH_ATTEMPTS) {\n await wait(RETRY_DELAY_MS);\n continue;\n }\n\n onError?.(err, {\n action: \"refreshAccessToken\",\n attempt,\n maxAttempts: MAX_REFRESH_ATTEMPTS,\n });\n console.error(\"Token refresh failed:\", err);\n onAuthRecoveryEvent?.({\n reason: \"refresh_network_exhausted\",\n retryable: true,\n type: \"refresh_failed\",\n });\n return { hadRefreshToken: true, retryable: true, token: null };\n }\n }\n\n throw new Error(\"refreshAccessToken: unreachable\");\n }\n\n return function refreshAccessToken(): Promise<RefreshAccessTokenResult> {\n // Same-realm coalesce: return existing work without taking the cross-tab lock again.\n if (inFlightRefresh !== null) {\n return inFlightRefresh;\n }\n\n const startCoalesced = (): Promise<RefreshAccessTokenResult> => {\n inFlightRefresh ??= refreshAccessTokenInternal().finally(() => {\n inFlightRefresh = null;\n });\n return inFlightRefresh;\n };\n\n if (refreshCoordination) {\n // Await inside the lock so other tabs wait until refresh settles.\n return refreshCoordination.withLock(async () => {\n if (inFlightRefresh !== null) {\n return inFlightRefresh;\n }\n return startCoalesced();\n });\n }\n\n return startCoalesced();\n };\n}\n","import { onError, type ErrorResponse } from \"@apollo/client/link/error\";\n\nimport { readErrorResponseFields } from \"./readErrorResponseFields\";\nimport { toStructuredError } from \"./toStructuredError\";\nimport type { GraphQLErrorLike } from \"./types\";\n\nconst SCOPE = \"apollo\";\nconst REDACTED = \"[REDACTED]\";\nconst MAX_DEPTH = 4;\nconst MAX_ARRAY_ITEMS = 20;\n\nconst SENSITIVE_KEY_RE =\n /(pass(word)?|token|secret|auth(orization)?|cookie|session|otp|pin|email|phone|ssn|credit|card|cvv|iban|refresh)/i;\n\nconst GRAPHQL_EXTENSION_ALLOWLIST = new Set([\"category\", \"code\", \"httpStatus\"]);\n\nexport type ApolloErrorLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type CreateApolloErrorLoggingLinkAdapters = {\n /** When true, variables/extensions are redacted but still included. */\n isDev: boolean | (() => boolean);\n onLog: (\n level: ApolloErrorLogLevel,\n scope: string,\n message: string,\n details?: Record<string, unknown>,\n ) => void;\n};\n\nfunction resolveIsDev(isDev: boolean | (() => boolean)): boolean {\n return typeof isDev === \"function\" ? isDev() : isDev;\n}\n\nfunction isSensitiveKey(key: string) {\n return SENSITIVE_KEY_RE.test(key);\n}\n\nfunction isSensitiveExtensionKey(key: string) {\n return (\n isSensitiveKey(key) ||\n /stack|trace|debug|exception|internals|snippet|query|variables|body/i.test(\n key,\n )\n );\n}\n\nfunction redactValue(value: unknown, depth = 0): unknown {\n if (value == null) return value;\n if (depth >= MAX_DEPTH) return \"[Truncated]\";\n\n if (Array.isArray(value)) {\n return value\n .slice(0, MAX_ARRAY_ITEMS)\n .map((item) => redactValue(item, depth + 1));\n }\n\n if (typeof value === \"object\") {\n const input = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(input)) {\n out[key] = isSensitiveKey(key)\n ? REDACTED\n : redactValue(nested, depth + 1);\n }\n return out;\n }\n\n return value;\n}\n\nfunction pickAllowlistedExtensions(\n ext: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n for (const key of GRAPHQL_EXTENSION_ALLOWLIST) {\n if (key in ext && ext[key] !== undefined) {\n out[key] = ext[key];\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction redactGraphQLExtensionsForDev(\n ext: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(ext)) {\n if (GRAPHQL_EXTENSION_ALLOWLIST.has(key)) {\n out[key] =\n value != null && typeof value === \"object\" ? redactValue(value) : value;\n continue;\n }\n if (isSensitiveExtensionKey(key)) {\n out[key] = REDACTED;\n continue;\n }\n out[key] = redactValue(value);\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction safeExtensionsForLogs(\n extensions: GraphQLErrorLike[\"extensions\"],\n isDev: boolean,\n): unknown {\n if (extensions == null) return undefined;\n if (typeof extensions !== \"object\" || Array.isArray(extensions)) {\n return \"[NonObjectExtensions]\";\n }\n const ext = extensions as Record<string, unknown>;\n if (!isDev) {\n return pickAllowlistedExtensions(ext);\n }\n return redactGraphQLExtensionsForDev(ext);\n}\n\nfunction serializeGraphQLError(err: GraphQLErrorLike, isDev: boolean) {\n return {\n extensions: safeExtensionsForLogs(err.extensions, isDev),\n locations: err.locations,\n message: err.message,\n path: err.path,\n };\n}\n\nfunction safeVariablesForLogs(\n variables: Record<string, unknown> | undefined,\n isDev: boolean,\n) {\n if (!variables) return undefined;\n if (!isDev) {\n return {\n keys: Object.keys(variables),\n present: true,\n };\n }\n return redactValue(variables);\n}\n\nfunction safeResponseForLogs(response: unknown, isDev: boolean) {\n if (!response) return null;\n if (!isDev) return { present: true };\n return redactValue(toStructuredError(response));\n}\n\n/**\n * Logging-only Apollo `onError` link with secret redaction.\n * Does not retry or forward — place before auth recovery links.\n */\nexport function createApolloErrorLoggingLink(\n adapters: CreateApolloErrorLoggingLinkAdapters,\n) {\n const { isDev, onLog } = adapters;\n\n return onError((errorHandler: ErrorResponse) => {\n const { operation } = errorHandler;\n const { graphQLErrors, networkError, response } =\n readErrorResponseFields(errorHandler);\n const dev = resolveIsDev(isDev);\n\n if (graphQLErrors?.length) {\n onLog(\"error\", SCOPE, \"GraphQL error(s)\", {\n graphQLErrors: graphQLErrors.map((err) =>\n serializeGraphQLError(err, dev),\n ),\n operationName: operation.operationName,\n variables: safeVariablesForLogs(operation.variables, dev),\n });\n }\n\n if (networkError) {\n onLog(\"error\", SCOPE, \"Network error\", {\n networkError: toStructuredError(networkError),\n operationName: operation.operationName,\n response: safeResponseForLogs(response, dev),\n variables: safeVariablesForLogs(operation.variables, dev),\n });\n }\n\n return undefined;\n });\n}\n","type Json = null | boolean | number | string | Json[] | { [key: string]: Json };\n\n/**\n * JSON.stringify that tolerates circular refs, Errors, bigint, and functions.\n * Always returns a string — top-level `undefined` / `symbol` become `\"null\"`\n * (native `JSON.stringify` would return `undefined`).\n */\nexport function safeJsonStringify(value: unknown): string {\n const seen = new WeakSet<object>();\n const json = JSON.stringify(\n value,\n (_key, v) => {\n if (typeof v === \"bigint\") return v.toString();\n if (typeof v === \"function\") return `[Function ${v.name || \"anonymous\"}]`;\n if (v && typeof v === \"object\") {\n if (seen.has(v as object)) return \"[Circular]\";\n seen.add(v as object);\n }\n if (v instanceof Error) {\n return {\n message: v.message,\n name: v.name,\n stack: v.stack,\n ...(v as unknown as Record<string, unknown>),\n } as Record<string, unknown>;\n }\n return v as unknown;\n },\n 2,\n );\n return json ?? \"null\";\n}\n\n/** Coerce arbitrary values into `Json`, dropping `undefined` (omit the field). */\nfunction coerceJson(value: unknown): Json | undefined {\n if (value === undefined) return undefined;\n if (value === null) return null;\n if (\n typeof value === \"boolean\" ||\n typeof value === \"number\" ||\n typeof value === \"string\"\n ) {\n return value;\n }\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"symbol\") return value.toString();\n if (typeof value === \"function\") {\n return `[Function ${value.name || \"anonymous\"}]`;\n }\n // Objects/arrays: keep structure; nested non-JSON values are handled when\n // the result is passed through `safeJsonStringify` for logging.\n return value as Json;\n}\n\nfunction pickKnownFields(\n src: Record<string, unknown>,\n dst: Record<string, Json>,\n) {\n const keys = [\n \"message\",\n \"code\",\n \"reason\",\n \"type\",\n \"name\",\n \"stack\",\n \"status\",\n \"statusCode\",\n \"readyState\",\n \"url\",\n \"wasClean\",\n ] as const;\n for (const k of keys) {\n if (k in src) {\n const coerced = coerceJson(src[k]);\n if (coerced !== undefined) dst[k] = coerced;\n }\n }\n}\n\nfunction objectToJson(anyErr: object): Json {\n const out: Record<string, Json> = {};\n pickKnownFields(anyErr as Record<string, unknown>, out);\n for (const [k, v] of Object.entries(anyErr)) {\n if (k in out) continue;\n const coerced = coerceJson(v);\n if (coerced !== undefined) out[k] = coerced;\n }\n return out;\n}\n\n/** Best-effort JSON-safe shape for logging network / GraphQL / WS errors. */\nexport function toStructuredError(err: unknown): Json {\n if (err == null) return null;\n if (typeof err === \"string\") return { message: err };\n if (typeof err === \"number\" || typeof err === \"boolean\")\n return { value: err };\n if (typeof err === \"symbol\") return { value: err.toString() };\n if (err instanceof Error) {\n const details = objectToJson(err);\n if (details && typeof details === \"object\" && !Array.isArray(details)) {\n return {\n ...details,\n message: err.message,\n name: err.name,\n stack: err.stack ?? null,\n };\n }\n return {\n message: err.message,\n name: err.name,\n stack: err.stack ?? null,\n };\n }\n if (typeof err === \"object\") return objectToJson(err);\n return { value: safeJsonStringify({ value: err }) };\n}\n","import { ApolloLink, Observable } from \"@apollo/client\";\nimport type { FetchResult, NextLink, Operation } from \"@apollo/client/core\";\nimport { getMainDefinition } from \"@apollo/client/utilities\";\n\nimport { isTransientNetworkError } from \"../utils/isTransientNetworkError\";\n\n/** Highest attempt index before giving up (0 = initial request; 1..N = retries). */\nconst MAX_RETRIES = 4;\n\n/** Backoff delays (ms) before each retry; index matches the failed attempt. */\nconst BACKOFF_MS = [500, 1500, 3000, 4000] as const;\n\nexport type CreateNetworkRecoveryLinkAdapters = {\n forceRefreshIsOnline: () => Promise<boolean> | boolean;\n subscribeIsOnline: (listener: (online: boolean) => void) => () => void;\n};\n\ntype QueryRecoveryObserver = {\n complete: () => void;\n error: (err: unknown) => void;\n next: (value: FetchResult) => void;\n};\n\ntype QueryRecoveryState = {\n adapters: CreateNetworkRecoveryLinkAdapters;\n forward: NextLink;\n innerSub: { unsubscribe: () => void } | null;\n observer: QueryRecoveryObserver;\n operation: Operation;\n unsubscribed: boolean;\n};\n\nfunction emitNext(state: QueryRecoveryState, value: FetchResult): void {\n if (state.unsubscribed) return;\n state.observer.next(value);\n}\n\nfunction emitComplete(state: QueryRecoveryState): void {\n if (state.unsubscribed) return;\n state.observer.complete();\n}\n\nfunction emitError(state: QueryRecoveryState, err: unknown): void {\n if (state.unsubscribed) return;\n state.observer.error(err);\n}\n\nfunction isQueryOperation(op: Operation): boolean {\n const def = getMainDefinition(op.query);\n return (\n def.kind === \"OperationDefinition\" &&\n (def as { operation?: string }).operation === \"query\"\n );\n}\n\nfunction wait(ms: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRetryableNetworkFailure(err: unknown): boolean {\n if (isTransientNetworkError(err)) return true;\n\n const networkError =\n err && typeof err === \"object\"\n ? (err as { networkError?: unknown }).networkError\n : undefined;\n\n if (!networkError) return false;\n if (\n typeof networkError === \"object\" &&\n networkError !== null &&\n !(networkError instanceof Error) &&\n Object.keys(networkError).length === 0\n ) {\n return false;\n }\n\n return isTransientNetworkError(networkError);\n}\n\nfunction waitForOnline(\n adapters: CreateNetworkRecoveryLinkAdapters,\n aborted: () => boolean,\n): Promise<void> {\n return new Promise((resolve) => {\n if (aborted()) {\n resolve();\n return;\n }\n\n let intervalId: ReturnType<typeof setInterval> | null = null;\n let settled = false;\n let polling = false;\n let unsub: (() => void) | null = null;\n\n const settle = () => {\n if (settled) return;\n settled = true;\n if (intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n unsub?.();\n resolve();\n };\n\n unsub = adapters.subscribeIsOnline((online) => {\n if (aborted() || online) {\n settle();\n }\n });\n\n // The adapter may invoke its listener synchronously (a common pattern for\n // adapters that emit the current state on subscribe). settle() ran before\n // `unsub` was assigned, so release the subscription and skip the poll.\n if (settled) {\n unsub?.();\n return;\n }\n\n // Poll the real online state so a stale/false \"offline\" reading (e.g. the\n // expo-network isInternetReachable quirk) doesn't park the query forever.\n // The push listener above remains the fast path; this is the self-heal.\n intervalId = setInterval(() => {\n if (aborted() || settled) {\n settle();\n return;\n }\n if (polling) return;\n polling = true;\n void Promise.resolve(adapters.forceRefreshIsOnline())\n .then((online) => {\n if (settled || aborted()) return;\n if (online) settle();\n })\n .catch(() => undefined)\n .finally(() => {\n polling = false;\n });\n }, 500);\n });\n}\n\nfunction cleanupRecoveryState(state: QueryRecoveryState): void {\n state.innerSub?.unsubscribe();\n state.innerSub = null;\n}\n\nasync function ensureOnlineOrWait(state: QueryRecoveryState): Promise<boolean> {\n const online = await state.adapters.forceRefreshIsOnline();\n if (online) return !state.unsubscribed;\n\n await waitForOnline(state.adapters, () => state.unsubscribed);\n return !state.unsubscribed;\n}\n\n/* eslint-disable no-use-before-define -- mutual recursion between attempt + error handlers */\nasync function handleQueryNetworkError(\n state: QueryRecoveryState,\n err: unknown,\n attempt: number,\n): Promise<void> {\n if (state.unsubscribed) return;\n\n if (!isRetryableNetworkFailure(err)) {\n emitError(state, err);\n return;\n }\n\n const nowOnline = await state.adapters.forceRefreshIsOnline();\n if (state.unsubscribed) return;\n\n if (!nowOnline) {\n await waitForOnline(state.adapters, () => state.unsubscribed);\n if (state.unsubscribed) return;\n cleanupRecoveryState(state);\n void runQueryAttempt(state, attempt);\n return;\n }\n\n if (attempt >= MAX_RETRIES) {\n emitError(state, err);\n return;\n }\n\n await wait(BACKOFF_MS[attempt] ?? 4000);\n if (state.unsubscribed) return;\n cleanupRecoveryState(state);\n void runQueryAttempt(state, attempt + 1);\n}\n\nasync function runQueryAttempt(\n state: QueryRecoveryState,\n attempt: number,\n): Promise<void> {\n if (state.unsubscribed) return;\n\n const canContinue = await ensureOnlineOrWait(state);\n if (!canContinue) return;\n\n try {\n state.innerSub = state.forward(state.operation).subscribe({\n complete: () => emitComplete(state),\n error: (err) => {\n if (!isRetryableNetworkFailure(err)) {\n emitError(state, err);\n return;\n }\n void handleQueryNetworkError(state, err, attempt);\n },\n next: (value) => emitNext(state, value),\n });\n } catch (e) {\n emitError(state, e);\n }\n}\n/* eslint-enable no-use-before-define */\n\n/**\n * Apollo link that pauses and retries **queries** after transient network failures.\n * Mutations and subscriptions pass through unchanged.\n */\nexport function createNetworkRecoveryLink(\n adapters: CreateNetworkRecoveryLinkAdapters,\n): ApolloLink {\n return new ApolloLink((operation, forward) => {\n if (!forward) {\n return null;\n }\n\n if (!isQueryOperation(operation)) {\n return forward(operation);\n }\n\n return new Observable((observer) => {\n const state: QueryRecoveryState = {\n adapters,\n forward,\n innerSub: null,\n observer,\n operation,\n unsubscribed: false,\n };\n\n void runQueryAttempt(state, 0);\n\n return () => {\n state.unsubscribed = true;\n cleanupRecoveryState(state);\n };\n });\n });\n}\n","const TRANSIENT_NETWORK_PATTERNS = [\n /network connection was lost/i,\n /network request failed/i,\n /fetch failed/i,\n /failed to fetch/i,\n /internet connection appears to be offline/i,\n // Transport-layer timeouts only — avoid generic \"timeout\" (backend/query timeouts).\n /\\b(request|connection|network)\\s+timed\\s+out\\b/i,\n /\\b(connect|read|write|socket)\\s+timeout\\b/i,\n /\\bsocket\\s+timed\\s+out\\b/i,\n /\\betimedout\\b/i,\n /\\benotfound\\b/i,\n /\\beconnreset\\b/i,\n /\\beconnrefused\\b/i,\n] as const;\n\nfunction extractErrorMessage(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (typeof err === \"string\") return err;\n if (err && typeof err === \"object\") {\n const obj = err as Record<string, unknown>;\n if (typeof obj.message === \"string\") return obj.message;\n if (obj.networkError) return extractErrorMessage(obj.networkError);\n try {\n return JSON.stringify(err);\n } catch {\n return \"[object]\";\n }\n }\n if (err == null) return \"\";\n if (\n typeof err === \"number\" ||\n typeof err === \"boolean\" ||\n typeof err === \"bigint\"\n ) {\n return String(err);\n }\n if (typeof err === \"symbol\") return err.toString();\n return \"\";\n}\n\n/** True for short-lived connectivity failures (e.g. resume before the stack is ready). */\nexport function isTransientNetworkError(err: unknown): boolean {\n const message = extractErrorMessage(err);\n return TRANSIENT_NETWORK_PATTERNS.some((pattern) => pattern.test(message));\n}\n","import { safeJsonStringify } from \"./toStructuredError\";\n\nexport type NetworkLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type CreateNetworkLogAdapters = {\n enabled: boolean | (() => boolean);\n};\n\nfunction resolveEnabled(enabled: boolean | (() => boolean)): boolean {\n return typeof enabled === \"function\" ? enabled() : enabled;\n}\n\n/**\n * Structured network/auth/WS console logger (mobile format: prefix + JSON payload).\n */\nexport function createNetworkLog(adapters: CreateNetworkLogAdapters) {\n const { enabled } = adapters;\n\n return function networkLog(\n level: NetworkLogLevel,\n scope: string,\n message: string,\n details?: Record<string, unknown>,\n ) {\n if (!resolveEnabled(enabled)) return;\n\n const payload = details ? safeJsonStringify(details) : \"\";\n const prefix = `[${scope}] ${message}`;\n\n let logger: (...args: unknown[]) => void;\n switch (level) {\n case \"debug\":\n logger = console.debug;\n break;\n case \"info\":\n logger = console.info;\n break;\n case \"warn\":\n logger = console.warn;\n break;\n case \"error\":\n default:\n logger = console.error;\n break;\n }\n logger(payload ? `${prefix}\\n${payload}` : prefix);\n };\n}\n","import { createClient, type Client } from \"graphql-ws\";\n\nimport type { NetworkLogLevel } from \"./createNetworkLog\";\nimport { toStructuredError } from \"./toStructuredError\";\n\nconst WS_SCOPE = \"ws\";\nconst MIN_RECONNECT_MS = 1000;\nconst MAX_RECONNECT_MS = 10_000;\n\n/**\n * Client-initiated close to restart the transport without disposing the `graphql-ws`\n * client. Active `subscribe()` loops keep running and re-handshake with fresh\n * `connectionParams` (see graphql-ws recipes). Not a protocol fatal code.\n */\nconst WS_CLIENT_RESTART_CODE = 4205;\n\nconst MAX_WS_RETRY_ATTEMPTS = 30;\nconst WS_READY_STATE_OPEN = 1;\nconst WS_READY_STATE_CONNECTING = 0;\n\nexport type CreateWsManagerAdapters = {\n getWsUrl: () => string;\n awaitReady: () => Promise<void>;\n getAccessToken: () => string | null;\n isActive: () => boolean;\n /** Subscribe to inactive/active transitions; return unsubscribe. */\n subscribeLifecycle: (handlers: {\n onInactive: () => void;\n onActive: () => void;\n }) => () => void;\n onLog?: (\n level: NetworkLogLevel,\n scope: string,\n message: string,\n details?: Record<string, unknown>,\n ) => void;\n isDev?: boolean | (() => boolean);\n};\n\nexport type WsManager = {\n initLifecycleListener: () => void;\n getClient: () => Client;\n ensureConnected: (reason: string) => void;\n onAuthTokenChanged: (reason: string) => void;\n close: (reason: string) => void;\n dispose: () => void;\n};\n\nfunction resolveIsDev(isDev: boolean | (() => boolean) | undefined): boolean {\n if (isDev == null) return false;\n return typeof isDev === \"function\" ? isDev() : isDev;\n}\n\nfunction maskedTokenInfo(token: string) {\n const len = token.length;\n const start = token.slice(0, 4);\n const end = token.slice(-4);\n return { end, len, start };\n}\n\nfunction computeBackoffMs(attempt: number): number {\n // Exponential backoff with a small deterministic spread to reduce reconnect stampedes.\n // Avoid Math.random() (Sonar S2245) — jitter here is not security-sensitive.\n const exp = Math.min(MIN_RECONNECT_MS * 2 ** attempt, MAX_RECONNECT_MS);\n const jitter = (attempt * 37 + 17) % 250;\n return Math.min(exp + jitter, MAX_RECONNECT_MS);\n}\n\nfunction wsCloseReason(reason: string): string {\n const trimmed = reason.trim().slice(0, 100);\n return trimmed || \"restart\";\n}\n\n/**\n * Platform-agnostic graphql-ws client manager (mobile-shaped).\n * Apps supply lifecycle (AppState / visibility), token access, and logging.\n */\nexport function createWsManager(adapters: CreateWsManagerAdapters): WsManager {\n const {\n getWsUrl,\n awaitReady,\n getAccessToken,\n isActive,\n subscribeLifecycle,\n onLog,\n isDev,\n } = adapters;\n\n const log = (\n level: NetworkLogLevel,\n message: string,\n details?: Record<string, unknown>,\n ) => {\n onLog?.(level, WS_SCOPE, message, details);\n };\n\n let client: Client | null = null;\n let activeSocket: WebSocket | null = null;\n let unsubscribeLifecycle: (() => void) | null = null;\n\n const ensureConnectedRef: { current: (reason: string) => void } = {\n current: () => undefined,\n };\n\n const close = (reason: string) => {\n activeSocket = null;\n if (client) {\n try {\n log(\"debug\", \"Disposing WS client\", { reason });\n client.dispose();\n } catch (e) {\n log(\"warn\", \"Error while disposing WS client\", {\n error: toStructuredError(e),\n reason,\n });\n }\n }\n client = null;\n };\n\n const createNewClient = (): Client => {\n const url = getWsUrl();\n\n return createClient({\n connectionParams: async () => {\n try {\n await awaitReady();\n } catch (e) {\n log(\"error\", \"WS auth params: awaitReady failed\", {\n error: toStructuredError(e),\n });\n return {};\n }\n\n const token = getAccessToken();\n if (!token) {\n if (resolveIsDev(isDev)) {\n log(\"warn\", \"WS auth params: missing token\", {});\n }\n return {};\n }\n\n if (resolveIsDev(isDev)) {\n log(\"debug\", \"WS connecting with token\", {\n token: maskedTokenInfo(token),\n });\n }\n\n const bearer = `Bearer ${token}`;\n return { Authorization: bearer, authorization: bearer };\n },\n keepAlive: 20_000,\n lazy: true,\n on: {\n closed: (ev: unknown) => {\n activeSocket = null;\n log(\"warn\", \"WS closed\", {\n close: toStructuredError(ev),\n url,\n });\n },\n connected: (socket: unknown) => {\n activeSocket = socket as WebSocket;\n log(\"info\", \"WS connected\", { url });\n },\n connecting: () => {\n log(\"debug\", \"WS connecting\", { url });\n },\n error: (err: unknown) => {\n const structuredError = toStructuredError(err);\n const hasStructuredDetails =\n structuredError != null &&\n (typeof structuredError !== \"object\" ||\n Array.isArray(structuredError) ||\n Object.keys(structuredError).length > 0);\n const logLevel = hasStructuredDetails ? \"error\" : \"warn\";\n const logMessage = hasStructuredDetails\n ? \"WS error\"\n : \"WS error (empty payload)\";\n\n log(\n logLevel,\n logMessage,\n hasStructuredDetails ? { error: structuredError, url } : { url },\n );\n },\n },\n retryAttempts: MAX_WS_RETRY_ATTEMPTS,\n retryWait: async (retries: number) => {\n await new Promise<void>((resolve) =>\n setTimeout(resolve, computeBackoffMs(retries)),\n );\n },\n url,\n });\n };\n\n const initLifecycleListener = () => {\n if (unsubscribeLifecycle) return;\n\n unsubscribeLifecycle = subscribeLifecycle({\n onActive: () => {\n log(\"debug\", \"Lifecycle active; allowing reconnect\", {});\n ensureConnectedRef.current(\"lifecycle_active\");\n },\n onInactive: () => {\n log(\"debug\", \"Lifecycle inactive; closing WS\", {});\n close(\"lifecycle_inactive\");\n },\n });\n };\n\n const getClient = (): Client => {\n initLifecycleListener();\n if (!client) {\n client = createNewClient();\n }\n return client;\n };\n\n const nudgeSocketReconnect = (reason: string) => {\n if (!isActive()) return;\n\n const token = getAccessToken();\n if (!token) {\n if (resolveIsDev(isDev)) {\n log(\"warn\", \"WS restart blocked (missing token)\", { reason });\n }\n close(`blocked_missing_token:${reason}`);\n return;\n }\n\n if (client === null) {\n client = createNewClient();\n log(\"debug\", \"WS client created\", { reason });\n return;\n }\n\n const socket = activeSocket;\n if (socket !== null) {\n const { readyState } = socket;\n if (\n readyState === WS_READY_STATE_OPEN ||\n readyState === WS_READY_STATE_CONNECTING\n ) {\n try {\n socket.close(WS_CLIENT_RESTART_CODE, wsCloseReason(reason));\n log(\"debug\", \"WS socket restart (same client)\", { reason });\n } catch (e) {\n log(\"warn\", \"WS socket close failed\", {\n error: toStructuredError(e),\n reason,\n });\n }\n }\n return;\n }\n\n if (resolveIsDev(isDev)) {\n log(\"debug\", \"WS nudge: no open socket (library retry)\", { reason });\n }\n };\n\n const ensureConnected = (reason: string) => {\n initLifecycleListener();\n\n if (!isActive()) {\n log(\"debug\", \"Skip ensureConnected while inactive\", { reason });\n return;\n }\n\n awaitReady()\n .then(() => {\n const token = getAccessToken();\n if (!token) {\n if (resolveIsDev(isDev)) {\n log(\"warn\", \"WS blocked (missing token)\", { reason });\n }\n return;\n }\n getClient();\n })\n .catch((e) => {\n log(\"error\", \"WS ensureConnected failed\", {\n error: toStructuredError(e),\n reason,\n });\n });\n };\n ensureConnectedRef.current = ensureConnected;\n\n const onAuthTokenChanged = (reason: string) => {\n if (resolveIsDev(isDev)) {\n log(\"debug\", \"Auth token changed; reconnecting WS\", { reason });\n }\n nudgeSocketReconnect(`auth_token_changed:${reason}`);\n };\n\n const dispose = () => {\n close(\"dispose\");\n if (unsubscribeLifecycle) {\n unsubscribeLifecycle();\n unsubscribeLifecycle = null;\n }\n };\n\n return {\n close,\n dispose,\n ensureConnected,\n getClient,\n initLifecycleListener,\n onAuthTokenChanged,\n };\n}\n","/**\n * Idle / background thresholds for Apollo recovery after the app or tab\n * returns to the foreground.\n *\n * These are **independent of the server access-token TTL** (currently 15\n * minutes on the ClueMart auth service). Recovery is driven by how long the\n * client was backgrounded/hidden, not by JWT `exp`.\n *\n * Any future proactive refresh-near-expiry logic is a separate mechanism and\n * must not reuse these constants as a stand-in for token lifetime.\n */\nexport const MIN_BACKGROUND_MS = 30_000;\n\n/**\n * Delay after a successful long-background recovery before refetching active\n * Apollo queries (gives networking a moment to stabilize, especially on iOS).\n *\n * Independent of the server's access-token TTL (see `MIN_BACKGROUND_MS`).\n */\nexport const REFETCH_DELAY_MS = 500;\n","import { MIN_BACKGROUND_MS, REFETCH_DELAY_MS } from \"./recoveryConstants\";\n\nexport type CreateRecoveryCoreAdapters = {\n /** Refresh tokens / user; `true` = schedule active-query refetch. */\n refreshSession: () => Promise<boolean>;\n ensureWsConnected: (reason: string) => void;\n disposeWs: () => void;\n refetchActiveQueries: () => void;\n /** Foreground / visible check (AppState active, document visible, …). */\n isActive: () => boolean;\n /**\n * Optional online check. When omitted, treated as online (current app behavior —\n * query pause is handled by networkRecoveryLink).\n */\n isOnline?: () => boolean;\n /** Same shape as createWsManager lifecycle adapter. */\n subscribeLifecycle: (handlers: {\n onInactive: () => void;\n onActive: () => void;\n }) => () => void;\n /** WS ensureConnected reason after a short background hop. */\n shortBackgroundWsReason?: string;\n /** WS ensureConnected reason after full recovery. */\n recoverWsReason?: string;\n now?: () => number;\n schedule?: (fn: () => void, ms: number) => ReturnType<typeof setTimeout>;\n cancelSchedule?: (id: ReturnType<typeof setTimeout>) => void;\n};\n\nexport type RecoveryCore = {\n /** Subscribe to lifecycle; idempotent. */\n start: () => void;\n /** Unsubscribe + clear timers; does not dispose WS (hook cleanup does). */\n stop: () => void;\n /** Full recovery: refresh → WS → deferred refetch. */\n recoverApollo: () => Promise<void>;\n /**\n * Call at the start of client reset/logout: bump generation, clear timers,\n * drop recovering guard so in-flight recovery cannot touch the new client.\n */\n prepareClientReset: () => void;\n};\n\nconst DEFAULT_SHORT_BG_REASON = \"short_background\";\nconst DEFAULT_RECOVER_REASON = \"apollo_recover\";\n\n/**\n * Platform-agnostic Apollo idle recovery orchestration (mobile/admin parity).\n *\n * Apps supply lifecycle (AppState / visibility), session refresh, and WS/query\n * side effects. React client ownership stays in each app's useApolloRecovery.\n */\nexport function createRecoveryCore(\n adapters: CreateRecoveryCoreAdapters,\n): RecoveryCore {\n const {\n refreshSession,\n ensureWsConnected,\n disposeWs,\n refetchActiveQueries,\n isActive,\n isOnline,\n subscribeLifecycle,\n shortBackgroundWsReason = DEFAULT_SHORT_BG_REASON,\n recoverWsReason = DEFAULT_RECOVER_REASON,\n now = () => Date.now(),\n schedule = (fn, ms) => setTimeout(fn, ms),\n cancelSchedule = (id) => clearTimeout(id),\n } = adapters;\n\n let recovering = false;\n let resetGeneration = 0;\n let backgroundTime: number | null = null;\n let wsDisposeTimer: ReturnType<typeof setTimeout> | null = null;\n let refetchTimer: ReturnType<typeof setTimeout> | null = null;\n let unsubscribeLifecycle: (() => void) | null = null;\n\n const clearRefetchTimer = () => {\n if (refetchTimer !== null) {\n cancelSchedule(refetchTimer);\n refetchTimer = null;\n }\n };\n\n const clearWsDisposeTimer = () => {\n if (wsDisposeTimer !== null) {\n cancelSchedule(wsDisposeTimer);\n wsDisposeTimer = null;\n }\n };\n\n const canUseNetwork = () => isOnline?.() ?? true;\n\n const scheduleActiveQueryRefetch = (generationAtStart: number) => {\n clearRefetchTimer();\n refetchTimer = schedule(() => {\n refetchTimer = null;\n if (!isActive()) return;\n if (generationAtStart !== resetGeneration) return;\n if (!canUseNetwork()) return;\n refetchActiveQueries();\n }, REFETCH_DELAY_MS);\n };\n\n const handleMovedToBackground = () => {\n clearRefetchTimer();\n backgroundTime = now();\n\n clearWsDisposeTimer();\n wsDisposeTimer = schedule(() => {\n wsDisposeTimer = null;\n disposeWs();\n }, MIN_BACKGROUND_MS);\n };\n\n async function recoverApollo(): Promise<void> {\n if (recovering) return;\n recovering = true;\n const generationAtStart = resetGeneration;\n\n try {\n const shouldRefetch = await refreshSession();\n\n if (generationAtStart !== resetGeneration) return;\n\n ensureWsConnected(recoverWsReason);\n\n if (!isActive()) return;\n\n if (shouldRefetch) {\n scheduleActiveQueryRefetch(generationAtStart);\n }\n } finally {\n if (generationAtStart === resetGeneration) {\n recovering = false;\n }\n }\n }\n\n const handleReturnedToForeground = () => {\n clearWsDisposeTimer();\n\n const bgTime = backgroundTime;\n const elapsed = bgTime != null ? now() - bgTime : MIN_BACKGROUND_MS;\n backgroundTime = null;\n\n if (elapsed >= MIN_BACKGROUND_MS) {\n void recoverApollo();\n return;\n }\n\n ensureWsConnected(shortBackgroundWsReason);\n };\n\n return {\n prepareClientReset() {\n clearRefetchTimer();\n clearWsDisposeTimer();\n backgroundTime = null;\n recovering = false;\n resetGeneration += 1;\n },\n\n recoverApollo,\n\n start() {\n if (unsubscribeLifecycle) return;\n unsubscribeLifecycle = subscribeLifecycle({\n onActive: handleReturnedToForeground,\n onInactive: handleMovedToBackground,\n });\n },\n\n stop() {\n if (unsubscribeLifecycle) {\n unsubscribeLifecycle();\n unsubscribeLifecycle = null;\n }\n clearRefetchTimer();\n clearWsDisposeTimer();\n backgroundTime = null;\n recovering = false;\n },\n };\n}\n"],"mappings":"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","names":["onError","import_client","onError","import_error","import_client","wait","resolveIsDev","maskedTokenInfo"]}
1
+ {"version":3,"sources":["../../src/apollo/index.ts","../../src/apollo/createApolloManager.ts","../../src/apollo/createAuthLink.ts","../../src/apollo/createErrorLink.ts","../../src/apollo/readErrorResponseFields.ts","../../src/apollo/unauthHelpers.ts","../../src/apollo/createRefreshAccessToken.ts","../../src/apollo/createApolloErrorLoggingLink.ts","../../src/apollo/toStructuredError.ts","../../src/apollo/createNetworkRecoveryLink.ts","../../src/utils/isTransientNetworkError.ts","../../src/apollo/createNetworkLog.ts","../../src/apollo/createWsManager.ts","../../src/apollo/recoveryConstants.ts","../../src/apollo/createRecoveryCore.ts"],"sourcesContent":["export { createApolloManager } from \"./createApolloManager\";\nexport type {\n ApolloManager,\n CreateApolloManagerAdapters,\n} from \"./createApolloManager\";\nexport type {\n AuthRecoveryEvent,\n OnAuthRecoveryEvent,\n} from \"./authRecoveryEvents\";\nexport { createAuthLink } from \"./createAuthLink\";\nexport { createErrorLink } from \"./createErrorLink\";\nexport { createRefreshAccessToken } from \"./createRefreshAccessToken\";\nexport { createApolloErrorLoggingLink } from \"./createApolloErrorLoggingLink\";\nexport type {\n ApolloErrorLogLevel,\n CreateApolloErrorLoggingLinkAdapters,\n} from \"./createApolloErrorLoggingLink\";\nexport { createNetworkRecoveryLink } from \"./createNetworkRecoveryLink\";\nexport type { CreateNetworkRecoveryLinkAdapters } from \"./createNetworkRecoveryLink\";\nexport { createNetworkLog } from \"./createNetworkLog\";\nexport type {\n CreateNetworkLogAdapters,\n NetworkLogLevel,\n} from \"./createNetworkLog\";\nexport { createWsManager } from \"./createWsManager\";\nexport type { CreateWsManagerAdapters, WsManager } from \"./createWsManager\";\nexport { createRecoveryCore } from \"./createRecoveryCore\";\nexport type {\n CreateRecoveryCoreAdapters,\n RecoveryCore,\n} from \"./createRecoveryCore\";\nexport { MIN_BACKGROUND_MS, REFETCH_DELAY_MS } from \"./recoveryConstants\";\nexport { readErrorResponseFields } from \"./readErrorResponseFields\";\nexport { safeJsonStringify, toStructuredError } from \"./toStructuredError\";\nexport type {\n ApolloTokenStorage,\n CreateAuthLinkAdapters,\n CreateErrorLinkAdapters,\n CreateRefreshAccessTokenAdapters,\n GraphQLErrorLike,\n RefreshAccessTokenResult,\n RefreshCoordination,\n RefreshErrorCode,\n} from \"./types\";\nexport {\n decideRefreshNextStep,\n getRefreshErrorCode,\n getStatusCode,\n isExpectedRefreshAuthFailure,\n isRefreshAuthFailureMessage,\n isUnauthenticatedError,\n isUnauthenticatedGraphQLError,\n NON_RETRYABLE_REFRESH_AUTH_CODES,\n refreshGraphqlErrorsWarrantRetry,\n} from \"./unauthHelpers\";\nexport type { RefreshDecision } from \"./unauthHelpers\";\n","import type { OnAuthRecoveryEvent } from \"./authRecoveryEvents\";\n\nexport type ApolloManager = {\n resetClient: () => void;\n setResetClient: (fn: (() => void) | null) => void;\n};\n\nexport type CreateApolloManagerAdapters = {\n /** Optional recovery telemetry when resetClient runs (default: no-op). */\n onAuthRecoveryEvent?: OnAuthRecoveryEvent;\n};\n\n/**\n * Lets logout recreate the Apollo client without importing React hooks.\n * Apps register a reset handler (mobile: useApolloRecovery).\n */\nexport function createApolloManager(\n adapters: CreateApolloManagerAdapters = {},\n): ApolloManager {\n const { onAuthRecoveryEvent } = adapters;\n let resetClientFn: (() => void) | null = null;\n let pendingReset = false;\n\n return {\n resetClient(): void {\n if (!resetClientFn) {\n pendingReset = true;\n return;\n }\n pendingReset = false;\n onAuthRecoveryEvent?.({ type: \"reset_client\" });\n resetClientFn();\n },\n\n setResetClient(fn: (() => void) | null): void {\n resetClientFn = fn;\n if (fn && pendingReset) {\n pendingReset = false;\n onAuthRecoveryEvent?.({ type: \"reset_client\" });\n fn();\n }\n },\n };\n}\n","import { ApolloLink, Observable } from \"@apollo/client\";\n\nimport type { CreateAuthLinkAdapters } from \"./types\";\n\nfunction maskedTokenInfo(token: string) {\n const len = token.length;\n const start = token.slice(0, 4);\n const end = token.slice(-4);\n return { end, len, start };\n}\n\n/**\n * Auth link that attaches Bearer token after optional awaitReady.\n * Does not overwrite an Authorization header already set on the operation.\n */\nexport function createAuthLink(adapters: CreateAuthLinkAdapters): ApolloLink {\n const { awaitReady, getAccessToken, onError, onDebug } = adapters;\n\n return new ApolloLink((operation, forward) => {\n return new Observable((observer) => {\n let innerSub: { unsubscribe: () => void } | null = null;\n let closed = false;\n\n const teardown = () => {\n closed = true;\n innerSub?.unsubscribe();\n innerSub = null;\n };\n\n void (async () => {\n if (awaitReady) {\n try {\n await awaitReady();\n } catch (err) {\n onError?.(err, { action: \"awaitReady\" });\n }\n }\n\n if (closed) return;\n\n const token = await getAccessToken();\n\n if (token) {\n operation.setContext(({ headers = {} }) => {\n const hasAuthHeader =\n Object.hasOwn(headers, \"Authorization\") ||\n Object.hasOwn(headers, \"authorization\");\n\n if (hasAuthHeader) {\n onDebug?.(\"Preserving existing Authorization header\", {\n operationName: operation.operationName,\n });\n return { headers };\n }\n\n return {\n headers: {\n ...headers,\n Authorization: `Bearer ${token}`,\n },\n };\n });\n onDebug?.(\"Attached Authorization header\", {\n operationName: operation.operationName,\n token: maskedTokenInfo(token),\n });\n } else {\n onDebug?.(\"Proceeding without Authorization header\", {\n operationName: operation.operationName,\n });\n }\n\n if (closed) return;\n\n try {\n innerSub = forward(operation).subscribe({\n complete: () => {\n if (!closed) observer.complete();\n },\n error: (error) => {\n if (!closed) observer.error(error);\n },\n next: (result) => {\n if (!closed) observer.next(result);\n },\n });\n } catch (err) {\n if (closed) return;\n onError?.(err, { action: \"forward\" });\n observer.error(err);\n }\n })();\n\n return teardown;\n });\n });\n}\n","import { Observable } from \"@apollo/client\";\nimport type { FetchResult, NextLink, Operation } from \"@apollo/client/core\";\nimport { onError } from \"@apollo/client/link/error\";\n\nimport { readErrorResponseFields } from \"./readErrorResponseFields\";\nimport type {\n CreateErrorLinkAdapters,\n GraphQLErrorLike,\n RefreshAccessTokenResult,\n} from \"./types\";\nimport {\n decideRefreshNextStep,\n getStatusCode,\n isUnauthenticatedError,\n} from \"./unauthHelpers\";\n\ntype AuthErrorContext = {\n graphQLErrors: ReadonlyArray<GraphQLErrorLike> | undefined;\n networkError: unknown;\n statusCode: number | null;\n};\n\ntype AuthRecoveryObserver = {\n complete: () => void;\n error: (error: Error) => void;\n isClosed: () => boolean;\n next: (value: FetchResult) => void;\n};\n\n/**\n * Emits a transient error when the token refresh failed due to a temporary\n * problem (e.g. offline). Marking it with a `networkError` lets the network\n * recovery link retry the query automatically once connectivity returns.\n */\nfunction emitRetryableRefreshError(observer: AuthRecoveryObserver): void {\n if (observer.isClosed()) return;\n const error = new Error(\n \"Couldn't refresh your session. Please check your connection and try again.\",\n ) as Error & { networkError?: Error };\n error.networkError = new Error(\"Network request failed\");\n observer.error(error);\n}\n\n/**\n * Emits a terminal session error when there is no session to recover (no\n * refresh token). Completing silently would leave Apollo stuck in `loading`\n * with no data and no error, so surface an error instead.\n */\nfunction emitSessionExpiredError(observer: AuthRecoveryObserver): void {\n if (!observer.isClosed()) {\n observer.error(new Error(\"Session expired. Please sign in again.\"));\n }\n}\n\nfunction retryOperationWithToken(\n operation: Operation,\n forward: NextLink,\n token: string,\n observer: AuthRecoveryObserver,\n setInnerSubscriber: (subscriber: { unsubscribe: () => void }) => void,\n): void {\n operation.setContext(({ headers = {} }) => ({\n __authRetryAttempted: true,\n headers: {\n ...headers,\n Authorization: `Bearer ${token}`,\n },\n }));\n\n if (observer.isClosed()) return;\n\n setInnerSubscriber(\n forward(operation).subscribe({\n complete: () => {\n if (!observer.isClosed()) observer.complete();\n },\n error: (error) => {\n if (!observer.isClosed()) observer.error(error);\n },\n next: (value) => {\n if (!observer.isClosed()) observer.next(value);\n },\n }),\n );\n}\n\n/**\n * Error link with mobile auth recovery: refresh once, retry op, or deferred logout.\n */\nexport function createErrorLink(adapters: CreateErrorLinkAdapters) {\n const {\n refreshAccessToken,\n clearAccessToken,\n logout,\n onError: reportError,\n onDebug,\n onAuthRecoveryEvent,\n } = adapters;\n\n function scheduleSessionLogout(reason: string): void {\n onAuthRecoveryEvent?.({ reason, type: \"logout_scheduled\" });\n // End the link chain before logout clears the Apollo store (avoids invariant 42).\n setTimeout(() => {\n void logout();\n }, 0);\n }\n\n async function handleTerminalRefreshFailure(\n observer: AuthRecoveryObserver,\n ): Promise<void> {\n clearAccessToken?.(\"refresh_failed\");\n if (!observer.isClosed()) observer.complete();\n scheduleSessionLogout(\"refresh_failed\");\n }\n\n async function handleRefreshResult(\n result: RefreshAccessTokenResult,\n operation: Operation,\n forward: NextLink,\n observer: AuthRecoveryObserver,\n setInnerSubscriber: (subscriber: { unsubscribe: () => void }) => void,\n ): Promise<void> {\n const decision = decideRefreshNextStep(result);\n if (decision.kind === \"logout\") {\n await handleTerminalRefreshFailure(observer);\n return;\n }\n if (decision.kind === \"complete\") {\n if (result.retryable) {\n emitRetryableRefreshError(observer);\n } else {\n emitSessionExpiredError(observer);\n }\n return;\n }\n retryOperationWithToken(\n operation,\n forward,\n decision.token,\n observer,\n setInnerSubscriber,\n );\n }\n\n async function recoverFromAuthError(\n operation: Operation,\n forward: NextLink,\n authContext: AuthErrorContext,\n observer: AuthRecoveryObserver,\n setInnerSubscriber: (subscriber: { unsubscribe: () => void }) => void,\n ): Promise<void> {\n const ctx = operation.getContext() as Record<string, unknown>;\n if (ctx.__authRetryAttempted) {\n onDebug?.(\"Auth retry suppressed (already retried)\", {\n operationName: operation.operationName,\n statusCode: authContext.statusCode,\n });\n if (!observer.isClosed()) {\n observer.error(\n new Error(\n `Auth failed after retry (status ${authContext.statusCode ?? \"unknown\"})`,\n ),\n );\n }\n return;\n }\n\n onDebug?.(\"Auth error detected; attempting refresh\", {\n operationName: operation.operationName,\n statusCode: authContext.statusCode,\n });\n\n const result = await refreshAccessToken();\n if (observer.isClosed()) return;\n\n await handleRefreshResult(\n result,\n operation,\n forward,\n observer,\n setInnerSubscriber,\n );\n }\n\n async function handleAuthRecoveryError(\n err: unknown,\n observer: AuthRecoveryObserver,\n ): Promise<void> {\n reportError?.(err, { action: \"tokenRefresh\" });\n console.error(\"Token refresh failed\", err);\n clearAccessToken?.(\"refresh_exception\");\n if (!observer.isClosed()) observer.complete();\n scheduleSessionLogout(\"refresh_exception\");\n }\n\n return onError((errorResponse) => {\n const { operation, forward } = errorResponse;\n const { graphQLErrors, networkError } =\n readErrorResponseFields(errorResponse);\n\n if (\n !isUnauthenticatedError({\n graphQLErrors,\n networkError,\n })\n ) {\n return;\n }\n\n const statusCode = networkError ? getStatusCode(networkError) : null;\n const authContext: AuthErrorContext = {\n graphQLErrors,\n networkError,\n statusCode,\n };\n\n return new Observable((observer) => {\n let innerSubscriber: { unsubscribe: () => void } | null = null;\n let closed = false;\n\n const recoveryObserver: AuthRecoveryObserver = {\n complete: () => {\n if (!closed) observer.complete();\n },\n error: (error) => {\n if (!closed) observer.error(error);\n },\n isClosed: () => closed,\n next: (value) => {\n if (!closed) observer.next(value);\n },\n };\n\n const teardown = () => {\n closed = true;\n innerSubscriber?.unsubscribe();\n innerSubscriber = null;\n };\n\n void recoverFromAuthError(\n operation,\n forward,\n authContext,\n recoveryObserver,\n (subscriber) => {\n innerSubscriber = subscriber;\n },\n ).catch((err) => handleAuthRecoveryError(err, recoveryObserver));\n\n return teardown;\n });\n });\n}\n","import type { GraphQLErrorLike } from \"./types\";\n\n/**\n * Reads AC3 ErrorResponse fields via property access instead of destructuring\n * (`graphQLErrors`, `networkError`, `response`) to avoid Apollo Client warnings.\n */\nexport function readErrorResponseFields(errorResponse: unknown): {\n graphQLErrors: GraphQLErrorLike[] | undefined;\n networkError: unknown;\n response: unknown;\n} {\n const record = errorResponse as Record<string, unknown>;\n return {\n graphQLErrors: record[\"graphQLErrors\"] as GraphQLErrorLike[] | undefined,\n networkError: record[\"networkError\"],\n response: record[\"response\"],\n };\n}\n","import type { GraphQLErrorLike, RefreshErrorCode } from \"./types\";\n\nexport function getStatusCode(networkError: unknown): number | null {\n const anyErr = networkError as Record<string, unknown> | null;\n const status =\n (anyErr?.[\"statusCode\"] as number | undefined) ??\n (anyErr?.[\"status\"] as number | undefined) ??\n (anyErr?.[\"response\"] as { status?: number } | undefined)?.status;\n return typeof status === \"number\" ? status : null;\n}\n\nexport function isUnauthenticatedGraphQLError(\n graphQLErrors?: ReadonlyArray<GraphQLErrorLike> | null,\n): boolean {\n return Boolean(\n graphQLErrors?.some(\n (err) =>\n err.extensions?.code === \"UNAUTHENTICATED\" ||\n err.message?.includes(\"You must be logged in.\"),\n ),\n );\n}\n\n/**\n * True when GraphQL unauth signals and/or HTTP 401/403 indicate auth recovery is needed.\n */\nexport function isUnauthenticatedError(input: {\n graphQLErrors?: ReadonlyArray<GraphQLErrorLike> | null;\n networkError?: unknown;\n}): boolean {\n const statusCode = input.networkError\n ? getStatusCode(input.networkError)\n : null;\n return (\n isUnauthenticatedGraphQLError(input.graphQLErrors) ||\n statusCode === 401 ||\n statusCode === 403\n );\n}\n\nexport const NON_RETRYABLE_REFRESH_AUTH_CODES: ReadonlySet<string> =\n new Set<RefreshErrorCode>([\"FORBIDDEN\", \"TOKEN_EXPIRED\", \"UNAUTHENTICATED\"]);\n\nconst REFRESH_AUTH_FAILURE_MESSAGE_PATTERNS: ReadonlyArray<RegExp> = [\n /invalid.*refresh token/i,\n /jwt expired/i,\n /jwt malformed/i,\n /invalid signature/i,\n];\n\nexport function isRefreshAuthFailureMessage(\n message: string | undefined,\n): boolean {\n if (!message) return false;\n return REFRESH_AUTH_FAILURE_MESSAGE_PATTERNS.some((pattern) =>\n pattern.test(message),\n );\n}\n\nexport function getRefreshErrorCode(\n errors: ReadonlyArray<GraphQLErrorLike>,\n): string | undefined {\n for (const err of errors) {\n const code = err.extensions?.code;\n if (typeof code === \"string\") return code;\n }\n return undefined;\n}\n\nexport function isExpectedRefreshAuthFailure(\n errors: ReadonlyArray<GraphQLErrorLike>,\n errorCode: string | undefined,\n): boolean {\n if (errorCode != null && NON_RETRYABLE_REFRESH_AUTH_CODES.has(errorCode)) {\n return true;\n }\n return errors.some((err) => isRefreshAuthFailureMessage(err.message));\n}\n\n/**\n * Whether GraphQL `errors` from the refresh mutation warrant another HTTP attempt.\n */\nexport function refreshGraphqlErrorsWarrantRetry(\n errors: ReadonlyArray<GraphQLErrorLike>,\n): boolean {\n if (\n errors.some(\n (e) =>\n e.extensions != null &&\n (e.extensions as Record<string, unknown>).retryable === true,\n )\n ) {\n return true;\n }\n\n for (const err of errors) {\n if (isRefreshAuthFailureMessage(err.message)) {\n return false;\n }\n const code = err.extensions?.code;\n if (\n typeof code === \"string\" &&\n NON_RETRYABLE_REFRESH_AUTH_CODES.has(code)\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nexport type RefreshDecision =\n | { kind: \"complete\" }\n | { kind: \"logout\" }\n | { kind: \"retry\"; token: string };\n\n/** Maps refresh outcome to error-link next step (mobile behavior). */\nexport function decideRefreshNextStep(result: {\n hadRefreshToken?: boolean;\n token: string | null;\n retryable?: boolean;\n}): RefreshDecision {\n if (!result.token && !result.retryable) {\n // No credentials left (e.g. intentional logout cleared storage) — do not\n // schedule another session logout; matches createRecoveryCore refreshSession.\n if (result.hadRefreshToken === false) return { kind: \"complete\" };\n return { kind: \"logout\" };\n }\n if (!result.token) return { kind: \"complete\" };\n return { kind: \"retry\", token: result.token };\n}\n","import type { RefreshTokenMutationResponse } from \"../types/auth\";\n\nimport type {\n CreateRefreshAccessTokenAdapters,\n GraphQLErrorLike,\n RefreshAccessTokenResult,\n} from \"./types\";\nimport {\n getRefreshErrorCode,\n isExpectedRefreshAuthFailure,\n refreshGraphqlErrorsWarrantRetry,\n} from \"./unauthHelpers\";\n\n/** Plain query string avoids host `graphql` DocumentNode type conflicts. */\nconst buildRefreshQuery = (mutationName: string, inputTypeName: string) => `\n mutation ${mutationName}($input: ${inputTypeName}!) {\n ${mutationName}(input: $input) {\n data {\n token\n refreshToken\n }\n message\n }\n }\n`;\n\nconst DEFAULT_REFRESH_MUTATION_NAME = \"refreshToken\";\nconst DEFAULT_REFRESH_INPUT_TYPE_NAME = \"RefreshTokenInputType\";\n\nconst RETRY_DELAY_MS = 1500;\nconst MAX_REFRESH_ATTEMPTS = 5;\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\ntype RefreshAttemptResult =\n | { kind: \"success\"; token: string }\n | { kind: \"retry\" }\n | {\n errorCode?: string;\n errors: GraphQLErrorLike[];\n kind: \"terminal_graphql\";\n }\n | { kind: \"terminal_invalid\" };\n\n/**\n * Creates a coalesced refreshAccessToken() using mobile multi-attempt behavior.\n * Storage and token/WS side effects are injected via adapters.\n *\n * Optional `refreshCoordination` serializes refresh across realms (admin tabs).\n * Before clearing credentials on terminal failure, skips wipe if storage already\n * holds a newer access token (another actor recovered).\n */\nexport function createRefreshAccessToken(\n adapters: CreateRefreshAccessTokenAdapters,\n): () => Promise<RefreshAccessTokenResult> {\n const {\n apiUrl,\n storage,\n onTokensUpdated,\n onTokensCleared,\n onError,\n onDebug,\n onAuthRecoveryEvent,\n refreshCoordination,\n refreshMutationName = DEFAULT_REFRESH_MUTATION_NAME,\n refreshInputTypeName = DEFAULT_REFRESH_INPUT_TYPE_NAME,\n } = adapters;\n\n let inFlightRefresh: Promise<RefreshAccessTokenResult> | null = null;\n\n async function clearRefreshCredentials(reason: string): Promise<void> {\n await storage.clearTokens();\n onTokensCleared?.(reason);\n }\n\n /**\n * Avoid wiping a winning tab's rotated tokens when this attempt lost the race.\n * If access token changed since we started, return it as success for retry.\n */\n async function clearOrAdoptNewerAccessToken(\n reason: string,\n accessTokenAtStart: string | null,\n errorCode?: string,\n ): Promise<RefreshAccessTokenResult> {\n const currentAccess = await storage.getAccessToken();\n if (currentAccess != null && currentAccess !== accessTokenAtStart) {\n onAuthRecoveryEvent?.({ reason, type: \"stale_clear_skipped\" });\n return { hadRefreshToken: true, token: currentAccess };\n }\n\n await clearRefreshCredentials(reason);\n onAuthRecoveryEvent?.({\n errorCode,\n reason,\n type: \"refresh_failed\",\n });\n return {\n hadRefreshToken: true,\n token: null,\n };\n }\n\n async function abortAfterRefreshGraphqlErrors(\n errors: GraphQLErrorLike[],\n errorCode: string | undefined,\n accessTokenAtStart: string | null,\n ): Promise<RefreshAccessTokenResult> {\n const sanitizedErrors = errors.map((error) => ({\n message: error?.message,\n }));\n\n if (isExpectedRefreshAuthFailure(errors, errorCode)) {\n console.warn(\n \"[refreshAccessToken] Refresh rejected:\",\n errorCode ?? sanitizedErrors.map((e) => e.message).join(\", \"),\n );\n } else {\n console.error(\"[refreshAccessToken] GraphQL errors:\", sanitizedErrors);\n onError?.(new Error(\"GraphQL errors during refresh\"), {\n action: \"refresh_graphql_error\",\n errorCode,\n errors: sanitizedErrors,\n });\n }\n\n const outcome = await clearOrAdoptNewerAccessToken(\n \"refresh_graphql_error\",\n accessTokenAtStart,\n errorCode,\n );\n return {\n ...outcome,\n errorCode,\n };\n }\n\n async function runRefreshAttempt(\n refreshToken: string,\n attempt: number,\n ): Promise<RefreshAttemptResult> {\n const res = await fetch(`${apiUrl}/graphql`, {\n body: JSON.stringify({\n query: buildRefreshQuery(refreshMutationName, refreshInputTypeName),\n variables: { input: { refreshToken } },\n }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n });\n\n const json = (await res.json()) as {\n data?: Record<string, RefreshTokenMutationResponse | undefined>;\n errors?: GraphQLErrorLike[];\n };\n\n if (json.errors?.length) {\n const errors = json.errors;\n const errorCode = getRefreshErrorCode(errors);\n const warrantRetry =\n refreshGraphqlErrorsWarrantRetry(errors) &&\n attempt < MAX_REFRESH_ATTEMPTS;\n\n if (warrantRetry) {\n onDebug?.(\n `GraphQL errors (attempt ${attempt}/${MAX_REFRESH_ATTEMPTS}), retrying`,\n { errorCode },\n );\n return { kind: \"retry\" };\n }\n return { errorCode, errors, kind: \"terminal_graphql\" };\n }\n\n const refreshResponse = json?.data?.[refreshMutationName];\n const newToken = refreshResponse?.data?.token;\n const newRefreshToken = refreshResponse?.data?.refreshToken;\n\n if (newToken && newRefreshToken) {\n await storage.setTokens(newToken, newRefreshToken);\n onTokensUpdated?.(newToken);\n return { kind: \"success\", token: newToken };\n }\n\n if (attempt < MAX_REFRESH_ATTEMPTS) {\n onDebug?.(\n `Invalid refresh response (attempt ${attempt}/${MAX_REFRESH_ATTEMPTS}), retrying`,\n );\n return { kind: \"retry\" };\n }\n\n return { kind: \"terminal_invalid\" };\n }\n\n async function refreshAccessTokenInternal(): Promise<RefreshAccessTokenResult> {\n const accessTokenAtStart = await storage.getAccessToken();\n\n for (let attempt = 1; attempt <= MAX_REFRESH_ATTEMPTS; attempt += 1) {\n const refreshToken = await storage.getRefreshToken();\n if (!refreshToken) return { hadRefreshToken: false, token: null };\n\n try {\n const result = await runRefreshAttempt(refreshToken, attempt);\n if (result.kind === \"success\") {\n onAuthRecoveryEvent?.({ type: \"refresh_succeeded\" });\n return { hadRefreshToken: true, token: result.token };\n }\n if (result.kind === \"retry\") {\n await wait(RETRY_DELAY_MS);\n continue;\n }\n if (result.kind === \"terminal_graphql\") {\n return abortAfterRefreshGraphqlErrors(\n result.errors,\n result.errorCode,\n accessTokenAtStart,\n );\n }\n return clearOrAdoptNewerAccessToken(\n \"refresh_invalid_response\",\n accessTokenAtStart,\n );\n } catch (err) {\n if (attempt < MAX_REFRESH_ATTEMPTS) {\n await wait(RETRY_DELAY_MS);\n continue;\n }\n\n onError?.(err, {\n action: \"refreshAccessToken\",\n attempt,\n maxAttempts: MAX_REFRESH_ATTEMPTS,\n });\n console.error(\"Token refresh failed:\", err);\n onAuthRecoveryEvent?.({\n reason: \"refresh_network_exhausted\",\n retryable: true,\n type: \"refresh_failed\",\n });\n return { hadRefreshToken: true, retryable: true, token: null };\n }\n }\n\n throw new Error(\"refreshAccessToken: unreachable\");\n }\n\n return function refreshAccessToken(): Promise<RefreshAccessTokenResult> {\n // Same-realm coalesce: return existing work without taking the cross-tab lock again.\n if (inFlightRefresh !== null) {\n return inFlightRefresh;\n }\n\n const startCoalesced = (): Promise<RefreshAccessTokenResult> => {\n inFlightRefresh ??= refreshAccessTokenInternal().finally(() => {\n inFlightRefresh = null;\n });\n return inFlightRefresh;\n };\n\n if (refreshCoordination) {\n // Await inside the lock so other tabs wait until refresh settles.\n return refreshCoordination.withLock(async () => {\n if (inFlightRefresh !== null) {\n return inFlightRefresh;\n }\n return startCoalesced();\n });\n }\n\n return startCoalesced();\n };\n}\n","import { onError, type ErrorResponse } from \"@apollo/client/link/error\";\n\nimport { readErrorResponseFields } from \"./readErrorResponseFields\";\nimport { toStructuredError } from \"./toStructuredError\";\nimport type { GraphQLErrorLike } from \"./types\";\n\nconst SCOPE = \"apollo\";\nconst REDACTED = \"[REDACTED]\";\nconst MAX_DEPTH = 4;\nconst MAX_ARRAY_ITEMS = 20;\n\nconst SENSITIVE_KEY_RE =\n /(pass(word)?|token|secret|auth(orization)?|cookie|session|otp|pin|email|phone|ssn|credit|card|cvv|iban|refresh)/i;\n\nconst GRAPHQL_EXTENSION_ALLOWLIST = new Set([\"category\", \"code\", \"httpStatus\"]);\n\nexport type ApolloErrorLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type CreateApolloErrorLoggingLinkAdapters = {\n /** When true, variables/extensions are redacted but still included. */\n isDev: boolean | (() => boolean);\n onLog: (\n level: ApolloErrorLogLevel,\n scope: string,\n message: string,\n details?: Record<string, unknown>,\n ) => void;\n};\n\nfunction resolveIsDev(isDev: boolean | (() => boolean)): boolean {\n return typeof isDev === \"function\" ? isDev() : isDev;\n}\n\nfunction isSensitiveKey(key: string) {\n return SENSITIVE_KEY_RE.test(key);\n}\n\nfunction isSensitiveExtensionKey(key: string) {\n return (\n isSensitiveKey(key) ||\n /stack|trace|debug|exception|internals|snippet|query|variables|body/i.test(\n key,\n )\n );\n}\n\nfunction redactValue(value: unknown, depth = 0): unknown {\n if (value == null) return value;\n if (depth >= MAX_DEPTH) return \"[Truncated]\";\n\n if (Array.isArray(value)) {\n return value\n .slice(0, MAX_ARRAY_ITEMS)\n .map((item) => redactValue(item, depth + 1));\n }\n\n if (typeof value === \"object\") {\n const input = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(input)) {\n out[key] = isSensitiveKey(key)\n ? REDACTED\n : redactValue(nested, depth + 1);\n }\n return out;\n }\n\n return value;\n}\n\nfunction pickAllowlistedExtensions(\n ext: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n for (const key of GRAPHQL_EXTENSION_ALLOWLIST) {\n if (key in ext && ext[key] !== undefined) {\n out[key] = ext[key];\n }\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction redactGraphQLExtensionsForDev(\n ext: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(ext)) {\n if (GRAPHQL_EXTENSION_ALLOWLIST.has(key)) {\n out[key] =\n value != null && typeof value === \"object\" ? redactValue(value) : value;\n continue;\n }\n if (isSensitiveExtensionKey(key)) {\n out[key] = REDACTED;\n continue;\n }\n out[key] = redactValue(value);\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction safeExtensionsForLogs(\n extensions: GraphQLErrorLike[\"extensions\"],\n isDev: boolean,\n): unknown {\n if (extensions == null) return undefined;\n if (typeof extensions !== \"object\" || Array.isArray(extensions)) {\n return \"[NonObjectExtensions]\";\n }\n const ext = extensions as Record<string, unknown>;\n if (!isDev) {\n return pickAllowlistedExtensions(ext);\n }\n return redactGraphQLExtensionsForDev(ext);\n}\n\nfunction serializeGraphQLError(err: GraphQLErrorLike, isDev: boolean) {\n return {\n extensions: safeExtensionsForLogs(err.extensions, isDev),\n locations: err.locations,\n message: err.message,\n path: err.path,\n };\n}\n\nfunction safeVariablesForLogs(\n variables: Record<string, unknown> | undefined,\n isDev: boolean,\n) {\n if (!variables) return undefined;\n if (!isDev) {\n return {\n keys: Object.keys(variables),\n present: true,\n };\n }\n return redactValue(variables);\n}\n\nfunction safeResponseForLogs(response: unknown, isDev: boolean) {\n if (!response) return null;\n if (!isDev) return { present: true };\n return redactValue(toStructuredError(response));\n}\n\n/**\n * Logging-only Apollo `onError` link with secret redaction.\n * Does not retry or forward — place before auth recovery links.\n */\nexport function createApolloErrorLoggingLink(\n adapters: CreateApolloErrorLoggingLinkAdapters,\n) {\n const { isDev, onLog } = adapters;\n\n return onError((errorHandler: ErrorResponse) => {\n const { operation } = errorHandler;\n const { graphQLErrors, networkError, response } =\n readErrorResponseFields(errorHandler);\n const dev = resolveIsDev(isDev);\n\n if (graphQLErrors?.length) {\n onLog(\"error\", SCOPE, \"GraphQL error(s)\", {\n graphQLErrors: graphQLErrors.map((err) =>\n serializeGraphQLError(err, dev),\n ),\n operationName: operation.operationName,\n variables: safeVariablesForLogs(operation.variables, dev),\n });\n }\n\n if (networkError) {\n onLog(\"error\", SCOPE, \"Network error\", {\n networkError: toStructuredError(networkError),\n operationName: operation.operationName,\n response: safeResponseForLogs(response, dev),\n variables: safeVariablesForLogs(operation.variables, dev),\n });\n }\n\n return undefined;\n });\n}\n","type Json = null | boolean | number | string | Json[] | { [key: string]: Json };\n\n/**\n * JSON.stringify that tolerates circular refs, Errors, bigint, and functions.\n * Always returns a string — top-level `undefined` / `symbol` become `\"null\"`\n * (native `JSON.stringify` would return `undefined`).\n */\nexport function safeJsonStringify(value: unknown): string {\n const seen = new WeakSet<object>();\n const json = JSON.stringify(\n value,\n (_key, v) => {\n if (typeof v === \"bigint\") return v.toString();\n if (typeof v === \"function\") return `[Function ${v.name || \"anonymous\"}]`;\n if (v && typeof v === \"object\") {\n if (seen.has(v as object)) return \"[Circular]\";\n seen.add(v as object);\n }\n if (v instanceof Error) {\n return {\n message: v.message,\n name: v.name,\n stack: v.stack,\n ...(v as unknown as Record<string, unknown>),\n } as Record<string, unknown>;\n }\n return v as unknown;\n },\n 2,\n );\n return json ?? \"null\";\n}\n\n/** Coerce arbitrary values into `Json`, dropping `undefined` (omit the field). */\nfunction coerceJson(value: unknown): Json | undefined {\n if (value === undefined) return undefined;\n if (value === null) return null;\n if (\n typeof value === \"boolean\" ||\n typeof value === \"number\" ||\n typeof value === \"string\"\n ) {\n return value;\n }\n if (typeof value === \"bigint\") return value.toString();\n if (typeof value === \"symbol\") return value.toString();\n if (typeof value === \"function\") {\n return `[Function ${value.name || \"anonymous\"}]`;\n }\n // Objects/arrays: keep structure; nested non-JSON values are handled when\n // the result is passed through `safeJsonStringify` for logging.\n return value as Json;\n}\n\nfunction pickKnownFields(\n src: Record<string, unknown>,\n dst: Record<string, Json>,\n) {\n const keys = [\n \"message\",\n \"code\",\n \"reason\",\n \"type\",\n \"name\",\n \"stack\",\n \"status\",\n \"statusCode\",\n \"readyState\",\n \"url\",\n \"wasClean\",\n ] as const;\n for (const k of keys) {\n if (k in src) {\n const coerced = coerceJson(src[k]);\n if (coerced !== undefined) dst[k] = coerced;\n }\n }\n}\n\nfunction objectToJson(anyErr: object): Json {\n const out: Record<string, Json> = {};\n pickKnownFields(anyErr as Record<string, unknown>, out);\n for (const [k, v] of Object.entries(anyErr)) {\n if (k in out) continue;\n const coerced = coerceJson(v);\n if (coerced !== undefined) out[k] = coerced;\n }\n return out;\n}\n\n/** Best-effort JSON-safe shape for logging network / GraphQL / WS errors. */\nexport function toStructuredError(err: unknown): Json {\n if (err == null) return null;\n if (typeof err === \"string\") return { message: err };\n if (typeof err === \"number\" || typeof err === \"boolean\")\n return { value: err };\n if (typeof err === \"symbol\") return { value: err.toString() };\n if (err instanceof Error) {\n const details = objectToJson(err);\n if (details && typeof details === \"object\" && !Array.isArray(details)) {\n return {\n ...details,\n message: err.message,\n name: err.name,\n stack: err.stack ?? null,\n };\n }\n return {\n message: err.message,\n name: err.name,\n stack: err.stack ?? null,\n };\n }\n if (typeof err === \"object\") return objectToJson(err);\n return { value: safeJsonStringify({ value: err }) };\n}\n","import { ApolloLink, Observable } from \"@apollo/client\";\nimport type { FetchResult, NextLink, Operation } from \"@apollo/client/core\";\nimport { getMainDefinition } from \"@apollo/client/utilities\";\n\nimport { isTransientNetworkError } from \"../utils/isTransientNetworkError\";\n\n/** Highest attempt index before giving up (0 = initial request; 1..N = retries). */\nconst MAX_RETRIES = 4;\n\n/** Backoff delays (ms) before each retry; index matches the failed attempt. */\nconst BACKOFF_MS = [500, 1500, 3000, 4000] as const;\n\nexport type CreateNetworkRecoveryLinkAdapters = {\n forceRefreshIsOnline: () => Promise<boolean> | boolean;\n subscribeIsOnline: (listener: (online: boolean) => void) => () => void;\n};\n\ntype QueryRecoveryObserver = {\n complete: () => void;\n error: (err: unknown) => void;\n next: (value: FetchResult) => void;\n};\n\ntype QueryRecoveryState = {\n adapters: CreateNetworkRecoveryLinkAdapters;\n forward: NextLink;\n innerSub: { unsubscribe: () => void } | null;\n observer: QueryRecoveryObserver;\n operation: Operation;\n unsubscribed: boolean;\n};\n\nfunction emitNext(state: QueryRecoveryState, value: FetchResult): void {\n if (state.unsubscribed) return;\n state.observer.next(value);\n}\n\nfunction emitComplete(state: QueryRecoveryState): void {\n if (state.unsubscribed) return;\n state.observer.complete();\n}\n\nfunction emitError(state: QueryRecoveryState, err: unknown): void {\n if (state.unsubscribed) return;\n state.observer.error(err);\n}\n\nfunction isQueryOperation(op: Operation): boolean {\n const def = getMainDefinition(op.query);\n return (\n def.kind === \"OperationDefinition\" &&\n (def as { operation?: string }).operation === \"query\"\n );\n}\n\nfunction wait(ms: number) {\n return new Promise<void>((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isRetryableNetworkFailure(err: unknown): boolean {\n if (isTransientNetworkError(err)) return true;\n\n const networkError =\n err && typeof err === \"object\"\n ? (err as { networkError?: unknown }).networkError\n : undefined;\n\n if (!networkError) return false;\n if (\n typeof networkError === \"object\" &&\n networkError !== null &&\n !(networkError instanceof Error) &&\n Object.keys(networkError).length === 0\n ) {\n return false;\n }\n\n return isTransientNetworkError(networkError);\n}\n\nfunction waitForOnline(\n adapters: CreateNetworkRecoveryLinkAdapters,\n aborted: () => boolean,\n): Promise<void> {\n return new Promise((resolve) => {\n if (aborted()) {\n resolve();\n return;\n }\n\n let intervalId: ReturnType<typeof setInterval> | null = null;\n let settled = false;\n let polling = false;\n let unsub: (() => void) | null = null;\n\n const settle = () => {\n if (settled) return;\n settled = true;\n if (intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n unsub?.();\n resolve();\n };\n\n unsub = adapters.subscribeIsOnline((online) => {\n if (aborted() || online) {\n settle();\n }\n });\n\n // The adapter may invoke its listener synchronously (a common pattern for\n // adapters that emit the current state on subscribe). settle() ran before\n // `unsub` was assigned, so release the subscription and skip the poll.\n if (settled) {\n unsub?.();\n return;\n }\n\n // Poll the real online state so a stale/false \"offline\" reading (e.g. the\n // expo-network isInternetReachable quirk) doesn't park the query forever.\n // The push listener above remains the fast path; this is the self-heal.\n intervalId = setInterval(() => {\n if (aborted() || settled) {\n settle();\n return;\n }\n if (polling) return;\n polling = true;\n void Promise.resolve(adapters.forceRefreshIsOnline())\n .then((online) => {\n if (settled || aborted()) return;\n if (online) settle();\n })\n .catch(() => undefined)\n .finally(() => {\n polling = false;\n });\n }, 500);\n });\n}\n\nfunction cleanupRecoveryState(state: QueryRecoveryState): void {\n state.innerSub?.unsubscribe();\n state.innerSub = null;\n}\n\nasync function ensureOnlineOrWait(state: QueryRecoveryState): Promise<boolean> {\n const online = await state.adapters.forceRefreshIsOnline();\n if (online) return !state.unsubscribed;\n\n await waitForOnline(state.adapters, () => state.unsubscribed);\n return !state.unsubscribed;\n}\n\n/* eslint-disable no-use-before-define -- mutual recursion between attempt + error handlers */\nasync function handleQueryNetworkError(\n state: QueryRecoveryState,\n err: unknown,\n attempt: number,\n): Promise<void> {\n if (state.unsubscribed) return;\n\n if (!isRetryableNetworkFailure(err)) {\n emitError(state, err);\n return;\n }\n\n const nowOnline = await state.adapters.forceRefreshIsOnline();\n if (state.unsubscribed) return;\n\n if (!nowOnline) {\n await waitForOnline(state.adapters, () => state.unsubscribed);\n if (state.unsubscribed) return;\n cleanupRecoveryState(state);\n void runQueryAttempt(state, attempt);\n return;\n }\n\n if (attempt >= MAX_RETRIES) {\n emitError(state, err);\n return;\n }\n\n await wait(BACKOFF_MS[attempt] ?? 4000);\n if (state.unsubscribed) return;\n cleanupRecoveryState(state);\n void runQueryAttempt(state, attempt + 1);\n}\n\nasync function runQueryAttempt(\n state: QueryRecoveryState,\n attempt: number,\n): Promise<void> {\n if (state.unsubscribed) return;\n\n const canContinue = await ensureOnlineOrWait(state);\n if (!canContinue) return;\n\n try {\n state.innerSub = state.forward(state.operation).subscribe({\n complete: () => emitComplete(state),\n error: (err) => {\n if (!isRetryableNetworkFailure(err)) {\n emitError(state, err);\n return;\n }\n void handleQueryNetworkError(state, err, attempt);\n },\n next: (value) => emitNext(state, value),\n });\n } catch (e) {\n emitError(state, e);\n }\n}\n/* eslint-enable no-use-before-define */\n\n/**\n * Apollo link that pauses and retries **queries** after transient network failures.\n * Mutations and subscriptions pass through unchanged.\n */\nexport function createNetworkRecoveryLink(\n adapters: CreateNetworkRecoveryLinkAdapters,\n): ApolloLink {\n return new ApolloLink((operation, forward) => {\n if (!forward) {\n return null;\n }\n\n if (!isQueryOperation(operation)) {\n return forward(operation);\n }\n\n return new Observable((observer) => {\n const state: QueryRecoveryState = {\n adapters,\n forward,\n innerSub: null,\n observer,\n operation,\n unsubscribed: false,\n };\n\n void runQueryAttempt(state, 0);\n\n return () => {\n state.unsubscribed = true;\n cleanupRecoveryState(state);\n };\n });\n });\n}\n","const TRANSIENT_NETWORK_PATTERNS = [\n /network connection was lost/i,\n /network request failed/i,\n /fetch failed/i,\n /failed to fetch/i,\n /internet connection appears to be offline/i,\n // Transport-layer timeouts only — avoid generic \"timeout\" (backend/query timeouts).\n /\\b(request|connection|network)\\s+timed\\s+out\\b/i,\n /\\b(connect|read|write|socket)\\s+timeout\\b/i,\n /\\bsocket\\s+timed\\s+out\\b/i,\n /\\betimedout\\b/i,\n /\\benotfound\\b/i,\n /\\beconnreset\\b/i,\n /\\beconnrefused\\b/i,\n] as const;\n\nfunction extractErrorMessage(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (typeof err === \"string\") return err;\n if (err && typeof err === \"object\") {\n const obj = err as Record<string, unknown>;\n if (typeof obj.message === \"string\") return obj.message;\n if (obj.networkError) return extractErrorMessage(obj.networkError);\n try {\n return JSON.stringify(err);\n } catch {\n return \"[object]\";\n }\n }\n if (err == null) return \"\";\n if (\n typeof err === \"number\" ||\n typeof err === \"boolean\" ||\n typeof err === \"bigint\"\n ) {\n return String(err);\n }\n if (typeof err === \"symbol\") return err.toString();\n return \"\";\n}\n\n/** True for short-lived connectivity failures (e.g. resume before the stack is ready). */\nexport function isTransientNetworkError(err: unknown): boolean {\n const message = extractErrorMessage(err);\n return TRANSIENT_NETWORK_PATTERNS.some((pattern) => pattern.test(message));\n}\n","import { safeJsonStringify } from \"./toStructuredError\";\n\nexport type NetworkLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type CreateNetworkLogAdapters = {\n enabled: boolean | (() => boolean);\n};\n\nfunction resolveEnabled(enabled: boolean | (() => boolean)): boolean {\n return typeof enabled === \"function\" ? enabled() : enabled;\n}\n\n/**\n * Structured network/auth/WS console logger (mobile format: prefix + JSON payload).\n */\nexport function createNetworkLog(adapters: CreateNetworkLogAdapters) {\n const { enabled } = adapters;\n\n return function networkLog(\n level: NetworkLogLevel,\n scope: string,\n message: string,\n details?: Record<string, unknown>,\n ) {\n if (!resolveEnabled(enabled)) return;\n\n const payload = details ? safeJsonStringify(details) : \"\";\n const prefix = `[${scope}] ${message}`;\n\n let logger: (...args: unknown[]) => void;\n switch (level) {\n case \"debug\":\n logger = console.debug;\n break;\n case \"info\":\n logger = console.info;\n break;\n case \"warn\":\n logger = console.warn;\n break;\n case \"error\":\n default:\n logger = console.error;\n break;\n }\n logger(payload ? `${prefix}\\n${payload}` : prefix);\n };\n}\n","import { createClient, type Client } from \"graphql-ws\";\n\nimport type { NetworkLogLevel } from \"./createNetworkLog\";\nimport { toStructuredError } from \"./toStructuredError\";\n\nconst WS_SCOPE = \"ws\";\nconst MIN_RECONNECT_MS = 1000;\nconst MAX_RECONNECT_MS = 10_000;\n\n/**\n * Client-initiated close to restart the transport without disposing the `graphql-ws`\n * client. Active `subscribe()` loops keep running and re-handshake with fresh\n * `connectionParams` (see graphql-ws recipes). Not a protocol fatal code.\n */\nconst WS_CLIENT_RESTART_CODE = 4205;\n\nconst MAX_WS_RETRY_ATTEMPTS = 30;\nconst WS_READY_STATE_OPEN = 1;\nconst WS_READY_STATE_CONNECTING = 0;\n\nexport type CreateWsManagerAdapters = {\n getWsUrl: () => string;\n awaitReady: () => Promise<void>;\n getAccessToken: () => string | null;\n isActive: () => boolean;\n /** Subscribe to inactive/active transitions; return unsubscribe. */\n subscribeLifecycle: (handlers: {\n onInactive: () => void;\n onActive: () => void;\n }) => () => void;\n onLog?: (\n level: NetworkLogLevel,\n scope: string,\n message: string,\n details?: Record<string, unknown>,\n ) => void;\n isDev?: boolean | (() => boolean);\n};\n\nexport type WsManager = {\n initLifecycleListener: () => void;\n getClient: () => Client;\n ensureConnected: (reason: string) => void;\n onAuthTokenChanged: (reason: string) => void;\n close: (reason: string) => void;\n dispose: () => void;\n};\n\nfunction resolveIsDev(isDev: boolean | (() => boolean) | undefined): boolean {\n if (isDev == null) return false;\n return typeof isDev === \"function\" ? isDev() : isDev;\n}\n\nfunction maskedTokenInfo(token: string) {\n const len = token.length;\n const start = token.slice(0, 4);\n const end = token.slice(-4);\n return { end, len, start };\n}\n\nfunction computeBackoffMs(attempt: number): number {\n // Exponential backoff with a small deterministic spread to reduce reconnect stampedes.\n // Avoid Math.random() (Sonar S2245) — jitter here is not security-sensitive.\n const exp = Math.min(MIN_RECONNECT_MS * 2 ** attempt, MAX_RECONNECT_MS);\n const jitter = (attempt * 37 + 17) % 250;\n return Math.min(exp + jitter, MAX_RECONNECT_MS);\n}\n\nfunction wsCloseReason(reason: string): string {\n const trimmed = reason.trim().slice(0, 100);\n return trimmed || \"restart\";\n}\n\n/**\n * Platform-agnostic graphql-ws client manager (mobile-shaped).\n * Apps supply lifecycle (AppState / visibility), token access, and logging.\n */\nexport function createWsManager(adapters: CreateWsManagerAdapters): WsManager {\n const {\n getWsUrl,\n awaitReady,\n getAccessToken,\n isActive,\n subscribeLifecycle,\n onLog,\n isDev,\n } = adapters;\n\n const log = (\n level: NetworkLogLevel,\n message: string,\n details?: Record<string, unknown>,\n ) => {\n onLog?.(level, WS_SCOPE, message, details);\n };\n\n let client: Client | null = null;\n let activeSocket: WebSocket | null = null;\n let unsubscribeLifecycle: (() => void) | null = null;\n\n const ensureConnectedRef: { current: (reason: string) => void } = {\n current: () => undefined,\n };\n\n const close = (reason: string) => {\n activeSocket = null;\n if (client) {\n try {\n log(\"debug\", \"Disposing WS client\", { reason });\n client.dispose();\n } catch (e) {\n log(\"warn\", \"Error while disposing WS client\", {\n error: toStructuredError(e),\n reason,\n });\n }\n }\n client = null;\n };\n\n const createNewClient = (): Client => {\n const url = getWsUrl();\n\n return createClient({\n connectionParams: async () => {\n try {\n await awaitReady();\n } catch (e) {\n log(\"error\", \"WS auth params: awaitReady failed\", {\n error: toStructuredError(e),\n });\n return {};\n }\n\n const token = getAccessToken();\n if (!token) {\n if (resolveIsDev(isDev)) {\n log(\"warn\", \"WS auth params: missing token\", {});\n }\n return {};\n }\n\n if (resolveIsDev(isDev)) {\n log(\"debug\", \"WS connecting with token\", {\n token: maskedTokenInfo(token),\n });\n }\n\n const bearer = `Bearer ${token}`;\n return { Authorization: bearer, authorization: bearer };\n },\n keepAlive: 20_000,\n lazy: true,\n on: {\n closed: (ev: unknown) => {\n activeSocket = null;\n log(\"warn\", \"WS closed\", {\n close: toStructuredError(ev),\n url,\n });\n },\n connected: (socket: unknown) => {\n activeSocket = socket as WebSocket;\n log(\"info\", \"WS connected\", { url });\n },\n connecting: () => {\n log(\"debug\", \"WS connecting\", { url });\n },\n error: (err: unknown) => {\n const structuredError = toStructuredError(err);\n const hasStructuredDetails =\n structuredError != null &&\n (typeof structuredError !== \"object\" ||\n Array.isArray(structuredError) ||\n Object.keys(structuredError).length > 0);\n const logLevel = hasStructuredDetails ? \"error\" : \"warn\";\n const logMessage = hasStructuredDetails\n ? \"WS error\"\n : \"WS error (empty payload)\";\n\n log(\n logLevel,\n logMessage,\n hasStructuredDetails ? { error: structuredError, url } : { url },\n );\n },\n },\n retryAttempts: MAX_WS_RETRY_ATTEMPTS,\n retryWait: async (retries: number) => {\n await new Promise<void>((resolve) =>\n setTimeout(resolve, computeBackoffMs(retries)),\n );\n },\n url,\n });\n };\n\n const initLifecycleListener = () => {\n if (unsubscribeLifecycle) return;\n\n unsubscribeLifecycle = subscribeLifecycle({\n onActive: () => {\n log(\"debug\", \"Lifecycle active; allowing reconnect\", {});\n ensureConnectedRef.current(\"lifecycle_active\");\n },\n onInactive: () => {\n log(\"debug\", \"Lifecycle inactive; closing WS\", {});\n close(\"lifecycle_inactive\");\n },\n });\n };\n\n const getClient = (): Client => {\n initLifecycleListener();\n if (!client) {\n client = createNewClient();\n }\n return client;\n };\n\n const nudgeSocketReconnect = (reason: string) => {\n if (!isActive()) return;\n\n const token = getAccessToken();\n if (!token) {\n if (resolveIsDev(isDev)) {\n log(\"warn\", \"WS restart blocked (missing token)\", { reason });\n }\n close(`blocked_missing_token:${reason}`);\n return;\n }\n\n if (client === null) {\n client = createNewClient();\n log(\"debug\", \"WS client created\", { reason });\n return;\n }\n\n const socket = activeSocket;\n if (socket !== null) {\n const { readyState } = socket;\n if (\n readyState === WS_READY_STATE_OPEN ||\n readyState === WS_READY_STATE_CONNECTING\n ) {\n try {\n socket.close(WS_CLIENT_RESTART_CODE, wsCloseReason(reason));\n log(\"debug\", \"WS socket restart (same client)\", { reason });\n } catch (e) {\n log(\"warn\", \"WS socket close failed\", {\n error: toStructuredError(e),\n reason,\n });\n }\n }\n return;\n }\n\n if (resolveIsDev(isDev)) {\n log(\"debug\", \"WS nudge: no open socket (library retry)\", { reason });\n }\n };\n\n const ensureConnected = (reason: string) => {\n initLifecycleListener();\n\n if (!isActive()) {\n log(\"debug\", \"Skip ensureConnected while inactive\", { reason });\n return;\n }\n\n awaitReady()\n .then(() => {\n const token = getAccessToken();\n if (!token) {\n if (resolveIsDev(isDev)) {\n log(\"warn\", \"WS blocked (missing token)\", { reason });\n }\n return;\n }\n getClient();\n })\n .catch((e) => {\n log(\"error\", \"WS ensureConnected failed\", {\n error: toStructuredError(e),\n reason,\n });\n });\n };\n ensureConnectedRef.current = ensureConnected;\n\n const onAuthTokenChanged = (reason: string) => {\n if (resolveIsDev(isDev)) {\n log(\"debug\", \"Auth token changed; reconnecting WS\", { reason });\n }\n nudgeSocketReconnect(`auth_token_changed:${reason}`);\n };\n\n const dispose = () => {\n close(\"dispose\");\n if (unsubscribeLifecycle) {\n unsubscribeLifecycle();\n unsubscribeLifecycle = null;\n }\n };\n\n return {\n close,\n dispose,\n ensureConnected,\n getClient,\n initLifecycleListener,\n onAuthTokenChanged,\n };\n}\n","/**\n * Idle / background thresholds for Apollo recovery after the app or tab\n * returns to the foreground.\n *\n * These are **independent of the server access-token TTL** (currently 15\n * minutes on the ClueMart auth service). Recovery is driven by how long the\n * client was backgrounded/hidden, not by JWT `exp`.\n *\n * Any future proactive refresh-near-expiry logic is a separate mechanism and\n * must not reuse these constants as a stand-in for token lifetime.\n */\nexport const MIN_BACKGROUND_MS = 30_000;\n\n/**\n * Delay after a successful long-background recovery before refetching active\n * Apollo queries (gives networking a moment to stabilize, especially on iOS).\n *\n * Independent of the server's access-token TTL (see `MIN_BACKGROUND_MS`).\n */\nexport const REFETCH_DELAY_MS = 500;\n","import { MIN_BACKGROUND_MS, REFETCH_DELAY_MS } from \"./recoveryConstants\";\n\nexport type CreateRecoveryCoreAdapters = {\n /** Refresh tokens / user; `true` = schedule active-query refetch. */\n refreshSession: () => Promise<boolean>;\n ensureWsConnected: (reason: string) => void;\n disposeWs: () => void;\n refetchActiveQueries: () => void;\n /** Foreground / visible check (AppState active, document visible, …). */\n isActive: () => boolean;\n /**\n * Optional online check. When omitted, treated as online (current app behavior —\n * query pause is handled by networkRecoveryLink).\n */\n isOnline?: () => boolean;\n /** Same shape as createWsManager lifecycle adapter. */\n subscribeLifecycle: (handlers: {\n onInactive: () => void;\n onActive: () => void;\n }) => () => void;\n /** WS ensureConnected reason after a short background hop. */\n shortBackgroundWsReason?: string;\n /** WS ensureConnected reason after full recovery. */\n recoverWsReason?: string;\n now?: () => number;\n schedule?: (fn: () => void, ms: number) => ReturnType<typeof setTimeout>;\n cancelSchedule?: (id: ReturnType<typeof setTimeout>) => void;\n};\n\nexport type RecoveryCore = {\n /** Subscribe to lifecycle; idempotent. */\n start: () => void;\n /** Unsubscribe + clear timers; does not dispose WS (hook cleanup does). */\n stop: () => void;\n /** Full recovery: refresh → WS → deferred refetch. */\n recoverApollo: () => Promise<void>;\n /**\n * Call at the start of client reset/logout: bump generation, clear timers,\n * drop recovering guard so in-flight recovery cannot touch the new client.\n */\n prepareClientReset: () => void;\n};\n\nconst DEFAULT_SHORT_BG_REASON = \"short_background\";\nconst DEFAULT_RECOVER_REASON = \"apollo_recover\";\n\n/**\n * Platform-agnostic Apollo idle recovery orchestration (mobile/admin parity).\n *\n * Apps supply lifecycle (AppState / visibility), session refresh, and WS/query\n * side effects. React client ownership stays in each app's useApolloRecovery.\n */\nexport function createRecoveryCore(\n adapters: CreateRecoveryCoreAdapters,\n): RecoveryCore {\n const {\n refreshSession,\n ensureWsConnected,\n disposeWs,\n refetchActiveQueries,\n isActive,\n isOnline,\n subscribeLifecycle,\n shortBackgroundWsReason = DEFAULT_SHORT_BG_REASON,\n recoverWsReason = DEFAULT_RECOVER_REASON,\n now = () => Date.now(),\n schedule = (fn, ms) => setTimeout(fn, ms),\n cancelSchedule = (id) => clearTimeout(id),\n } = adapters;\n\n let recovering = false;\n let resetGeneration = 0;\n let backgroundTime: number | null = null;\n let wsDisposeTimer: ReturnType<typeof setTimeout> | null = null;\n let refetchTimer: ReturnType<typeof setTimeout> | null = null;\n let unsubscribeLifecycle: (() => void) | null = null;\n\n const clearRefetchTimer = () => {\n if (refetchTimer !== null) {\n cancelSchedule(refetchTimer);\n refetchTimer = null;\n }\n };\n\n const clearWsDisposeTimer = () => {\n if (wsDisposeTimer !== null) {\n cancelSchedule(wsDisposeTimer);\n wsDisposeTimer = null;\n }\n };\n\n const canUseNetwork = () => isOnline?.() ?? true;\n\n const scheduleActiveQueryRefetch = (generationAtStart: number) => {\n clearRefetchTimer();\n refetchTimer = schedule(() => {\n refetchTimer = null;\n if (!isActive()) return;\n if (generationAtStart !== resetGeneration) return;\n if (!canUseNetwork()) return;\n refetchActiveQueries();\n }, REFETCH_DELAY_MS);\n };\n\n const handleMovedToBackground = () => {\n clearRefetchTimer();\n backgroundTime = now();\n\n clearWsDisposeTimer();\n wsDisposeTimer = schedule(() => {\n wsDisposeTimer = null;\n disposeWs();\n }, MIN_BACKGROUND_MS);\n };\n\n async function recoverApollo(): Promise<void> {\n if (recovering) return;\n recovering = true;\n const generationAtStart = resetGeneration;\n\n try {\n const shouldRefetch = await refreshSession();\n\n if (generationAtStart !== resetGeneration) return;\n\n ensureWsConnected(recoverWsReason);\n\n if (!isActive()) return;\n\n if (shouldRefetch) {\n scheduleActiveQueryRefetch(generationAtStart);\n }\n } finally {\n if (generationAtStart === resetGeneration) {\n recovering = false;\n }\n }\n }\n\n const handleReturnedToForeground = () => {\n clearWsDisposeTimer();\n\n const bgTime = backgroundTime;\n const elapsed = bgTime != null ? now() - bgTime : MIN_BACKGROUND_MS;\n backgroundTime = null;\n\n if (elapsed >= MIN_BACKGROUND_MS) {\n void recoverApollo();\n return;\n }\n\n ensureWsConnected(shortBackgroundWsReason);\n };\n\n return {\n prepareClientReset() {\n clearRefetchTimer();\n clearWsDisposeTimer();\n backgroundTime = null;\n recovering = false;\n resetGeneration += 1;\n },\n\n recoverApollo,\n\n start() {\n if (unsubscribeLifecycle) return;\n unsubscribeLifecycle = subscribeLifecycle({\n onActive: handleReturnedToForeground,\n onInactive: handleMovedToBackground,\n });\n },\n\n stop() {\n if (unsubscribeLifecycle) {\n unsubscribeLifecycle();\n unsubscribeLifecycle = null;\n }\n clearRefetchTimer();\n clearWsDisposeTimer();\n backgroundTime = null;\n recovering = false;\n },\n };\n}\n"],"mappings":"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","names":["onError","import_client","onError","import_error","import_client","wait","resolveIsDev","maskedTokenInfo"]}
@@ -84,6 +84,17 @@ type CreateRefreshAccessTokenAdapters = {
84
84
  refreshCoordination?: RefreshCoordination;
85
85
  /** Optional recovery telemetry (default: no-op). */
86
86
  onAuthRecoveryEvent?: OnAuthRecoveryEvent;
87
+ /**
88
+ * GraphQL mutation used to refresh tokens. Defaults to `refreshToken`; the
89
+ * mobile impersonation flow passes `refreshImpersonation`.
90
+ */
91
+ refreshMutationName?: string;
92
+ /**
93
+ * GraphQL input type name for the refresh mutation. Defaults to
94
+ * `RefreshTokenInputType`; the impersonation flow passes
95
+ * `RefreshImpersonationInputType`.
96
+ */
97
+ refreshInputTypeName?: string;
87
98
  };
88
99
  type CreateAuthLinkAdapters = {
89
100
  /** Wait until tokens are loaded (mobile tokenManager.awaitReady). */
@@ -84,6 +84,17 @@ type CreateRefreshAccessTokenAdapters = {
84
84
  refreshCoordination?: RefreshCoordination;
85
85
  /** Optional recovery telemetry (default: no-op). */
86
86
  onAuthRecoveryEvent?: OnAuthRecoveryEvent;
87
+ /**
88
+ * GraphQL mutation used to refresh tokens. Defaults to `refreshToken`; the
89
+ * mobile impersonation flow passes `refreshImpersonation`.
90
+ */
91
+ refreshMutationName?: string;
92
+ /**
93
+ * GraphQL input type name for the refresh mutation. Defaults to
94
+ * `RefreshTokenInputType`; the impersonation flow passes
95
+ * `RefreshImpersonationInputType`.
96
+ */
97
+ refreshInputTypeName?: string;
87
98
  };
88
99
  type CreateAuthLinkAdapters = {
89
100
  /** Wait until tokens are loaded (mobile tokenManager.awaitReady). */