@timardex/cluemart-shared 1.7.55 → 1.7.57

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 (57) hide show
  1. package/dist/{ad-DgFNz7LE.d.mts → ad-CCuXkAAt.d.mts} +2 -2
  2. package/dist/{ad--1Dgx3EQ.d.ts → ad-wW8fzT4I.d.ts} +2 -2
  3. package/dist/{affiliate-BtxKsl7M.d.ts → affiliate-BSWxq9Uv.d.ts} +2 -2
  4. package/dist/{affiliate-CyELKIG-.d.mts → affiliate-CaP_IFPL.d.mts} +2 -2
  5. package/dist/apollo/index.cjs +30 -23
  6. package/dist/apollo/index.cjs.map +1 -1
  7. package/dist/apollo/index.mjs +30 -23
  8. package/dist/apollo/index.mjs.map +1 -1
  9. package/dist/auth/index.d.mts +3 -3
  10. package/dist/auth/index.d.ts +3 -3
  11. package/dist/{chunk-QYHJKAVQ.mjs → chunk-5D2JVHC2.mjs} +1 -3
  12. package/dist/chunk-5D2JVHC2.mjs.map +1 -0
  13. package/dist/{chunk-7RQ6PC7B.mjs → chunk-P4JLZCWZ.mjs} +5 -5
  14. package/dist/chunk-P4JLZCWZ.mjs.map +1 -0
  15. package/dist/{contactUs-kzob0wKa.d.mts → contactUs-B7wv2hjk.d.mts} +1 -1
  16. package/dist/{contactUs-CX1bTZ9V.d.ts → contactUs-CArD2hbK.d.ts} +1 -1
  17. package/dist/formFields/index.cjs +3 -3
  18. package/dist/formFields/index.cjs.map +1 -1
  19. package/dist/formFields/index.d.mts +1 -1
  20. package/dist/formFields/index.d.ts +1 -1
  21. package/dist/formFields/index.mjs +2 -2
  22. package/dist/{global-CcE-PQOR.d.mts → global-ho4a3lOA.d.mts} +0 -2
  23. package/dist/{global-CdSsPQHl.d.ts → global-xmZHaJhe.d.ts} +0 -2
  24. package/dist/graphql/index.d.mts +5 -5
  25. package/dist/graphql/index.d.ts +5 -5
  26. package/dist/hooks/index.cjs +3 -5
  27. package/dist/hooks/index.cjs.map +1 -1
  28. package/dist/hooks/index.d.mts +5 -5
  29. package/dist/hooks/index.d.ts +5 -5
  30. package/dist/hooks/index.mjs +2 -2
  31. package/dist/index.cjs +3 -5
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.d.mts +0 -2
  34. package/dist/index.d.ts +0 -2
  35. package/dist/index.mjs +3 -5
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/map/index.d.mts +1 -1
  38. package/dist/map/index.d.ts +1 -1
  39. package/dist/{resourceActivities-Cjvh0Szg.d.ts → resourceActivities-BPNPHXgT.d.ts} +1 -1
  40. package/dist/{resourceActivities-D36XsiZQ.d.mts → resourceActivities-CWVdldcS.d.mts} +1 -1
  41. package/dist/sharing/index.d.mts +1 -1
  42. package/dist/sharing/index.d.ts +1 -1
  43. package/dist/types/index.cjs +0 -2
  44. package/dist/types/index.cjs.map +1 -1
  45. package/dist/types/index.d.mts +7 -7
  46. package/dist/types/index.d.ts +7 -7
  47. package/dist/types/index.mjs +1 -1
  48. package/dist/{user-CQC_FzHj.d.ts → user-B6RYIUjX.d.ts} +1 -1
  49. package/dist/{user-D2Dww93Z.d.mts → user-Cz3XuyJU.d.mts} +1 -1
  50. package/dist/utils/index.cjs +3 -3
  51. package/dist/utils/index.cjs.map +1 -1
  52. package/dist/utils/index.d.mts +3 -3
  53. package/dist/utils/index.d.ts +3 -3
  54. package/dist/utils/index.mjs +2 -2
  55. package/package.json +1 -1
  56. package/dist/chunk-7RQ6PC7B.mjs.map +0 -1
  57. package/dist/chunk-QYHJKAVQ.mjs.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { EnumPartnerType, EnumResourceType, EnumOSPlatform } from './enums/index.mjs';
2
- import { Q as BaseResourceType, L as LocationType, B as BaseResourceTypeFormData, a2 as CreateFormData, aL as ResourceContactDetailsType, aN as ResourceImageType, aO as SocialMediaType, aS as TermsAgreement, ao as OwnerType, aC as PromoCodeType, M as MutationResponse } from './global-CcE-PQOR.mjs';
2
+ import { Q as BaseResourceType, L as LocationType, B as BaseResourceTypeFormData, a2 as CreateFormData, aL as ResourceContactDetailsType, aN as ResourceImageType, aO as SocialMediaType, aS as TermsAgreement, ao as OwnerType, aC as PromoCodeType, M as MutationResponse } from './global-ho4a3lOA.mjs';
3
3
  import { PosterAssetId } from './images/index.mjs';
4
- import { S as SafeUserType } from './user-D2Dww93Z.mjs';
4
+ import { S as SafeUserType } from './user-Cz3XuyJU.mjs';
5
5
 
