{"version":3,"file":"user-rejection.mjs","sourceRoot":"","sources":["../src/user-rejection.ts"],"names":[],"mappings":"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","sourcesContent":["import { HardwareWalletError } from './hardware-error';\nimport { ErrorCode } from './hardware-errors-enums';\n\nconst PROVIDER_USER_REJECTED_CODE = 4001;\n\nconst USER_REJECTION_PATTERN =\n  /(?:\\buser rejected\\b|\\baction cancelled\\b|\\bcancelled\\b|\\bcanceled\\b|failure_actioncancelled)/iu;\n\nconst USER_REJECTED_PATTERN = /\\buser rejected\\b/iu;\nconst PERMISSIONS_NOT_GRANTED_PATTERN = /\\bpermissions? not granted\\b/iu;\n\nconst USER_REJECTION_CODES = new Set<string>([\n  'Method_PermissionsNotGranted',\n  'Method_Cancel',\n  'Failure_ActionCancelled',\n]);\n\nfunction isUserRejectionString(value: string): boolean {\n  return (\n    USER_REJECTION_PATTERN.test(value) ||\n    PERMISSIONS_NOT_GRANTED_PATTERN.test(value) ||\n    USER_REJECTION_CODES.has(value)\n  );\n}\n\nfunction isUserRejectedString(value: string): boolean {\n  return (\n    USER_REJECTED_PATTERN.test(value) ||\n    PERMISSIONS_NOT_GRANTED_PATTERN.test(value) ||\n    value === 'Method_PermissionsNotGranted'\n  );\n}\n\ntype ErrorLikeObject = {\n  code?: unknown;\n  message?: unknown;\n  name?: unknown;\n  stack?: unknown;\n  cause?: unknown;\n  originalError?: unknown;\n};\n\nfunction isHardwareWalletConnectionClosedError(error: object): boolean {\n  if (error instanceof HardwareWalletError) {\n    return error.code === ErrorCode.ConnectionClosed;\n  }\n\n  const errorObject = error as ErrorLikeObject;\n  return (\n    errorObject.name === 'HardwareWalletError' &&\n    errorObject.code === ErrorCode.ConnectionClosed\n  );\n}\n\nfunction isProviderUserRejectedCode(code: unknown): boolean {\n  return code === PROVIDER_USER_REJECTED_CODE;\n}\n\n/**\n * Recursively checks whether an error value represents a user rejection or\n * cancellation, mirroring detection used in MetaMask core signing flows.\n *\n * @param error - The error value to inspect.\n * @param visited - Set of already-visited objects to avoid infinite recursion.\n * @returns True when the error looks like a user rejection or cancellation.\n */\nexport function isUserRejectionLikeError(\n  error: unknown,\n  visited = new Set<unknown>(),\n): boolean {\n  if (!error || visited.has(error)) {\n    return false;\n  }\n  visited.add(error);\n\n  if (typeof error === 'string') {\n    return isUserRejectionString(error);\n  }\n\n  if (typeof error !== 'object') {\n    return false;\n  }\n\n  const errorObject = error as ErrorLikeObject;\n\n  if (isHardwareWalletConnectionClosedError(error)) {\n    return false;\n  }\n\n  if (isProviderUserRejectedCode(errorObject.code)) {\n    return true;\n  }\n\n  return (\n    isUserRejectionLikeError(errorObject.code, visited) ||\n    isUserRejectionLikeError(errorObject.message, visited) ||\n    isUserRejectionLikeError(errorObject.stack, visited) ||\n    isUserRejectionLikeError(errorObject.cause, visited) ||\n    isUserRejectionLikeError(errorObject.originalError, visited)\n  );\n}\n\n/**\n * Resolves a hardware-wallet error code for user rejection-like errors.\n *\n * @param error - The error value to inspect.\n * @returns `UserRejected` or `UserCancelled` when detected, otherwise `undefined`.\n */\nexport function resolveUserRejectionErrorCode(\n  error: unknown,\n): ErrorCode.UserCancelled | ErrorCode.UserRejected | undefined {\n  if (!isUserRejectionLikeError(error)) {\n    return undefined;\n  }\n\n  if (typeof error === 'string') {\n    return isUserRejectedString(error)\n      ? ErrorCode.UserRejected\n      : ErrorCode.UserCancelled;\n  }\n\n  const errorObject = error as ErrorLikeObject;\n\n  if (typeof errorObject.message === 'string') {\n    if (isUserRejectedString(errorObject.message)) {\n      return ErrorCode.UserRejected;\n    }\n    if (isUserRejectionString(errorObject.message)) {\n      return ErrorCode.UserCancelled;\n    }\n  }\n\n  if (typeof errorObject.code === 'string') {\n    if (isUserRejectedString(errorObject.code)) {\n      return ErrorCode.UserRejected;\n    }\n    if (isUserRejectionString(errorObject.code)) {\n      return ErrorCode.UserCancelled;\n    }\n  }\n\n  if (errorObject.cause !== undefined) {\n    const causeCode = resolveUserRejectionErrorCode(errorObject.cause);\n    if (causeCode !== undefined) {\n      return causeCode;\n    }\n  }\n\n  if (errorObject.originalError !== undefined) {\n    const originalCode = resolveUserRejectionErrorCode(\n      errorObject.originalError,\n    );\n    if (originalCode !== undefined) {\n      return originalCode;\n    }\n  }\n\n  return ErrorCode.UserCancelled;\n}\n"]}