@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 +1 @@
1
- {"version":3,"sources":["../../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/apollo/createNetworkLog.ts","../../src/apollo/createWsManager.ts","../../src/apollo/recoveryConstants.ts","../../src/apollo/createRecoveryCore.ts"],"sourcesContent":["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","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","Observable","Observable","onError","onError","onError","ApolloLink","Observable","wait","ApolloLink","Observable","resolveIsDev","maskedTokenInfo"]}
1
+ {"version":3,"sources":["../../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/apollo/createNetworkLog.ts","../../src/apollo/createWsManager.ts","../../src/apollo/recoveryConstants.ts","../../src/apollo/createRecoveryCore.ts"],"sourcesContent":["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","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","Observable","Observable","onError","onError","onError","ApolloLink","Observable","wait","ApolloLink","Observable","resolveIsDev","maskedTokenInfo"]}
@@ -1,9 +1,9 @@
1
1
  import { EnumUserRole, EnumResourceType, EnumUserLicence } from '../enums/index.mjs';
2
- import { P as Permission, S as SafeUserType } from '../user-D2Dww93Z.mjs';
3
- export { a as PERMISSIONS, W as WILDCARD_PERMISSION } from '../user-D2Dww93Z.mjs';
2
+ import { P as Permission, S as SafeUserType } from '../user-Cz3XuyJU.mjs';
3
+ export { a as PERMISSIONS, W as WILDCARD_PERMISSION } from '../user-Cz3XuyJU.mjs';
4
4
  import { T as Tier } from '../subscription-bmAdrnfi.mjs';
5
5
  import React, { ReactNode } from 'react';
6
- import '../global-CcE-PQOR.mjs';
6
+ import '../global-ho4a3lOA.mjs';
7
7
  import 'react-hook-form';
8
8
 
