@thavguard/arc-pay 0.1.25 → 0.1.27

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/errors.ts","../../src/server/client.ts","../../src/three-ds/actions.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export type ArcPayErrorType =\n | \"validation_error\"\n | \"configuration_error\"\n | \"authentication_error\"\n | \"authorization_error\"\n | \"state_error\"\n | \"rate_limit_error\"\n | \"api_error\"\n | \"network_error\"\n | \"challenge_aborted\";\n\ninterface ArcPayErrorInit {\n type: ArcPayErrorType;\n message: string;\n code?: string;\n param?: string;\n paymentId?: string;\n declineCode?: string;\n retryable: boolean;\n requestId?: string;\n}\n\nexport class ArcPayError extends Error {\n readonly type: ArcPayErrorType;\n readonly code?: string;\n readonly param?: string;\n readonly paymentId?: string;\n readonly declineCode?: string;\n readonly retryable: boolean;\n readonly requestId?: string;\n\n constructor(init: ArcPayErrorInit) {\n super(init.message);\n this.name = \"ArcPayError\";\n this.type = init.type;\n this.code = init.code;\n this.param = init.param;\n this.paymentId = init.paymentId;\n this.declineCode = init.declineCode;\n this.retryable = init.retryable;\n this.requestId = init.requestId;\n }\n}\n\nexport const isValidationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"validation_error\";\nconst isConfigurationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"configuration_error\";\nexport const isAuthenticationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"authentication_error\";\nexport const isAuthorizationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"authorization_error\";\nexport const isStateError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"state_error\";\nexport const isRateLimitError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"rate_limit_error\";\nexport const isApiError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"api_error\";\nexport const isNetworkError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"network_error\";\nexport const isChallengeAborted = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"challenge_aborted\";\n","import { ArcPayError, type ArcPayErrorType } from \"../core/errors\";\nimport type {\n AvailablePaymentMethod,\n CaptureRequest,\n ChargeSavedCardRequest,\n CheckoutSession,\n CompleteThreeDSMethodRequest,\n CreateCheckoutSessionRequest,\n CreateCardSetupRequest,\n CreateLinkRequest,\n CreatePaymentRequest,\n CreateRefundRequest,\n ExecutePaymentRequest,\n ExecutePaymentResponse,\n Link,\n ListAvailablePaymentMethodsQuery,\n ListPaymentsQuery,\n Payment,\n PaymentList,\n PaymentNextAction,\n Refund,\n TerminalPaymentStatus,\n VoidRequest,\n WaitForPaymentOptions,\n} from \"./types\";\n\nexport type {\n AvailablePaymentMethod,\n CaptureRequest,\n ChargeSavedCardRequest,\n CheckoutSession,\n CompleteThreeDSMethodRequest,\n CreateCheckoutSessionRequest,\n CreateLinkRequest,\n CreatePaymentRequest,\n CreateRefundRequest,\n ExecutePaymentRequest,\n ExecutePaymentResponse,\n PaymentNextAction,\n Link,\n ListAvailablePaymentMethodsQuery,\n ListPaymentsQuery,\n Payment,\n PaymentFlowMode,\n PaymentList,\n PaymentMethod,\n Refund,\n VoidRequest,\n} from \"./types\";\n\nexport interface ArcPayClientOptions {\n secretKey: string;\n apiBase?: string;\n fetch?: typeof fetch;\n}\n\nexport interface IdempotencyOptions {\n idempotencyKey: string;\n signal?: AbortSignal;\n}\n\ntype RequestOptionsInput = RequestOptions | IdempotencyOptions | null | undefined;\n\nexport interface RequestOptions {\n signal?: AbortSignal;\n}\n\nconst DEFAULT_API_BASE = \"https://api.arcpay.space/v1\";\nconst API_VERSION = \"2026-05-06\";\nconst DEFAULT_POLL_INTERVAL_MS = 1500;\nconst DEFAULT_POLL_TIMEOUT_MS = 60_000;\nconst DEFAULT_TERMINAL_PAYMENT_STATUSES: readonly TerminalPaymentStatus[] = [\n \"authorized\",\n \"captured\",\n \"settled\",\n \"voided\",\n \"expired\",\n \"refunded\",\n \"chargeback\",\n \"declined\",\n \"failed\",\n];\n\nfunction validateSecretKey(key: unknown): asserts key is string {\n if (typeof key !== \"string\" || key.length === 0) {\n throw new ArcPayError({\n type: \"authentication_error\",\n code: \"invalid_secret_key\",\n message: \"Secret key must be a non-empty string\",\n retryable: false,\n });\n }\n if (!key.startsWith(\"sk_test_\") && !key.startsWith(\"sk_live_\")) {\n throw new ArcPayError({\n type: \"authentication_error\",\n code: \"invalid_secret_key\",\n message:\n \"Secret key must start with sk_test_ or sk_live_. Publishable keys cannot call server APIs.\",\n retryable: false,\n });\n }\n}\n\nconst normalizeBase = (base: string): string => {\n let end = base.length;\n while (end > 0 && base.charCodeAt(end - 1) === 47) {\n end -= 1;\n }\n return base.slice(0, end);\n};\n\ninterface RequestOptionsWithOptionalIdempotency extends RequestOptions {\n idempotencyKey?: string;\n}\n\nconst normalizeRequestOptions = (\n opts: RequestOptionsInput,\n): RequestOptionsWithOptionalIdempotency => opts ?? {};\n\nconst IDEMPOTENCY_KEY_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nconst requireIdempotencyKey = (opts: RequestOptionsWithOptionalIdempotency): string => {\n if (!opts.idempotencyKey) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"missing_idempotency_key\",\n message: \"idempotencyKey is required for this operation\",\n retryable: false,\n });\n }\n if (!IDEMPOTENCY_KEY_RE.test(opts.idempotencyKey)) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_idempotency_key\",\n message: \"idempotencyKey must be a valid UUID\",\n retryable: false,\n });\n }\n return opts.idempotencyKey;\n};\n\nconst normalizeExecutePaymentRequest = (body: ExecutePaymentRequest): ExecutePaymentRequest => {\n if (!body || !body.payment_method) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_request\",\n message: \"payment_method is required\",\n retryable: false,\n });\n }\n if (body.payment_method === \"bank_card\" && !body.card_token_id) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"missing_card_token_id\",\n message: \"card_token_id is required for bank_card executePayment\",\n retryable: false,\n });\n }\n if (body.payment_mode !== \"h2h\") {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_payment_mode\",\n message: \"payment_mode must be h2h for executePayment\",\n retryable: false,\n });\n }\n if (body.payment_method !== \"bank_card\") {\n if (!body.wallet_interaction) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_request\",\n message: \"wallet_interaction is required for wallet executePayment\",\n retryable: false,\n });\n }\n if (body.wallet_interaction.provider !== body.payment_method) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_request\",\n message: \"wallet_interaction.provider must match payment_method\",\n retryable: false,\n });\n }\n }\n return body;\n};\n\nconst appendQuery = (path: string, query?: object): string => {\n if (!query) return path;\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null || value === \"\") continue;\n params.set(key, String(value));\n }\n const encoded = params.toString();\n return encoded ? `${path}?${encoded}` : path;\n};\n\nconst sleep = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n\nconst normalizePollMs = (value: number | undefined, fallback: number): number => {\n if (value === undefined) return fallback;\n if (!Number.isFinite(value) || value <= 0) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_poll_options\",\n message: \"Polling intervals and timeouts must be positive finite numbers\",\n retryable: false,\n });\n }\n return value;\n};\n\ninterface APIErrorBody {\n error?: {\n type?: string;\n code?: string;\n message?: string;\n param?: string;\n request_id?: string;\n decline_code?: string;\n };\n}\n\nconst isPublicErrorType = (value: unknown): value is ArcPayErrorType =>\n value === \"validation_error\" ||\n value === \"authentication_error\" ||\n value === \"authorization_error\" ||\n value === \"state_error\" ||\n value === \"rate_limit_error\" ||\n value === \"api_error\";\n\nconst isRetryableError = (type: ArcPayErrorType, status: number, code?: string): boolean => {\n if (type === \"rate_limit_error\") return true;\n if (code === \"timeout\") return false;\n return type === \"api_error\" && status >= 500;\n};\n\nconst parseErrorResponse = async (res: Response): Promise<ArcPayError> => {\n let body: APIErrorBody = {};\n try {\n body = (await res.json()) as APIErrorBody;\n } catch {\n /* keep default error below */\n }\n const detail = body.error ?? {};\n const type = isPublicErrorType(detail.type)\n ? detail.type\n : res.status >= 500\n ? \"api_error\"\n : \"validation_error\";\n return new ArcPayError({\n type,\n code: detail.code,\n message: detail.message ?? `Request failed with status ${res.status}`,\n param: detail.param,\n requestId: detail.request_id,\n declineCode: detail.decline_code,\n retryable: isRetryableError(type, res.status, detail.code),\n });\n};\n\nexport class ArcPayClient {\n private readonly secretKey: string;\n private readonly apiBase: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: ArcPayClientOptions) {\n const secretKey: unknown = options.secretKey;\n validateSecretKey(secretKey);\n if (!options.fetch && typeof fetch === \"undefined\") {\n throw new ArcPayError({\n type: \"api_error\",\n code: \"fetch_unavailable\",\n message: \"A fetch implementation is required in this runtime\",\n retryable: false,\n });\n }\n this.secretKey = secretKey;\n this.apiBase = normalizeBase(options.apiBase ?? DEFAULT_API_BASE);\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async listPayments(\n query: ListPaymentsQuery = {},\n opts: RequestOptions = {},\n ): Promise<PaymentList> {\n return this.request<PaymentList>(\"GET\", appendQuery(\"/payments\", query), undefined, opts);\n }\n\n async createPayment(body: CreatePaymentRequest, opts: IdempotencyOptions): Promise<Payment>;\n async createPayment(body: CreatePaymentRequest, opts: RequestOptionsInput): Promise<Payment> {\n return this.request<Payment>(\"POST\", \"/payments\", body, opts, true);\n }\n\n async createCardSetup(body: CreateCardSetupRequest, opts: IdempotencyOptions): Promise<Payment>;\n async createCardSetup(body: CreateCardSetupRequest, opts: RequestOptionsInput): Promise<Payment> {\n return this.request<Payment>(\"POST\", \"/cards/setup\", body, opts, true);\n }\n\n async getPayment(paymentId: string, opts: RequestOptions = {}): Promise<Payment> {\n return this.request<Payment>(\n \"GET\",\n `/payments/${encodeURIComponent(paymentId)}`,\n undefined,\n opts,\n );\n }\n\n async waitForPaymentTerminal(\n paymentId: string,\n opts: WaitForPaymentOptions = {},\n ): Promise<Payment> {\n const intervalMs = normalizePollMs(opts.intervalMs, DEFAULT_POLL_INTERVAL_MS);\n const timeoutMs = normalizePollMs(opts.timeoutMs, DEFAULT_POLL_TIMEOUT_MS);\n const terminalStatuses = new Set(opts.terminalStatuses ?? DEFAULT_TERMINAL_PAYMENT_STATUSES);\n const startedAt = Date.now();\n\n for (;;) {\n const payment = await this.getPayment(paymentId, { signal: opts.signal });\n if (terminalStatuses.has(payment.status as TerminalPaymentStatus)) {\n return payment;\n }\n if (Date.now() - startedAt >= timeoutMs) {\n throw new ArcPayError({\n type: \"api_error\",\n code: \"payment_poll_timeout\",\n message: `Payment ${paymentId} did not reach a terminal status within ${timeoutMs}ms`,\n retryable: true,\n });\n }\n await sleep(intervalMs, opts.signal);\n }\n }\n\n async capturePayment(\n paymentId: string,\n body: CaptureRequest,\n opts: IdempotencyOptions,\n ): Promise<Payment>;\n async capturePayment(\n paymentId: string,\n body: CaptureRequest,\n opts: RequestOptionsInput,\n ): Promise<Payment> {\n return this.request<Payment>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/capture`,\n body,\n opts,\n true,\n );\n }\n\n async voidPayment(\n paymentId: string,\n body: VoidRequest,\n opts: IdempotencyOptions,\n ): Promise<Payment>;\n async voidPayment(\n paymentId: string,\n body: VoidRequest,\n opts: RequestOptionsInput,\n ): Promise<Payment> {\n return this.request<Payment>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/void`,\n body,\n opts,\n true,\n );\n }\n\n async createRefund(\n paymentId: string,\n body: CreateRefundRequest,\n opts: IdempotencyOptions,\n ): Promise<Refund>;\n async createRefund(\n paymentId: string,\n body: CreateRefundRequest,\n opts: RequestOptionsInput,\n ): Promise<Refund> {\n return this.request<Refund>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/refunds`,\n body,\n opts,\n true,\n );\n }\n\n async chargeSavedCard(\n body: ChargeSavedCardRequest,\n opts: IdempotencyOptions,\n ): Promise<ExecutePaymentResponse>;\n async chargeSavedCard(\n body: ChargeSavedCardRequest,\n opts: RequestOptionsInput,\n ): Promise<ExecutePaymentResponse> {\n return this.request<ExecutePaymentResponse>(\"POST\", \"/payments/saved-card\", body, opts, true);\n }\n\n async executePayment(\n paymentId: string,\n body: ExecutePaymentRequest,\n opts: IdempotencyOptions,\n ): Promise<ExecutePaymentResponse>;\n async executePayment(\n paymentId: string,\n body: ExecutePaymentRequest,\n opts: RequestOptionsInput,\n ): Promise<ExecutePaymentResponse> {\n const requestBody = normalizeExecutePaymentRequest(body);\n return this.request<ExecutePaymentResponse>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/execute`,\n requestBody,\n opts,\n true,\n );\n }\n\n async completeThreeDSMethod(\n paymentId: string,\n body: CompleteThreeDSMethodRequest,\n opts: RequestOptions = {},\n ): Promise<ExecutePaymentResponse> {\n return this.request<ExecutePaymentResponse>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/complete-3ds-method`,\n body,\n opts,\n );\n }\n\n async listAvailablePaymentMethods(\n query: ListAvailablePaymentMethodsQuery,\n opts: RequestOptions = {},\n ): Promise<AvailablePaymentMethod[]> {\n return this.request<AvailablePaymentMethod[]>(\n \"GET\",\n appendQuery(\"/payment-methods/available\", query),\n undefined,\n opts,\n );\n }\n\n async createLink(body: CreateLinkRequest, opts: IdempotencyOptions): Promise<Link>;\n async createLink(body: CreateLinkRequest, opts: RequestOptionsInput): Promise<Link> {\n return this.request<Link>(\"POST\", \"/links\", body, opts, true);\n }\n\n async getLink(linkId: string, opts: RequestOptions = {}): Promise<Link> {\n return this.request<Link>(\"GET\", `/links/${encodeURIComponent(linkId)}`, undefined, opts);\n }\n\n async cancelLink(linkId: string, opts: RequestOptions = {}): Promise<Link> {\n return this.request<Link>(\"DELETE\", `/links/${encodeURIComponent(linkId)}`, undefined, opts);\n }\n\n async createCheckoutSession(\n body: CreateCheckoutSessionRequest,\n opts: IdempotencyOptions,\n ): Promise<CheckoutSession>;\n async createCheckoutSession(\n body: CreateCheckoutSessionRequest,\n opts: RequestOptionsInput,\n ): Promise<CheckoutSession> {\n return this.request<CheckoutSession>(\"POST\", \"/checkout/sessions\", body, opts, true);\n }\n\n private async request<T>(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n body: unknown,\n opts: RequestOptionsInput = undefined,\n requireIdempotency = false,\n ): Promise<T> {\n const requestOpts = normalizeRequestOptions(opts);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n \"X-Arc-Pay-API-Version\": API_VERSION,\n \"Content-Type\": \"application/json\",\n };\n if (requireIdempotency) {\n headers[\"Idempotency-Key\"] = requireIdempotencyKey(requestOpts);\n } else if (requestOpts.idempotencyKey !== undefined) {\n headers[\"Idempotency-Key\"] = requireIdempotencyKey(requestOpts);\n }\n\n let res: Response;\n try {\n res = await this.fetchImpl(`${this.apiBase}${path}`, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: requestOpts.signal,\n });\n } catch (err) {\n throw new ArcPayError({\n type: \"network_error\",\n message: err instanceof Error ? err.message : \"Network request failed\",\n retryable: true,\n });\n }\n if (!res.ok) throw await parseErrorResponse(res);\n return (await res.json()) as T;\n }\n}\n\nexport const createArcPayClient = (options: ArcPayClientOptions): ArcPayClient =>\n new ArcPayClient(options);\n","import type { CardBrowserInfo, ExecutePaymentResponse, PaymentNextAction } from \"../server/types\";\n\nexport type ThreeDSAction = PaymentNextAction;\nexport type BrowserInfo = CardBrowserInfo;\n\nexport interface BrowserFormField {\n name: string;\n value: string;\n}\n\nexport interface BrowserPostForm {\n action: string;\n method: \"POST\";\n target: \"hidden_iframe\" | \"browser\";\n fields: BrowserFormField[];\n}\n\nexport interface ThreeDSBrowserStep {\n kind: \"method\" | \"challenge\";\n protocolVersion: \"1\" | \"2\";\n form: BrowserPostForm;\n completionEndpoint?: string;\n threeDSServerTransId?: string;\n}\n\nexport interface MountedThreeDSForm {\n form: HTMLFormElement;\n iframe?: HTMLIFrameElement;\n submit: () => void;\n remove: () => void;\n}\n\nexport interface ThreeDSMountOptions {\n document?: Document;\n container?: HTMLElement;\n challengeTarget?: \"_self\";\n submitter?: (form: HTMLFormElement) => void;\n}\n\nexport interface RunThreeDSBrowserFlowOptions extends ThreeDSMountOptions {\n completeThreeDSMethod?: (\n completion: ReturnType<typeof buildThreeDSMethodCompletion>,\n nextAction: PaymentNextAction,\n ) => Promise<ExecutePaymentResponse>;\n methodCompletionIndicator?: \"Y\" | \"N\" | \"U\";\n methodTimeoutMs?: number;\n signal?: AbortSignal;\n}\n\nexport type ThreeDSBrowserFlowResult =\n | {\n status: \"no_action\";\n response?: ExecutePaymentResponse;\n }\n | {\n status: \"method_completed\";\n response: ExecutePaymentResponse;\n methodResult: \"loaded\" | \"timeout\";\n }\n | {\n status: \"challenge_submitted\";\n action: PaymentNextAction;\n response?: ExecutePaymentResponse;\n mounted: MountedThreeDSForm;\n methodResult?: \"loaded\" | \"timeout\";\n };\n\nconst supportedColorDepths = [1, 4, 8, 15, 16, 24, 32, 48] as const;\n\nconst normalizeColorDepth = (value: number): BrowserInfo[\"color_depth\"] =>\n supportedColorDepths.includes(value as BrowserInfo[\"color_depth\"])\n ? (value as BrowserInfo[\"color_depth\"])\n : 24;\n\nconst resolveWindowSize = (width: number): NonNullable<BrowserInfo[\"window_size\"]> => {\n if (width >= 1000) return \"05\";\n if (width >= 600) return \"04\";\n if (width >= 500) return \"03\";\n if (width >= 390) return \"02\";\n return \"01\";\n};\n\nexport const collectBrowserInfo = (\n acceptHeader = \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n): BrowserInfo => {\n if (\n typeof window === \"undefined\" ||\n typeof navigator === \"undefined\" ||\n typeof screen === \"undefined\"\n ) {\n throw new Error(\"collectBrowserInfo must be called in a browser environment\");\n }\n return {\n accept_header: acceptHeader,\n language: navigator.language || \"en\",\n screen_width: screen.width,\n screen_height: screen.height,\n color_depth: normalizeColorDepth(screen.colorDepth),\n timezone_offset_minutes: new Date().getTimezoneOffset(),\n java_enabled: false,\n user_agent: navigator.userAgent,\n window_size: resolveWindowSize(window.innerWidth || screen.width),\n };\n};\n\nexport const getThreeDSAction = (nextAction?: PaymentNextAction): PaymentNextAction | null => {\n return nextAction ?? null;\n};\n\nexport const isThreeDSMethodAction = (nextAction?: PaymentNextAction): boolean => {\n return nextAction?.type === \"three_ds_method\" && nextAction.three_ds.phase === \"method\";\n};\n\nexport const isThreeDSChallengeAction = (nextAction?: PaymentNextAction): boolean => {\n return nextAction?.type === \"three_ds_challenge\" && nextAction.three_ds.phase === \"challenge\";\n};\n\nexport const buildThreeDSBrowserForm = (nextAction: PaymentNextAction): BrowserPostForm => ({\n action: nextAction.three_ds.submit.url,\n method: nextAction.three_ds.submit.method,\n target: nextAction.three_ds.submit.target,\n fields: nextAction.three_ds.submit.fields,\n});\n\nconst assertHTTPSActionURL = (action: string): void => {\n let parsed: URL;\n try {\n parsed = new URL(action);\n } catch {\n throw new Error(\"3DS form action must be an absolute HTTPS URL\");\n }\n if (parsed.protocol !== \"https:\") {\n throw new Error(\"3DS form action must use HTTPS\");\n }\n};\n\nexport const buildThreeDSBrowserStep = (\n nextAction?: PaymentNextAction,\n): ThreeDSBrowserStep | null => {\n const action = getThreeDSAction(nextAction);\n if (!action) return null;\n return {\n kind: action.three_ds.phase,\n protocolVersion: action.three_ds.version,\n form: buildThreeDSBrowserForm(action),\n completionEndpoint: action.three_ds.completion_endpoint,\n threeDSServerTransId: action.three_ds.three_ds_server_trans_id,\n };\n};\n\nexport const buildThreeDSMethodCompletion = (\n nextAction: PaymentNextAction,\n completionIndicator: \"Y\" | \"N\" | \"U\" = \"Y\",\n): { completion_indicator: \"Y\" | \"N\" | \"U\"; three_ds_server_trans_id: string } => {\n if (!isThreeDSMethodAction(nextAction) || !nextAction.three_ds.three_ds_server_trans_id) {\n throw new Error(\"nextAction must be a three_ds_method action with three_ds_server_trans_id\");\n }\n return {\n completion_indicator: completionIndicator,\n three_ds_server_trans_id: nextAction.three_ds.three_ds_server_trans_id,\n };\n};\n\nconst requireDocument = (explicitDocument?: Document): Document => {\n if (explicitDocument) return explicitDocument;\n if (typeof document === \"undefined\") {\n throw new Error(\"3DS browser helpers must be called in a browser environment\");\n }\n return document;\n};\n\nconst defaultSubmitter = (form: HTMLFormElement): void => {\n form.submit();\n};\n\nexport const mountThreeDSBrowserForm = (\n nextAction: PaymentNextAction,\n options: ThreeDSMountOptions = {},\n): MountedThreeDSForm => {\n const doc = requireDocument(options.document);\n const container = options.container ?? doc.body;\n const formDescriptor = buildThreeDSBrowserForm(nextAction);\n assertHTTPSActionURL(formDescriptor.action);\n const form = doc.createElement(\"form\");\n const target =\n formDescriptor.target === \"hidden_iframe\"\n ? `arcpay-three-ds-method-${crypto.randomUUID()}`\n : (options.challengeTarget ?? \"_self\");\n let iframe: HTMLIFrameElement | undefined;\n\n form.method = formDescriptor.method;\n form.action = formDescriptor.action;\n form.target = target;\n form.hidden = true;\n\n for (const field of formDescriptor.fields) {\n const input = doc.createElement(\"input\");\n input.type = \"hidden\";\n input.name = field.name;\n input.value = field.value;\n form.append(input);\n }\n\n if (formDescriptor.target === \"hidden_iframe\") {\n iframe = doc.createElement(\"iframe\");\n iframe.name = target;\n iframe.title = \"3-D Secure method\";\n iframe.hidden = true;\n container.append(iframe);\n }\n\n container.append(form);\n\n return {\n form,\n iframe,\n submit: () => (options.submitter ?? defaultSubmitter)(form),\n remove: () => {\n form.remove();\n iframe?.remove();\n },\n };\n};\n\nconst waitForMethodFrame = (\n mounted: MountedThreeDSForm,\n timeoutMs: number,\n signal?: AbortSignal,\n): Promise<\"loaded\" | \"timeout\"> =>\n new Promise((resolve, reject) => {\n if (!mounted.iframe) {\n resolve(\"loaded\");\n return;\n }\n if (signal?.aborted) {\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n return;\n }\n\n let settled = false;\n const cleanup = () => {\n mounted.iframe?.removeEventListener(\"load\", onLoad);\n signal?.removeEventListener(\"abort\", onAbort);\n clearTimeout(timer);\n };\n const settle = (result: \"loaded\" | \"timeout\") => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(result);\n };\n const onLoad = () => settle(\"loaded\");\n const onAbort = () => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n };\n const timer = setTimeout(() => settle(\"timeout\"), timeoutMs);\n\n mounted.iframe.addEventListener(\"load\", onLoad, { once: true });\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n\nexport const runThreeDSBrowserFlow = async (\n nextAction: PaymentNextAction | undefined,\n options: RunThreeDSBrowserFlowOptions,\n): Promise<ThreeDSBrowserFlowResult> => {\n if (!nextAction) return { status: \"no_action\" };\n\n if (isThreeDSChallengeAction(nextAction)) {\n const mounted = mountThreeDSBrowserForm(nextAction, options);\n mounted.submit();\n return { status: \"challenge_submitted\", action: nextAction, mounted };\n }\n\n if (!isThreeDSMethodAction(nextAction)) return { status: \"no_action\" };\n const completeThreeDSMethod = options.completeThreeDSMethod;\n if (!completeThreeDSMethod) {\n throw new Error(\"completeThreeDSMethod is required for 3DS Method actions\");\n }\n\n const mounted = mountThreeDSBrowserForm(nextAction, options);\n try {\n mounted.submit();\n const methodResult = await waitForMethodFrame(\n mounted,\n options.methodTimeoutMs ?? 10_000,\n options.signal,\n );\n const indicator = options.methodCompletionIndicator ?? (methodResult === \"loaded\" ? \"Y\" : \"N\");\n const response = await completeThreeDSMethod(\n buildThreeDSMethodCompletion(nextAction, indicator),\n nextAction,\n );\n const followUpAction = getThreeDSAction(response.next_action);\n if (followUpAction && isThreeDSChallengeAction(followUpAction)) {\n const challengeMounted = mountThreeDSBrowserForm(followUpAction, options);\n challengeMounted.submit();\n return {\n status: \"challenge_submitted\",\n action: followUpAction,\n response,\n mounted: challengeMounted,\n methodResult,\n };\n }\n return { status: \"method_completed\", response, methodResult };\n } finally {\n mounted.remove();\n }\n};\n\nconst htmlEscape = (value: string): string =>\n value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n\nexport const buildThreeDSAutoSubmitHtml = (nextAction: PaymentNextAction): string => {\n const form = buildThreeDSBrowserForm(nextAction);\n assertHTTPSActionURL(form.action);\n const target = form.target === \"hidden_iframe\" ? \"arcpay-three-ds-method\" : \"_self\";\n const inputs = form.fields\n .map(\n (field) =>\n `<input type=\"hidden\" name=\"${htmlEscape(field.name)}\" value=\"${htmlEscape(field.value)}\">`,\n )\n .join(\"\");\n const iframe =\n form.target === \"hidden_iframe\"\n ? '<iframe name=\"arcpay-three-ds-method\" title=\"3-D Secure method\" hidden></iframe>'\n : \"\";\n return `<!doctype html><html><head><meta charset=\"utf-8\"></head><body>${iframe}<form method=\"POST\" action=\"${htmlEscape(form.action)}\" target=\"${target}\">${inputs}</form><script>document.forms[0].submit();</script></body></html>`;\n};\n"]}
1
+ {"version":3,"sources":["../../src/core/errors.ts","../../src/server/client.ts","../../src/three-ds/actions.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export type ArcPayErrorType =\n | \"validation_error\"\n | \"configuration_error\"\n | \"authentication_error\"\n | \"authorization_error\"\n | \"state_error\"\n | \"rate_limit_error\"\n | \"api_error\"\n | \"network_error\"\n | \"challenge_aborted\";\n\ninterface ArcPayErrorInit {\n type: ArcPayErrorType;\n message: string;\n code?: string;\n param?: string;\n paymentId?: string;\n declineCode?: string;\n retryable: boolean;\n requestId?: string;\n}\n\nexport class ArcPayError extends Error {\n readonly type: ArcPayErrorType;\n readonly code?: string;\n readonly param?: string;\n readonly paymentId?: string;\n readonly declineCode?: string;\n readonly retryable: boolean;\n readonly requestId?: string;\n\n constructor(init: ArcPayErrorInit) {\n super(init.message);\n this.name = \"ArcPayError\";\n this.type = init.type;\n this.code = init.code;\n this.param = init.param;\n this.paymentId = init.paymentId;\n this.declineCode = init.declineCode;\n this.retryable = init.retryable;\n this.requestId = init.requestId;\n }\n}\n\nexport const isValidationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"validation_error\";\nconst isConfigurationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"configuration_error\";\nexport const isAuthenticationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"authentication_error\";\nexport const isAuthorizationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"authorization_error\";\nexport const isStateError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"state_error\";\nexport const isRateLimitError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"rate_limit_error\";\nexport const isApiError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"api_error\";\nexport const isNetworkError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"network_error\";\nexport const isChallengeAborted = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"challenge_aborted\";\n","import { ArcPayError, type ArcPayErrorType } from \"../core/errors\";\nimport type {\n AvailablePaymentMethod,\n CaptureRequest,\n ChargeSavedCardRequest,\n CheckoutSession,\n CompleteThreeDSMethodRequest,\n CreateCheckoutSessionRequest,\n CreateCardSetupRequest,\n CreateLinkRequest,\n CreatePaymentRequest,\n CreateRefundRequest,\n ExecutePaymentRequest,\n ExecutePaymentResponse,\n Link,\n ListAvailablePaymentMethodsQuery,\n ListPaymentsQuery,\n Payment,\n PaymentList,\n PaymentNextAction,\n Refund,\n TerminalPaymentStatus,\n VoidRequest,\n WaitForPaymentOptions,\n} from \"./types\";\n\nexport type {\n AvailablePaymentMethod,\n CaptureRequest,\n ChargeSavedCardRequest,\n CheckoutSession,\n CompleteThreeDSMethodRequest,\n CreateCheckoutSessionRequest,\n CreateLinkRequest,\n CreatePaymentRequest,\n CreateRefundRequest,\n ExecutePaymentRequest,\n ExecutePaymentResponse,\n PaymentNextAction,\n Link,\n ListAvailablePaymentMethodsQuery,\n ListPaymentsQuery,\n Payment,\n PaymentFlowMode,\n PaymentList,\n PaymentMethod,\n Refund,\n VoidRequest,\n} from \"./types\";\n\nexport interface ArcPayClientOptions {\n secretKey: string;\n apiBase?: string;\n fetch?: typeof fetch;\n}\n\nexport interface IdempotencyOptions {\n idempotencyKey: string;\n signal?: AbortSignal;\n}\n\ntype RequestOptionsInput = RequestOptions | IdempotencyOptions | null | undefined;\n\nexport interface RequestOptions {\n signal?: AbortSignal;\n}\n\nconst DEFAULT_API_BASE = \"https://api.arcpay.space/v1\";\nconst API_VERSION = \"2026-05-06\";\nconst DEFAULT_POLL_INTERVAL_MS = 1500;\nconst DEFAULT_POLL_TIMEOUT_MS = 60_000;\nconst DEFAULT_TERMINAL_PAYMENT_STATUSES: readonly TerminalPaymentStatus[] = [\n \"authorized\",\n \"captured\",\n \"settled\",\n \"voided\",\n \"expired\",\n \"refunded\",\n \"chargeback\",\n \"declined\",\n \"failed\",\n];\n\nfunction validateSecretKey(key: unknown): asserts key is string {\n if (typeof key !== \"string\" || key.length === 0) {\n throw new ArcPayError({\n type: \"authentication_error\",\n code: \"invalid_secret_key\",\n message: \"Secret key must be a non-empty string\",\n retryable: false,\n });\n }\n if (!key.startsWith(\"sk_test_\") && !key.startsWith(\"sk_live_\")) {\n throw new ArcPayError({\n type: \"authentication_error\",\n code: \"invalid_secret_key\",\n message:\n \"Secret key must start with sk_test_ or sk_live_. Publishable keys cannot call server APIs.\",\n retryable: false,\n });\n }\n}\n\nconst normalizeBase = (base: string): string => {\n let end = base.length;\n while (end > 0 && base.charCodeAt(end - 1) === 47) {\n end -= 1;\n }\n return base.slice(0, end);\n};\n\ninterface RequestOptionsWithOptionalIdempotency extends RequestOptions {\n idempotencyKey?: string;\n}\n\nconst normalizeRequestOptions = (\n opts: RequestOptionsInput,\n): RequestOptionsWithOptionalIdempotency => opts ?? {};\n\nconst IDEMPOTENCY_KEY_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nconst requireIdempotencyKey = (opts: RequestOptionsWithOptionalIdempotency): string => {\n if (!opts.idempotencyKey) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"missing_idempotency_key\",\n message: \"idempotencyKey is required for this operation\",\n retryable: false,\n });\n }\n if (!IDEMPOTENCY_KEY_RE.test(opts.idempotencyKey)) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_idempotency_key\",\n message: \"idempotencyKey must be a valid UUID\",\n retryable: false,\n });\n }\n return opts.idempotencyKey;\n};\n\nconst normalizeExecutePaymentRequest = (body: ExecutePaymentRequest): ExecutePaymentRequest => {\n if (!body || !body.payment_method) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_request\",\n message: \"payment_method is required\",\n retryable: false,\n });\n }\n if (body.payment_method === \"bank_card\" && !body.card_token_id) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"missing_card_token_id\",\n message: \"card_token_id is required for bank_card executePayment\",\n retryable: false,\n });\n }\n if (body.payment_mode !== \"h2h\") {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_payment_mode\",\n message: \"payment_mode must be h2h for executePayment\",\n retryable: false,\n });\n }\n if (body.payment_method !== \"bank_card\") {\n if (!body.wallet_interaction) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_request\",\n message: \"wallet_interaction is required for wallet executePayment\",\n retryable: false,\n });\n }\n if (body.wallet_interaction.provider !== body.payment_method) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_request\",\n message: \"wallet_interaction.provider must match payment_method\",\n retryable: false,\n });\n }\n }\n return body;\n};\n\nconst appendQuery = (path: string, query?: object): string => {\n if (!query) return path;\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null || value === \"\") continue;\n params.set(key, String(value));\n }\n const encoded = params.toString();\n return encoded ? `${path}?${encoded}` : path;\n};\n\nconst sleep = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n\nconst normalizePollMs = (value: number | undefined, fallback: number): number => {\n if (value === undefined) return fallback;\n if (!Number.isFinite(value) || value <= 0) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_poll_options\",\n message: \"Polling intervals and timeouts must be positive finite numbers\",\n retryable: false,\n });\n }\n return value;\n};\n\ninterface APIErrorBody {\n error?: {\n type?: string;\n code?: string;\n message?: string;\n param?: string;\n request_id?: string;\n decline_code?: string;\n };\n}\n\nconst isPublicErrorType = (value: unknown): value is ArcPayErrorType =>\n value === \"validation_error\" ||\n value === \"authentication_error\" ||\n value === \"authorization_error\" ||\n value === \"state_error\" ||\n value === \"rate_limit_error\" ||\n value === \"api_error\";\n\nconst isRetryableError = (type: ArcPayErrorType, status: number, code?: string): boolean => {\n if (type === \"rate_limit_error\") return true;\n if (code === \"timeout\") return false;\n return type === \"api_error\" && status >= 500;\n};\n\nconst parseErrorResponse = async (res: Response): Promise<ArcPayError> => {\n let body: APIErrorBody = {};\n try {\n body = (await res.json()) as APIErrorBody;\n } catch {\n /* keep default error below */\n }\n const detail = body.error ?? {};\n const type = isPublicErrorType(detail.type)\n ? detail.type\n : res.status >= 500\n ? \"api_error\"\n : \"validation_error\";\n return new ArcPayError({\n type,\n code: detail.code,\n message: detail.message ?? `Request failed with status ${res.status}`,\n param: detail.param,\n requestId: detail.request_id,\n declineCode: detail.decline_code,\n retryable: isRetryableError(type, res.status, detail.code),\n });\n};\n\nconst parseSuccessResponse = async <T>(res: Response): Promise<T> => {\n if (res.status === 204 || res.headers.get(\"content-length\") === \"0\") {\n return undefined as T;\n }\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (!contentType.toLowerCase().includes(\"application/json\")) {\n return undefined as T;\n }\n return (await res.json()) as T;\n};\n\nexport class ArcPayClient {\n private readonly secretKey: string;\n private readonly apiBase: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: ArcPayClientOptions) {\n const secretKey: unknown = options.secretKey;\n validateSecretKey(secretKey);\n if (!options.fetch && typeof fetch === \"undefined\") {\n throw new ArcPayError({\n type: \"api_error\",\n code: \"fetch_unavailable\",\n message: \"A fetch implementation is required in this runtime\",\n retryable: false,\n });\n }\n this.secretKey = secretKey;\n this.apiBase = normalizeBase(options.apiBase ?? DEFAULT_API_BASE);\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async listPayments(\n query: ListPaymentsQuery = {},\n opts: RequestOptions = {},\n ): Promise<PaymentList> {\n return this.request<PaymentList>(\"GET\", appendQuery(\"/payments\", query), undefined, opts);\n }\n\n async createPayment(body: CreatePaymentRequest, opts: IdempotencyOptions): Promise<Payment>;\n async createPayment(body: CreatePaymentRequest, opts: RequestOptionsInput): Promise<Payment> {\n return this.request<Payment>(\"POST\", \"/payments\", body, opts, true);\n }\n\n async createCardSetup(body: CreateCardSetupRequest, opts: IdempotencyOptions): Promise<Payment>;\n async createCardSetup(body: CreateCardSetupRequest, opts: RequestOptionsInput): Promise<Payment> {\n return this.request<Payment>(\"POST\", \"/cards/setup\", body, opts, true);\n }\n\n async getPayment(paymentId: string, opts: RequestOptions = {}): Promise<Payment> {\n return this.request<Payment>(\n \"GET\",\n `/payments/${encodeURIComponent(paymentId)}`,\n undefined,\n opts,\n );\n }\n\n async waitForPaymentTerminal(\n paymentId: string,\n opts: WaitForPaymentOptions = {},\n ): Promise<Payment> {\n const intervalMs = normalizePollMs(opts.intervalMs, DEFAULT_POLL_INTERVAL_MS);\n const timeoutMs = normalizePollMs(opts.timeoutMs, DEFAULT_POLL_TIMEOUT_MS);\n const terminalStatuses = new Set(opts.terminalStatuses ?? DEFAULT_TERMINAL_PAYMENT_STATUSES);\n const startedAt = Date.now();\n\n for (;;) {\n const payment = await this.getPayment(paymentId, { signal: opts.signal });\n if (terminalStatuses.has(payment.status as TerminalPaymentStatus)) {\n return payment;\n }\n if (Date.now() - startedAt >= timeoutMs) {\n throw new ArcPayError({\n type: \"api_error\",\n code: \"payment_poll_timeout\",\n message: `Payment ${paymentId} did not reach a terminal status within ${timeoutMs}ms`,\n retryable: true,\n });\n }\n await sleep(intervalMs, opts.signal);\n }\n }\n\n async capturePayment(\n paymentId: string,\n body: CaptureRequest,\n opts: IdempotencyOptions,\n ): Promise<Payment>;\n async capturePayment(\n paymentId: string,\n body: CaptureRequest,\n opts: RequestOptionsInput,\n ): Promise<Payment> {\n return this.request<Payment>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/capture`,\n body,\n opts,\n true,\n );\n }\n\n async voidPayment(\n paymentId: string,\n body: VoidRequest,\n opts: IdempotencyOptions,\n ): Promise<Payment>;\n async voidPayment(\n paymentId: string,\n body: VoidRequest,\n opts: RequestOptionsInput,\n ): Promise<Payment> {\n return this.request<Payment>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/void`,\n body,\n opts,\n true,\n );\n }\n\n async createRefund(\n paymentId: string,\n body: CreateRefundRequest,\n opts: IdempotencyOptions,\n ): Promise<Refund>;\n async createRefund(\n paymentId: string,\n body: CreateRefundRequest,\n opts: RequestOptionsInput,\n ): Promise<Refund> {\n return this.request<Refund>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/refunds`,\n body,\n opts,\n true,\n );\n }\n\n async chargeSavedCard(\n body: ChargeSavedCardRequest,\n opts: IdempotencyOptions,\n ): Promise<ExecutePaymentResponse>;\n async chargeSavedCard(\n body: ChargeSavedCardRequest,\n opts: RequestOptionsInput,\n ): Promise<ExecutePaymentResponse> {\n return this.request<ExecutePaymentResponse>(\"POST\", \"/payments/saved-card\", body, opts, true);\n }\n\n async executePayment(\n paymentId: string,\n body: ExecutePaymentRequest,\n opts: IdempotencyOptions,\n ): Promise<ExecutePaymentResponse>;\n async executePayment(\n paymentId: string,\n body: ExecutePaymentRequest,\n opts: RequestOptionsInput,\n ): Promise<ExecutePaymentResponse> {\n const requestBody = normalizeExecutePaymentRequest(body);\n return this.request<ExecutePaymentResponse>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/execute`,\n requestBody,\n opts,\n true,\n );\n }\n\n async completeThreeDSMethod(\n paymentId: string,\n body: CompleteThreeDSMethodRequest,\n opts: IdempotencyOptions,\n ): Promise<ExecutePaymentResponse> {\n return this.request<ExecutePaymentResponse>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/complete-3ds-method`,\n body,\n opts,\n true,\n );\n }\n\n async listAvailablePaymentMethods(\n query: ListAvailablePaymentMethodsQuery,\n opts: RequestOptions = {},\n ): Promise<AvailablePaymentMethod[]> {\n return this.request<AvailablePaymentMethod[]>(\n \"GET\",\n appendQuery(\"/payment-methods/available\", query),\n undefined,\n opts,\n );\n }\n\n async createLink(body: CreateLinkRequest, opts: IdempotencyOptions): Promise<Link>;\n async createLink(body: CreateLinkRequest, opts: RequestOptionsInput): Promise<Link> {\n return this.request<Link>(\"POST\", \"/links\", body, opts, true);\n }\n\n async getLink(linkId: string, opts: RequestOptions = {}): Promise<Link> {\n return this.request<Link>(\"GET\", `/links/${encodeURIComponent(linkId)}`, undefined, opts);\n }\n\n async cancelLink(linkId: string, opts: IdempotencyOptions): Promise<Link>;\n async cancelLink(linkId: string, opts: RequestOptionsInput): Promise<Link> {\n return this.request<Link>(\n \"DELETE\",\n `/links/${encodeURIComponent(linkId)}`,\n undefined,\n opts,\n true,\n );\n }\n\n async createCheckoutSession(\n body: CreateCheckoutSessionRequest,\n opts: IdempotencyOptions,\n ): Promise<CheckoutSession>;\n async createCheckoutSession(\n body: CreateCheckoutSessionRequest,\n opts: RequestOptionsInput,\n ): Promise<CheckoutSession> {\n return this.request<CheckoutSession>(\"POST\", \"/checkout/sessions\", body, opts, true);\n }\n\n private async request<T>(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n body: unknown,\n opts: RequestOptionsInput = undefined,\n requireIdempotency = false,\n ): Promise<T> {\n const requestOpts = normalizeRequestOptions(opts);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n \"X-Arc-Pay-API-Version\": API_VERSION,\n \"Content-Type\": \"application/json\",\n };\n if (requireIdempotency) {\n headers[\"Idempotency-Key\"] = requireIdempotencyKey(requestOpts);\n } else if (requestOpts.idempotencyKey !== undefined) {\n headers[\"Idempotency-Key\"] = requireIdempotencyKey(requestOpts);\n }\n\n let res: Response;\n try {\n res = await this.fetchImpl(`${this.apiBase}${path}`, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: requestOpts.signal,\n });\n } catch (err) {\n throw new ArcPayError({\n type: \"network_error\",\n message: err instanceof Error ? err.message : \"Network request failed\",\n retryable: true,\n });\n }\n if (!res.ok) throw await parseErrorResponse(res);\n return parseSuccessResponse<T>(res);\n }\n}\n\nexport const createArcPayClient = (options: ArcPayClientOptions): ArcPayClient =>\n new ArcPayClient(options);\n","import type { CardBrowserInfo, ExecutePaymentResponse, PaymentNextAction } from \"../server/types\";\n\nexport type ThreeDSAction = PaymentNextAction;\nexport type BrowserInfo = CardBrowserInfo;\n\nexport interface BrowserFormField {\n name: string;\n value: string;\n}\n\nexport interface BrowserPostForm {\n action: string;\n method: \"POST\";\n target: \"hidden_iframe\" | \"browser\";\n fields: BrowserFormField[];\n}\n\nexport interface ThreeDSBrowserStep {\n kind: \"method\" | \"challenge\";\n protocolVersion: \"1\" | \"2\";\n form: BrowserPostForm;\n completionEndpoint?: string;\n threeDSServerTransId?: string;\n}\n\nexport interface MountedThreeDSForm {\n form: HTMLFormElement;\n iframe?: HTMLIFrameElement;\n submit: () => void;\n remove: () => void;\n}\n\nexport interface ThreeDSMountOptions {\n document?: Document;\n container?: HTMLElement;\n challengeTarget?: \"_self\";\n submitter?: (form: HTMLFormElement) => void;\n}\n\nexport interface RunThreeDSBrowserFlowOptions extends ThreeDSMountOptions {\n completeThreeDSMethod?: (\n completion: ReturnType<typeof buildThreeDSMethodCompletion>,\n nextAction: PaymentNextAction,\n ) => Promise<ExecutePaymentResponse>;\n methodCompletionIndicator?: \"Y\" | \"N\" | \"U\";\n methodTimeoutMs?: number;\n signal?: AbortSignal;\n}\n\nexport type ThreeDSBrowserFlowResult =\n | {\n status: \"no_action\";\n response?: ExecutePaymentResponse;\n }\n | {\n status: \"method_completed\";\n response: ExecutePaymentResponse;\n methodResult: \"loaded\" | \"timeout\";\n }\n | {\n status: \"challenge_submitted\";\n action: PaymentNextAction;\n response?: ExecutePaymentResponse;\n mounted: MountedThreeDSForm;\n methodResult?: \"loaded\" | \"timeout\";\n };\n\nconst supportedColorDepths = [1, 4, 8, 15, 16, 24, 32, 48] as const;\n\nconst normalizeColorDepth = (value: number): BrowserInfo[\"color_depth\"] =>\n supportedColorDepths.includes(value as BrowserInfo[\"color_depth\"])\n ? (value as BrowserInfo[\"color_depth\"])\n : 24;\n\nconst resolveWindowSize = (width: number): NonNullable<BrowserInfo[\"window_size\"]> => {\n if (width >= 1000) return \"05\";\n if (width >= 600) return \"04\";\n if (width >= 500) return \"03\";\n if (width >= 390) return \"02\";\n return \"01\";\n};\n\nexport const collectBrowserInfo = (\n acceptHeader = \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n): BrowserInfo => {\n if (\n typeof window === \"undefined\" ||\n typeof navigator === \"undefined\" ||\n typeof screen === \"undefined\"\n ) {\n throw new Error(\"collectBrowserInfo must be called in a browser environment\");\n }\n return {\n accept_header: acceptHeader,\n language: navigator.language || \"en\",\n screen_width: screen.width,\n screen_height: screen.height,\n color_depth: normalizeColorDepth(screen.colorDepth),\n timezone_offset_minutes: new Date().getTimezoneOffset(),\n java_enabled: false,\n user_agent: navigator.userAgent,\n window_size: resolveWindowSize(window.innerWidth || screen.width),\n };\n};\n\nexport const getThreeDSAction = (nextAction?: PaymentNextAction): PaymentNextAction | null => {\n return nextAction ?? null;\n};\n\nexport const isThreeDSMethodAction = (nextAction?: PaymentNextAction): boolean => {\n return nextAction?.type === \"three_ds_method\" && nextAction.three_ds.phase === \"method\";\n};\n\nexport const isThreeDSChallengeAction = (nextAction?: PaymentNextAction): boolean => {\n return nextAction?.type === \"three_ds_challenge\" && nextAction.three_ds.phase === \"challenge\";\n};\n\nexport const buildThreeDSBrowserForm = (nextAction: PaymentNextAction): BrowserPostForm => ({\n action: nextAction.three_ds.submit.url,\n method: nextAction.three_ds.submit.method,\n target: nextAction.three_ds.submit.target,\n fields: nextAction.three_ds.submit.fields,\n});\n\nconst assertHTTPSActionURL = (action: string): void => {\n let parsed: URL;\n try {\n parsed = new URL(action);\n } catch {\n throw new Error(\"3DS form action must be an absolute HTTPS URL\");\n }\n if (parsed.protocol !== \"https:\") {\n throw new Error(\"3DS form action must use HTTPS\");\n }\n};\n\nexport const buildThreeDSBrowserStep = (\n nextAction?: PaymentNextAction,\n): ThreeDSBrowserStep | null => {\n const action = getThreeDSAction(nextAction);\n if (!action) return null;\n return {\n kind: action.three_ds.phase,\n protocolVersion: action.three_ds.version,\n form: buildThreeDSBrowserForm(action),\n completionEndpoint: action.three_ds.completion_endpoint,\n threeDSServerTransId: action.three_ds.three_ds_server_trans_id,\n };\n};\n\nexport const buildThreeDSMethodCompletion = (\n nextAction: PaymentNextAction,\n completionIndicator: \"Y\" | \"N\" | \"U\" = \"Y\",\n): { completion_indicator: \"Y\" | \"N\" | \"U\"; three_ds_server_trans_id: string } => {\n if (!isThreeDSMethodAction(nextAction) || !nextAction.three_ds.three_ds_server_trans_id) {\n throw new Error(\"nextAction must be a three_ds_method action with three_ds_server_trans_id\");\n }\n return {\n completion_indicator: completionIndicator,\n three_ds_server_trans_id: nextAction.three_ds.three_ds_server_trans_id,\n };\n};\n\nconst requireDocument = (explicitDocument?: Document): Document => {\n if (explicitDocument) return explicitDocument;\n if (typeof document === \"undefined\") {\n throw new Error(\"3DS browser helpers must be called in a browser environment\");\n }\n return document;\n};\n\nconst defaultSubmitter = (form: HTMLFormElement): void => {\n form.submit();\n};\n\nexport const mountThreeDSBrowserForm = (\n nextAction: PaymentNextAction,\n options: ThreeDSMountOptions = {},\n): MountedThreeDSForm => {\n const doc = requireDocument(options.document);\n const container = options.container ?? doc.body;\n const formDescriptor = buildThreeDSBrowserForm(nextAction);\n assertHTTPSActionURL(formDescriptor.action);\n const form = doc.createElement(\"form\");\n const target =\n formDescriptor.target === \"hidden_iframe\"\n ? `arcpay-three-ds-method-${crypto.randomUUID()}`\n : (options.challengeTarget ?? \"_self\");\n let iframe: HTMLIFrameElement | undefined;\n\n form.method = formDescriptor.method;\n form.action = formDescriptor.action;\n form.target = target;\n form.hidden = true;\n\n for (const field of formDescriptor.fields) {\n const input = doc.createElement(\"input\");\n input.type = \"hidden\";\n input.name = field.name;\n input.value = field.value;\n form.append(input);\n }\n\n if (formDescriptor.target === \"hidden_iframe\") {\n iframe = doc.createElement(\"iframe\");\n iframe.name = target;\n iframe.title = \"3-D Secure method\";\n iframe.hidden = true;\n container.append(iframe);\n }\n\n container.append(form);\n\n return {\n form,\n iframe,\n submit: () => (options.submitter ?? defaultSubmitter)(form),\n remove: () => {\n form.remove();\n iframe?.remove();\n },\n };\n};\n\nconst waitForMethodFrame = (\n mounted: MountedThreeDSForm,\n timeoutMs: number,\n signal?: AbortSignal,\n): Promise<\"loaded\" | \"timeout\"> =>\n new Promise((resolve, reject) => {\n if (!mounted.iframe) {\n resolve(\"loaded\");\n return;\n }\n if (signal?.aborted) {\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n return;\n }\n\n let settled = false;\n const cleanup = () => {\n mounted.iframe?.removeEventListener(\"load\", onLoad);\n signal?.removeEventListener(\"abort\", onAbort);\n clearTimeout(timer);\n };\n const settle = (result: \"loaded\" | \"timeout\") => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(result);\n };\n const onLoad = () => settle(\"loaded\");\n const onAbort = () => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n };\n const timer = setTimeout(() => settle(\"timeout\"), timeoutMs);\n\n mounted.iframe.addEventListener(\"load\", onLoad, { once: true });\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n\nexport const runThreeDSBrowserFlow = async (\n nextAction: PaymentNextAction | undefined,\n options: RunThreeDSBrowserFlowOptions,\n): Promise<ThreeDSBrowserFlowResult> => {\n if (!nextAction) return { status: \"no_action\" };\n\n if (isThreeDSChallengeAction(nextAction)) {\n const mounted = mountThreeDSBrowserForm(nextAction, options);\n mounted.submit();\n return { status: \"challenge_submitted\", action: nextAction, mounted };\n }\n\n if (!isThreeDSMethodAction(nextAction)) return { status: \"no_action\" };\n const completeThreeDSMethod = options.completeThreeDSMethod;\n if (!completeThreeDSMethod) {\n throw new Error(\"completeThreeDSMethod is required for 3DS Method actions\");\n }\n\n const mounted = mountThreeDSBrowserForm(nextAction, options);\n try {\n mounted.submit();\n const methodResult = await waitForMethodFrame(\n mounted,\n options.methodTimeoutMs ?? 10_000,\n options.signal,\n );\n const indicator = options.methodCompletionIndicator ?? (methodResult === \"loaded\" ? \"Y\" : \"N\");\n const response = await completeThreeDSMethod(\n buildThreeDSMethodCompletion(nextAction, indicator),\n nextAction,\n );\n const followUpAction = getThreeDSAction(response.next_action);\n if (followUpAction && isThreeDSChallengeAction(followUpAction)) {\n const challengeMounted = mountThreeDSBrowserForm(followUpAction, options);\n challengeMounted.submit();\n return {\n status: \"challenge_submitted\",\n action: followUpAction,\n response,\n mounted: challengeMounted,\n methodResult,\n };\n }\n return { status: \"method_completed\", response, methodResult };\n } finally {\n mounted.remove();\n }\n};\n\nconst htmlEscape = (value: string): string =>\n value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n\nexport const buildThreeDSAutoSubmitHtml = (nextAction: PaymentNextAction): string => {\n const form = buildThreeDSBrowserForm(nextAction);\n assertHTTPSActionURL(form.action);\n const target = form.target === \"hidden_iframe\" ? \"arcpay-three-ds-method\" : \"_self\";\n const inputs = form.fields\n .map(\n (field) =>\n `<input type=\"hidden\" name=\"${htmlEscape(field.name)}\" value=\"${htmlEscape(field.value)}\">`,\n )\n .join(\"\");\n const iframe =\n form.target === \"hidden_iframe\"\n ? '<iframe name=\"arcpay-three-ds-method\" title=\"3-D Secure method\" hidden></iframe>'\n : \"\";\n return `<!doctype html><html><head><meta charset=\"utf-8\"></head><body>${iframe}<form method=\"POST\" action=\"${htmlEscape(form.action)}\" target=\"${target}\">${inputs}</form><script>document.forms[0].submit();</script></body></html>`;\n};\n"]}
@@ -28,11 +28,11 @@ declare class ArcPayClient {
28
28
  createRefund(paymentId: string, body: CreateRefundRequest, opts: IdempotencyOptions): Promise<Refund>;
29
29
  chargeSavedCard(body: ChargeSavedCardRequest, opts: IdempotencyOptions): Promise<ExecutePaymentResponse>;
30
30
  executePayment(paymentId: string, body: ExecutePaymentRequest, opts: IdempotencyOptions): Promise<ExecutePaymentResponse>;
31
- completeThreeDSMethod(paymentId: string, body: CompleteThreeDSMethodRequest, opts?: RequestOptions): Promise<ExecutePaymentResponse>;
31
+ completeThreeDSMethod(paymentId: string, body: CompleteThreeDSMethodRequest, opts: IdempotencyOptions): Promise<ExecutePaymentResponse>;
32
32
  listAvailablePaymentMethods(query: ListAvailablePaymentMethodsQuery, opts?: RequestOptions): Promise<AvailablePaymentMethod[]>;
33
33
  createLink(body: CreateLinkRequest, opts: IdempotencyOptions): Promise<Link>;
34
34
  getLink(linkId: string, opts?: RequestOptions): Promise<Link>;
35
- cancelLink(linkId: string, opts?: RequestOptions): Promise<Link>;
35
+ cancelLink(linkId: string, opts: IdempotencyOptions): Promise<Link>;
36
36
  createCheckoutSession(body: CreateCheckoutSessionRequest, opts: IdempotencyOptions): Promise<CheckoutSession>;
37
37
  private request;
38
38
  }
