@timardex/cluemart-shared 1.5.843 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/{ad-CD820Thg.d.ts → ad-BUYzE6zx.d.ts} +6 -5
  2. package/dist/{ad-Dh0rDcR3.d.mts → ad-BhLoEul3.d.mts} +6 -5
  3. package/dist/{affiliate-C56okox0.d.mts → affiliate-BbtjeUP4.d.mts} +2 -2
  4. package/dist/{affiliate-B28f_U7r.d.ts → affiliate-C51nzKsw.d.ts} +2 -2
  5. package/dist/apollo/index.cjs +7 -4
  6. package/dist/apollo/index.cjs.map +1 -1
  7. package/dist/apollo/index.d.mts +2 -2
  8. package/dist/apollo/index.d.ts +2 -2
  9. package/dist/apollo/index.mjs +7 -4
  10. package/dist/apollo/index.mjs.map +1 -1
  11. package/dist/auth/index.cjs +23 -12
  12. package/dist/auth/index.cjs.map +1 -1
  13. package/dist/auth/index.d.mts +3 -3
  14. package/dist/auth/index.d.ts +3 -3
  15. package/dist/auth/index.mjs +1 -1
  16. package/dist/{chunk-QGEZL577.mjs → chunk-32MKHJTX.mjs} +27 -22
  17. package/dist/chunk-32MKHJTX.mjs.map +1 -0
  18. package/dist/{chunk-4VN5M5JO.mjs → chunk-ILILH7E2.mjs} +1 -1
  19. package/dist/chunk-ILILH7E2.mjs.map +1 -0
  20. package/dist/{chunk-TX3TVIQO.mjs → chunk-LBEJECG3.mjs} +2 -2
  21. package/dist/{chunk-GSPUTUBD.mjs → chunk-PT273XYH.mjs} +502 -391
  22. package/dist/chunk-PT273XYH.mjs.map +1 -0
  23. package/dist/{contactUs-DKhr1NAC.d.ts → contactUs--NoohZBu.d.ts} +1 -1
  24. package/dist/{contactUs-BH5uubk6.d.mts → contactUs-CBWzefUS.d.mts} +1 -1
  25. package/dist/formFields/index.cjs.map +1 -1
  26. package/dist/formFields/index.d.mts +1 -1
  27. package/dist/formFields/index.d.ts +1 -1
  28. package/dist/formFields/index.mjs +2 -2
  29. package/dist/{global-B8kHBTPv.d.ts → global-CUYYxpy2.d.ts} +7 -2
  30. package/dist/{global-JPj82Tvl.d.mts → global-DePDtOFt.d.mts} +7 -2
  31. package/dist/graphql/index.cjs +526 -410
  32. package/dist/graphql/index.cjs.map +1 -1
  33. package/dist/graphql/index.d.mts +401 -178
  34. package/dist/graphql/index.d.ts +401 -178
  35. package/dist/graphql/index.mjs +2 -2
  36. package/dist/hooks/index.cjs +339 -103
  37. package/dist/hooks/index.cjs.map +1 -1
  38. package/dist/hooks/index.d.mts +5 -5
  39. package/dist/hooks/index.d.ts +5 -5
  40. package/dist/hooks/index.mjs +4 -4
  41. package/dist/index.cjs +526 -410
  42. package/dist/index.cjs.map +1 -1
  43. package/dist/index.d.mts +405 -175
  44. package/dist/index.d.ts +405 -175
  45. package/dist/index.mjs +526 -410
  46. package/dist/index.mjs.map +1 -1
  47. package/dist/map/index.d.mts +1 -1
  48. package/dist/map/index.d.ts +1 -1
  49. package/dist/{resourceActivities-DV23pl5i.d.ts → resourceActivities-CMUcn2P7.d.ts} +9 -3
  50. package/dist/{resourceActivities-CZw8My9Z.d.mts → resourceActivities-CwbJFGIp.d.mts} +9 -3
  51. package/dist/sharing/index.d.mts +1 -1
  52. package/dist/sharing/index.d.ts +1 -1
  53. package/dist/types/index.cjs.map +1 -1
  54. package/dist/types/index.d.mts +9 -15
  55. package/dist/types/index.d.ts +9 -15
  56. package/dist/types/index.mjs +1 -1
  57. package/dist/{user-c_sh7aZ_.d.ts → user-D47MLFyH.d.ts} +4 -3
  58. package/dist/{user-B8Y1_VmG.d.mts → user-DE8edl3u.d.mts} +4 -3
  59. package/dist/utils/index.cjs.map +1 -1
  60. package/dist/utils/index.d.mts +3 -3
  61. package/dist/utils/index.d.ts +3 -3
  62. package/dist/utils/index.mjs +2 -2
  63. package/package.json +1 -1
  64. package/dist/chunk-4VN5M5JO.mjs.map +0 -1
  65. package/dist/chunk-GSPUTUBD.mjs.map +0 -1
  66. package/dist/chunk-QGEZL577.mjs.map +0 -1
  67. /package/dist/{chunk-TX3TVIQO.mjs.map → chunk-LBEJECG3.mjs.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  import { EnumPartnerType, EnumResourceType, EnumOSPlatform } from './enums/index.js';
2
- import { A as BaseResourceType, L as LocationType, aw as SocialShareResourceType, B as BaseResourceTypeFormData, D as CreateFormData, as as ResourceContactDetailsType, au as ResourceImageType, av as SocialMediaType, az as TermsAgreement, a5 as OwnerType, aj as PromoCodeType } from './global-B8kHBTPv.js';
2
+ import { D as BaseResourceType, L as LocationType, ax as SocialShareResourceType, B as BaseResourceTypeFormData, H as CreateFormData, at as ResourceContactDetailsType, av as ResourceImageType, aw as SocialMediaType, aA as TermsAgreement, a7 as OwnerType, ak as PromoCodeType, M as MutationResponse } from './global-CUYYxpy2.js';
3
3
  import { PosterAssetId } from './images/index.js';
4
- import { S as SafeUserType } from './user-c_sh7aZ_.js';
4
+ import { S as SafeUserType } from './user-D47MLFyH.js';
5
5
 
6
6
  interface PartnerFormData extends BaseResourceTypeFormData {
7
7
  location: LocationType;
@@ -115,15 +115,16 @@ type ValidateVerificationTokenFormData = {
115
115
  };
116
116
  type CreateValidateVerificationTokenFormData = CreateFormData<ValidateVerificationTokenFormData>;
117
117
  type AuthPayloadType = {
118
- message: string;
119
- token: string;
120
118
  refreshToken: string | null;
119
+ token: string;
121
120
  user: SafeUserType;
122
121
  };
122
+ type AuthMutationResponse = MutationResponse<AuthPayloadType>;
123
123
  type RefreshTokenPayloadType = {
124
124
  refreshToken: string;
125
125
  token: string;
126
126
  };
127
+ type RefreshTokenMutationResponse = MutationResponse<RefreshTokenPayloadType>;
127
128
 
128
129
  declare enum EnumAdShowOn {
129
130
  EVENTS_PAGE = "Events_page",
@@ -177,4 +178,4 @@ interface AdType extends AdFormData {
177
178
  updatedAt: Date | null;
178
179
  }
179
180
 
180
- export { type AuthPayloadType as A, type SchoolCampaignType as B, type CreateLoginFormData as C, type SchoolRegisteredUserType as D, EnumAdStatus as E, type LoginFormData as L, type MarketingMaterialRequestInputType as M, type PartnerType as P, type RefreshTokenPayloadType as R, type SchoolReturnType as S, type ValidateVerificationTokenFormData as V, type AdType as a, type AppSettingsType as b, type SchoolType as c, type CreateRegisterFormData as d, type CreateRequestPasswordResetFormData as e, type CreateValidateVerificationTokenFormData as f, type CreateResetPasswordFormData as g, type PartnerFormData as h, type AdFormData as i, type CreateAdFormState as j, type CreatePartnerFormData as k, type AppSettingsFormData as l, type CreateAppSettingsFormData as m, type SchoolFormData as n, type CreateSchoolFormData as o, type AdFormState as p, type AdResource as q, type CreateAdFormData as r, EnumAdShowOn as s, EnumAdStyle as t, EnumAdType as u, EnumVerificationType as v, type PosterInputType as w, type RegisterFormData as x, type RequestPasswordResetFormData as y, type ResetPasswordFormData as z };
181
+ export { type AuthMutationResponse as A, type RequestPasswordResetFormData as B, type CreateLoginFormData as C, type ResetPasswordFormData as D, EnumAdStatus as E, type SchoolCampaignType as F, type SchoolRegisteredUserType as G, type LoginFormData as L, type MarketingMaterialRequestInputType as M, type PartnerType as P, type RefreshTokenMutationResponse as R, type SchoolType as S, type ValidateVerificationTokenFormData as V, type AdType as a, type AppSettingsType as b, type SchoolReturnType as c, type CreateRegisterFormData as d, type CreateRequestPasswordResetFormData as e, type CreateValidateVerificationTokenFormData as f, type CreateResetPasswordFormData as g, type PartnerFormData as h, type AdFormData as i, type CreateAdFormState as j, type CreatePartnerFormData as k, type AppSettingsFormData as l, type CreateAppSettingsFormData as m, type SchoolFormData as n, type CreateSchoolFormData as o, type AdFormState as p, type AdResource as q, type AuthPayloadType as r, type CreateAdFormData as s, EnumAdShowOn as t, EnumAdStyle as u, EnumAdType as v, EnumVerificationType as w, type PosterInputType as x, type RefreshTokenPayloadType as y, type RegisterFormData as z };
@@ -1,7 +1,7 @@
1
1
  import { EnumPartnerType, EnumResourceType, EnumOSPlatform } from './enums/index.mjs';
2
- import { A as BaseResourceType, L as LocationType, aw as SocialShareResourceType, B as BaseResourceTypeFormData, D as CreateFormData, as as ResourceContactDetailsType, au as ResourceImageType, av as SocialMediaType, az as TermsAgreement, a5 as OwnerType, aj as PromoCodeType } from './global-JPj82Tvl.mjs';
2
+ import { D as BaseResourceType, L as LocationType, ax as SocialShareResourceType, B as BaseResourceTypeFormData, H as CreateFormData, at as ResourceContactDetailsType, av as ResourceImageType, aw as SocialMediaType, aA as TermsAgreement, a7 as OwnerType, ak as PromoCodeType, M as MutationResponse } from './global-DePDtOFt.mjs';
3
3
  import { PosterAssetId } from './images/index.mjs';
4
- import { S as SafeUserType } from './user-B8Y1_VmG.mjs';
4
+ import { S as SafeUserType } from './user-DE8edl3u.mjs';
5
5
 
6
6
  interface PartnerFormData extends BaseResourceTypeFormData {
7
7
  location: LocationType;
@@ -115,15 +115,16 @@ type ValidateVerificationTokenFormData = {
115
115
  };
116
116
  type CreateValidateVerificationTokenFormData = CreateFormData<ValidateVerificationTokenFormData>;
117
117
  type AuthPayloadType = {
118
- message: string;
119
- token: string;
120
118
  refreshToken: string | null;
119
+ token: string;
121
120
  user: SafeUserType;
122
121
  };
122
+ type AuthMutationResponse = MutationResponse<AuthPayloadType>;
123
123
  type RefreshTokenPayloadType = {
124
124
  refreshToken: string;
125
125
  token: string;
126
126
  };
127
+ type RefreshTokenMutationResponse = MutationResponse<RefreshTokenPayloadType>;
127
128
 
128
129
  declare enum EnumAdShowOn {
129
130
  EVENTS_PAGE = "Events_page",
@@ -177,4 +178,4 @@ interface AdType extends AdFormData {
177
178
  updatedAt: Date | null;
178
179
  }
179
180
 
180
- export { type AuthPayloadType as A, type SchoolCampaignType as B, type CreateLoginFormData as C, type SchoolRegisteredUserType as D, EnumAdStatus as E, type LoginFormData as L, type MarketingMaterialRequestInputType as M, type PartnerType as P, type RefreshTokenPayloadType as R, type SchoolReturnType as S, type ValidateVerificationTokenFormData as V, type AdType as a, type AppSettingsType as b, type SchoolType as c, type CreateRegisterFormData as d, type CreateRequestPasswordResetFormData as e, type CreateValidateVerificationTokenFormData as f, type CreateResetPasswordFormData as g, type PartnerFormData as h, type AdFormData as i, type CreateAdFormState as j, type CreatePartnerFormData as k, type AppSettingsFormData as l, type CreateAppSettingsFormData as m, type SchoolFormData as n, type CreateSchoolFormData as o, type AdFormState as p, type AdResource as q, type CreateAdFormData as r, EnumAdShowOn as s, EnumAdStyle as t, EnumAdType as u, EnumVerificationType as v, type PosterInputType as w, type RegisterFormData as x, type RequestPasswordResetFormData as y, type ResetPasswordFormData as z };
181
+ export { type AuthMutationResponse as A, type RequestPasswordResetFormData as B, type CreateLoginFormData as C, type ResetPasswordFormData as D, EnumAdStatus as E, type SchoolCampaignType as F, type SchoolRegisteredUserType as G, type LoginFormData as L, type MarketingMaterialRequestInputType as M, type PartnerType as P, type RefreshTokenMutationResponse as R, type SchoolType as S, type ValidateVerificationTokenFormData as V, type AdType as a, type AppSettingsType as b, type SchoolReturnType as c, type CreateRegisterFormData as d, type CreateRequestPasswordResetFormData as e, type CreateValidateVerificationTokenFormData as f, type CreateResetPasswordFormData as g, type PartnerFormData as h, type AdFormData as i, type CreateAdFormState as j, type CreatePartnerFormData as k, type AppSettingsFormData as l, type CreateAppSettingsFormData as m, type SchoolFormData as n, type CreateSchoolFormData as o, type AdFormState as p, type AdResource as q, type AuthPayloadType as r, type CreateAdFormData as s, EnumAdShowOn as t, EnumAdStyle as u, EnumAdType as v, EnumVerificationType as w, type PosterInputType as x, type RefreshTokenPayloadType as y, type RegisterFormData as z };
@@ -1,6 +1,6 @@
1
1
  import { EnumResourceType } from './enums/index.mjs';
2
- import { aj as PromoCodeType, L as LocationType, av as SocialMediaType, a5 as OwnerType, D as CreateFormData } from './global-JPj82Tvl.mjs';
3
- import { U as UserFormData } from './user-B8Y1_VmG.mjs';
2
+ import { ak as PromoCodeType, L as LocationType, aw as SocialMediaType, a7 as OwnerType, H as CreateFormData } from './global-DePDtOFt.mjs';
3
+ import { U as UserFormData } from './user-DE8edl3u.mjs';
4
4
 
5
5
  declare enum EnumAffiliateParticipantType {
6
6
  INDIVIDUAL = "INDIVIDUAL",
@@ -1,6 +1,6 @@
1
1
  import { EnumResourceType } from './enums/index.js';
2
- import { aj as PromoCodeType, L as LocationType, av as SocialMediaType, a5 as OwnerType, D as CreateFormData } from './global-B8kHBTPv.js';
3
- import { U as UserFormData } from './user-c_sh7aZ_.js';
2
+ import { ak as PromoCodeType, L as LocationType, aw as SocialMediaType, a7 as OwnerType, H as CreateFormData } from './global-CUYYxpy2.js';
3
+ import { U as UserFormData } from './user-D47MLFyH.js';
4
4
 
5
5
  declare enum EnumAffiliateParticipantType {
6
6
  INDIVIDUAL = "INDIVIDUAL",
@@ -388,8 +388,11 @@ function createErrorLink(adapters) {
388
388
  var REFRESH_TOKEN_QUERY = `
389
389
  mutation refreshToken($input: RefreshTokenInputType!) {
390
390
  refreshToken(input: $input) {
391
- token
392
- refreshToken
391
+ data {
392
+ token
393
+ refreshToken
394
+ }
395
+ message
393
396
  }
394
397
  }
395
398
  `;
@@ -479,8 +482,8 @@ function createRefreshAccessToken(adapters) {
479
482
  }
480
483
  return { errorCode, errors, kind: "terminal_graphql" };
481
484
  }
482
- const newToken = json?.data?.refreshToken?.token;
483
- const newRefreshToken = json?.data?.refreshToken?.refreshToken;
485
+ const newToken = json?.data?.refreshToken?.data?.token;
486
+ const newRefreshToken = json?.data?.refreshToken?.data?.refreshToken;
484
487
  if (newToken && newRefreshToken) {
485
488
  await storage.setTokens(newToken, newRefreshToken);
486
489
  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/** Completes the observer for transient refresh failures (do not logout). */\nfunction handleRetryableRefreshFailure(observer: AuthRecoveryObserver): void {\n if (!observer.isClosed()) observer.complete();\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 handleRetryableRefreshFailure(observer);\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 without destructuring properties that\n * Apollo marks deprecated (`graphQLErrors`, `networkError`, `response`).\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 {\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 token\n refreshToken\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?: { refreshToken?: { token?: string; refreshToken?: string } };\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?.token;\n const newRefreshToken = json?.data?.refreshToken?.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\n const unsub = adapters.subscribeIsOnline((online) => {\n if (aborted()) {\n if (intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n unsub();\n resolve();\n return;\n }\n if (online) {\n if (intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n unsub();\n resolve();\n }\n });\n\n intervalId = setInterval(() => {\n if (aborted()) {\n if (intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n unsub();\n resolve();\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/** Completes the observer for transient refresh failures (do not logout). */\nfunction handleRetryableRefreshFailure(observer: AuthRecoveryObserver): void {\n if (!observer.isClosed()) observer.complete();\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 handleRetryableRefreshFailure(observer);\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\n const unsub = adapters.subscribeIsOnline((online) => {\n if (aborted()) {\n if (intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n unsub();\n resolve();\n return;\n }\n if (online) {\n if (intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n unsub();\n resolve();\n }\n });\n\n intervalId = setInterval(() => {\n if (aborted()) {\n if (intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n unsub();\n resolve();\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"]}
@@ -267,8 +267,8 @@ declare const MIN_BACKGROUND_MS = 30000;
267
267
  declare const REFETCH_DELAY_MS = 500;
268
268
 
269
269
  /**
270
- * Reads AC3 ErrorResponse fields without destructuring properties that
271
- * Apollo marks deprecated (`graphQLErrors`, `networkError`, `response`).
270
+ * Reads AC3 ErrorResponse fields via property access instead of destructuring
271
+ * (`graphQLErrors`, `networkError`, `response`) to avoid Apollo Client warnings.
272
272
  */
273
273
  declare function readErrorResponseFields(errorResponse: unknown): {
274
274
  graphQLErrors: GraphQLErrorLike[] | undefined;
@@ -267,8 +267,8 @@ declare const MIN_BACKGROUND_MS = 30000;
267
267
  declare const REFETCH_DELAY_MS = 500;
268
268
 
269
269
  /**
270
- * Reads AC3 ErrorResponse fields without destructuring properties that
271
- * Apollo marks deprecated (`graphQLErrors`, `networkError`, `response`).
270
+ * Reads AC3 ErrorResponse fields via property access instead of destructuring
271
+ * (`graphQLErrors`, `networkError`, `response`) to avoid Apollo Client warnings.
272
272
  */
273
273
  declare function readErrorResponseFields(errorResponse: unknown): {
274
274
  graphQLErrors: GraphQLErrorLike[] | undefined;
@@ -344,8 +344,11 @@ function createErrorLink(adapters) {
344
344
  var REFRESH_TOKEN_QUERY = `
345
345
  mutation refreshToken($input: RefreshTokenInputType!) {
346
346
  refreshToken(input: $input) {
347
- token
348
- refreshToken
347
+ data {
348
+ token
349
+ refreshToken
350
+ }
351
+ message
349
352
  }
350
353
  }
351
354
  `;
@@ -435,8 +438,8 @@ function createRefreshAccessToken(adapters) {
435
438
  }
436
439
  return { errorCode, errors, kind: "terminal_graphql" };
437
440
  }
438
- const newToken = json?.data?.refreshToken?.token;
439
- const newRefreshToken = json?.data?.refreshToken?.refreshToken;
441
+ const newToken = json?.data?.refreshToken?.data?.token;
442
+ const newRefreshToken = json?.data?.refreshToken?.data?.refreshToken;
440
443
  if (newToken && newRefreshToken) {
441
444
  await storage.setTokens(newToken, newRefreshToken);
442
445
  onTokensUpdated?.(newToken);