9
9
  type AuthManager = {
@@ -1,9 +1,9 @@
1
1
  import { EnumUserRole, EnumResourceType, EnumUserLicence } from '../enums/index.js';
2
- import { P as Permission, S as SafeUserType } from '../user-CQC_FzHj.js';
3
- export { a as PERMISSIONS, W as WILDCARD_PERMISSION } from '../user-CQC_FzHj.js';
2
+ import { P as Permission, S as SafeUserType } from '../user-B6RYIUjX.js';
3
+ export { a as PERMISSIONS, W as WILDCARD_PERMISSION } from '../user-B6RYIUjX.js';
4
4
  import { T as Tier } from '../subscription-BU8GvH2K.js';
5
5
  import React, { ReactNode } from 'react';
6
- import '../global-CdSsPQHl.js';
6
+ import '../global-xmZHaJhe.js';
7
7
  import 'react-hook-form';
8
8
 
9
9
  type AuthManager = {
@@ -46,8 +46,6 @@ var EnumActivity = /* @__PURE__ */ ((EnumActivity2) => {
46
46
  // src/types/post.ts
47
47
  var EnumPostType = /* @__PURE__ */ ((EnumPostType2) => {
48
48
  EnumPostType2["CLUE_BITES"] = "clue_bites";
49
- EnumPostType2["CLUE_GUIDES_FOR_ORGANISERS"] = "clue_guides_for_organisers";
50
- EnumPostType2["CLUE_GUIDES_FOR_VENDORS"] = "clue_guides_for_vendors";
51
49
  EnumPostType2["MARKET_FACES"] = "market_faces";
52
50
  EnumPostType2["PLAY_AND_WIN"] = "play_and_win";
53
51
  return EnumPostType2;
@@ -234,4 +232,4 @@ export {
234
232
  EnumCouponQualificationType,
235
233
  EnumCouponListType
236
234
  };
237
- //# sourceMappingURL=chunk-QYHJKAVQ.mjs.map
235
+ //# sourceMappingURL=chunk-5D2JVHC2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/auth.ts","../src/types/global.ts","../src/types/ad.ts","../src/types/resourceActivities.ts","../src/types/post.ts","../src/types/game/index.ts","../src/types/game/dailyClue.ts","../src/types/game/global.ts","../src/types/affiliate.ts","../src/types/coupon/index.ts"],"sourcesContent":["import {\n CreateFormData,\n EnumOSPlatform,\n PromoCodeType,\n TermsAgreement,\n} from \"src\";\n\nimport { MutationResponse } from \"./global\";\nimport { SafeUserType } from \"./user\";\n\nexport enum EnumVerificationType {\n REGISTER = \"register\",\n RESET_PASSWORD = \"resetPassword\",\n}\n\nexport type LoginFormData = {\n email: string;\n isAdminPage?: boolean;\n password: string;\n platform?: EnumOSPlatform;\n};\n\nexport type CreateLoginFormData = CreateFormData<LoginFormData>;\n\nexport type RegisterFormData = {\n email: string;\n firstName: string;\n lastName: string;\n password: string;\n platform?: EnumOSPlatform;\n preferredRegion: string;\n promoCode?: PromoCodeType | null;\n termsAgreement?: TermsAgreement | null;\n};\n\nexport type CreateRegisterFormData = CreateFormData<RegisterFormData>;\n\nexport type RequestPasswordResetFormData = {\n email: string;\n};\n\nexport type CreateRequestPasswordResetFormData =\n CreateFormData<RequestPasswordResetFormData>;\n\nexport type ResetPasswordFormData = {\n confirmPassword: string;\n email: string;\n password: string;\n};\n\nexport type CreateResetPasswordFormData = CreateFormData<ResetPasswordFormData>;\n\nexport type ValidateVerificationTokenFormData = {\n email: string;\n verificationToken: string;\n verificationType?: EnumVerificationType;\n};\n\nexport type CreateValidateVerificationTokenFormData =\n CreateFormData<ValidateVerificationTokenFormData>;\n\nexport type AuthPayloadType = {\n refreshToken: string | null;\n token: string;\n user: SafeUserType;\n};\n\nexport type AuthMutationResponse = MutationResponse<AuthPayloadType>;\n\nexport type RefreshTokenPayloadType = {\n refreshToken: string;\n token: string;\n};\n\nexport type RefreshTokenMutationResponse =\n MutationResponse<RefreshTokenPayloadType>;\n","import {\n Control,\n FieldValues,\n FormState,\n UseFormGetValues,\n UseFormHandleSubmit,\n UseFormReset,\n UseFormSetValue,\n UseFormWatch,\n} from \"react-hook-form\";\n\nimport {\n EnumEventDateStatus,\n EnumEventType,\n EnumResourceType,\n EnumSocialMedia,\n EnumUserLicence,\n} from \"../enums\";\n\nimport { EventListItemType } from \"./event\";\nimport { EnumPostType } from \"./post\";\nimport { VendorType } from \"./vendor\";\n\nexport const PROMO_CODE_PREFIX = \"CM-\";\n\nexport type PromoCodeType = `${typeof PROMO_CODE_PREFIX}${string}`;\n\nexport type Nullable<T> = {\n [K in keyof T]: T[K] | null | undefined;\n};\n\n/** Uniform mutation response envelope used across GraphQL mutations. */\nexport type MutationResponse<T> = {\n data: T | null;\n message: string | null;\n};\n\nexport type DeviceInfo = {\n appBuildNumber: string;\n appId: string;\n appVersion: string;\n brand: string;\n deviceName: string;\n installationId: string;\n manufacturer: string;\n modelName: string;\n osName: string;\n osVersion: string;\n timestamp: string;\n};\n\nexport type TermsAgreement = DeviceInfo & {\n termVersion: string;\n};\n\nexport type ResourceContactDetailsType = {\n email?: string | null;\n landlinePhone?: string | null;\n mobilePhone?: string | null;\n};\n\nexport type ResourceImageType = {\n active: boolean;\n source: string;\n title: string;\n};\n\nexport type SocialMediaType = {\n name?: EnumSocialMedia;\n link?: string;\n};\n\nexport type UserLicenceType = {\n expiryDate: Date;\n issuedDate: Date;\n licenceType: EnumUserLicence;\n prevLicenceType?: EnumUserLicence | null;\n};\n\nexport type OwnerType = {\n email: string;\n userId: string;\n};\n\nexport interface BaseResourceTypeFormData {\n _id?: string;\n active: boolean;\n contactDetails: ResourceContactDetailsType | null;\n cover: ResourceImageType;\n coverUpload?: ResourceImageType | null;\n description: string;\n images?: ResourceImageType[] | null;\n imagesUpload?: ResourceImageType[] | null;\n logo?: ResourceImageType | null;\n logoUpload?: ResourceImageType | null;\n name: string;\n promoCodes?: PromoCodeType[] | null;\n region: string;\n socialMedia: SocialMediaType[] | null;\n termsAgreement?: TermsAgreement | null;\n}\n\nexport type PosterUsageType = {\n month: string;\n count: number;\n};\n\nexport type RelatedPostType = {\n postActive: boolean;\n postId: string;\n postSlug: string;\n postType: EnumPostType;\n};\n\nexport type SocialShareResourceType = {\n qrCode: ResourceImageType;\n socialImage: ResourceImageType;\n};\n\nexport type BaseResourceType = Omit<\n BaseResourceTypeFormData,\n \"_id\" | \"coverUpload\" | \"imagesUpload\" | \"logoUpload\"\n> & {\n _id: string;\n adIds?: string[] | null;\n approvedAt?: Date | null;\n createdAt: Date;\n deletedAt: Date | null;\n owner: OwnerType;\n posterUsage?: PosterUsageType | null;\n rating?: number | null;\n relatedPost?: RelatedPostType | null;\n reviewCount?: number | null;\n sharePublic?: SocialShareResourceType | null;\n slug: string;\n updatedAt: Date | null;\n};\n\nexport type LocationGeoType = {\n coordinates: number[]; // [longitude, latitude]\n type: \"Point\"; // Mongoose GeoJSON type\n};\n\nexport type LocationType = {\n city: string;\n country: string;\n fullAddress: string;\n geo: LocationGeoType;\n latitude: number;\n longitude: number;\n region: string;\n};\n\nexport type DateTimeType = {\n dateStatus: EnumEventDateStatus;\n endDate: string;\n endTime: string;\n startDate: string;\n startTime: string;\n};\n\nexport type Region = {\n latitude: number;\n latitudeDelta: number;\n longitude: number;\n longitudeDelta: number;\n};\n\nexport type ResourceDetails = {\n dateTime: DateTimeType[] | null;\n description: string | null;\n eventStatus?: EventStatusType | null;\n location: LocationType | null;\n resourceCover: ResourceImageType | null;\n resourceId: string;\n resourceLogo: ResourceImageType | null;\n resourceName: string;\n resourceType: EnumResourceType;\n};\n\nexport type GeocodeLocation = Pick<LocationType, \"latitude\" | \"longitude\">;\n\nexport type EventStatusType = {\n claimed: boolean;\n eventType: EnumEventType;\n googlePlaceId?: string | null;\n};\n\nexport interface FormField {\n disabled?: boolean;\n helperText?: string;\n isTextArea?: boolean;\n keyboardType?:\n | \"default\"\n | \"email-address\"\n | \"number-pad\"\n | \"url\"\n | \"decimal-pad\"\n | \"phone-pad\";\n name: string;\n placeholder: string;\n required?: boolean;\n secureTextEntry?: boolean;\n}\n\nexport interface FormDateField {\n dateMode: \"date\" | \"time\";\n helperText?: string;\n name: \"endDate\" | \"endTime\" | \"startDate\" | \"startTime\";\n placeholder: string;\n}\n\nexport interface SubcategoryItems {\n id: string;\n name: string;\n description?: string | null;\n}\n\nexport interface Subcategory {\n id: string;\n name: string;\n items?: SubcategoryItems[] | null;\n}\n\nexport interface Category {\n color?: string | null;\n description?: string | null;\n id: string;\n name: string;\n subcategories: Subcategory[];\n}\n\nexport type OptionItem = {\n value: string;\n label: string;\n};\n\nexport type ImageObjectType = {\n uri: string;\n type: string;\n name: string;\n};\n\nexport interface ResourceConnectionsType {\n events: EventListItemType[] | null;\n vendors: VendorType[] | null;\n}\n\nexport interface CreateFormData<T extends FieldValues> {\n control: Control<T, any>;\n fields: T;\n formState: FormState<T>;\n handleSubmit: UseFormHandleSubmit<T, any>;\n reset: UseFormReset<T>;\n setValue: UseFormSetValue<T>;\n watch: UseFormWatch<T>;\n getValues: UseFormGetValues<T>;\n}\n\nexport interface UseGetResourcesByRegionOptions {\n onlyClaimed?: boolean;\n limit?: number;\n offset?: number;\n}\n","import { EnumResourceType } from \"src/enums\";\n\nimport { CreateFormData } from \"./global\";\n\nexport enum EnumAdShowOn {\n EVENTS_PAGE = \"Events_page\",\n FRONT_PAGE = \"Front_page\",\n PARTNERS_PAGE = \"Partners_page\",\n VENDORS_PAGE = \"Vendors_page\",\n}\n\nexport enum EnumAdStatus {\n ACTIVE = \"Active\",\n PAUSED = \"Paused\",\n EXPIRED = \"Expired\",\n}\n\nexport enum EnumAdType {\n SPONSORED = \"Sponsored\",\n FREE = \"Free\",\n}\n\nexport enum EnumAdStyle {\n BLOOM = \"Bloom\",\n RISE = \"Rise\",\n}\n\nexport type AdResource = {\n adDescription: string;\n adImage: string;\n adStyle: EnumAdStyle;\n adTitle: string;\n adType: EnumAdType;\n resourceId: string;\n resourceName: string;\n resourceRegion: string;\n resourceType: EnumResourceType;\n resourceSlug: string;\n};\n\nexport interface AdFormData {\n active: boolean;\n end: Date; // ISO date string\n resource: AdResource;\n showOn: EnumAdShowOn[];\n start?: Date; // ISO date string\n status: EnumAdStatus;\n targetRegion: string[];\n}\n\n// Form state matches the validation schema: all resource fields are present.\n// Use empty strings / explicit enum defaults in `defaultValues` for \"create\" flows.\nexport type AdFormState = AdFormData;\n\nexport type CreateAdFormData = CreateFormData<AdFormData>;\nexport type CreateAdFormState = CreateFormData<AdFormState>;\n\nexport interface AdType extends AdFormData {\n _id: string;\n clicks?: number; // How many times the ad was clicked\n createdAt: Date;\n impressions?: number; // How often the ad was seen\n start: Date; // ISO date string\n updatedAt: Date | null;\n}\n","import {\n EnumEventDateStatus,\n EnumOSPlatform,\n EnumResourceType,\n} from \"src/enums\";\n\nimport { LocationGeoType } from \"./global\";\n\nexport enum EnumActivity {\n FAVORITE = \"FAVORITE\",\n GOING = \"GOING\",\n INTERESTED = \"INTERESTED\",\n PRESENT = \"PRESENT\",\n VIEW = \"VIEW\",\n}\n\nexport type ResourceActivityEntry = {\n activityType: EnumActivity;\n location: LocationGeoType | null;\n dateStatus?: EnumEventDateStatus | null;\n startDate?: string | null;\n startTime?: string | null;\n timestamp: Date;\n userAgent: EnumOSPlatform;\n userId?: string | null;\n};\n\nexport type ResourceActivityType = {\n _id: string;\n resourceType: EnumResourceType;\n resourceId: string;\n activity: ResourceActivityEntry[];\n};\n\nexport type ResourceActivityInputType = {\n resourceId: string;\n resourceType: EnumResourceType;\n activity: Omit<ResourceActivityEntry, \"timestamp\">;\n};\n","import { EnumResourceType } from \"src/enums\";\n\nimport { BaseGameType } from \"./game\";\nimport {\n CreateFormData,\n ResourceImageType,\n SocialShareResourceType,\n} from \"./global\";\n\nexport enum EnumPostType {\n CLUE_BITES = \"clue_bites\",\n //CLUE_GUIDES_FOR_ORGANISERS = \"clue_guides_for_organisers\",\n //CLUE_GUIDES_FOR_VENDORS = \"clue_guides_for_vendors\",\n MARKET_FACES = \"market_faces\",\n PLAY_AND_WIN = \"play_and_win\",\n}\n\nexport enum EnumPostContentType {\n GAME = \"game\",\n IMAGE = \"image\",\n LIST = \"list\",\n TEXTAREA = \"textarea\",\n VIDEO = \"video\",\n}\n\nexport type PostFileInput = {\n source: File;\n title?: string;\n};\n\nexport type PostContentTextarea = {\n textarea: {\n title?: string;\n data: string;\n };\n};\n\nexport type PostContentImage = {\n images: ResourceImageType[] | null;\n imagesUpload?: PostFileInput[] | null;\n};\n\nexport type PostContentVideo = {\n video: {\n source: string;\n title?: string;\n };\n};\n\nexport type PostContentList = {\n list: {\n title?: string;\n items: {\n text: string;\n }[];\n };\n};\n\nexport type PostContentGame = {\n game: BaseGameType;\n};\n\nexport type PostContentData =\n | PostContentGame\n | PostContentTextarea\n | PostContentImage\n | PostContentVideo\n | PostContentList;\n\nexport type PostContentFormData = {\n contentData?: PostContentData | null;\n contentOrder?: number | null;\n contentType?: EnumPostContentType | null;\n};\n\nexport type PostResource = {\n resourceSlug: string;\n resourceId: string;\n resourceType: EnumResourceType;\n resourceRegion: string;\n};\n\nexport interface PostFormData {\n active: boolean;\n caption: string;\n content: PostContentFormData[];\n cover?: ResourceImageType | null;\n coverUpload?: PostFileInput | null;\n postType: EnumPostType;\n resource?: PostResource | null;\n tags?: string[] | null;\n title: string;\n notifyUsers?: boolean | null;\n}\n\nexport type CreatePostFormData = CreateFormData<PostFormData>;\n\nexport type PostContentType = Omit<PostContentFormData, \"contentData\"> & {\n contentData: Omit<PostContentData, \"imagesUpload\">;\n};\n\nexport type PostType = Omit<\n PostFormData,\n \"content\" | \"coverUpload\" | \"resource\"\n> & {\n _id: string;\n approvedAt?: Date | null;\n content: PostContentType[];\n createdAt: Date;\n deletedAt: Date | null;\n resource?: PostResource | null;\n slug: string;\n sharePublic?: SocialShareResourceType | null;\n updatedAt: Date | null;\n};\n","import { OwnerType } from \"../global\";\n\nimport { DailyClueBaseGame, DailyClueGameData } from \"./dailyClue\";\nimport { EnumGameType, GameDate } from \"./global\";\nimport { PuzzleBaseGame, PuzzleGameData } from \"./puzzleGame\";\n\nexport type BaseGameMap = {\n [EnumGameType.DAILY_CLUE]: DailyClueBaseGame;\n [EnumGameType.MINI_QUIZ]: PuzzleBaseGame;\n [EnumGameType.ODD_ONE_OUT]: PuzzleBaseGame;\n};\n\nexport type BaseGameType = {\n gameType: EnumGameType;\n gameTypeId: string;\n gameTitle: string;\n} & {\n [K in keyof BaseGameMap]?: BaseGameMap[K] | null;\n};\n\nexport enum EnumGameStatus {\n GAME_COMPLETED = \"GAME_COMPLETED\",\n GAME_IN_PROGRESS = \"GAME_IN_PROGRESS\",\n GAME_LEFT = \"GAME_LEFT\",\n GAME_STARTED = \"GAME_STARTED\",\n}\n\nexport type GameHistory = Pick<\n BaseGameType,\n \"gameTitle\" | \"gameType\" | \"gameTypeId\"\n> & {\n createdAt: Date;\n gameDate: GameDate;\n gameStatus: EnumGameStatus;\n /** Per-event delta. Not persisted for overallGamePoints (computed at read time). */\n pointsEarned: number;\n /** Running total for this game instance; computed at read time, not stored in Mongo. */\n overallGamePoints?: number;\n};\n\ntype GameDataMap = {\n [EnumGameType.DAILY_CLUE]: DailyClueGameData;\n [EnumGameType.MINI_QUIZ]: PuzzleGameData;\n [EnumGameType.ODD_ONE_OUT]: PuzzleGameData;\n};\ntype GameDataType = {\n [K in keyof GameDataMap]?: GameDataMap[K] | null;\n};\n\nexport type GameType = Pick<\n BaseGameType,\n \"gameTitle\" | \"gameType\" | \"gameTypeId\"\n> & {\n _id: string;\n active: boolean;\n createdAt: Date;\n gameData: GameDataType;\n gameHistory: GameHistory[] | null;\n updatedAt: Date | null;\n};\n\nexport type GameDocType = {\n _id: string;\n active: boolean;\n createdAt: Date;\n deletedAt: Date | null;\n games: GameType[] | null;\n owner: OwnerType;\n points: number;\n updatedAt: Date | null;\n};\n\nexport type GameLeaderboard = {\n gameHistory: GameHistory[] | null;\n overallPoints: number;\n owner: OwnerType;\n};\n","import { GameDate, GlobalGameData } from \"./global\";\n\nconst OBJECT_ID_PATH_SEGMENT = \"[a-f0-9]{24}\";\nconst OBJECT_ID_PATH_SEGMENT_END = `${OBJECT_ID_PATH_SEGMENT}$`;\n\nexport const gameScreenIdentifierList = [\n {\n clue: \"Where your actions turn into a timeline.\",\n id: \"activities\",\n match: \"/profile/account/favourites\",\n },\n {\n clue: \"Where conversations happen without speaking.\",\n id: \"chat\",\n match: \"/chat\",\n },\n {\n clue: \"The place to redefine who you are.\",\n id: \"edit-profile\",\n match: \"/profile/account\",\n },\n {\n clue: \"A single moment worth showing up for.\",\n id: \"single-event\",\n match: new RegExp(`^/events/${OBJECT_ID_PATH_SEGMENT_END}`),\n },\n {\n clue: \"What’s happening around you, right now.\",\n id: \"events-near-me\",\n match: \"/events/events-near-me\",\n },\n {\n clue: \"Where events appear as pins on a map.\",\n id: \"events-map\",\n match: \"/events/events-map\",\n },\n {\n clue: \"A collection of events worth attending.\",\n id: \"events\",\n match: \"/events\",\n },\n {\n clue: \"What’s happening in a wider area — not just nearby.\",\n id: \"events-region\",\n match: /^\\/events\\/region\\/[^/]+$/,\n },\n {\n clue: \"Where fun becomes a challenge.\",\n id: \"games\",\n match: \"/games\",\n },\n {\n clue: \"Your starting point for everything.\",\n id: \"home\",\n match: \"/\",\n },\n {\n clue: \"Where the app whispers what you shouldn’t miss.\",\n id: \"notifications\",\n match: \"/notifications\",\n },\n {\n clue: \"Where you fine-tune your experience.\",\n id: \"options\",\n match: \"/options\",\n },\n {\n clue: \"An organisation or creator supporting the community.\",\n id: \"single-partner\",\n match: new RegExp(`^/partners/${OBJECT_ID_PATH_SEGMENT_END}`),\n },\n {\n clue: \"Organisations and creators supporting the community.\",\n id: \"partners\",\n match: \"/partners\",\n },\n {\n clue: \"A single published post in full view.\",\n id: \"single-visitor-post\",\n match: new RegExp(`^/visitors/post/${OBJECT_ID_PATH_SEGMENT_END}`),\n },\n {\n clue: \"Your identity, on display.\",\n id: \"profile\",\n match: \"/profile\",\n },\n {\n clue: \"One stallholder offering something valuable.\",\n id: \"single-vendor\",\n match: new RegExp(`^/vendors/${OBJECT_ID_PATH_SEGMENT_END}`),\n },\n {\n clue: \"Where every stallholder waits under the right category.\",\n id: \"vendors\",\n match: \"/vendors\",\n },\n {\n clue: \"Where you browse articles and posts from around the platform.\",\n id: \"visitors\",\n match: \"/visitors\",\n },\n] as const;\n\nexport type GamePlacement = (typeof gameScreenIdentifierList)[number][\"id\"];\nexport type GamePlacementClue =\n (typeof gameScreenIdentifierList)[number][\"clue\"];\n\nexport type DailyClueBaseGame = {\n gameDate: GameDate;\n gameSolution: string;\n};\n\nexport type DailyClueGameData = GlobalGameData & {\n gameFields: DailyClueBaseGame;\n lastFoundDate: Date | null;\n letterInfo: {\n collected: string[] | null; // The letters the user has found, e.g. [\"C\", \"L\", \"U\"]\n solutionShuffled: string[]; // The letters of the solution, but shuffled, e.g. [\"L\", \"C\", \"U\"]\n todaysClue: GamePlacementClue | null; // The clue for user to find the letter, e.g. related to {todaysPlacement}\n todaysLetter: string | null; // The letter the user has to find today, e.g. \"C\"\n todaysPlacement: GamePlacement | null; // The screen where the user has to find the clue, e.g. \"HomeScreen\"\n };\n};\n","export enum EnumGameType {\n DAILY_CLUE = \"dailyClue\",\n MINI_QUIZ = \"miniQuiz\",\n ODD_ONE_OUT = \"oddOneOut\",\n}\n\nexport type GameDate = {\n startDate: Date;\n endDate: Date;\n};\n\nexport const gameTypeToDisplayName: Record<EnumGameType, string> = {\n [EnumGameType.DAILY_CLUE]: \"Daily Clue\",\n [EnumGameType.MINI_QUIZ]: \"Mini Quiz\",\n [EnumGameType.ODD_ONE_OUT]: \"Odd One Out\",\n};\n\nexport type GlobalGameData = {\n points: number;\n // User has found the clue 3 days in a row, this is incrementing if the user finds the clue and decrements if user misses a day\n streak: number;\n};\n","import { EnumResourceType } from \"src/enums\";\n\nimport {\n CreateFormData,\n LocationType,\n OwnerType,\n PromoCodeType,\n SocialMediaType,\n} from \"./global\";\nimport { UserFormData } from \"./user\";\n\nexport enum EnumAffiliateParticipantType {\n INDIVIDUAL = \"INDIVIDUAL\",\n SOLE_TRADER = \"SOLE_TRADER\",\n COMPANY = \"COMPANY\",\n}\n\nexport type AffiliateContactDetails = {\n mobilePhone: string;\n};\n\nexport type AffiliateBankAccountDetailsType = {\n accountHolderName: string;\n accountNumber: string;\n};\n\nexport type AffiliateUserDefaultFields = Pick<\n UserFormData,\n \"email\" | \"firstName\" | \"lastName\" | \"termsAgreement\"\n>;\n\nexport type AffiliateDetailsType = AffiliateUserDefaultFields & {\n bankAccountDetails: AffiliateBankAccountDetailsType;\n contactDetails: AffiliateContactDetails;\n irdNumber: string;\n location: LocationType;\n participantType: EnumAffiliateParticipantType;\n socialMedia: SocialMediaType[] | null;\n};\n\nexport enum EnumAffiliateRewardType {\n ACTIVE_EVENT_WITH_VENDOR_REGISTRATIONS = \"ACTIVE_EVENT_WITH_VENDOR_REGISTRATIONS\",\n ACTIVE_VENDOR_BONUS_REWARD = \"ACTIVE_VENDOR_BONUS_REWARD\",\n ACTIVE_VENDOR_PRO_SUBSCRIPTION = \"ACTIVE_VENDOR_PRO_SUBSCRIPTION\",\n ACTIVE_VENDOR_STANDARD_SUBSCRIPTION = \"ACTIVE_VENDOR_STANDARD_SUBSCRIPTION\",\n NEW_EVENT_REGISTRATION = \"NEW_EVENT_REGISTRATION\",\n NEW_VENDOR_REGISTRATION = \"NEW_VENDOR_REGISTRATION\",\n}\n\nexport type AffiliateRewardType = {\n createdAt: Date;\n redeemedAt: Date | null;\n rewardDescription: string;\n rewardType: EnumAffiliateRewardType;\n rewardValue: number;\n};\n\nexport type AffiliateResourceType = {\n resourceActive: boolean;\n resourceDeletedAt: Date | null;\n resourceId: string;\n resourceName: string;\n resourceOwner: OwnerType;\n resourceType: EnumResourceType;\n rewards: AffiliateRewardType[];\n};\n\nexport type RedeemHistoryType = {\n paidAt?: Date | null;\n redeemedAt: Date;\n rewardValue: number;\n};\n\nexport interface AffiliateType {\n _id: string;\n active: boolean;\n approvedAt?: Date | null;\n affiliateBonusRewards?: AffiliateRewardType[] | null;\n affiliateCode: PromoCodeType | null;\n affiliateDetails: AffiliateDetailsType | null;\n affiliateResources: AffiliateResourceType[];\n createdAt: Date;\n deletedAt: Date | null;\n overallPoints: number;\n owner: OwnerType;\n redeemHistory?: RedeemHistoryType[] | null;\n updatedAt: Date | null;\n}\n\nexport type AffiliateFormData = Omit<\n AffiliateDetailsType,\n \"email\" | \"firstName\" | \"lastName\"\n>;\n\nexport type CreateAffiliateFormData = CreateFormData<AffiliateFormData>;\n","import { EnumResourceType } from \"src/enums\";\n\nimport { CreateFormData, OwnerType, ResourceImageType } from \"../global\";\nimport { VendorProductList } from \"../vendor\";\n\nexport type ProductCoupon = {\n couponDocumentId: string;\n couponId: string;\n};\n\nexport enum EnumCouponQualificationType {\n PURCHASE = \"PURCHASE\",\n MARKET_VISIT = \"MARKET_VISIT\",\n MARKET_PASSPORT = \"MARKET_PASSPORT\",\n}\n\nexport type CouponPurchaseOption = {\n buy: number;\n get: number;\n type: EnumCouponQualificationType.PURCHASE;\n unit: string;\n};\n\nexport type CouponMarketVisitOption = {\n type: EnumCouponQualificationType.MARKET_VISIT;\n visits: number;\n};\n\nexport type CouponMarketPassportOption = {\n type: EnumCouponQualificationType.MARKET_PASSPORT;\n visits: number;\n};\n\nexport type CouponOption =\n | CouponPurchaseOption\n | CouponMarketVisitOption\n | CouponMarketPassportOption;\n\nexport type CouponVendorProduct = {\n couponId: string;\n productId: string;\n vendorId: string;\n\n // Required only for MARKET_PASSPORT: which Vendor coupon contributes\n // progress when scanned.\n vendorCouponId?: string | null;\n};\n\nexport type CouponDefaultsFormData = {\n couponDescription: string;\n couponOption: CouponOption | null;\n couponVendorProducts?: CouponVendorProduct[];\n endDate: Date;\n resourceId: string;\n resourceType: EnumResourceType;\n startDate: Date;\n};\n\nexport type CreateCouponFormData = CreateFormData<CouponDefaultsFormData>;\n\nexport type CouponParticipantUserType = {\n couponCollectedCount: number;\n couponRedeemedAt: Date | null;\n createdAt: Date;\n updatedAt: Date | null;\n userId: string;\n};\n\nexport type CouponCodeType = {\n code: string;\n qrCode: ResourceImageType;\n shareableQrCode: ResourceImageType;\n};\n\nexport type CouponDataProductsType = {\n active: boolean | null;\n couponId: string;\n productsList: VendorProductList[];\n vendorId: string;\n vendorLogo: ResourceImageType | null;\n vendorName: string;\n};\n\nexport type CouponDataType = CouponDefaultsFormData & {\n _id: string;\n active: boolean;\n couponCode: CouponCodeType;\n createdAt: Date;\n participantUsers: CouponParticipantUserType[] | null;\n // products are not saved in the database, but are returned by the backend for convenience\n products?: CouponDataProductsType[] | null;\n updatedAt: Date | null;\n};\n\nexport interface CouponType {\n _id: string;\n active: boolean;\n couponData: CouponDataType[] | null;\n createdAt: Date;\n deletedAt: Date | null;\n owner: OwnerType;\n updatedAt: Date | null;\n}\n\nexport enum EnumCouponListType {\n ACTIVE = \"active\",\n OWNED = \"owned\",\n SCANNED = \"scanned\",\n}\n\nexport type CouponTypeList = {\n active: {\n data: CouponType[] | null;\n listName: EnumCouponListType.ACTIVE;\n };\n owned: {\n data: CouponType[] | null;\n listName: EnumCouponListType.OWNED;\n };\n scanned: {\n data: CouponType[] | null;\n listName: EnumCouponListType.SCANNED;\n };\n};\n"],"mappings":"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","names":["EnumVerificationType","EnumAdShowOn","EnumAdStatus","EnumAdType","EnumAdStyle","EnumActivity","EnumPostType","EnumPostContentType","EnumGameStatus","EnumGameType","EnumAffiliateParticipantType","EnumAffiliateRewardType","EnumCouponQualificationType","EnumCouponListType"]}
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  PROMO_CODE_PREFIX,
12
12
  gameScreenIdentifierList
13
- } from "./chunk-QYHJKAVQ.mjs";
13
+ } from "./chunk-5D2JVHC2.mjs";
14
14
  import {
15
15
  isTransientNetworkError
16
16
  } from "./chunk-RAYUJODN.mjs";
@@ -190,9 +190,9 @@ var rewardNiceNames = {
190
190
  var PostTypeLabels = {
191
191
  ["market_faces" /* MARKET_FACES */]: "Market Faces",
192
192
  ["clue_bites" /* CLUE_BITES */]: "Clue Bites",
193
- ["play_and_win" /* PLAY_AND_WIN */]: "Play & Win",
194
- ["clue_guides_for_organisers" /* CLUE_GUIDES_FOR_ORGANISERS */]: "Clue Guides for Organisers",
195
- ["clue_guides_for_vendors" /* CLUE_GUIDES_FOR_VENDORS */]: "Clue Guides for Stallholders"
193
+ ["play_and_win" /* PLAY_AND_WIN */]: "Play & Win"
194
+ //[EnumPostType.CLUE_GUIDES_FOR_ORGANISERS]: "Clue Guides for Organisers",
195
+ //[EnumPostType.CLUE_GUIDES_FOR_VENDORS]: "Clue Guides for Stallholders",
196
196
  };
197
197
  var CM_SCHOOL_PROMO_CODE = `${PROMO_CODE_PREFIX}SCHOOL`;
198
198
  var CM_AFFILIATE_PROMO_CODE = `${PROMO_CODE_PREFIX}AFFILIATE`;
@@ -1698,4 +1698,4 @@ export {
1698
1698
  toUserFacingErrorMessage,
1699
1699
  getErrorMessage
1700
1700
  };
1701
- //# sourceMappingURL=chunk-7RQ6PC7B.mjs.map
1701
+ //# sourceMappingURL=chunk-P4JLZCWZ.mjs.map