@@ -28,11 +28,11 @@ declare class ArcPayClient {
28
28
  createRefund(paymentId: string, body: CreateRefundRequest, opts: IdempotencyOptions): Promise<Refund>;
29
29
  chargeSavedCard(body: ChargeSavedCardRequest, opts: IdempotencyOptions): Promise<ExecutePaymentResponse>;
30
30
  executePayment(paymentId: string, body: ExecutePaymentRequest, opts: IdempotencyOptions): Promise<ExecutePaymentResponse>;
31
- completeThreeDSMethod(paymentId: string, body: CompleteThreeDSMethodRequest, opts?: RequestOptions): Promise<ExecutePaymentResponse>;
31
+ completeThreeDSMethod(paymentId: string, body: CompleteThreeDSMethodRequest, opts: IdempotencyOptions): Promise<ExecutePaymentResponse>;
32
32
  listAvailablePaymentMethods(query: ListAvailablePaymentMethodsQuery, opts?: RequestOptions): Promise<AvailablePaymentMethod[]>;
33
33
  createLink(body: CreateLinkRequest, opts: IdempotencyOptions): Promise<Link>;
34
34
  getLink(linkId: string, opts?: RequestOptions): Promise<Link>;
35
- cancelLink(linkId: string, opts?: RequestOptions): Promise<Link>;
35
+ cancelLink(linkId: string, opts: IdempotencyOptions): Promise<Link>;
36
36
  createCheckoutSession(body: CreateCheckoutSessionRequest, opts: IdempotencyOptions): Promise<CheckoutSession>;
37
37
  private request;
38
38
  }