6
6
  interface PartnerFormData extends BaseResourceTypeFormData {
7
7
  location: LocationType;
@@ -1,7 +1,7 @@
1
1
  import { EnumPartnerType, EnumResourceType, EnumOSPlatform } from './enums/index.js';
2
- import { Q as BaseResourceType, L as LocationType, B as BaseResourceTypeFormData, a2 as CreateFormData, aL as ResourceContactDetailsType, aN as ResourceImageType, aO as SocialMediaType, aS as TermsAgreement, ao as OwnerType, aC as PromoCodeType, M as MutationResponse } from './global-CdSsPQHl.js';
2
+ import { Q as BaseResourceType, L as LocationType, B as BaseResourceTypeFormData, a2 as CreateFormData, aL as ResourceContactDetailsType, aN as ResourceImageType, aO as SocialMediaType, aS as TermsAgreement, ao as OwnerType, aC as PromoCodeType, M as MutationResponse } from './global-xmZHaJhe.js';
3
3
  import { PosterAssetId } from './images/index.js';
4
- import { S as SafeUserType } from './user-CQC_FzHj.js';
4
+ import { S as SafeUserType } from './user-B6RYIUjX.js';
5
5
 
6
6
  interface PartnerFormData extends BaseResourceTypeFormData {
7
7
  location: LocationType;
@@ -1,6 +1,6 @@
1
1
  import { EnumResourceType } from './enums/index.js';
2
- import { aC as PromoCodeType, L as LocationType, aO as SocialMediaType, ao as OwnerType, a2 as CreateFormData } from './global-CdSsPQHl.js';
3
- import { U as UserFormData } from './user-CQC_FzHj.js';
2
+ import { aC as PromoCodeType, L as LocationType, aO as SocialMediaType, ao as OwnerType, a2 as CreateFormData } from './global-xmZHaJhe.js';
3
+ import { U as UserFormData } from './user-B6RYIUjX.js';
4
4
 
5
5
  declare enum EnumAffiliateParticipantType {
6
6
  INDIVIDUAL = "INDIVIDUAL",
@@ -1,6 +1,6 @@
1
1
  import { EnumResourceType } from './enums/index.mjs';
2
- import { aC as PromoCodeType, L as LocationType, aO as SocialMediaType, ao as OwnerType, a2 as CreateFormData } from './global-CcE-PQOR.mjs';
3
- import { U as UserFormData } from './user-D2Dww93Z.mjs';
2
+ import { aC as PromoCodeType, L as LocationType, aO as SocialMediaType, ao as OwnerType, a2 as CreateFormData } from './global-ho4a3lOA.mjs';
3
+ import { U as UserFormData } from './user-Cz3XuyJU.mjs';
4
4
 
5
5
  declare enum EnumAffiliateParticipantType {
6
6
  INDIVIDUAL = "INDIVIDUAL",
@@ -867,34 +867,41 @@ function waitForOnline(adapters, aborted) {
867
867
  return;
868
868
  }
869
869
  let intervalId = null;
870
- const unsub = adapters.subscribeIsOnline((online) => {
871
- if (aborted()) {
872
- if (intervalId !== null) {
873
- clearInterval(intervalId);
874
- intervalId = null;
875
- }
876
- unsub();
877
- resolve();
878
- return;
870
+ let settled = false;
871
+ let polling = false;
872
+ let unsub = null;
873
+ const settle = () => {
874
+ if (settled) return;
875
+ settled = true;
876
+ if (intervalId !== null) {
877
+ clearInterval(intervalId);
878
+ intervalId = null;
879
879
  }
880
- if (online) {
881
- if (intervalId !== null) {
882
- clearInterval(intervalId);
883
- intervalId = null;
884
- }
885
- unsub();
886
- resolve();
880
+ unsub?.();
881
+ resolve();
882
+ };
883
+ unsub = adapters.subscribeIsOnline((online) => {
884
+ if (aborted() || online) {
885
+ settle();
887
886
  }
888
887
  });
888
+ if (settled) {
889
+ unsub?.();
890
+ return;
891
+ }
889
892
  intervalId = setInterval(() => {
890
- if (aborted()) {
891
- if (intervalId !== null) {
892
- clearInterval(intervalId);
893
- intervalId = null;
894
- }
895
- unsub();
896
- resolve();
893
+ if (aborted() || settled) {
894
+ settle();
895
+ return;
897
896
  }
897
+ if (polling) return;
898
+ polling = true;
899
+ void Promise.resolve(adapters.forceRefreshIsOnline()).then((online) => {
900
+ if (settled || aborted()) return;
901
+ if (online) settle();
902
+ }).catch(() => void 0).finally(() => {
903
+ polling = false;
904
+ });
898
905
  }, 500);
899
906
  });
900
907
  }
@@ -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 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"]}
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 let settled = false;\n let polling = false;\n let unsub: (() => void) | null = null;\n\n const settle = () => {\n if (settled) return;\n settled = true;\n if (intervalId !== null) {\n clearInterval(intervalId);\n intervalId = null;\n }\n unsub?.();\n resolve();\n };\n\n unsub = adapters.subscribeIsOnline((online) => {\n if (aborted() || online) {\n settle();\n }\n });\n\n // The adapter may invoke its listener synchronously (a common pattern for\n // adapters that emit the current state on subscribe). settle() ran before\n // `unsub` was assigned, so release the subscription and skip the poll.\n if (settled) {\n unsub?.();\n return;\n }\n\n // Poll the real online state so a stale/false \"offline\" reading (e.g. the\n // expo-network isInternetReachable quirk) doesn't park the query forever.\n // The push listener above remains the fast path; this is the self-heal.\n intervalId = setInterval(() => {\n if (aborted() || settled) {\n settle();\n return;\n }\n if (polling) return;\n polling = true;\n void Promise.resolve(adapters.forceRefreshIsOnline())\n .then((online) => {\n if (settled || aborted()) return;\n if (online) settle();\n })\n .catch(() => undefined)\n .finally(() => {\n polling = false;\n });\n }, 500);\n });\n}\n\nfunction cleanupRecoveryState(state: QueryRecoveryState): void {\n state.innerSub?.unsubscribe();\n state.innerSub = null;\n}\n\nasync function ensureOnlineOrWait(state: QueryRecoveryState): Promise<boolean> {\n const online = await state.adapters.forceRefreshIsOnline();\n if (online) return !state.unsubscribed;\n\n await waitForOnline(state.adapters, () => state.unsubscribed);\n return !state.unsubscribed;\n}\n\n/* eslint-disable no-use-before-define -- mutual recursion between attempt + error handlers */\nasync function handleQueryNetworkError(\n state: QueryRecoveryState,\n err: unknown,\n attempt: number,\n): Promise<void> {\n if (state.unsubscribed) return;\n\n if (!isRetryableNetworkFailure(err)) {\n emitError(state, err);\n return;\n }\n\n const nowOnline = await state.adapters.forceRefreshIsOnline();\n if (state.unsubscribed) return;\n\n if (!nowOnline) {\n await waitForOnline(state.adapters, () => state.unsubscribed);\n if (state.unsubscribed) return;\n cleanupRecoveryState(state);\n void runQueryAttempt(state, attempt);\n return;\n }\n\n if (attempt >= MAX_RETRIES) {\n emitError(state, err);\n return;\n }\n\n await wait(BACKOFF_MS[attempt] ?? 4000);\n if (state.unsubscribed) return;\n cleanupRecoveryState(state);\n void runQueryAttempt(state, attempt + 1);\n}\n\nasync function runQueryAttempt(\n state: QueryRecoveryState,\n attempt: number,\n): Promise<void> {\n if (state.unsubscribed) return;\n\n const canContinue = await ensureOnlineOrWait(state);\n if (!canContinue) return;\n\n try {\n state.innerSub = state.forward(state.operation).subscribe({\n complete: () => emitComplete(state),\n error: (err) => {\n if (!isRetryableNetworkFailure(err)) {\n emitError(state, err);\n return;\n }\n void handleQueryNetworkError(state, err, attempt);\n },\n next: (value) => emitNext(state, value),\n });\n } catch (e) {\n emitError(state, e);\n }\n}\n/* eslint-enable no-use-before-define */\n\n/**\n * Apollo link that pauses and retries **queries** after transient network failures.\n * Mutations and subscriptions pass through unchanged.\n */\nexport function createNetworkRecoveryLink(\n adapters: CreateNetworkRecoveryLinkAdapters,\n): ApolloLink {\n return new ApolloLink((operation, forward) => {\n if (!forward) {\n return null;\n }\n\n if (!isQueryOperation(operation)) {\n return forward(operation);\n }\n\n return new Observable((observer) => {\n const state: QueryRecoveryState = {\n adapters,\n forward,\n innerSub: null,\n observer,\n operation,\n unsubscribed: false,\n };\n\n void runQueryAttempt(state, 0);\n\n return () => {\n state.unsubscribed = true;\n cleanupRecoveryState(state);\n };\n });\n });\n}\n","const TRANSIENT_NETWORK_PATTERNS = [\n /network connection was lost/i,\n /network request failed/i,\n /fetch failed/i,\n /failed to fetch/i,\n /internet connection appears to be offline/i,\n // Transport-layer timeouts only — avoid generic \"timeout\" (backend/query timeouts).\n /\\b(request|connection|network)\\s+timed\\s+out\\b/i,\n /\\b(connect|read|write|socket)\\s+timeout\\b/i,\n /\\bsocket\\s+timed\\s+out\\b/i,\n /\\betimedout\\b/i,\n /\\benotfound\\b/i,\n /\\beconnreset\\b/i,\n /\\beconnrefused\\b/i,\n] as const;\n\nfunction extractErrorMessage(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (typeof err === \"string\") return err;\n if (err && typeof err === \"object\") {\n const obj = err as Record<string, unknown>;\n if (typeof obj.message === \"string\") return obj.message;\n if (obj.networkError) return extractErrorMessage(obj.networkError);\n try {\n return JSON.stringify(err);\n } catch {\n return \"[object]\";\n }\n }\n if (err == null) return \"\";\n if (\n typeof err === \"number\" ||\n typeof err === \"boolean\" ||\n typeof err === \"bigint\"\n ) {\n return String(err);\n }\n if (typeof err === \"symbol\") return err.toString();\n return \"\";\n}\n\n/** True for short-lived connectivity failures (e.g. resume before the stack is ready). */\nexport function isTransientNetworkError(err: unknown): boolean {\n const message = extractErrorMessage(err);\n return TRANSIENT_NETWORK_PATTERNS.some((pattern) => pattern.test(message));\n}\n","import { safeJsonStringify } from \"./toStructuredError\";\n\nexport type NetworkLogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type CreateNetworkLogAdapters = {\n enabled: boolean | (() => boolean);\n};\n\nfunction resolveEnabled(enabled: boolean | (() => boolean)): boolean {\n return typeof enabled === \"function\" ? enabled() : enabled;\n}\n\n/**\n * Structured network/auth/WS console logger (mobile format: prefix + JSON payload).\n */\nexport function createNetworkLog(adapters: CreateNetworkLogAdapters) {\n const { enabled } = adapters;\n\n return function networkLog(\n level: NetworkLogLevel,\n scope: string,\n message: string,\n details?: Record<string, unknown>,\n ) {\n if (!resolveEnabled(enabled)) return;\n\n const payload = details ? safeJsonStringify(details) : \"\";\n const prefix = `[${scope}] ${message}`;\n\n let logger: (...args: unknown[]) => void;\n switch (level) {\n case \"debug\":\n logger = console.debug;\n break;\n case \"info\":\n logger = console.info;\n break;\n case \"warn\":\n logger = console.warn;\n break;\n case \"error\":\n default:\n logger = console.error;\n break;\n }\n logger(payload ? `${prefix}\\n${payload}` : prefix);\n };\n}\n","import { createClient, type Client } from \"graphql-ws\";\n\nimport type { NetworkLogLevel } from \"./createNetworkLog\";\nimport { toStructuredError } from \"./toStructuredError\";\n\nconst WS_SCOPE = \"ws\";\nconst MIN_RECONNECT_MS = 1000;\nconst MAX_RECONNECT_MS = 10_000;\n\n/**\n * Client-initiated close to restart the transport without disposing the `graphql-ws`\n * client. Active `subscribe()` loops keep running and re-handshake with fresh\n * `connectionParams` (see graphql-ws recipes). Not a protocol fatal code.\n */\nconst WS_CLIENT_RESTART_CODE = 4205;\n\nconst MAX_WS_RETRY_ATTEMPTS = 30;\nconst WS_READY_STATE_OPEN = 1;\nconst WS_READY_STATE_CONNECTING = 0;\n\nexport type CreateWsManagerAdapters = {\n getWsUrl: () => string;\n awaitReady: () => Promise<void>;\n getAccessToken: () => string | null;\n isActive: () => boolean;\n /** Subscribe to inactive/active transitions; return unsubscribe. */\n subscribeLifecycle: (handlers: {\n onInactive: () => void;\n onActive: () => void;\n }) => () => void;\n onLog?: (\n level: NetworkLogLevel,\n scope: string,\n message: string,\n details?: Record<string, unknown>,\n ) => void;\n isDev?: boolean | (() => boolean);\n};\n\nexport type WsManager = {\n initLifecycleListener: () => void;\n getClient: () => Client;\n ensureConnected: (reason: string) => void;\n onAuthTokenChanged: (reason: string) => void;\n close: (reason: string) => void;\n dispose: () => void;\n};\n\nfunction resolveIsDev(isDev: boolean | (() => boolean) | undefined): boolean {\n if (isDev == null) return false;\n return typeof isDev === \"function\" ? isDev() : isDev;\n}\n\nfunction maskedTokenInfo(token: string) {\n const len = token.length;\n const start = token.slice(0, 4);\n const end = token.slice(-4);\n return { end, len, start };\n}\n\nfunction computeBackoffMs(attempt: number): number {\n // Exponential backoff with a small deterministic spread to reduce reconnect stampedes.\n // Avoid Math.random() (Sonar S2245) — jitter here is not security-sensitive.\n const exp = Math.min(MIN_RECONNECT_MS * 2 ** attempt, MAX_RECONNECT_MS);\n const jitter = (attempt * 37 + 17) % 250;\n return Math.min(exp + jitter, MAX_RECONNECT_MS);\n}\n\nfunction wsCloseReason(reason: string): string {\n const trimmed = reason.trim().slice(0, 100);\n return trimmed || \"restart\";\n}\n\n/**\n * Platform-agnostic graphql-ws client manager (mobile-shaped).\n * Apps supply lifecycle (AppState / visibility), token access, and logging.\n */\nexport function createWsManager(adapters: CreateWsManagerAdapters): WsManager {\n const {\n getWsUrl,\n awaitReady,\n getAccessToken,\n isActive,\n subscribeLifecycle,\n onLog,\n isDev,\n } = adapters;\n\n const log = (\n level: NetworkLogLevel,\n message: string,\n details?: Record<string, unknown>,\n ) => {\n onLog?.(level, WS_SCOPE, message, details);\n };\n\n let client: Client | null = null;\n let activeSocket: WebSocket | null = null;\n let unsubscribeLifecycle: (() => void) | null = null;\n\n const ensureConnectedRef: { current: (reason: string) => void } = {\n current: () => undefined,\n };\n\n const close = (reason: string) => {\n activeSocket = null;\n if (client) {\n try {\n log(\"debug\", \"Disposing WS client\", { reason });\n client.dispose();\n } catch (e) {\n log(\"warn\", \"Error while disposing WS client\", {\n error: toStructuredError(e),\n reason,\n });\n }\n }\n client = null;\n };\n\n const createNewClient = (): Client => {\n const url = getWsUrl();\n\n return createClient({\n connectionParams: async () => {\n try {\n await awaitReady();\n } catch (e) {\n log(\"error\", \"WS auth params: awaitReady failed\", {\n error: toStructuredError(e),\n });\n return {};\n }\n\n const token = getAccessToken();\n if (!token) {\n if (resolveIsDev(isDev)) {\n log(\"warn\", \"WS auth params: missing token\", {});\n }\n return {};\n }\n\n if (resolveIsDev(isDev)) {\n log(\"debug\", \"WS connecting with token\", {\n token: maskedTokenInfo(token),\n });\n }\n\n const bearer = `Bearer ${token}`;\n return { Authorization: bearer, authorization: bearer };\n },\n keepAlive: 20_000,\n lazy: true,\n on: {\n closed: (ev: unknown) => {\n activeSocket = null;\n log(\"warn\", \"WS closed\", {\n close: toStructuredError(ev),\n url,\n });\n },\n connected: (socket: unknown) => {\n activeSocket = socket as WebSocket;\n log(\"info\", \"WS connected\", { url });\n },\n connecting: () => {\n log(\"debug\", \"WS connecting\", { url });\n },\n error: (err: unknown) => {\n const structuredError = toStructuredError(err);\n const hasStructuredDetails =\n structuredError != null &&\n (typeof structuredError !== \"object\" ||\n Array.isArray(structuredError) ||\n Object.keys(structuredError).length > 0);\n const logLevel = hasStructuredDetails ? \"error\" : \"warn\";\n const logMessage = hasStructuredDetails\n ? \"WS error\"\n : \"WS error (empty payload)\";\n\n log(\n logLevel,\n logMessage,\n hasStructuredDetails ? { error: structuredError, url } : { url },\n );\n },\n },\n retryAttempts: MAX_WS_RETRY_ATTEMPTS,\n retryWait: async (retries: number) => {\n await new Promise<void>((resolve) =>\n setTimeout(resolve, computeBackoffMs(retries)),\n );\n },\n url,\n });\n };\n\n const initLifecycleListener = () => {\n if (unsubscribeLifecycle) return;\n\n unsubscribeLifecycle = subscribeLifecycle({\n onActive: () => {\n log(\"debug\", \"Lifecycle active; allowing reconnect\", {});\n ensureConnectedRef.current(\"lifecycle_active\");\n },\n onInactive: () => {\n log(\"debug\", \"Lifecycle inactive; closing WS\", {});\n close(\"lifecycle_inactive\");\n },\n });\n };\n\n const getClient = (): Client => {\n initLifecycleListener();\n if (!client) {\n client = createNewClient();\n }\n return client;\n };\n\n const nudgeSocketReconnect = (reason: string) => {\n if (!isActive()) return;\n\n const token = getAccessToken();\n if (!token) {\n if (resolveIsDev(isDev)) {\n log(\"warn\", \"WS restart blocked (missing token)\", { reason });\n }\n close(`blocked_missing_token:${reason}`);\n return;\n }\n\n if (client === null) {\n client = createNewClient();\n log(\"debug\", \"WS client created\", { reason });\n return;\n }\n\n const socket = activeSocket;\n if (socket !== null) {\n const { readyState } = socket;\n if (\n readyState === WS_READY_STATE_OPEN ||\n readyState === WS_READY_STATE_CONNECTING\n ) {\n try {\n socket.close(WS_CLIENT_RESTART_CODE, wsCloseReason(reason));\n log(\"debug\", \"WS socket restart (same client)\", { reason });\n } catch (e) {\n log(\"warn\", \"WS socket close failed\", {\n error: toStructuredError(e),\n reason,\n });\n }\n }\n return;\n }\n\n if (resolveIsDev(isDev)) {\n log(\"debug\", \"WS nudge: no open socket (library retry)\", { reason });\n }\n };\n\n const ensureConnected = (reason: string) => {\n initLifecycleListener();\n\n if (!isActive()) {\n log(\"debug\", \"Skip ensureConnected while inactive\", { reason });\n return;\n }\n\n awaitReady()\n .then(() => {\n const token = getAccessToken();\n if (!token) {\n if (resolveIsDev(isDev)) {\n log(\"warn\", \"WS blocked (missing token)\", { reason });\n }\n return;\n }\n getClient();\n })\n .catch((e) => {\n log(\"error\", \"WS ensureConnected failed\", {\n error: toStructuredError(e),\n reason,\n });\n });\n };\n ensureConnectedRef.current = ensureConnected;\n\n const onAuthTokenChanged = (reason: string) => {\n if (resolveIsDev(isDev)) {\n log(\"debug\", \"Auth token changed; reconnecting WS\", { reason });\n }\n nudgeSocketReconnect(`auth_token_changed:${reason}`);\n };\n\n const dispose = () => {\n close(\"dispose\");\n if (unsubscribeLifecycle) {\n unsubscribeLifecycle();\n unsubscribeLifecycle = null;\n }\n };\n\n return {\n close,\n dispose,\n ensureConnected,\n getClient,\n initLifecycleListener,\n onAuthTokenChanged,\n };\n}\n","/**\n * Idle / background thresholds for Apollo recovery after the app or tab\n * returns to the foreground.\n *\n * These are **independent of the server access-token TTL** (currently 15\n * minutes on the ClueMart auth service). Recovery is driven by how long the\n * client was backgrounded/hidden, not by JWT `exp`.\n *\n * Any future proactive refresh-near-expiry logic is a separate mechanism and\n * must not reuse these constants as a stand-in for token lifetime.\n */\nexport const MIN_BACKGROUND_MS = 30_000;\n\n/**\n * Delay after a successful long-background recovery before refetching active\n * Apollo queries (gives networking a moment to stabilize, especially on iOS).\n *\n * Independent of the server's access-token TTL (see `MIN_BACKGROUND_MS`).\n */\nexport const REFETCH_DELAY_MS = 500;\n","import { MIN_BACKGROUND_MS, REFETCH_DELAY_MS } from \"./recoveryConstants\";\n\nexport type CreateRecoveryCoreAdapters = {\n /** Refresh tokens / user; `true` = schedule active-query refetch. */\n refreshSession: () => Promise<boolean>;\n ensureWsConnected: (reason: string) => void;\n disposeWs: () => void;\n refetchActiveQueries: () => void;\n /** Foreground / visible check (AppState active, document visible, …). */\n isActive: () => boolean;\n /**\n * Optional online check. When omitted, treated as online (current app behavior —\n * query pause is handled by networkRecoveryLink).\n */\n isOnline?: () => boolean;\n /** Same shape as createWsManager lifecycle adapter. */\n subscribeLifecycle: (handlers: {\n onInactive: () => void;\n onActive: () => void;\n }) => () => void;\n /** WS ensureConnected reason after a short background hop. */\n shortBackgroundWsReason?: string;\n /** WS ensureConnected reason after full recovery. */\n recoverWsReason?: string;\n now?: () => number;\n schedule?: (fn: () => void, ms: number) => ReturnType<typeof setTimeout>;\n cancelSchedule?: (id: ReturnType<typeof setTimeout>) => void;\n};\n\nexport type RecoveryCore = {\n /** Subscribe to lifecycle; idempotent. */\n start: () => void;\n /** Unsubscribe + clear timers; does not dispose WS (hook cleanup does). */\n stop: () => void;\n /** Full recovery: refresh → WS → deferred refetch. */\n recoverApollo: () => Promise<void>;\n /**\n * Call at the start of client reset/logout: bump generation, clear timers,\n * drop recovering guard so in-flight recovery cannot touch the new client.\n */\n prepareClientReset: () => void;\n};\n\nconst DEFAULT_SHORT_BG_REASON = \"short_background\";\nconst DEFAULT_RECOVER_REASON = \"apollo_recover\";\n\n/**\n * Platform-agnostic Apollo idle recovery orchestration (mobile/admin parity).\n *\n * Apps supply lifecycle (AppState / visibility), session refresh, and WS/query\n * side effects. React client ownership stays in each app's useApolloRecovery.\n */\nexport function createRecoveryCore(\n adapters: CreateRecoveryCoreAdapters,\n): RecoveryCore {\n const {\n refreshSession,\n ensureWsConnected,\n disposeWs,\n refetchActiveQueries,\n isActive,\n isOnline,\n subscribeLifecycle,\n shortBackgroundWsReason = DEFAULT_SHORT_BG_REASON,\n recoverWsReason = DEFAULT_RECOVER_REASON,\n now = () => Date.now(),\n schedule = (fn, ms) => setTimeout(fn, ms),\n cancelSchedule = (id) => clearTimeout(id),\n } = adapters;\n\n let recovering = false;\n let resetGeneration = 0;\n let backgroundTime: number | null = null;\n let wsDisposeTimer: ReturnType<typeof setTimeout> | null = null;\n let refetchTimer: ReturnType<typeof setTimeout> | null = null;\n let unsubscribeLifecycle: (() => void) | null = null;\n\n const clearRefetchTimer = () => {\n if (refetchTimer !== null) {\n cancelSchedule(refetchTimer);\n refetchTimer = null;\n }\n };\n\n const clearWsDisposeTimer = () => {\n if (wsDisposeTimer !== null) {\n cancelSchedule(wsDisposeTimer);\n wsDisposeTimer = null;\n }\n };\n\n const canUseNetwork = () => isOnline?.() ?? true;\n\n const scheduleActiveQueryRefetch = (generationAtStart: number) => {\n clearRefetchTimer();\n refetchTimer = schedule(() => {\n refetchTimer = null;\n if (!isActive()) return;\n if (generationAtStart !== resetGeneration) return;\n if (!canUseNetwork()) return;\n refetchActiveQueries();\n }, REFETCH_DELAY_MS);\n };\n\n const handleMovedToBackground = () => {\n clearRefetchTimer();\n backgroundTime = now();\n\n clearWsDisposeTimer();\n wsDisposeTimer = schedule(() => {\n wsDisposeTimer = null;\n disposeWs();\n }, MIN_BACKGROUND_MS);\n };\n\n async function recoverApollo(): Promise<void> {\n if (recovering) return;\n recovering = true;\n const generationAtStart = resetGeneration;\n\n try {\n const shouldRefetch = await refreshSession();\n\n if (generationAtStart !== resetGeneration) return;\n\n ensureWsConnected(recoverWsReason);\n\n if (!isActive()) return;\n\n if (shouldRefetch) {\n scheduleActiveQueryRefetch(generationAtStart);\n }\n } finally {\n if (generationAtStart === resetGeneration) {\n recovering = false;\n }\n }\n }\n\n const handleReturnedToForeground = () => {\n clearWsDisposeTimer();\n\n const bgTime = backgroundTime;\n const elapsed = bgTime != null ? now() - bgTime : MIN_BACKGROUND_MS;\n backgroundTime = null;\n\n if (elapsed >= MIN_BACKGROUND_MS) {\n void recoverApollo();\n return;\n }\n\n ensureWsConnected(shortBackgroundWsReason);\n };\n\n return {\n prepareClientReset() {\n clearRefetchTimer();\n clearWsDisposeTimer();\n backgroundTime = null;\n recovering = false;\n resetGeneration += 1;\n },\n\n recoverApollo,\n\n start() {\n if (unsubscribeLifecycle) return;\n unsubscribeLifecycle = subscribeLifecycle({\n onActive: handleReturnedToForeground,\n onInactive: handleMovedToBackground,\n });\n },\n\n stop() {\n if (unsubscribeLifecycle) {\n unsubscribeLifecycle();\n unsubscribeLifecycle = null;\n }\n clearRefetchTimer();\n clearWsDisposeTimer();\n backgroundTime = null;\n recovering = false;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACgBO,SAAS,oBACd,WAAwC,CAAC,GAC1B;AACf,QAAM,EAAE,oBAAoB,IAAI;AAChC,MAAI,gBAAqC;AACzC,MAAI,eAAe;AAEnB,SAAO;AAAA,IACL,cAAoB;AAClB,UAAI,CAAC,eAAe;AAClB,uBAAe;AACf;AAAA,MACF;AACA,qBAAe;AACf,4BAAsB,EAAE,MAAM,eAAe,CAAC;AAC9C,oBAAc;AAAA,IAChB;AAAA,IAEA,eAAe,IAA+B;AAC5C,sBAAgB;AAChB,UAAI,MAAM,cAAc;AACtB,uBAAe;AACf,8BAAsB,EAAE,MAAM,eAAe,CAAC;AAC9C,WAAG;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACF;;;AC3CA,oBAAuC;AAIvC,SAAS,gBAAgB,OAAe;AACtC,QAAM,MAAM,MAAM;AAClB,QAAM,QAAQ,MAAM,MAAM,GAAG,CAAC;AAC9B,QAAM,MAAM,MAAM,MAAM,EAAE;AAC1B,SAAO,EAAE,KAAK,KAAK,MAAM;AAC3B;AAMO,SAAS,eAAe,UAA8C;AAC3E,QAAM,EAAE,YAAY,gBAAgB,SAAAA,UAAS,QAAQ,IAAI;AAEzD,SAAO,IAAI,yBAAW,CAAC,WAAW,YAAY;AAC5C,WAAO,IAAI,yBAAW,CAAC,aAAa;AAClC,UAAI,WAA+C;AACnD,UAAI,SAAS;AAEb,YAAM,WAAW,MAAM;AACrB,iBAAS;AACT,kBAAU,YAAY;AACtB,mBAAW;AAAA,MACb;AAEA,YAAM,YAAY;AAChB,YAAI,YAAY;AACd,cAAI;AACF,kBAAM,WAAW;AAAA,UACnB,SAAS,KAAK;AACZ,YAAAA,WAAU,KAAK,EAAE,QAAQ,aAAa,CAAC;AAAA,UACzC;AAAA,QACF;AAEA,YAAI,OAAQ;AAEZ,cAAM,QAAQ,MAAM,eAAe;AAEnC,YAAI,OAAO;AACT,oBAAU,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM;AACzC,kBAAM,gBACJ,OAAO,OAAO,SAAS,eAAe,KACtC,OAAO,OAAO,SAAS,eAAe;AAExC,gBAAI,eAAe;AACjB,wBAAU,4CAA4C;AAAA,gBACpD,eAAe,UAAU;AAAA,cAC3B,CAAC;AACD,qBAAO,EAAE,QAAQ;AAAA,YACnB;AAEA,mBAAO;AAAA,cACL,SAAS;AAAA,gBACP,GAAG;AAAA,gBACH,eAAe,UAAU,KAAK;AAAA,cAChC;AAAA,YACF;AAAA,UACF,CAAC;AACD,oBAAU,iCAAiC;AAAA,YACzC,eAAe,UAAU;AAAA,YACzB,OAAO,gBAAgB,KAAK;AAAA,UAC9B,CAAC;AAAA,QACH,OAAO;AACL,oBAAU,2CAA2C;AAAA,YACnD,eAAe,UAAU;AAAA,UAC3B,CAAC;AAAA,QACH;AAEA,YAAI,OAAQ;AAEZ,YAAI;AACF,qBAAW,QAAQ,SAAS,EAAE,UAAU;AAAA,YACtC,UAAU,MAAM;AACd,kBAAI,CAAC,OAAQ,UAAS,SAAS;AAAA,YACjC;AAAA,YACA,OAAO,CAAC,UAAU;AAChB,kBAAI,CAAC,OAAQ,UAAS,MAAM,KAAK;AAAA,YACnC;AAAA,YACA,MAAM,CAAC,WAAW;AAChB,kBAAI,CAAC,OAAQ,UAAS,KAAK,MAAM;AAAA,YACnC;AAAA,UACF,CAAC;AAAA,QACH,SAAS,KAAK;AACZ,cAAI,OAAQ;AACZ,UAAAA,WAAU,KAAK,EAAE,QAAQ,UAAU,CAAC;AACpC,mBAAS,MAAM,GAAG;AAAA,QACpB;AAAA,MACF,GAAG;AAEH,aAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AACH;;;AChGA,IAAAC,iBAA2B;AAE3B,mBAAwB;;;ACIjB,SAAS,wBAAwB,eAItC;AACA,QAAM,SAAS;AACf,SAAO;AAAA,IACL,eAAe,OAAO,eAAe;AAAA,IACrC,cAAc,OAAO,cAAc;AAAA,IACnC,UAAU,OAAO,UAAU;AAAA,EAC7B;AACF;;;ACfO,SAAS,cAAc,cAAsC;AAClE,QAAM,SAAS;AACf,QAAM,SACH,SAAS,YAAY,KACrB,SAAS,QAAQ,KACjB,SAAS,UAAU,GAAuC;AAC7D,SAAO,OAAO,WAAW,WAAW,SAAS;AAC/C;AAEO,SAAS,8BACd,eACS;AACT,SAAO;AAAA,IACL,eAAe;AAAA,MACb,CAAC,QACC,IAAI,YAAY,SAAS,qBACzB,IAAI,SAAS,SAAS,wBAAwB;AAAA,IAClD;AAAA,EACF;AACF;AAKO,SAAS,uBAAuB,OAG3B;AACV,QAAM,aAAa,MAAM,eACrB,cAAc,MAAM,YAAY,IAChC;AACJ,SACE,8BAA8B,MAAM,aAAa,KACjD,eAAe,OACf,eAAe;AAEnB;AAEO,IAAM,mCACX,oBAAI,IAAsB,CAAC,aAAa,iBAAiB,iBAAiB,CAAC;AAE7E,IAAM,wCAA+D;AAAA,EACnE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,4BACd,SACS;AACT,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,sCAAsC;AAAA,IAAK,CAAC,YACjD,QAAQ,KAAK,OAAO;AAAA,EACtB;AACF;AAEO,SAAS,oBACd,QACoB;AACpB,aAAW,OAAO,QAAQ;AACxB,UAAM,OAAO,IAAI,YAAY;AAC7B,QAAI,OAAO,SAAS,SAAU,QAAO;AAAA,EACvC;AACA,SAAO;AACT;AAEO,SAAS,6BACd,QACA,WACS;AACT,MAAI,aAAa,QAAQ,iCAAiC,IAAI,SAAS,GAAG;AACxE,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK,CAAC,QAAQ,4BAA4B,IAAI,OAAO,CAAC;AACtE;AAKO,SAAS,iCACd,QACS;AACT,MACE,OAAO;AAAA,IACL,CAAC,MACC,EAAE,cAAc,QACf,EAAE,WAAuC,cAAc;AAAA,EAC5D,GACA;AACA,WAAO;AAAA,EACT;AAEA,aAAW,OAAO,QAAQ;AACxB,QAAI,4BAA4B,IAAI,OAAO,GAAG;AAC5C,aAAO;AAAA,IACT;AACA,UAAM,OAAO,IAAI,YAAY;AAC7B,QACE,OAAO,SAAS,YAChB,iCAAiC,IAAI,IAAI,GACzC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAQO,SAAS,sBAAsB,QAIlB;AAClB,MAAI,CAAC,OAAO,SAAS,CAAC,OAAO,WAAW;AAGtC,QAAI,OAAO,oBAAoB,MAAO,QAAO,EAAE,MAAM,WAAW;AAChE,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AACA,MAAI,CAAC,OAAO,MAAO,QAAO,EAAE,MAAM,WAAW;AAC7C,SAAO,EAAE,MAAM,SAAS,OAAO,OAAO,MAAM;AAC9C;;;AFpGA,SAAS,8BAA8B,UAAsC;AAC3E,MAAI,CAAC,SAAS,SAAS,EAAG,UAAS,SAAS;AAC9C;AAEA,SAAS,wBACP,WACA,SACA,OACA,UACA,oBACM;AACN,YAAU,WAAW,CAAC,EAAE,UAAU,CAAC,EAAE,OAAO;AAAA,IAC1C,sBAAsB;AAAA,IACtB,SAAS;AAAA,MACP,GAAG;AAAA,MACH,eAAe,UAAU,KAAK;AAAA,IAChC;AAAA,EACF,EAAE;AAEF,MAAI,SAAS,SAAS,EAAG;AAEzB;AAAA,IACE,QAAQ,SAAS,EAAE,UAAU;AAAA,MAC3B,UAAU,MAAM;AACd,YAAI,CAAC,SAAS,SAAS,EAAG,UAAS,SAAS;AAAA,MAC9C;AAAA,MACA,OAAO,CAAC,UAAU;AAChB,YAAI,CAAC,SAAS,SAAS,EAAG,UAAS,MAAM,KAAK;AAAA,MAChD;AAAA,MACA,MAAM,CAAC,UAAU;AACf,YAAI,CAAC,SAAS,SAAS,EAAG,UAAS,KAAK,KAAK;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAKO,SAAS,gBAAgB,UAAmC;AACjE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,WAAS,sBAAsB,QAAsB;AACnD,0BAAsB,EAAE,QAAQ,MAAM,mBAAmB,CAAC;AAE1D,eAAW,MAAM;AACf,WAAK,OAAO;AAAA,IACd,GAAG,CAAC;AAAA,EACN;AAEA,iBAAe,6BACb,UACe;AACf,uBAAmB,gBAAgB;AACnC,QAAI,CAAC,SAAS,SAAS,EAAG,UAAS,SAAS;AAC5C,0BAAsB,gBAAgB;AAAA,EACxC;AAEA,iBAAe,oBACb,QACA,WACA,SACA,UACA,oBACe;AACf,UAAM,WAAW,sBAAsB,MAAM;AAC7C,QAAI,SAAS,SAAS,UAAU;AAC9B,YAAM,6BAA6B,QAAQ;AAC3C;AAAA,IACF;AACA,QAAI,SAAS,SAAS,YAAY;AAChC,oCAA8B,QAAQ;AACtC;AAAA,IACF;AACA;AAAA,MACE;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,qBACb,WACA,SACA,aACA,UACA,oBACe;AACf,UAAM,MAAM,UAAU,WAAW;AACjC,QAAI,IAAI,sBAAsB;AAC5B,gBAAU,2CAA2C;AAAA,QACnD,eAAe,UAAU;AAAA,QACzB,YAAY,YAAY;AAAA,MAC1B,CAAC;AACD,UAAI,CAAC,SAAS,SAAS,GAAG;AACxB,iBAAS;AAAA,UACP,IAAI;AAAA,YACF,mCAAmC,YAAY,cAAc,SAAS;AAAA,UACxE;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,cAAU,2CAA2C;AAAA,MACnD,eAAe,UAAU;AAAA,MACzB,YAAY,YAAY;AAAA,IAC1B,CAAC;AAED,UAAM,SAAS,MAAM,mBAAmB;AACxC,QAAI,SAAS,SAAS,EAAG;AAEzB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,wBACb,KACA,UACe;AACf,kBAAc,KAAK,EAAE,QAAQ,eAAe,CAAC;AAC7C,YAAQ,MAAM,wBAAwB,GAAG;AACzC,uBAAmB,mBAAmB;AACtC,QAAI,CAAC,SAAS,SAAS,EAAG,UAAS,SAAS;AAC5C,0BAAsB,mBAAmB;AAAA,EAC3C;AAEA,aAAO,sBAAQ,CAAC,kBAAkB;AAChC,UAAM,EAAE,WAAW,QAAQ,IAAI;AAC/B,UAAM,EAAE,eAAe,aAAa,IAClC,wBAAwB,aAAa;AAEvC,QACE,CAAC,uBAAuB;AAAA,MACtB;AAAA,MACA;AAAA,IACF,CAAC,GACD;AACA;AAAA,IACF;AAEA,UAAM,aAAa,eAAe,cAAc,YAAY,IAAI;AAChE,UAAM,cAAgC;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,IAAI,0BAAW,CAAC,aAAa;AAClC,UAAI,kBAAsD;AAC1D,UAAI,SAAS;AAEb,YAAM,mBAAyC;AAAA,QAC7C,UAAU,MAAM;AACd,cAAI,CAAC,OAAQ,UAAS,SAAS;AAAA,QACjC;AAAA,QACA,OAAO,CAAC,UAAU;AAChB,cAAI,CAAC,OAAQ,UAAS,MAAM,KAAK;AAAA,QACnC;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,MAAM,CAAC,UAAU;AACf,cAAI,CAAC,OAAQ,UAAS,KAAK,KAAK;AAAA,QAClC;AAAA,MACF;AAEA,YAAM,WAAW,MAAM;AACrB,iBAAS;AACT,yBAAiB,YAAY;AAC7B,0BAAkB;AAAA,MACpB;AAEA,WAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,eAAe;AACd,4BAAkB;AAAA,QACpB;AAAA,MACF,EAAE,MAAM,CAAC,QAAQ,wBAAwB,KAAK,gBAAgB,CAAC;AAE/D,aAAO;AAAA,IACT,CAAC;AAAA,EACH,CAAC;AACH;;;AGtNA,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY5B,IAAM,iBAAiB;AACvB,IAAM,uBAAuB;AAE7B,IAAM,OAAO,CAAC,OAAe,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAoBtE,SAAS,yBACd,UACyC;AACzC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAAC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,MAAI,kBAA4D;AAEhE,iBAAe,wBAAwB,QAA+B;AACpE,UAAM,QAAQ,YAAY;AAC1B,sBAAkB,MAAM;AAAA,EAC1B;AAMA,iBAAe,6BACb,QACA,oBACA,WACmC;AACnC,UAAM,gBAAgB,MAAM,QAAQ,eAAe;AACnD,QAAI,iBAAiB,QAAQ,kBAAkB,oBAAoB;AACjE,4BAAsB,EAAE,QAAQ,MAAM,sBAAsB,CAAC;AAC7D,aAAO,EAAE,iBAAiB,MAAM,OAAO,cAAc;AAAA,IACvD;AAEA,UAAM,wBAAwB,MAAM;AACpC,0BAAsB;AAAA,MACpB;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AACD,WAAO;AAAA,MACL,iBAAiB;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,EACF;AAEA,iBAAe,+BACb,QACA,WACA,oBACmC;AACnC,UAAM,kBAAkB,OAAO,IAAI,CAAC,WAAW;AAAA,MAC7C,SAAS,OAAO;AAAA,IAClB,EAAE;AAEF,QAAI,6BAA6B,QAAQ,SAAS,GAAG;AACnD,cAAQ;AAAA,QACN;AAAA,QACA,aAAa,gBAAgB,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AAAA,MAC9D;AAAA,IACF,OAAO;AACL,cAAQ,MAAM,wCAAwC,eAAe;AACrE,MAAAA,WAAU,IAAI,MAAM,+BAA+B,GAAG;AAAA,QACpD,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,kBACb,cACA,SAC+B;AAC/B,UAAM,MAAM,MAAM,MAAM,GAAG,MAAM,YAAY;AAAA,MAC3C,MAAM,KAAK,UAAU;AAAA,QACnB,OAAO;AAAA,QACP,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE;AAAA,MACvC,CAAC;AAAA,MACD,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,QAAQ;AAAA,IACV,CAAC;AAED,UAAM,OAAQ,MAAM,IAAI,KAAK;AAO7B,QAAI,KAAK,QAAQ,QAAQ;AACvB,YAAM,SAAS,KAAK;AACpB,YAAM,YAAY,oBAAoB,MAAM;AAC5C,YAAM,eACJ,iCAAiC,MAAM,KACvC,UAAU;AAEZ,UAAI,cAAc;AAChB;AAAA,UACE,2BAA2B,OAAO,IAAI,oBAAoB;AAAA,UAC1D,EAAE,UAAU;AAAA,QACd;AACA,eAAO,EAAE,MAAM,QAAQ;AAAA,MACzB;AACA,aAAO,EAAE,WAAW,QAAQ,MAAM,mBAAmB;AAAA,IACvD;AAEA,UAAM,WAAW,MAAM,MAAM,cAAc,MAAM;AACjD,UAAM,kBAAkB,MAAM,MAAM,cAAc,MAAM;AAExD,QAAI,YAAY,iBAAiB;AAC/B,YAAM,QAAQ,UAAU,UAAU,eAAe;AACjD,wBAAkB,QAAQ;AAC1B,aAAO,EAAE,MAAM,WAAW,OAAO,SAAS;AAAA,IAC5C;AAEA,QAAI,UAAU,sBAAsB;AAClC;AAAA,QACE,qCAAqC,OAAO,IAAI,oBAAoB;AAAA,MACtE;AACA,aAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AAEA,WAAO,EAAE,MAAM,mBAAmB;AAAA,EACpC;AAEA,iBAAe,6BAAgE;AAC7E,UAAM,qBAAqB,MAAM,QAAQ,eAAe;AAExD,aAAS,UAAU,GAAG,WAAW,sBAAsB,WAAW,GAAG;AACnE,YAAM,eAAe,MAAM,QAAQ,gBAAgB;AACnD,UAAI,CAAC,aAAc,QAAO,EAAE,iBAAiB,OAAO,OAAO,KAAK;AAEhE,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,cAAc,OAAO;AAC5D,YAAI,OAAO,SAAS,WAAW;AAC7B,gCAAsB,EAAE,MAAM,oBAAoB,CAAC;AACnD,iBAAO,EAAE,iBAAiB,MAAM,OAAO,OAAO,MAAM;AAAA,QACtD;AACA,YAAI,OAAO,SAAS,SAAS;AAC3B,gBAAM,KAAK,cAAc;AACzB;AAAA,QACF;AACA,YAAI,OAAO,SAAS,oBAAoB;AACtC,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,OAAO;AAAA,YACP;AAAA,UACF;AAAA,QACF;AACA,eAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,YAAI,UAAU,sBAAsB;AAClC,gBAAM,KAAK,cAAc;AACzB;AAAA,QACF;AAEA,QAAAA,WAAU,KAAK;AAAA,UACb,QAAQ;AAAA,UACR;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AACD,gBAAQ,MAAM,yBAAyB,GAAG;AAC1C,8BAAsB;AAAA,UACpB,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,MAAM;AAAA,QACR,CAAC;AACD,eAAO,EAAE,iBAAiB,MAAM,WAAW,MAAM,OAAO,KAAK;AAAA,MAC/D;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,SAAO,SAAS,qBAAwD;AAEtE,QAAI,oBAAoB,MAAM;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,MAAyC;AAC9D,0BAAoB,2BAA2B,EAAE,QAAQ,MAAM;AAC7D,0BAAkB;AAAA,MACpB,CAAC;AACD,aAAO;AAAA,IACT;AAEA,QAAI,qBAAqB;AAEvB,aAAO,oBAAoB,SAAS,YAAY;AAC9C,YAAI,oBAAoB,MAAM;AAC5B,iBAAO;AAAA,QACT;AACA,eAAO,eAAe;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,WAAO,eAAe;AAAA,EACxB;AACF;;;ACxQA,IAAAC,gBAA4C;;;ACOrC,SAAS,kBAAkB,OAAwB;AACxD,QAAM,OAAO,oBAAI,QAAgB;AACjC,QAAM,OAAO,KAAK;AAAA,IAChB;AAAA,IACA,CAAC,MAAM,MAAM;AACX,UAAI,OAAO,MAAM,SAAU,QAAO,EAAE,SAAS;AAC7C,UAAI,OAAO,MAAM,WAAY,QAAO,aAAa,EAAE,QAAQ,WAAW;AACtE,UAAI,KAAK,OAAO,MAAM,UAAU;AAC9B,YAAI,KAAK,IAAI,CAAW,EAAG,QAAO;AAClC,aAAK,IAAI,CAAW;AAAA,MACtB;AACA,UAAI,aAAa,OAAO;AACtB,eAAO;AAAA,UACL,SAAS,EAAE;AAAA,UACX,MAAM,EAAE;AAAA,UACR,OAAO,EAAE;AAAA,UACT,GAAI;AAAA,QACN;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACA,SAAO,QAAQ;AACjB;AAGA,SAAS,WAAW,OAAkC;AACpD,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,KAAM,QAAO;AAC3B,MACE,OAAO,UAAU,aACjB,OAAO,UAAU,YACjB,OAAO,UAAU,UACjB;AACA,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,SAAS;AACrD,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,SAAS;AACrD,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAO,aAAa,MAAM,QAAQ,WAAW;AAAA,EAC/C;AAGA,SAAO;AACT;AAEA,SAAS,gBACP,KACA,KACA;AACA,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,KAAK,MAAM;AACpB,QAAI,KAAK,KAAK;AACZ,YAAM,UAAU,WAAW,IAAI,CAAC,CAAC;AACjC,UAAI,YAAY,OAAW,KAAI,CAAC,IAAI;AAAA,IACtC;AAAA,EACF;AACF;AAEA,SAAS,aAAa,QAAsB;AAC1C,QAAM,MAA4B,CAAC;AACnC,kBAAgB,QAAmC,GAAG;AACtD,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,QAAI,KAAK,IAAK;AACd,UAAM,UAAU,WAAW,CAAC;AAC5B,QAAI,YAAY,OAAW,KAAI,CAAC,IAAI;AAAA,EACtC;AACA,SAAO;AACT;AAGO,SAAS,kBAAkB,KAAoB;AACpD,MAAI,OAAO,KAAM,QAAO;AACxB,MAAI,OAAO,QAAQ,SAAU,QAAO,EAAE,SAAS,IAAI;AACnD,MAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ;AAC5C,WAAO,EAAE,OAAO,IAAI;AACtB,MAAI,OAAO,QAAQ,SAAU,QAAO,EAAE,OAAO,IAAI,SAAS,EAAE;AAC5D,MAAI,eAAe,OAAO;AACxB,UAAM,UAAU,aAAa,GAAG;AAChC,QAAI,WAAW,OAAO,YAAY,YAAY,CAAC,MAAM,QAAQ,OAAO,GAAG;AACrE,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,IAAI;AAAA,QACb,MAAM,IAAI;AAAA,QACV,OAAO,IAAI,SAAS;AAAA,MACtB;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb,MAAM,IAAI;AAAA,MACV,OAAO,IAAI,SAAS;AAAA,IACtB;AAAA,EACF;AACA,MAAI,OAAO,QAAQ,SAAU,QAAO,aAAa,GAAG;AACpD,SAAO,EAAE,OAAO,kBAAkB,EAAE,OAAO,IAAI,CAAC,EAAE;AACpD;;;AD7GA,IAAM,QAAQ;AACd,IAAM,WAAW;AACjB,IAAM,YAAY;AAClB,IAAM,kBAAkB;AAExB,IAAM,mBACJ;AAEF,IAAM,8BAA8B,oBAAI,IAAI,CAAC,YAAY,QAAQ,YAAY,CAAC;AAe9E,SAAS,aAAa,OAA2C;AAC/D,SAAO,OAAO,UAAU,aAAa,MAAM,IAAI;AACjD;AAEA,SAAS,eAAe,KAAa;AACnC,SAAO,iBAAiB,KAAK,GAAG;AAClC;AAEA,SAAS,wBAAwB,KAAa;AAC5C,SACE,eAAe,GAAG,KAClB,sEAAsE;AAAA,IACpE;AAAA,EACF;AAEJ;AAEA,SAAS,YAAY,OAAgB,QAAQ,GAAY;AACvD,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,SAAS,UAAW,QAAO;AAE/B,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MACJ,MAAM,GAAG,eAAe,EACxB,IAAI,CAAC,SAAS,YAAY,MAAM,QAAQ,CAAC,CAAC;AAAA,EAC/C;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,QAAQ;AACd,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,UAAI,GAAG,IAAI,eAAe,GAAG,IACzB,WACA,YAAY,QAAQ,QAAQ,CAAC;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,0BACP,KACqC;AACrC,QAAM,MAA+B,CAAC;AACtC,aAAW,OAAO,6BAA6B;AAC7C,QAAI,OAAO,OAAO,IAAI,GAAG,MAAM,QAAW;AACxC,UAAI,GAAG,IAAI,IAAI,GAAG;AAAA,IACpB;AAAA,EACF;AACA,SAAO,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,MAAM;AAC7C;AAEA,SAAS,8BACP,KACqC;AACrC,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,4BAA4B,IAAI,GAAG,GAAG;AACxC,UAAI,GAAG,IACL,SAAS,QAAQ,OAAO,UAAU,WAAW,YAAY,KAAK,IAAI;AACpE;AAAA,IACF;AACA,QAAI,wBAAwB,GAAG,GAAG;AAChC,UAAI,GAAG,IAAI;AACX;AAAA,IACF;AACA,QAAI,GAAG,IAAI,YAAY,KAAK;AAAA,EAC9B;AACA,SAAO,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,MAAM;AAC7C;AAEA,SAAS,sBACP,YACA,OACS;AACT,MAAI,cAAc,KAAM,QAAO;AAC/B,MAAI,OAAO,eAAe,YAAY,MAAM,QAAQ,UAAU,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,QAAM,MAAM;AACZ,MAAI,CAAC,OAAO;AACV,WAAO,0BAA0B,GAAG;AAAA,EACtC;AACA,SAAO,8BAA8B,GAAG;AAC1C;AAEA,SAAS,sBAAsB,KAAuB,OAAgB;AACpE,SAAO;AAAA,IACL,YAAY,sBAAsB,IAAI,YAAY,KAAK;AAAA,IACvD,WAAW,IAAI;AAAA,IACf,SAAS,IAAI;AAAA,IACb,MAAM,IAAI;AAAA,EACZ;AACF;AAEA,SAAS,qBACP,WACA,OACA;AACA,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,MAAM,OAAO,KAAK,SAAS;AAAA,MAC3B,SAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO,YAAY,SAAS;AAC9B;AAEA,SAAS,oBAAoB,UAAmB,OAAgB;AAC9D,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,CAAC,MAAO,QAAO,EAAE,SAAS,KAAK;AACnC,SAAO,YAAY,kBAAkB,QAAQ,CAAC;AAChD;AAMO,SAAS,6BACd,UACA;AACA,QAAM,EAAE,OAAO,MAAM,IAAI;AAEzB,aAAO,uBAAQ,CAAC,iBAAgC;AAC9C,UAAM,EAAE,UAAU,IAAI;AACtB,UAAM,EAAE,eAAe,cAAc,SAAS,IAC5C,wBAAwB,YAAY;AACtC,UAAM,MAAM,aAAa,KAAK;AAE9B,QAAI,eAAe,QAAQ;AACzB,YAAM,SAAS,OAAO,oBAAoB;AAAA,QACxC,eAAe,cAAc;AAAA,UAAI,CAAC,QAChC,sBAAsB,KAAK,GAAG;AAAA,QAChC;AAAA,QACA,eAAe,UAAU;AAAA,QACzB,WAAW,qBAAqB,UAAU,WAAW,GAAG;AAAA,MAC1D,CAAC;AAAA,IACH;AAEA,QAAI,cAAc;AAChB,YAAM,SAAS,OAAO,iBAAiB;AAAA,QACrC,cAAc,kBAAkB,YAAY;AAAA,QAC5C,eAAe,UAAU;AAAA,QACzB,UAAU,oBAAoB,UAAU,GAAG;AAAA,QAC3C,WAAW,qBAAqB,UAAU,WAAW,GAAG;AAAA,MAC1D,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT,CAAC;AACH;;;AErLA,IAAAC,iBAAuC;AAEvC,uBAAkC;;;ACFlC,IAAM,6BAA6B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,oBAAoB,KAAsB;AACjD,MAAI,eAAe,MAAO,QAAO,IAAI;AACrC,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,MAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,UAAM,MAAM;AACZ,QAAI,OAAO,IAAI,YAAY,SAAU,QAAO,IAAI;AAChD,QAAI,IAAI,aAAc,QAAO,oBAAoB,IAAI,YAAY;AACjE,QAAI;AACF,aAAO,KAAK,UAAU,GAAG;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,OAAO,KAAM,QAAO;AACxB,MACE,OAAO,QAAQ,YACf,OAAO,QAAQ,aACf,OAAO,QAAQ,UACf;AACA,WAAO,OAAO,GAAG;AAAA,EACnB;AACA,MAAI,OAAO,QAAQ,SAAU,QAAO,IAAI,SAAS;AACjD,SAAO;AACT;AAGO,SAAS,wBAAwB,KAAuB;AAC7D,QAAM,UAAU,oBAAoB,GAAG;AACvC,SAAO,2BAA2B,KAAK,CAAC,YAAY,QAAQ,KAAK,OAAO,CAAC;AAC3E;;;ADtCA,IAAM,cAAc;AAGpB,IAAM,aAAa,CAAC,KAAK,MAAM,KAAM,GAAI;AAsBzC,SAAS,SAAS,OAA2B,OAA0B;AACrE,MAAI,MAAM,aAAc;AACxB,QAAM,SAAS,KAAK,KAAK;AAC3B;AAEA,SAAS,aAAa,OAAiC;AACrD,MAAI,MAAM,aAAc;AACxB,QAAM,SAAS,SAAS;AAC1B;AAEA,SAAS,UAAU,OAA2B,KAAoB;AAChE,MAAI,MAAM,aAAc;AACxB,QAAM,SAAS,MAAM,GAAG;AAC1B;AAEA,SAAS,iBAAiB,IAAwB;AAChD,QAAM,UAAM,oCAAkB,GAAG,KAAK;AACtC,SACE,IAAI,SAAS,yBACZ,IAA+B,cAAc;AAElD;AAEA,SAASC,MAAK,IAAY;AACxB,SAAO,IAAI,QAAc,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAC/D;AAEA,SAAS,0BAA0B,KAAuB;AACxD,MAAI,wBAAwB,GAAG,EAAG,QAAO;AAEzC,QAAM,eACJ,OAAO,OAAO,QAAQ,WACjB,IAAmC,eACpC;AAEN,MAAI,CAAC,aAAc,QAAO;AAC1B,MACE,OAAO,iBAAiB,YACxB,iBAAiB,QACjB,EAAE,wBAAwB,UAC1B,OAAO,KAAK,YAAY,EAAE,WAAW,GACrC;AACA,WAAO;AAAA,EACT;AAEA,SAAO,wBAAwB,YAAY;AAC7C;AAEA,SAAS,cACP,UACA,SACe;AACf,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,QAAQ,GAAG;AACb,cAAQ;AACR;AAAA,IACF;AAEA,QAAI,aAAoD;AACxD,QAAI,UAAU;AACd,QAAI,UAAU;AACd,QAAI,QAA6B;AAEjC,UAAM,SAAS,MAAM;AACnB,UAAI,QAAS;AACb,gBAAU;AACV,UAAI,eAAe,MAAM;AACvB,sBAAc,UAAU;AACxB,qBAAa;AAAA,MACf;AACA,cAAQ;AACR,cAAQ;AAAA,IACV;AAEA,YAAQ,SAAS,kBAAkB,CAAC,WAAW;AAC7C,UAAI,QAAQ,KAAK,QAAQ;AACvB,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAKD,QAAI,SAAS;AACX,cAAQ;AACR;AAAA,IACF;AAKA,iBAAa,YAAY,MAAM;AAC7B,UAAI,QAAQ,KAAK,SAAS;AACxB,eAAO;AACP;AAAA,MACF;AACA,UAAI,QAAS;AACb,gBAAU;AACV,WAAK,QAAQ,QAAQ,SAAS,qBAAqB,CAAC,EACjD,KAAK,CAAC,WAAW;AAChB,YAAI,WAAW,QAAQ,EAAG;AAC1B,YAAI,OAAQ,QAAO;AAAA,MACrB,CAAC,EACA,MAAM,MAAM,MAAS,EACrB,QAAQ,MAAM;AACb,kBAAU;AAAA,MACZ,CAAC;AAAA,IACL,GAAG,GAAG;AAAA,EACR,CAAC;AACH;AAEA,SAAS,qBAAqB,OAAiC;AAC7D,QAAM,UAAU,YAAY;AAC5B,QAAM,WAAW;AACnB;AAEA,eAAe,mBAAmB,OAA6C;AAC7E,QAAM,SAAS,MAAM,MAAM,SAAS,qBAAqB;AACzD,MAAI,OAAQ,QAAO,CAAC,MAAM;AAE1B,QAAM,cAAc,MAAM,UAAU,MAAM,MAAM,YAAY;AAC5D,SAAO,CAAC,MAAM;AAChB;AAGA,eAAe,wBACb,OACA,KACA,SACe;AACf,MAAI,MAAM,aAAc;AAExB,MAAI,CAAC,0BAA0B,GAAG,GAAG;AACnC,cAAU,OAAO,GAAG;AACpB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,MAAM,SAAS,qBAAqB;AAC5D,MAAI,MAAM,aAAc;AAExB,MAAI,CAAC,WAAW;AACd,UAAM,cAAc,MAAM,UAAU,MAAM,MAAM,YAAY;AAC5D,QAAI,MAAM,aAAc;AACxB,yBAAqB,KAAK;AAC1B,SAAK,gBAAgB,OAAO,OAAO;AACnC;AAAA,EACF;AAEA,MAAI,WAAW,aAAa;AAC1B,cAAU,OAAO,GAAG;AACpB;AAAA,EACF;AAEA,QAAMA,MAAK,WAAW,OAAO,KAAK,GAAI;AACtC,MAAI,MAAM,aAAc;AACxB,uBAAqB,KAAK;AAC1B,OAAK,gBAAgB,OAAO,UAAU,CAAC;AACzC;AAEA,eAAe,gBACb,OACA,SACe;AACf,MAAI,MAAM,aAAc;AAExB,QAAM,cAAc,MAAM,mBAAmB,KAAK;AAClD,MAAI,CAAC,YAAa;AAElB,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,MAAM,SAAS,EAAE,UAAU;AAAA,MACxD,UAAU,MAAM,aAAa,KAAK;AAAA,MAClC,OAAO,CAAC,QAAQ;AACd,YAAI,CAAC,0BAA0B,GAAG,GAAG;AACnC,oBAAU,OAAO,GAAG;AACpB;AAAA,QACF;AACA,aAAK,wBAAwB,OAAO,KAAK,OAAO;AAAA,MAClD;AAAA,MACA,MAAM,CAAC,UAAU,SAAS,OAAO,KAAK;AAAA,IACxC,CAAC;AAAA,EACH,SAAS,GAAG;AACV,cAAU,OAAO,CAAC;AAAA,EACpB;AACF;AAOO,SAAS,0BACd,UACY;AACZ,SAAO,IAAI,0BAAW,CAAC,WAAW,YAAY;AAC5C,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,iBAAiB,SAAS,GAAG;AAChC,aAAO,QAAQ,SAAS;AAAA,IAC1B;AAEA,WAAO,IAAI,0BAAW,CAAC,aAAa;AAClC,YAAM,QAA4B;AAAA,QAChC;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,cAAc;AAAA,MAChB;AAEA,WAAK,gBAAgB,OAAO,CAAC;AAE7B,aAAO,MAAM;AACX,cAAM,eAAe;AACrB,6BAAqB,KAAK;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;;AEpPA,SAAS,eAAe,SAA6C;AACnE,SAAO,OAAO,YAAY,aAAa,QAAQ,IAAI;AACrD;AAKO,SAAS,iBAAiB,UAAoC;AACnE,QAAM,EAAE,QAAQ,IAAI;AAEpB,SAAO,SAAS,WACd,OACA,OACA,SACA,SACA;AACA,QAAI,CAAC,eAAe,OAAO,EAAG;AAE9B,UAAM,UAAU,UAAU,kBAAkB,OAAO,IAAI;AACvD,UAAM,SAAS,IAAI,KAAK,KAAK,OAAO;AAEpC,QAAI;AACJ,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,iBAAS,QAAQ;AACjB;AAAA,MACF,KAAK;AACH,iBAAS,QAAQ;AACjB;AAAA,MACF,KAAK;AACH,iBAAS,QAAQ;AACjB;AAAA,MACF,KAAK;AAAA,MACL;AACE,iBAAS,QAAQ;AACjB;AAAA,IACJ;AACA,WAAO,UAAU,GAAG,MAAM;AAAA,EAAK,OAAO,KAAK,MAAM;AAAA,EACnD;AACF;;;AC/CA,wBAA0C;AAK1C,IAAM,WAAW;AACjB,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AAOzB,IAAM,yBAAyB;AAE/B,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAC5B,IAAM,4BAA4B;AA8BlC,SAASC,cAAa,OAAuD;AAC3E,MAAI,SAAS,KAAM,QAAO;AAC1B,SAAO,OAAO,UAAU,aAAa,MAAM,IAAI;AACjD;AAEA,SAASC,iBAAgB,OAAe;AACtC,QAAM,MAAM,MAAM;AAClB,QAAM,QAAQ,MAAM,MAAM,GAAG,CAAC;AAC9B,QAAM,MAAM,MAAM,MAAM,EAAE;AAC1B,SAAO,EAAE,KAAK,KAAK,MAAM;AAC3B;AAEA,SAAS,iBAAiB,SAAyB;AAGjD,QAAM,MAAM,KAAK,IAAI,mBAAmB,KAAK,SAAS,gBAAgB;AACtE,QAAM,UAAU,UAAU,KAAK,MAAM;AACrC,SAAO,KAAK,IAAI,MAAM,QAAQ,gBAAgB;AAChD;AAEA,SAAS,cAAc,QAAwB;AAC7C,QAAM,UAAU,OAAO,KAAK,EAAE,MAAM,GAAG,GAAG;AAC1C,SAAO,WAAW;AACpB;AAMO,SAAS,gBAAgB,UAA8C;AAC5E,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,QAAM,MAAM,CACV,OACA,SACA,YACG;AACH,YAAQ,OAAO,UAAU,SAAS,OAAO;AAAA,EAC3C;AAEA,MAAI,SAAwB;AAC5B,MAAI,eAAiC;AACrC,MAAI,uBAA4C;AAEhD,QAAM,qBAA4D;AAAA,IAChE,SAAS,MAAM;AAAA,EACjB;AAEA,QAAM,QAAQ,CAAC,WAAmB;AAChC,mBAAe;AACf,QAAI,QAAQ;AACV,UAAI;AACF,YAAI,SAAS,uBAAuB,EAAE,OAAO,CAAC;AAC9C,eAAO,QAAQ;AAAA,MACjB,SAAS,GAAG;AACV,YAAI,QAAQ,mCAAmC;AAAA,UAC7C,OAAO,kBAAkB,CAAC;AAAA,UAC1B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,aAAS;AAAA,EACX;AAEA,QAAM,kBAAkB,MAAc;AACpC,UAAM,MAAM,SAAS;AAErB,eAAO,gCAAa;AAAA,MAClB,kBAAkB,YAAY;AAC5B,YAAI;AACF,gBAAM,WAAW;AAAA,QACnB,SAAS,GAAG;AACV,cAAI,SAAS,qCAAqC;AAAA,YAChD,OAAO,kBAAkB,CAAC;AAAA,UAC5B,CAAC;AACD,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,QAAQ,eAAe;AAC7B,YAAI,CAAC,OAAO;AACV,cAAID,cAAa,KAAK,GAAG;AACvB,gBAAI,QAAQ,iCAAiC,CAAC,CAAC;AAAA,UACjD;AACA,iBAAO,CAAC;AAAA,QACV;AAEA,YAAIA,cAAa,KAAK,GAAG;AACvB,cAAI,SAAS,4BAA4B;AAAA,YACvC,OAAOC,iBAAgB,KAAK;AAAA,UAC9B,CAAC;AAAA,QACH;AAEA,cAAM,SAAS,UAAU,KAAK;AAC9B,eAAO,EAAE,eAAe,QAAQ,eAAe,OAAO;AAAA,MACxD;AAAA,MACA,WAAW;AAAA,MACX,MAAM;AAAA,MACN,IAAI;AAAA,QACF,QAAQ,CAAC,OAAgB;AACvB,yBAAe;AACf,cAAI,QAAQ,aAAa;AAAA,YACvB,OAAO,kBAAkB,EAAE;AAAA,YAC3B;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,WAAW,CAAC,WAAoB;AAC9B,yBAAe;AACf,cAAI,QAAQ,gBAAgB,EAAE,IAAI,CAAC;AAAA,QACrC;AAAA,QACA,YAAY,MAAM;AAChB,cAAI,SAAS,iBAAiB,EAAE,IAAI,CAAC;AAAA,QACvC;AAAA,QACA,OAAO,CAAC,QAAiB;AACvB,gBAAM,kBAAkB,kBAAkB,GAAG;AAC7C,gBAAM,uBACJ,mBAAmB,SAClB,OAAO,oBAAoB,YAC1B,MAAM,QAAQ,eAAe,KAC7B,OAAO,KAAK,eAAe,EAAE,SAAS;AAC1C,gBAAM,WAAW,uBAAuB,UAAU;AAClD,gBAAM,aAAa,uBACf,aACA;AAEJ;AAAA,YACE;AAAA,YACA;AAAA,YACA,uBAAuB,EAAE,OAAO,iBAAiB,IAAI,IAAI,EAAE,IAAI;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AAAA,MACA,eAAe;AAAA,MACf,WAAW,OAAO,YAAoB;AACpC,cAAM,IAAI;AAAA,UAAc,CAAC,YACvB,WAAW,SAAS,iBAAiB,OAAO,CAAC;AAAA,QAC/C;AAAA,MACF;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,wBAAwB,MAAM;AAClC,QAAI,qBAAsB;AAE1B,2BAAuB,mBAAmB;AAAA,MACxC,UAAU,MAAM;AACd,YAAI,SAAS,wCAAwC,CAAC,CAAC;AACvD,2BAAmB,QAAQ,kBAAkB;AAAA,MAC/C;AAAA,MACA,YAAY,MAAM;AAChB,YAAI,SAAS,kCAAkC,CAAC,CAAC;AACjD,cAAM,oBAAoB;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,MAAc;AAC9B,0BAAsB;AACtB,QAAI,CAAC,QAAQ;AACX,eAAS,gBAAgB;AAAA,IAC3B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB,CAAC,WAAmB;AAC/C,QAAI,CAAC,SAAS,EAAG;AAEjB,UAAM,QAAQ,eAAe;AAC7B,QAAI,CAAC,OAAO;AACV,UAAID,cAAa,KAAK,GAAG;AACvB,YAAI,QAAQ,sCAAsC,EAAE,OAAO,CAAC;AAAA,MAC9D;AACA,YAAM,yBAAyB,MAAM,EAAE;AACvC;AAAA,IACF;AAEA,QAAI,WAAW,MAAM;AACnB,eAAS,gBAAgB;AACzB,UAAI,SAAS,qBAAqB,EAAE,OAAO,CAAC;AAC5C;AAAA,IACF;AAEA,UAAM,SAAS;AACf,QAAI,WAAW,MAAM;AACnB,YAAM,EAAE,WAAW,IAAI;AACvB,UACE,eAAe,uBACf,eAAe,2BACf;AACA,YAAI;AACF,iBAAO,MAAM,wBAAwB,cAAc,MAAM,CAAC;AAC1D,cAAI,SAAS,mCAAmC,EAAE,OAAO,CAAC;AAAA,QAC5D,SAAS,GAAG;AACV,cAAI,QAAQ,0BAA0B;AAAA,YACpC,OAAO,kBAAkB,CAAC;AAAA,YAC1B;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAIA,cAAa,KAAK,GAAG;AACvB,UAAI,SAAS,4CAA4C,EAAE,OAAO,CAAC;AAAA,IACrE;AAAA,EACF;AAEA,QAAM,kBAAkB,CAAC,WAAmB;AAC1C,0BAAsB;AAEtB,QAAI,CAAC,SAAS,GAAG;AACf,UAAI,SAAS,uCAAuC,EAAE,OAAO,CAAC;AAC9D;AAAA,IACF;AAEA,eAAW,EACR,KAAK,MAAM;AACV,YAAM,QAAQ,eAAe;AAC7B,UAAI,CAAC,OAAO;AACV,YAAIA,cAAa,KAAK,GAAG;AACvB,cAAI,QAAQ,8BAA8B,EAAE,OAAO,CAAC;AAAA,QACtD;AACA;AAAA,MACF;AACA,gBAAU;AAAA,IACZ,CAAC,EACA,MAAM,CAAC,MAAM;AACZ,UAAI,SAAS,6BAA6B;AAAA,QACxC,OAAO,kBAAkB,CAAC;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACL;AACA,qBAAmB,UAAU;AAE7B,QAAM,qBAAqB,CAAC,WAAmB;AAC7C,QAAIA,cAAa,KAAK,GAAG;AACvB,UAAI,SAAS,uCAAuC,EAAE,OAAO,CAAC;AAAA,IAChE;AACA,yBAAqB,sBAAsB,MAAM,EAAE;AAAA,EACrD;AAEA,QAAM,UAAU,MAAM;AACpB,UAAM,SAAS;AACf,QAAI,sBAAsB;AACxB,2BAAqB;AACrB,6BAAuB;AAAA,IACzB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC/SO,IAAM,oBAAoB;AAQ1B,IAAM,mBAAmB;;;ACwBhC,IAAM,0BAA0B;AAChC,IAAM,yBAAyB;AAQxB,SAAS,mBACd,UACc;AACd,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,0BAA0B;AAAA,IAC1B,kBAAkB;AAAA,IAClB,MAAM,MAAM,KAAK,IAAI;AAAA,IACrB,WAAW,CAAC,IAAI,OAAO,WAAW,IAAI,EAAE;AAAA,IACxC,iBAAiB,CAAC,OAAO,aAAa,EAAE;AAAA,EAC1C,IAAI;AAEJ,MAAI,aAAa;AACjB,MAAI,kBAAkB;AACtB,MAAI,iBAAgC;AACpC,MAAI,iBAAuD;AAC3D,MAAI,eAAqD;AACzD,MAAI,uBAA4C;AAEhD,QAAM,oBAAoB,MAAM;AAC9B,QAAI,iBAAiB,MAAM;AACzB,qBAAe,YAAY;AAC3B,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,QAAI,mBAAmB,MAAM;AAC3B,qBAAe,cAAc;AAC7B,uBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,gBAAgB,MAAM,WAAW,KAAK;AAE5C,QAAM,6BAA6B,CAAC,sBAA8B;AAChE,sBAAkB;AAClB,mBAAe,SAAS,MAAM;AAC5B,qBAAe;AACf,UAAI,CAAC,SAAS,EAAG;AACjB,UAAI,sBAAsB,gBAAiB;AAC3C,UAAI,CAAC,cAAc,EAAG;AACtB,2BAAqB;AAAA,IACvB,GAAG,gBAAgB;AAAA,EACrB;AAEA,QAAM,0BAA0B,MAAM;AACpC,sBAAkB;AAClB,qBAAiB,IAAI;AAErB,wBAAoB;AACpB,qBAAiB,SAAS,MAAM;AAC9B,uBAAiB;AACjB,gBAAU;AAAA,IACZ,GAAG,iBAAiB;AAAA,EACtB;AAEA,iBAAe,gBAA+B;AAC5C,QAAI,WAAY;AAChB,iBAAa;AACb,UAAM,oBAAoB;AAE1B,QAAI;AACF,YAAM,gBAAgB,MAAM,eAAe;AAE3C,UAAI,sBAAsB,gBAAiB;AAE3C,wBAAkB,eAAe;AAEjC,UAAI,CAAC,SAAS,EAAG;AAEjB,UAAI,eAAe;AACjB,mCAA2B,iBAAiB;AAAA,MAC9C;AAAA,IACF,UAAE;AACA,UAAI,sBAAsB,iBAAiB;AACzC,qBAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,QAAM,6BAA6B,MAAM;AACvC,wBAAoB;AAEpB,UAAM,SAAS;AACf,UAAM,UAAU,UAAU,OAAO,IAAI,IAAI,SAAS;AAClD,qBAAiB;AAEjB,QAAI,WAAW,mBAAmB;AAChC,WAAK,cAAc;AACnB;AAAA,IACF;AAEA,sBAAkB,uBAAuB;AAAA,EAC3C;AAEA,SAAO;AAAA,IACL,qBAAqB;AACnB,wBAAkB;AAClB,0BAAoB;AACpB,uBAAiB;AACjB,mBAAa;AACb,yBAAmB;AAAA,IACrB;AAAA,IAEA;AAAA,IAEA,QAAQ;AACN,UAAI,qBAAsB;AAC1B,6BAAuB,mBAAmB;AAAA,QACxC,UAAU;AAAA,QACV,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,IAEA,OAAO;AACL,UAAI,sBAAsB;AACxB,6BAAqB;AACrB,+BAAuB;AAAA,MACzB;AACA,wBAAkB;AAClB,0BAAoB;AACpB,uBAAiB;AACjB,mBAAa;AAAA,IACf;AAAA,EACF;AACF;","names":["onError","import_client","onError","import_error","import_client","wait","resolveIsDev","maskedTokenInfo"]}
@@ -780,34 +780,41 @@ function waitForOnline(adapters, aborted) {
780
780
  return;
781
781
  }
782
782
  let intervalId = null;
783
- const unsub = adapters.subscribeIsOnline((online) => {
784
- if (aborted()) {
785
- if (intervalId !== null) {
786
- clearInterval(intervalId);
787
- intervalId = null;
788
- }
789
- unsub();
790
- resolve();
791
- return;
783
+ let settled = false;
784
+ let polling = false;
785
+ let unsub = null;
786
+ const settle = () => {
787
+ if (settled) return;
788
+ settled = true;
789
+ if (intervalId !== null) {
790
+ clearInterval(intervalId);
791
+ intervalId = null;
792
792
  }
793
- if (online) {
794
- if (intervalId !== null) {
795
- clearInterval(intervalId);
796
- intervalId = null;
797
- }
798
- unsub();
799
- resolve();
793
+ unsub?.();
794
+ resolve();
795
+ };
796
+ unsub = adapters.subscribeIsOnline((online) => {
797
+ if (aborted() || online) {
798
+ settle();
800
799
  }
801
800
  });
801
+ if (settled) {
802
+ unsub?.();
803
+ return;
804
+ }
802
805
  intervalId = setInterval(() => {
803
- if (aborted()) {
804
- if (intervalId !== null) {
805
- clearInterval(intervalId);
806
- intervalId = null;
807
- }
808
- unsub();
809
- resolve();
806
+ if (aborted() || settled) {
807
+ settle();
808
+ return;
810
809
  }
810
+ if (polling) return;
811
+ polling = true;
812
+ void Promise.resolve(adapters.forceRefreshIsOnline()).then((online) => {
813
+ if (settled || aborted()) return;
814
+ if (online) settle();
815
+ }).catch(() => void 0).finally(() => {
816
+ polling = false;
817
+ });
811
818
  }, 500);
812
819
  });
813
820
  }