@@ -182,6 +182,17 @@ var parseErrorResponse = async (res) => {
182
182
  retryable: isRetryableError(type, res.status, detail.code)
183
183
  });
184
184
  };
185
+ var parseSuccessResponse = async (res) => {
186
+ var _a;
187
+ if (res.status === 204 || res.headers.get("content-length") === "0") {
188
+ return void 0;
189
+ }
190
+ const contentType = (_a = res.headers.get("content-type")) != null ? _a : "";
191
+ if (!contentType.toLowerCase().includes("application/json")) {
192
+ return void 0;
193
+ }
194
+ return await res.json();
195
+ };
185
196
  var ArcPayClient = class {
186
197
  constructor(options) {
187
198
  var _a, _b;
@@ -278,12 +289,13 @@ var ArcPayClient = class {
278
289
  true
279
290
  );
280
291
  }
281
- async completeThreeDSMethod(paymentId, body, opts = {}) {
292
+ async completeThreeDSMethod(paymentId, body, opts) {
282
293
  return this.request(
283
294
  "POST",
284
295
  `/payments/${encodeURIComponent(paymentId)}/complete-3ds-method`,
285
296
  body,
286
- opts
297
+ opts,
298
+ true
287
299
  );
288
300
  }
289
301
  async listAvailablePaymentMethods(query, opts = {}) {
@@ -300,8 +312,14 @@ var ArcPayClient = class {
300
312
  async getLink(linkId, opts = {}) {
301
313
  return this.request("GET", `/links/${encodeURIComponent(linkId)}`, void 0, opts);
302
314
  }
303
- async cancelLink(linkId, opts = {}) {
304
- return this.request("DELETE", `/links/${encodeURIComponent(linkId)}`, void 0, opts);
315
+ async cancelLink(linkId, opts) {
316
+ return this.request(
317
+ "DELETE",
318
+ `/links/${encodeURIComponent(linkId)}`,
319
+ void 0,
320
+ opts,
321
+ true
322
+ );
305
323
  }
306
324
  async createCheckoutSession(body, opts) {
307
325
  return this.request("POST", "/checkout/sessions", body, opts, true);
@@ -334,7 +352,7 @@ var ArcPayClient = class {
334
352
  });
335
353
  }
336
354
  if (!res.ok) throw await parseErrorResponse(res);
337
- return await res.json();
355
+ return parseSuccessResponse(res);
338
356
  }
339
357
  };
340
358
  var createArcPayClient = (options) => new ArcPayClient(options);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/errors.ts","../../src/server/client.ts","../../src/three-ds/actions.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type ArcPayErrorType =\n | \"validation_error\"\n | \"configuration_error\"\n | \"authentication_error\"\n | \"authorization_error\"\n | \"state_error\"\n | \"rate_limit_error\"\n | \"api_error\"\n | \"network_error\"\n | \"challenge_aborted\";\n\ninterface ArcPayErrorInit {\n type: ArcPayErrorType;\n message: string;\n code?: string;\n param?: string;\n paymentId?: string;\n declineCode?: string;\n retryable: boolean;\n requestId?: string;\n}\n\nexport class ArcPayError extends Error {\n readonly type: ArcPayErrorType;\n readonly code?: string;\n readonly param?: string;\n readonly paymentId?: string;\n readonly declineCode?: string;\n readonly retryable: boolean;\n readonly requestId?: string;\n\n constructor(init: ArcPayErrorInit) {\n super(init.message);\n this.name = \"ArcPayError\";\n this.type = init.type;\n this.code = init.code;\n this.param = init.param;\n this.paymentId = init.paymentId;\n this.declineCode = init.declineCode;\n this.retryable = init.retryable;\n this.requestId = init.requestId;\n }\n}\n\nexport const isValidationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"validation_error\";\nconst isConfigurationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"configuration_error\";\nexport const isAuthenticationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"authentication_error\";\nexport const isAuthorizationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"authorization_error\";\nexport const isStateError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"state_error\";\nexport const isRateLimitError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"rate_limit_error\";\nexport const isApiError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"api_error\";\nexport const isNetworkError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"network_error\";\nexport const isChallengeAborted = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"challenge_aborted\";\n","import { ArcPayError, type ArcPayErrorType } from \"../core/errors\";\nimport type {\n AvailablePaymentMethod,\n CaptureRequest,\n ChargeSavedCardRequest,\n CheckoutSession,\n CompleteThreeDSMethodRequest,\n CreateCheckoutSessionRequest,\n CreateCardSetupRequest,\n CreateLinkRequest,\n CreatePaymentRequest,\n CreateRefundRequest,\n ExecutePaymentRequest,\n ExecutePaymentResponse,\n Link,\n ListAvailablePaymentMethodsQuery,\n ListPaymentsQuery,\n Payment,\n PaymentList,\n PaymentNextAction,\n Refund,\n TerminalPaymentStatus,\n VoidRequest,\n WaitForPaymentOptions,\n} from \"./types\";\n\nexport type {\n AvailablePaymentMethod,\n CaptureRequest,\n ChargeSavedCardRequest,\n CheckoutSession,\n CompleteThreeDSMethodRequest,\n CreateCheckoutSessionRequest,\n CreateLinkRequest,\n CreatePaymentRequest,\n CreateRefundRequest,\n ExecutePaymentRequest,\n ExecutePaymentResponse,\n PaymentNextAction,\n Link,\n ListAvailablePaymentMethodsQuery,\n ListPaymentsQuery,\n Payment,\n PaymentFlowMode,\n PaymentList,\n PaymentMethod,\n Refund,\n VoidRequest,\n} from \"./types\";\n\nexport interface ArcPayClientOptions {\n secretKey: string;\n apiBase?: string;\n fetch?: typeof fetch;\n}\n\nexport interface IdempotencyOptions {\n idempotencyKey: string;\n signal?: AbortSignal;\n}\n\ntype RequestOptionsInput = RequestOptions | IdempotencyOptions | null | undefined;\n\nexport interface RequestOptions {\n signal?: AbortSignal;\n}\n\nconst DEFAULT_API_BASE = \"https://api.arcpay.space/v1\";\nconst API_VERSION = \"2026-05-06\";\nconst DEFAULT_POLL_INTERVAL_MS = 1500;\nconst DEFAULT_POLL_TIMEOUT_MS = 60_000;\nconst DEFAULT_TERMINAL_PAYMENT_STATUSES: readonly TerminalPaymentStatus[] = [\n \"authorized\",\n \"captured\",\n \"settled\",\n \"voided\",\n \"expired\",\n \"refunded\",\n \"chargeback\",\n \"declined\",\n \"failed\",\n];\n\nfunction validateSecretKey(key: unknown): asserts key is string {\n if (typeof key !== \"string\" || key.length === 0) {\n throw new ArcPayError({\n type: \"authentication_error\",\n code: \"invalid_secret_key\",\n message: \"Secret key must be a non-empty string\",\n retryable: false,\n });\n }\n if (!key.startsWith(\"sk_test_\") && !key.startsWith(\"sk_live_\")) {\n throw new ArcPayError({\n type: \"authentication_error\",\n code: \"invalid_secret_key\",\n message:\n \"Secret key must start with sk_test_ or sk_live_. Publishable keys cannot call server APIs.\",\n retryable: false,\n });\n }\n}\n\nconst normalizeBase = (base: string): string => {\n let end = base.length;\n while (end > 0 && base.charCodeAt(end - 1) === 47) {\n end -= 1;\n }\n return base.slice(0, end);\n};\n\ninterface RequestOptionsWithOptionalIdempotency extends RequestOptions {\n idempotencyKey?: string;\n}\n\nconst normalizeRequestOptions = (\n opts: RequestOptionsInput,\n): RequestOptionsWithOptionalIdempotency => opts ?? {};\n\nconst IDEMPOTENCY_KEY_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nconst requireIdempotencyKey = (opts: RequestOptionsWithOptionalIdempotency): string => {\n if (!opts.idempotencyKey) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"missing_idempotency_key\",\n message: \"idempotencyKey is required for this operation\",\n retryable: false,\n });\n }\n if (!IDEMPOTENCY_KEY_RE.test(opts.idempotencyKey)) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_idempotency_key\",\n message: \"idempotencyKey must be a valid UUID\",\n retryable: false,\n });\n }\n return opts.idempotencyKey;\n};\n\nconst normalizeExecutePaymentRequest = (body: ExecutePaymentRequest): ExecutePaymentRequest => {\n if (!body || !body.payment_method) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_request\",\n message: \"payment_method is required\",\n retryable: false,\n });\n }\n if (body.payment_method === \"bank_card\" && !body.card_token_id) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"missing_card_token_id\",\n message: \"card_token_id is required for bank_card executePayment\",\n retryable: false,\n });\n }\n if (body.payment_mode !== \"h2h\") {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_payment_mode\",\n message: \"payment_mode must be h2h for executePayment\",\n retryable: false,\n });\n }\n if (body.payment_method !== \"bank_card\") {\n if (!body.wallet_interaction) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_request\",\n message: \"wallet_interaction is required for wallet executePayment\",\n retryable: false,\n });\n }\n if (body.wallet_interaction.provider !== body.payment_method) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_request\",\n message: \"wallet_interaction.provider must match payment_method\",\n retryable: false,\n });\n }\n }\n return body;\n};\n\nconst appendQuery = (path: string, query?: object): string => {\n if (!query) return path;\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null || value === \"\") continue;\n params.set(key, String(value));\n }\n const encoded = params.toString();\n return encoded ? `${path}?${encoded}` : path;\n};\n\nconst sleep = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n\nconst normalizePollMs = (value: number | undefined, fallback: number): number => {\n if (value === undefined) return fallback;\n if (!Number.isFinite(value) || value <= 0) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_poll_options\",\n message: \"Polling intervals and timeouts must be positive finite numbers\",\n retryable: false,\n });\n }\n return value;\n};\n\ninterface APIErrorBody {\n error?: {\n type?: string;\n code?: string;\n message?: string;\n param?: string;\n request_id?: string;\n decline_code?: string;\n };\n}\n\nconst isPublicErrorType = (value: unknown): value is ArcPayErrorType =>\n value === \"validation_error\" ||\n value === \"authentication_error\" ||\n value === \"authorization_error\" ||\n value === \"state_error\" ||\n value === \"rate_limit_error\" ||\n value === \"api_error\";\n\nconst isRetryableError = (type: ArcPayErrorType, status: number, code?: string): boolean => {\n if (type === \"rate_limit_error\") return true;\n if (code === \"timeout\") return false;\n return type === \"api_error\" && status >= 500;\n};\n\nconst parseErrorResponse = async (res: Response): Promise<ArcPayError> => {\n let body: APIErrorBody = {};\n try {\n body = (await res.json()) as APIErrorBody;\n } catch {\n /* keep default error below */\n }\n const detail = body.error ?? {};\n const type = isPublicErrorType(detail.type)\n ? detail.type\n : res.status >= 500\n ? \"api_error\"\n : \"validation_error\";\n return new ArcPayError({\n type,\n code: detail.code,\n message: detail.message ?? `Request failed with status ${res.status}`,\n param: detail.param,\n requestId: detail.request_id,\n declineCode: detail.decline_code,\n retryable: isRetryableError(type, res.status, detail.code),\n });\n};\n\nexport class ArcPayClient {\n private readonly secretKey: string;\n private readonly apiBase: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: ArcPayClientOptions) {\n const secretKey: unknown = options.secretKey;\n validateSecretKey(secretKey);\n if (!options.fetch && typeof fetch === \"undefined\") {\n throw new ArcPayError({\n type: \"api_error\",\n code: \"fetch_unavailable\",\n message: \"A fetch implementation is required in this runtime\",\n retryable: false,\n });\n }\n this.secretKey = secretKey;\n this.apiBase = normalizeBase(options.apiBase ?? DEFAULT_API_BASE);\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async listPayments(\n query: ListPaymentsQuery = {},\n opts: RequestOptions = {},\n ): Promise<PaymentList> {\n return this.request<PaymentList>(\"GET\", appendQuery(\"/payments\", query), undefined, opts);\n }\n\n async createPayment(body: CreatePaymentRequest, opts: IdempotencyOptions): Promise<Payment>;\n async createPayment(body: CreatePaymentRequest, opts: RequestOptionsInput): Promise<Payment> {\n return this.request<Payment>(\"POST\", \"/payments\", body, opts, true);\n }\n\n async createCardSetup(body: CreateCardSetupRequest, opts: IdempotencyOptions): Promise<Payment>;\n async createCardSetup(body: CreateCardSetupRequest, opts: RequestOptionsInput): Promise<Payment> {\n return this.request<Payment>(\"POST\", \"/cards/setup\", body, opts, true);\n }\n\n async getPayment(paymentId: string, opts: RequestOptions = {}): Promise<Payment> {\n return this.request<Payment>(\n \"GET\",\n `/payments/${encodeURIComponent(paymentId)}`,\n undefined,\n opts,\n );\n }\n\n async waitForPaymentTerminal(\n paymentId: string,\n opts: WaitForPaymentOptions = {},\n ): Promise<Payment> {\n const intervalMs = normalizePollMs(opts.intervalMs, DEFAULT_POLL_INTERVAL_MS);\n const timeoutMs = normalizePollMs(opts.timeoutMs, DEFAULT_POLL_TIMEOUT_MS);\n const terminalStatuses = new Set(opts.terminalStatuses ?? DEFAULT_TERMINAL_PAYMENT_STATUSES);\n const startedAt = Date.now();\n\n for (;;) {\n const payment = await this.getPayment(paymentId, { signal: opts.signal });\n if (terminalStatuses.has(payment.status as TerminalPaymentStatus)) {\n return payment;\n }\n if (Date.now() - startedAt >= timeoutMs) {\n throw new ArcPayError({\n type: \"api_error\",\n code: \"payment_poll_timeout\",\n message: `Payment ${paymentId} did not reach a terminal status within ${timeoutMs}ms`,\n retryable: true,\n });\n }\n await sleep(intervalMs, opts.signal);\n }\n }\n\n async capturePayment(\n paymentId: string,\n body: CaptureRequest,\n opts: IdempotencyOptions,\n ): Promise<Payment>;\n async capturePayment(\n paymentId: string,\n body: CaptureRequest,\n opts: RequestOptionsInput,\n ): Promise<Payment> {\n return this.request<Payment>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/capture`,\n body,\n opts,\n true,\n );\n }\n\n async voidPayment(\n paymentId: string,\n body: VoidRequest,\n opts: IdempotencyOptions,\n ): Promise<Payment>;\n async voidPayment(\n paymentId: string,\n body: VoidRequest,\n opts: RequestOptionsInput,\n ): Promise<Payment> {\n return this.request<Payment>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/void`,\n body,\n opts,\n true,\n );\n }\n\n async createRefund(\n paymentId: string,\n body: CreateRefundRequest,\n opts: IdempotencyOptions,\n ): Promise<Refund>;\n async createRefund(\n paymentId: string,\n body: CreateRefundRequest,\n opts: RequestOptionsInput,\n ): Promise<Refund> {\n return this.request<Refund>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/refunds`,\n body,\n opts,\n true,\n );\n }\n\n async chargeSavedCard(\n body: ChargeSavedCardRequest,\n opts: IdempotencyOptions,\n ): Promise<ExecutePaymentResponse>;\n async chargeSavedCard(\n body: ChargeSavedCardRequest,\n opts: RequestOptionsInput,\n ): Promise<ExecutePaymentResponse> {\n return this.request<ExecutePaymentResponse>(\"POST\", \"/payments/saved-card\", body, opts, true);\n }\n\n async executePayment(\n paymentId: string,\n body: ExecutePaymentRequest,\n opts: IdempotencyOptions,\n ): Promise<ExecutePaymentResponse>;\n async executePayment(\n paymentId: string,\n body: ExecutePaymentRequest,\n opts: RequestOptionsInput,\n ): Promise<ExecutePaymentResponse> {\n const requestBody = normalizeExecutePaymentRequest(body);\n return this.request<ExecutePaymentResponse>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/execute`,\n requestBody,\n opts,\n true,\n );\n }\n\n async completeThreeDSMethod(\n paymentId: string,\n body: CompleteThreeDSMethodRequest,\n opts: RequestOptions = {},\n ): Promise<ExecutePaymentResponse> {\n return this.request<ExecutePaymentResponse>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/complete-3ds-method`,\n body,\n opts,\n );\n }\n\n async listAvailablePaymentMethods(\n query: ListAvailablePaymentMethodsQuery,\n opts: RequestOptions = {},\n ): Promise<AvailablePaymentMethod[]> {\n return this.request<AvailablePaymentMethod[]>(\n \"GET\",\n appendQuery(\"/payment-methods/available\", query),\n undefined,\n opts,\n );\n }\n\n async createLink(body: CreateLinkRequest, opts: IdempotencyOptions): Promise<Link>;\n async createLink(body: CreateLinkRequest, opts: RequestOptionsInput): Promise<Link> {\n return this.request<Link>(\"POST\", \"/links\", body, opts, true);\n }\n\n async getLink(linkId: string, opts: RequestOptions = {}): Promise<Link> {\n return this.request<Link>(\"GET\", `/links/${encodeURIComponent(linkId)}`, undefined, opts);\n }\n\n async cancelLink(linkId: string, opts: RequestOptions = {}): Promise<Link> {\n return this.request<Link>(\"DELETE\", `/links/${encodeURIComponent(linkId)}`, undefined, opts);\n }\n\n async createCheckoutSession(\n body: CreateCheckoutSessionRequest,\n opts: IdempotencyOptions,\n ): Promise<CheckoutSession>;\n async createCheckoutSession(\n body: CreateCheckoutSessionRequest,\n opts: RequestOptionsInput,\n ): Promise<CheckoutSession> {\n return this.request<CheckoutSession>(\"POST\", \"/checkout/sessions\", body, opts, true);\n }\n\n private async request<T>(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n body: unknown,\n opts: RequestOptionsInput = undefined,\n requireIdempotency = false,\n ): Promise<T> {\n const requestOpts = normalizeRequestOptions(opts);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n \"X-Arc-Pay-API-Version\": API_VERSION,\n \"Content-Type\": \"application/json\",\n };\n if (requireIdempotency) {\n headers[\"Idempotency-Key\"] = requireIdempotencyKey(requestOpts);\n } else if (requestOpts.idempotencyKey !== undefined) {\n headers[\"Idempotency-Key\"] = requireIdempotencyKey(requestOpts);\n }\n\n let res: Response;\n try {\n res = await this.fetchImpl(`${this.apiBase}${path}`, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: requestOpts.signal,\n });\n } catch (err) {\n throw new ArcPayError({\n type: \"network_error\",\n message: err instanceof Error ? err.message : \"Network request failed\",\n retryable: true,\n });\n }\n if (!res.ok) throw await parseErrorResponse(res);\n return (await res.json()) as T;\n }\n}\n\nexport const createArcPayClient = (options: ArcPayClientOptions): ArcPayClient =>\n new ArcPayClient(options);\n","import type { CardBrowserInfo, ExecutePaymentResponse, PaymentNextAction } from \"../server/types\";\n\nexport type ThreeDSAction = PaymentNextAction;\nexport type BrowserInfo = CardBrowserInfo;\n\nexport interface BrowserFormField {\n name: string;\n value: string;\n}\n\nexport interface BrowserPostForm {\n action: string;\n method: \"POST\";\n target: \"hidden_iframe\" | \"browser\";\n fields: BrowserFormField[];\n}\n\nexport interface ThreeDSBrowserStep {\n kind: \"method\" | \"challenge\";\n protocolVersion: \"1\" | \"2\";\n form: BrowserPostForm;\n completionEndpoint?: string;\n threeDSServerTransId?: string;\n}\n\nexport interface MountedThreeDSForm {\n form: HTMLFormElement;\n iframe?: HTMLIFrameElement;\n submit: () => void;\n remove: () => void;\n}\n\nexport interface ThreeDSMountOptions {\n document?: Document;\n container?: HTMLElement;\n challengeTarget?: \"_self\";\n submitter?: (form: HTMLFormElement) => void;\n}\n\nexport interface RunThreeDSBrowserFlowOptions extends ThreeDSMountOptions {\n completeThreeDSMethod?: (\n completion: ReturnType<typeof buildThreeDSMethodCompletion>,\n nextAction: PaymentNextAction,\n ) => Promise<ExecutePaymentResponse>;\n methodCompletionIndicator?: \"Y\" | \"N\" | \"U\";\n methodTimeoutMs?: number;\n signal?: AbortSignal;\n}\n\nexport type ThreeDSBrowserFlowResult =\n | {\n status: \"no_action\";\n response?: ExecutePaymentResponse;\n }\n | {\n status: \"method_completed\";\n response: ExecutePaymentResponse;\n methodResult: \"loaded\" | \"timeout\";\n }\n | {\n status: \"challenge_submitted\";\n action: PaymentNextAction;\n response?: ExecutePaymentResponse;\n mounted: MountedThreeDSForm;\n methodResult?: \"loaded\" | \"timeout\";\n };\n\nconst supportedColorDepths = [1, 4, 8, 15, 16, 24, 32, 48] as const;\n\nconst normalizeColorDepth = (value: number): BrowserInfo[\"color_depth\"] =>\n supportedColorDepths.includes(value as BrowserInfo[\"color_depth\"])\n ? (value as BrowserInfo[\"color_depth\"])\n : 24;\n\nconst resolveWindowSize = (width: number): NonNullable<BrowserInfo[\"window_size\"]> => {\n if (width >= 1000) return \"05\";\n if (width >= 600) return \"04\";\n if (width >= 500) return \"03\";\n if (width >= 390) return \"02\";\n return \"01\";\n};\n\nexport const collectBrowserInfo = (\n acceptHeader = \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n): BrowserInfo => {\n if (\n typeof window === \"undefined\" ||\n typeof navigator === \"undefined\" ||\n typeof screen === \"undefined\"\n ) {\n throw new Error(\"collectBrowserInfo must be called in a browser environment\");\n }\n return {\n accept_header: acceptHeader,\n language: navigator.language || \"en\",\n screen_width: screen.width,\n screen_height: screen.height,\n color_depth: normalizeColorDepth(screen.colorDepth),\n timezone_offset_minutes: new Date().getTimezoneOffset(),\n java_enabled: false,\n user_agent: navigator.userAgent,\n window_size: resolveWindowSize(window.innerWidth || screen.width),\n };\n};\n\nexport const getThreeDSAction = (nextAction?: PaymentNextAction): PaymentNextAction | null => {\n return nextAction ?? null;\n};\n\nexport const isThreeDSMethodAction = (nextAction?: PaymentNextAction): boolean => {\n return nextAction?.type === \"three_ds_method\" && nextAction.three_ds.phase === \"method\";\n};\n\nexport const isThreeDSChallengeAction = (nextAction?: PaymentNextAction): boolean => {\n return nextAction?.type === \"three_ds_challenge\" && nextAction.three_ds.phase === \"challenge\";\n};\n\nexport const buildThreeDSBrowserForm = (nextAction: PaymentNextAction): BrowserPostForm => ({\n action: nextAction.three_ds.submit.url,\n method: nextAction.three_ds.submit.method,\n target: nextAction.three_ds.submit.target,\n fields: nextAction.three_ds.submit.fields,\n});\n\nconst assertHTTPSActionURL = (action: string): void => {\n let parsed: URL;\n try {\n parsed = new URL(action);\n } catch {\n throw new Error(\"3DS form action must be an absolute HTTPS URL\");\n }\n if (parsed.protocol !== \"https:\") {\n throw new Error(\"3DS form action must use HTTPS\");\n }\n};\n\nexport const buildThreeDSBrowserStep = (\n nextAction?: PaymentNextAction,\n): ThreeDSBrowserStep | null => {\n const action = getThreeDSAction(nextAction);\n if (!action) return null;\n return {\n kind: action.three_ds.phase,\n protocolVersion: action.three_ds.version,\n form: buildThreeDSBrowserForm(action),\n completionEndpoint: action.three_ds.completion_endpoint,\n threeDSServerTransId: action.three_ds.three_ds_server_trans_id,\n };\n};\n\nexport const buildThreeDSMethodCompletion = (\n nextAction: PaymentNextAction,\n completionIndicator: \"Y\" | \"N\" | \"U\" = \"Y\",\n): { completion_indicator: \"Y\" | \"N\" | \"U\"; three_ds_server_trans_id: string } => {\n if (!isThreeDSMethodAction(nextAction) || !nextAction.three_ds.three_ds_server_trans_id) {\n throw new Error(\"nextAction must be a three_ds_method action with three_ds_server_trans_id\");\n }\n return {\n completion_indicator: completionIndicator,\n three_ds_server_trans_id: nextAction.three_ds.three_ds_server_trans_id,\n };\n};\n\nconst requireDocument = (explicitDocument?: Document): Document => {\n if (explicitDocument) return explicitDocument;\n if (typeof document === \"undefined\") {\n throw new Error(\"3DS browser helpers must be called in a browser environment\");\n }\n return document;\n};\n\nconst defaultSubmitter = (form: HTMLFormElement): void => {\n form.submit();\n};\n\nexport const mountThreeDSBrowserForm = (\n nextAction: PaymentNextAction,\n options: ThreeDSMountOptions = {},\n): MountedThreeDSForm => {\n const doc = requireDocument(options.document);\n const container = options.container ?? doc.body;\n const formDescriptor = buildThreeDSBrowserForm(nextAction);\n assertHTTPSActionURL(formDescriptor.action);\n const form = doc.createElement(\"form\");\n const target =\n formDescriptor.target === \"hidden_iframe\"\n ? `arcpay-three-ds-method-${crypto.randomUUID()}`\n : (options.challengeTarget ?? \"_self\");\n let iframe: HTMLIFrameElement | undefined;\n\n form.method = formDescriptor.method;\n form.action = formDescriptor.action;\n form.target = target;\n form.hidden = true;\n\n for (const field of formDescriptor.fields) {\n const input = doc.createElement(\"input\");\n input.type = \"hidden\";\n input.name = field.name;\n input.value = field.value;\n form.append(input);\n }\n\n if (formDescriptor.target === \"hidden_iframe\") {\n iframe = doc.createElement(\"iframe\");\n iframe.name = target;\n iframe.title = \"3-D Secure method\";\n iframe.hidden = true;\n container.append(iframe);\n }\n\n container.append(form);\n\n return {\n form,\n iframe,\n submit: () => (options.submitter ?? defaultSubmitter)(form),\n remove: () => {\n form.remove();\n iframe?.remove();\n },\n };\n};\n\nconst waitForMethodFrame = (\n mounted: MountedThreeDSForm,\n timeoutMs: number,\n signal?: AbortSignal,\n): Promise<\"loaded\" | \"timeout\"> =>\n new Promise((resolve, reject) => {\n if (!mounted.iframe) {\n resolve(\"loaded\");\n return;\n }\n if (signal?.aborted) {\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n return;\n }\n\n let settled = false;\n const cleanup = () => {\n mounted.iframe?.removeEventListener(\"load\", onLoad);\n signal?.removeEventListener(\"abort\", onAbort);\n clearTimeout(timer);\n };\n const settle = (result: \"loaded\" | \"timeout\") => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(result);\n };\n const onLoad = () => settle(\"loaded\");\n const onAbort = () => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n };\n const timer = setTimeout(() => settle(\"timeout\"), timeoutMs);\n\n mounted.iframe.addEventListener(\"load\", onLoad, { once: true });\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n\nexport const runThreeDSBrowserFlow = async (\n nextAction: PaymentNextAction | undefined,\n options: RunThreeDSBrowserFlowOptions,\n): Promise<ThreeDSBrowserFlowResult> => {\n if (!nextAction) return { status: \"no_action\" };\n\n if (isThreeDSChallengeAction(nextAction)) {\n const mounted = mountThreeDSBrowserForm(nextAction, options);\n mounted.submit();\n return { status: \"challenge_submitted\", action: nextAction, mounted };\n }\n\n if (!isThreeDSMethodAction(nextAction)) return { status: \"no_action\" };\n const completeThreeDSMethod = options.completeThreeDSMethod;\n if (!completeThreeDSMethod) {\n throw new Error(\"completeThreeDSMethod is required for 3DS Method actions\");\n }\n\n const mounted = mountThreeDSBrowserForm(nextAction, options);\n try {\n mounted.submit();\n const methodResult = await waitForMethodFrame(\n mounted,\n options.methodTimeoutMs ?? 10_000,\n options.signal,\n );\n const indicator = options.methodCompletionIndicator ?? (methodResult === \"loaded\" ? \"Y\" : \"N\");\n const response = await completeThreeDSMethod(\n buildThreeDSMethodCompletion(nextAction, indicator),\n nextAction,\n );\n const followUpAction = getThreeDSAction(response.next_action);\n if (followUpAction && isThreeDSChallengeAction(followUpAction)) {\n const challengeMounted = mountThreeDSBrowserForm(followUpAction, options);\n challengeMounted.submit();\n return {\n status: \"challenge_submitted\",\n action: followUpAction,\n response,\n mounted: challengeMounted,\n methodResult,\n };\n }\n return { status: \"method_completed\", response, methodResult };\n } finally {\n mounted.remove();\n }\n};\n\nconst htmlEscape = (value: string): string =>\n value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n\nexport const buildThreeDSAutoSubmitHtml = (nextAction: PaymentNextAction): string => {\n const form = buildThreeDSBrowserForm(nextAction);\n assertHTTPSActionURL(form.action);\n const target = form.target === \"hidden_iframe\" ? \"arcpay-three-ds-method\" : \"_self\";\n const inputs = form.fields\n .map(\n (field) =>\n `<input type=\"hidden\" name=\"${htmlEscape(field.name)}\" value=\"${htmlEscape(field.value)}\">`,\n )\n .join(\"\");\n const iframe =\n form.target === \"hidden_iframe\"\n ? '<iframe name=\"arcpay-three-ds-method\" title=\"3-D Secure method\" hidden></iframe>'\n : \"\";\n return `<!doctype html><html><head><meta charset=\"utf-8\"></head><body>${iframe}<form method=\"POST\" action=\"${htmlEscape(form.action)}\" target=\"${target}\">${inputs}</form><script>document.forms[0].submit();</script></body></html>`;\n};\n"]}
1
+ {"version":3,"sources":["../../src/core/errors.ts","../../src/server/client.ts","../../src/three-ds/actions.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type ArcPayErrorType =\n | \"validation_error\"\n | \"configuration_error\"\n | \"authentication_error\"\n | \"authorization_error\"\n | \"state_error\"\n | \"rate_limit_error\"\n | \"api_error\"\n | \"network_error\"\n | \"challenge_aborted\";\n\ninterface ArcPayErrorInit {\n type: ArcPayErrorType;\n message: string;\n code?: string;\n param?: string;\n paymentId?: string;\n declineCode?: string;\n retryable: boolean;\n requestId?: string;\n}\n\nexport class ArcPayError extends Error {\n readonly type: ArcPayErrorType;\n readonly code?: string;\n readonly param?: string;\n readonly paymentId?: string;\n readonly declineCode?: string;\n readonly retryable: boolean;\n readonly requestId?: string;\n\n constructor(init: ArcPayErrorInit) {\n super(init.message);\n this.name = \"ArcPayError\";\n this.type = init.type;\n this.code = init.code;\n this.param = init.param;\n this.paymentId = init.paymentId;\n this.declineCode = init.declineCode;\n this.retryable = init.retryable;\n this.requestId = init.requestId;\n }\n}\n\nexport const isValidationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"validation_error\";\nconst isConfigurationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"configuration_error\";\nexport const isAuthenticationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"authentication_error\";\nexport const isAuthorizationError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"authorization_error\";\nexport const isStateError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"state_error\";\nexport const isRateLimitError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"rate_limit_error\";\nexport const isApiError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"api_error\";\nexport const isNetworkError = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"network_error\";\nexport const isChallengeAborted = (e: unknown): e is ArcPayError =>\n e instanceof ArcPayError && e.type === \"challenge_aborted\";\n","import { ArcPayError, type ArcPayErrorType } from \"../core/errors\";\nimport type {\n AvailablePaymentMethod,\n CaptureRequest,\n ChargeSavedCardRequest,\n CheckoutSession,\n CompleteThreeDSMethodRequest,\n CreateCheckoutSessionRequest,\n CreateCardSetupRequest,\n CreateLinkRequest,\n CreatePaymentRequest,\n CreateRefundRequest,\n ExecutePaymentRequest,\n ExecutePaymentResponse,\n Link,\n ListAvailablePaymentMethodsQuery,\n ListPaymentsQuery,\n Payment,\n PaymentList,\n PaymentNextAction,\n Refund,\n TerminalPaymentStatus,\n VoidRequest,\n WaitForPaymentOptions,\n} from \"./types\";\n\nexport type {\n AvailablePaymentMethod,\n CaptureRequest,\n ChargeSavedCardRequest,\n CheckoutSession,\n CompleteThreeDSMethodRequest,\n CreateCheckoutSessionRequest,\n CreateLinkRequest,\n CreatePaymentRequest,\n CreateRefundRequest,\n ExecutePaymentRequest,\n ExecutePaymentResponse,\n PaymentNextAction,\n Link,\n ListAvailablePaymentMethodsQuery,\n ListPaymentsQuery,\n Payment,\n PaymentFlowMode,\n PaymentList,\n PaymentMethod,\n Refund,\n VoidRequest,\n} from \"./types\";\n\nexport interface ArcPayClientOptions {\n secretKey: string;\n apiBase?: string;\n fetch?: typeof fetch;\n}\n\nexport interface IdempotencyOptions {\n idempotencyKey: string;\n signal?: AbortSignal;\n}\n\ntype RequestOptionsInput = RequestOptions | IdempotencyOptions | null | undefined;\n\nexport interface RequestOptions {\n signal?: AbortSignal;\n}\n\nconst DEFAULT_API_BASE = \"https://api.arcpay.space/v1\";\nconst API_VERSION = \"2026-05-06\";\nconst DEFAULT_POLL_INTERVAL_MS = 1500;\nconst DEFAULT_POLL_TIMEOUT_MS = 60_000;\nconst DEFAULT_TERMINAL_PAYMENT_STATUSES: readonly TerminalPaymentStatus[] = [\n \"authorized\",\n \"captured\",\n \"settled\",\n \"voided\",\n \"expired\",\n \"refunded\",\n \"chargeback\",\n \"declined\",\n \"failed\",\n];\n\nfunction validateSecretKey(key: unknown): asserts key is string {\n if (typeof key !== \"string\" || key.length === 0) {\n throw new ArcPayError({\n type: \"authentication_error\",\n code: \"invalid_secret_key\",\n message: \"Secret key must be a non-empty string\",\n retryable: false,\n });\n }\n if (!key.startsWith(\"sk_test_\") && !key.startsWith(\"sk_live_\")) {\n throw new ArcPayError({\n type: \"authentication_error\",\n code: \"invalid_secret_key\",\n message:\n \"Secret key must start with sk_test_ or sk_live_. Publishable keys cannot call server APIs.\",\n retryable: false,\n });\n }\n}\n\nconst normalizeBase = (base: string): string => {\n let end = base.length;\n while (end > 0 && base.charCodeAt(end - 1) === 47) {\n end -= 1;\n }\n return base.slice(0, end);\n};\n\ninterface RequestOptionsWithOptionalIdempotency extends RequestOptions {\n idempotencyKey?: string;\n}\n\nconst normalizeRequestOptions = (\n opts: RequestOptionsInput,\n): RequestOptionsWithOptionalIdempotency => opts ?? {};\n\nconst IDEMPOTENCY_KEY_RE =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\nconst requireIdempotencyKey = (opts: RequestOptionsWithOptionalIdempotency): string => {\n if (!opts.idempotencyKey) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"missing_idempotency_key\",\n message: \"idempotencyKey is required for this operation\",\n retryable: false,\n });\n }\n if (!IDEMPOTENCY_KEY_RE.test(opts.idempotencyKey)) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_idempotency_key\",\n message: \"idempotencyKey must be a valid UUID\",\n retryable: false,\n });\n }\n return opts.idempotencyKey;\n};\n\nconst normalizeExecutePaymentRequest = (body: ExecutePaymentRequest): ExecutePaymentRequest => {\n if (!body || !body.payment_method) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_request\",\n message: \"payment_method is required\",\n retryable: false,\n });\n }\n if (body.payment_method === \"bank_card\" && !body.card_token_id) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"missing_card_token_id\",\n message: \"card_token_id is required for bank_card executePayment\",\n retryable: false,\n });\n }\n if (body.payment_mode !== \"h2h\") {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_payment_mode\",\n message: \"payment_mode must be h2h for executePayment\",\n retryable: false,\n });\n }\n if (body.payment_method !== \"bank_card\") {\n if (!body.wallet_interaction) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_request\",\n message: \"wallet_interaction is required for wallet executePayment\",\n retryable: false,\n });\n }\n if (body.wallet_interaction.provider !== body.payment_method) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_request\",\n message: \"wallet_interaction.provider must match payment_method\",\n retryable: false,\n });\n }\n }\n return body;\n};\n\nconst appendQuery = (path: string, query?: object): string => {\n if (!query) return path;\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null || value === \"\") continue;\n params.set(key, String(value));\n }\n const encoded = params.toString();\n return encoded ? `${path}?${encoded}` : path;\n};\n\nconst sleep = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\n\nconst normalizePollMs = (value: number | undefined, fallback: number): number => {\n if (value === undefined) return fallback;\n if (!Number.isFinite(value) || value <= 0) {\n throw new ArcPayError({\n type: \"validation_error\",\n code: \"invalid_poll_options\",\n message: \"Polling intervals and timeouts must be positive finite numbers\",\n retryable: false,\n });\n }\n return value;\n};\n\ninterface APIErrorBody {\n error?: {\n type?: string;\n code?: string;\n message?: string;\n param?: string;\n request_id?: string;\n decline_code?: string;\n };\n}\n\nconst isPublicErrorType = (value: unknown): value is ArcPayErrorType =>\n value === \"validation_error\" ||\n value === \"authentication_error\" ||\n value === \"authorization_error\" ||\n value === \"state_error\" ||\n value === \"rate_limit_error\" ||\n value === \"api_error\";\n\nconst isRetryableError = (type: ArcPayErrorType, status: number, code?: string): boolean => {\n if (type === \"rate_limit_error\") return true;\n if (code === \"timeout\") return false;\n return type === \"api_error\" && status >= 500;\n};\n\nconst parseErrorResponse = async (res: Response): Promise<ArcPayError> => {\n let body: APIErrorBody = {};\n try {\n body = (await res.json()) as APIErrorBody;\n } catch {\n /* keep default error below */\n }\n const detail = body.error ?? {};\n const type = isPublicErrorType(detail.type)\n ? detail.type\n : res.status >= 500\n ? \"api_error\"\n : \"validation_error\";\n return new ArcPayError({\n type,\n code: detail.code,\n message: detail.message ?? `Request failed with status ${res.status}`,\n param: detail.param,\n requestId: detail.request_id,\n declineCode: detail.decline_code,\n retryable: isRetryableError(type, res.status, detail.code),\n });\n};\n\nconst parseSuccessResponse = async <T>(res: Response): Promise<T> => {\n if (res.status === 204 || res.headers.get(\"content-length\") === \"0\") {\n return undefined as T;\n }\n const contentType = res.headers.get(\"content-type\") ?? \"\";\n if (!contentType.toLowerCase().includes(\"application/json\")) {\n return undefined as T;\n }\n return (await res.json()) as T;\n};\n\nexport class ArcPayClient {\n private readonly secretKey: string;\n private readonly apiBase: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: ArcPayClientOptions) {\n const secretKey: unknown = options.secretKey;\n validateSecretKey(secretKey);\n if (!options.fetch && typeof fetch === \"undefined\") {\n throw new ArcPayError({\n type: \"api_error\",\n code: \"fetch_unavailable\",\n message: \"A fetch implementation is required in this runtime\",\n retryable: false,\n });\n }\n this.secretKey = secretKey;\n this.apiBase = normalizeBase(options.apiBase ?? DEFAULT_API_BASE);\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async listPayments(\n query: ListPaymentsQuery = {},\n opts: RequestOptions = {},\n ): Promise<PaymentList> {\n return this.request<PaymentList>(\"GET\", appendQuery(\"/payments\", query), undefined, opts);\n }\n\n async createPayment(body: CreatePaymentRequest, opts: IdempotencyOptions): Promise<Payment>;\n async createPayment(body: CreatePaymentRequest, opts: RequestOptionsInput): Promise<Payment> {\n return this.request<Payment>(\"POST\", \"/payments\", body, opts, true);\n }\n\n async createCardSetup(body: CreateCardSetupRequest, opts: IdempotencyOptions): Promise<Payment>;\n async createCardSetup(body: CreateCardSetupRequest, opts: RequestOptionsInput): Promise<Payment> {\n return this.request<Payment>(\"POST\", \"/cards/setup\", body, opts, true);\n }\n\n async getPayment(paymentId: string, opts: RequestOptions = {}): Promise<Payment> {\n return this.request<Payment>(\n \"GET\",\n `/payments/${encodeURIComponent(paymentId)}`,\n undefined,\n opts,\n );\n }\n\n async waitForPaymentTerminal(\n paymentId: string,\n opts: WaitForPaymentOptions = {},\n ): Promise<Payment> {\n const intervalMs = normalizePollMs(opts.intervalMs, DEFAULT_POLL_INTERVAL_MS);\n const timeoutMs = normalizePollMs(opts.timeoutMs, DEFAULT_POLL_TIMEOUT_MS);\n const terminalStatuses = new Set(opts.terminalStatuses ?? DEFAULT_TERMINAL_PAYMENT_STATUSES);\n const startedAt = Date.now();\n\n for (;;) {\n const payment = await this.getPayment(paymentId, { signal: opts.signal });\n if (terminalStatuses.has(payment.status as TerminalPaymentStatus)) {\n return payment;\n }\n if (Date.now() - startedAt >= timeoutMs) {\n throw new ArcPayError({\n type: \"api_error\",\n code: \"payment_poll_timeout\",\n message: `Payment ${paymentId} did not reach a terminal status within ${timeoutMs}ms`,\n retryable: true,\n });\n }\n await sleep(intervalMs, opts.signal);\n }\n }\n\n async capturePayment(\n paymentId: string,\n body: CaptureRequest,\n opts: IdempotencyOptions,\n ): Promise<Payment>;\n async capturePayment(\n paymentId: string,\n body: CaptureRequest,\n opts: RequestOptionsInput,\n ): Promise<Payment> {\n return this.request<Payment>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/capture`,\n body,\n opts,\n true,\n );\n }\n\n async voidPayment(\n paymentId: string,\n body: VoidRequest,\n opts: IdempotencyOptions,\n ): Promise<Payment>;\n async voidPayment(\n paymentId: string,\n body: VoidRequest,\n opts: RequestOptionsInput,\n ): Promise<Payment> {\n return this.request<Payment>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/void`,\n body,\n opts,\n true,\n );\n }\n\n async createRefund(\n paymentId: string,\n body: CreateRefundRequest,\n opts: IdempotencyOptions,\n ): Promise<Refund>;\n async createRefund(\n paymentId: string,\n body: CreateRefundRequest,\n opts: RequestOptionsInput,\n ): Promise<Refund> {\n return this.request<Refund>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/refunds`,\n body,\n opts,\n true,\n );\n }\n\n async chargeSavedCard(\n body: ChargeSavedCardRequest,\n opts: IdempotencyOptions,\n ): Promise<ExecutePaymentResponse>;\n async chargeSavedCard(\n body: ChargeSavedCardRequest,\n opts: RequestOptionsInput,\n ): Promise<ExecutePaymentResponse> {\n return this.request<ExecutePaymentResponse>(\"POST\", \"/payments/saved-card\", body, opts, true);\n }\n\n async executePayment(\n paymentId: string,\n body: ExecutePaymentRequest,\n opts: IdempotencyOptions,\n ): Promise<ExecutePaymentResponse>;\n async executePayment(\n paymentId: string,\n body: ExecutePaymentRequest,\n opts: RequestOptionsInput,\n ): Promise<ExecutePaymentResponse> {\n const requestBody = normalizeExecutePaymentRequest(body);\n return this.request<ExecutePaymentResponse>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/execute`,\n requestBody,\n opts,\n true,\n );\n }\n\n async completeThreeDSMethod(\n paymentId: string,\n body: CompleteThreeDSMethodRequest,\n opts: IdempotencyOptions,\n ): Promise<ExecutePaymentResponse> {\n return this.request<ExecutePaymentResponse>(\n \"POST\",\n `/payments/${encodeURIComponent(paymentId)}/complete-3ds-method`,\n body,\n opts,\n true,\n );\n }\n\n async listAvailablePaymentMethods(\n query: ListAvailablePaymentMethodsQuery,\n opts: RequestOptions = {},\n ): Promise<AvailablePaymentMethod[]> {\n return this.request<AvailablePaymentMethod[]>(\n \"GET\",\n appendQuery(\"/payment-methods/available\", query),\n undefined,\n opts,\n );\n }\n\n async createLink(body: CreateLinkRequest, opts: IdempotencyOptions): Promise<Link>;\n async createLink(body: CreateLinkRequest, opts: RequestOptionsInput): Promise<Link> {\n return this.request<Link>(\"POST\", \"/links\", body, opts, true);\n }\n\n async getLink(linkId: string, opts: RequestOptions = {}): Promise<Link> {\n return this.request<Link>(\"GET\", `/links/${encodeURIComponent(linkId)}`, undefined, opts);\n }\n\n async cancelLink(linkId: string, opts: IdempotencyOptions): Promise<Link>;\n async cancelLink(linkId: string, opts: RequestOptionsInput): Promise<Link> {\n return this.request<Link>(\n \"DELETE\",\n `/links/${encodeURIComponent(linkId)}`,\n undefined,\n opts,\n true,\n );\n }\n\n async createCheckoutSession(\n body: CreateCheckoutSessionRequest,\n opts: IdempotencyOptions,\n ): Promise<CheckoutSession>;\n async createCheckoutSession(\n body: CreateCheckoutSessionRequest,\n opts: RequestOptionsInput,\n ): Promise<CheckoutSession> {\n return this.request<CheckoutSession>(\"POST\", \"/checkout/sessions\", body, opts, true);\n }\n\n private async request<T>(\n method: \"GET\" | \"POST\" | \"DELETE\",\n path: string,\n body: unknown,\n opts: RequestOptionsInput = undefined,\n requireIdempotency = false,\n ): Promise<T> {\n const requestOpts = normalizeRequestOptions(opts);\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.secretKey}`,\n \"X-Arc-Pay-API-Version\": API_VERSION,\n \"Content-Type\": \"application/json\",\n };\n if (requireIdempotency) {\n headers[\"Idempotency-Key\"] = requireIdempotencyKey(requestOpts);\n } else if (requestOpts.idempotencyKey !== undefined) {\n headers[\"Idempotency-Key\"] = requireIdempotencyKey(requestOpts);\n }\n\n let res: Response;\n try {\n res = await this.fetchImpl(`${this.apiBase}${path}`, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: requestOpts.signal,\n });\n } catch (err) {\n throw new ArcPayError({\n type: \"network_error\",\n message: err instanceof Error ? err.message : \"Network request failed\",\n retryable: true,\n });\n }\n if (!res.ok) throw await parseErrorResponse(res);\n return parseSuccessResponse<T>(res);\n }\n}\n\nexport const createArcPayClient = (options: ArcPayClientOptions): ArcPayClient =>\n new ArcPayClient(options);\n","import type { CardBrowserInfo, ExecutePaymentResponse, PaymentNextAction } from \"../server/types\";\n\nexport type ThreeDSAction = PaymentNextAction;\nexport type BrowserInfo = CardBrowserInfo;\n\nexport interface BrowserFormField {\n name: string;\n value: string;\n}\n\nexport interface BrowserPostForm {\n action: string;\n method: \"POST\";\n target: \"hidden_iframe\" | \"browser\";\n fields: BrowserFormField[];\n}\n\nexport interface ThreeDSBrowserStep {\n kind: \"method\" | \"challenge\";\n protocolVersion: \"1\" | \"2\";\n form: BrowserPostForm;\n completionEndpoint?: string;\n threeDSServerTransId?: string;\n}\n\nexport interface MountedThreeDSForm {\n form: HTMLFormElement;\n iframe?: HTMLIFrameElement;\n submit: () => void;\n remove: () => void;\n}\n\nexport interface ThreeDSMountOptions {\n document?: Document;\n container?: HTMLElement;\n challengeTarget?: \"_self\";\n submitter?: (form: HTMLFormElement) => void;\n}\n\nexport interface RunThreeDSBrowserFlowOptions extends ThreeDSMountOptions {\n completeThreeDSMethod?: (\n completion: ReturnType<typeof buildThreeDSMethodCompletion>,\n nextAction: PaymentNextAction,\n ) => Promise<ExecutePaymentResponse>;\n methodCompletionIndicator?: \"Y\" | \"N\" | \"U\";\n methodTimeoutMs?: number;\n signal?: AbortSignal;\n}\n\nexport type ThreeDSBrowserFlowResult =\n | {\n status: \"no_action\";\n response?: ExecutePaymentResponse;\n }\n | {\n status: \"method_completed\";\n response: ExecutePaymentResponse;\n methodResult: \"loaded\" | \"timeout\";\n }\n | {\n status: \"challenge_submitted\";\n action: PaymentNextAction;\n response?: ExecutePaymentResponse;\n mounted: MountedThreeDSForm;\n methodResult?: \"loaded\" | \"timeout\";\n };\n\nconst supportedColorDepths = [1, 4, 8, 15, 16, 24, 32, 48] as const;\n\nconst normalizeColorDepth = (value: number): BrowserInfo[\"color_depth\"] =>\n supportedColorDepths.includes(value as BrowserInfo[\"color_depth\"])\n ? (value as BrowserInfo[\"color_depth\"])\n : 24;\n\nconst resolveWindowSize = (width: number): NonNullable<BrowserInfo[\"window_size\"]> => {\n if (width >= 1000) return \"05\";\n if (width >= 600) return \"04\";\n if (width >= 500) return \"03\";\n if (width >= 390) return \"02\";\n return \"01\";\n};\n\nexport const collectBrowserInfo = (\n acceptHeader = \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n): BrowserInfo => {\n if (\n typeof window === \"undefined\" ||\n typeof navigator === \"undefined\" ||\n typeof screen === \"undefined\"\n ) {\n throw new Error(\"collectBrowserInfo must be called in a browser environment\");\n }\n return {\n accept_header: acceptHeader,\n language: navigator.language || \"en\",\n screen_width: screen.width,\n screen_height: screen.height,\n color_depth: normalizeColorDepth(screen.colorDepth),\n timezone_offset_minutes: new Date().getTimezoneOffset(),\n java_enabled: false,\n user_agent: navigator.userAgent,\n window_size: resolveWindowSize(window.innerWidth || screen.width),\n };\n};\n\nexport const getThreeDSAction = (nextAction?: PaymentNextAction): PaymentNextAction | null => {\n return nextAction ?? null;\n};\n\nexport const isThreeDSMethodAction = (nextAction?: PaymentNextAction): boolean => {\n return nextAction?.type === \"three_ds_method\" && nextAction.three_ds.phase === \"method\";\n};\n\nexport const isThreeDSChallengeAction = (nextAction?: PaymentNextAction): boolean => {\n return nextAction?.type === \"three_ds_challenge\" && nextAction.three_ds.phase === \"challenge\";\n};\n\nexport const buildThreeDSBrowserForm = (nextAction: PaymentNextAction): BrowserPostForm => ({\n action: nextAction.three_ds.submit.url,\n method: nextAction.three_ds.submit.method,\n target: nextAction.three_ds.submit.target,\n fields: nextAction.three_ds.submit.fields,\n});\n\nconst assertHTTPSActionURL = (action: string): void => {\n let parsed: URL;\n try {\n parsed = new URL(action);\n } catch {\n throw new Error(\"3DS form action must be an absolute HTTPS URL\");\n }\n if (parsed.protocol !== \"https:\") {\n throw new Error(\"3DS form action must use HTTPS\");\n }\n};\n\nexport const buildThreeDSBrowserStep = (\n nextAction?: PaymentNextAction,\n): ThreeDSBrowserStep | null => {\n const action = getThreeDSAction(nextAction);\n if (!action) return null;\n return {\n kind: action.three_ds.phase,\n protocolVersion: action.three_ds.version,\n form: buildThreeDSBrowserForm(action),\n completionEndpoint: action.three_ds.completion_endpoint,\n threeDSServerTransId: action.three_ds.three_ds_server_trans_id,\n };\n};\n\nexport const buildThreeDSMethodCompletion = (\n nextAction: PaymentNextAction,\n completionIndicator: \"Y\" | \"N\" | \"U\" = \"Y\",\n): { completion_indicator: \"Y\" | \"N\" | \"U\"; three_ds_server_trans_id: string } => {\n if (!isThreeDSMethodAction(nextAction) || !nextAction.three_ds.three_ds_server_trans_id) {\n throw new Error(\"nextAction must be a three_ds_method action with three_ds_server_trans_id\");\n }\n return {\n completion_indicator: completionIndicator,\n three_ds_server_trans_id: nextAction.three_ds.three_ds_server_trans_id,\n };\n};\n\nconst requireDocument = (explicitDocument?: Document): Document => {\n if (explicitDocument) return explicitDocument;\n if (typeof document === \"undefined\") {\n throw new Error(\"3DS browser helpers must be called in a browser environment\");\n }\n return document;\n};\n\nconst defaultSubmitter = (form: HTMLFormElement): void => {\n form.submit();\n};\n\nexport const mountThreeDSBrowserForm = (\n nextAction: PaymentNextAction,\n options: ThreeDSMountOptions = {},\n): MountedThreeDSForm => {\n const doc = requireDocument(options.document);\n const container = options.container ?? doc.body;\n const formDescriptor = buildThreeDSBrowserForm(nextAction);\n assertHTTPSActionURL(formDescriptor.action);\n const form = doc.createElement(\"form\");\n const target =\n formDescriptor.target === \"hidden_iframe\"\n ? `arcpay-three-ds-method-${crypto.randomUUID()}`\n : (options.challengeTarget ?? \"_self\");\n let iframe: HTMLIFrameElement | undefined;\n\n form.method = formDescriptor.method;\n form.action = formDescriptor.action;\n form.target = target;\n form.hidden = true;\n\n for (const field of formDescriptor.fields) {\n const input = doc.createElement(\"input\");\n input.type = \"hidden\";\n input.name = field.name;\n input.value = field.value;\n form.append(input);\n }\n\n if (formDescriptor.target === \"hidden_iframe\") {\n iframe = doc.createElement(\"iframe\");\n iframe.name = target;\n iframe.title = \"3-D Secure method\";\n iframe.hidden = true;\n container.append(iframe);\n }\n\n container.append(form);\n\n return {\n form,\n iframe,\n submit: () => (options.submitter ?? defaultSubmitter)(form),\n remove: () => {\n form.remove();\n iframe?.remove();\n },\n };\n};\n\nconst waitForMethodFrame = (\n mounted: MountedThreeDSForm,\n timeoutMs: number,\n signal?: AbortSignal,\n): Promise<\"loaded\" | \"timeout\"> =>\n new Promise((resolve, reject) => {\n if (!mounted.iframe) {\n resolve(\"loaded\");\n return;\n }\n if (signal?.aborted) {\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n return;\n }\n\n let settled = false;\n const cleanup = () => {\n mounted.iframe?.removeEventListener(\"load\", onLoad);\n signal?.removeEventListener(\"abort\", onAbort);\n clearTimeout(timer);\n };\n const settle = (result: \"loaded\" | \"timeout\") => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(result);\n };\n const onLoad = () => settle(\"loaded\");\n const onAbort = () => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n };\n const timer = setTimeout(() => settle(\"timeout\"), timeoutMs);\n\n mounted.iframe.addEventListener(\"load\", onLoad, { once: true });\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n\nexport const runThreeDSBrowserFlow = async (\n nextAction: PaymentNextAction | undefined,\n options: RunThreeDSBrowserFlowOptions,\n): Promise<ThreeDSBrowserFlowResult> => {\n if (!nextAction) return { status: \"no_action\" };\n\n if (isThreeDSChallengeAction(nextAction)) {\n const mounted = mountThreeDSBrowserForm(nextAction, options);\n mounted.submit();\n return { status: \"challenge_submitted\", action: nextAction, mounted };\n }\n\n if (!isThreeDSMethodAction(nextAction)) return { status: \"no_action\" };\n const completeThreeDSMethod = options.completeThreeDSMethod;\n if (!completeThreeDSMethod) {\n throw new Error(\"completeThreeDSMethod is required for 3DS Method actions\");\n }\n\n const mounted = mountThreeDSBrowserForm(nextAction, options);\n try {\n mounted.submit();\n const methodResult = await waitForMethodFrame(\n mounted,\n options.methodTimeoutMs ?? 10_000,\n options.signal,\n );\n const indicator = options.methodCompletionIndicator ?? (methodResult === \"loaded\" ? \"Y\" : \"N\");\n const response = await completeThreeDSMethod(\n buildThreeDSMethodCompletion(nextAction, indicator),\n nextAction,\n );\n const followUpAction = getThreeDSAction(response.next_action);\n if (followUpAction && isThreeDSChallengeAction(followUpAction)) {\n const challengeMounted = mountThreeDSBrowserForm(followUpAction, options);\n challengeMounted.submit();\n return {\n status: \"challenge_submitted\",\n action: followUpAction,\n response,\n mounted: challengeMounted,\n methodResult,\n };\n }\n return { status: \"method_completed\", response, methodResult };\n } finally {\n mounted.remove();\n }\n};\n\nconst htmlEscape = (value: string): string =>\n value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n\nexport const buildThreeDSAutoSubmitHtml = (nextAction: PaymentNextAction): string => {\n const form = buildThreeDSBrowserForm(nextAction);\n assertHTTPSActionURL(form.action);\n const target = form.target === \"hidden_iframe\" ? \"arcpay-three-ds-method\" : \"_self\";\n const inputs = form.fields\n .map(\n (field) =>\n `<input type=\"hidden\" name=\"${htmlEscape(field.name)}\" value=\"${htmlEscape(field.value)}\">`,\n )\n .join(\"\");\n const iframe =\n form.target === \"hidden_iframe\"\n ? '<iframe name=\"arcpay-three-ds-method\" title=\"3-D Secure method\" hidden></iframe>'\n : \"\";\n return `<!doctype html><html><head><meta charset=\"utf-8\"></head><body>${iframe}<form method=\"POST\" action=\"${htmlEscape(form.action)}\" target=\"${target}\">${inputs}</form><script>document.forms[0].submit();</script></body></html>`;\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thavguard/arc-pay",
3
- "version": "0.1.25",
3
+ "version": "0.1.27",
4
4
  "description": "Arc Pay browser SDK — publishable-key tokenization, Hosted Fields, and React bindings",
5
5
  "private": false,
6
6
  "license": "MIT",