@dpayglobal/dpay-node-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/LICENSE +201 -0
- package/README.md +245 -0
- package/dist/chunk-SPQCX4N4.js +121 -0
- package/dist/chunk-SPQCX4N4.js.map +1 -0
- package/dist/index.cjs +1863 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +876 -0
- package/dist/index.d.ts +876 -0
- package/dist/index.js +1709 -0
- package/dist/index.js.map +1 -0
- package/dist/testing.cjs +99 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +21 -0
- package/dist/testing.d.ts +21 -0
- package/dist/testing.js +54 -0
- package/dist/testing.js.map +1 -0
- package/dist/types-CGcSNriz.d.cts +48 -0
- package/dist/types-CGcSNriz.d.ts +48 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/php.ts","../src/errors.ts","../src/internal/base-urls.ts","../src/internal/operation.ts","../src/currency.ts","../src/money.ts","../src/payment/enums.ts","../src/payment/models.ts","../src/bank/models.ts","../src/bank/ops.ts","../src/bank/service.ts","../src/blik/enums.ts","../src/blik/models.ts","../src/blik/ops.ts","../src/blik/service.ts","../src/card/enums.ts","../src/card/models.ts","../src/internal/validation.ts","../src/payment/params.ts","../src/card/params.ts","../src/card/ops.ts","../src/card/service.ts","../src/config.ts","../src/http/types.ts","../src/http/fetch-client.ts","../src/version.ts","../src/internal/checksum.ts","../src/internal/error-mapper.ts","../src/internal/requestor.ts","../src/ipn/request.ts","../src/ipn/event.ts","../src/ipn/verifier.ts","../src/ipn/service.ts","../src/blik/params.ts","../src/card/recurring-params.ts","../src/payment/register-body.ts","../src/payment/ops.ts","../src/payment/service.ts","../src/payout/models.ts","../src/payout/ops.ts","../src/payout/service.ts","../src/refund/models.ts","../src/refund/ops.ts","../src/refund/service.ts","../src/client.ts","../src/card/card-data.ts","../src/card/encryptor.ts"],"names":["amount","createHash","timingSafeEqual","flag","inspect","createPublicKey","publicEncrypt","constants"],"mappings":"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","file":"index.cjs","sourcesContent":["const PRECISION = 14\nconst INTEGER_FAST_PATH_LIMIT = 10 ** PRECISION\n\nexport function isPhpInt(value: unknown): boolean {\n return typeof value === 'number' && Number.isInteger(value)\n}\n\nexport function isPhpBool(value: unknown): boolean {\n return typeof value === 'boolean'\n}\n\nexport function isScalar(value: unknown): boolean {\n const type = typeof value\n return type === 'number' || type === 'boolean' || type === 'string'\n}\n\nconst PHP_WHITESPACE = String.raw`[ \\t\\n\\r\\v\\f]`\nconst PHP_NUMBER_GRAMMAR = String.raw`(?:\\d+\\.\\d*|\\.\\d+|\\d+)(?:[eE][+-]?\\d+)?`\nconst PHP_NUMERIC_STRING = new RegExp(`^${PHP_WHITESPACE}*[+-]?${PHP_NUMBER_GRAMMAR}${PHP_WHITESPACE}*$`)\nconst PHP_LEADING_NUMBER = new RegExp(`^${PHP_WHITESPACE}*([+-]?${PHP_NUMBER_GRAMMAR})`)\n\nexport function isNumeric(value: unknown): boolean {\n if (typeof value === 'number') return true\n if (typeof value !== 'string') return false\n return PHP_NUMERIC_STRING.test(value)\n}\n\nexport function phpStrval(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (typeof value === 'boolean') return value ? '1' : ''\n if (typeof value === 'number') return numberToPhpString(value)\n if (typeof value === 'string') return value\n return String(value)\n}\n\nfunction numberToPhpString(value: number): string {\n if (Number.isNaN(value)) return 'NAN'\n if (value === Number.POSITIVE_INFINITY) return 'INF'\n if (value === Number.NEGATIVE_INFINITY) return '-INF'\n if (Object.is(value, -0)) return '-0'\n if (Number.isInteger(value) && Math.abs(value) < INTEGER_FAST_PATH_LIMIT) return String(value)\n return formatG(value)\n}\n\nfunction formatG(value: number): string {\n const exponent = Number(value.toExponential(PRECISION - 1).split('e')[1])\n if (exponent < -4 || exponent >= PRECISION) {\n const mantissa = stripTrailingZeros(value.toExponential(PRECISION - 1).split('e')[0] as string)\n const normalized = mantissa.includes('.') ? mantissa : `${mantissa}.0`\n return `${normalized}E${exponent < 0 ? '-' : '+'}${Math.abs(exponent)}`\n }\n return stripTrailingZeros(value.toFixed(Math.max(0, PRECISION - 1 - exponent)))\n}\n\nfunction stripTrailingZeros(text: string): string {\n if (!text.includes('.')) return text\n return text.replace(/\\.?0+$/, '')\n}\n\nexport function phpRound(value: number): number {\n return value >= 0 ? Math.floor(value + 0.5) : Math.ceil(value - 0.5)\n}\n\nfunction clampToSafeInt(value: number): number {\n if (!Number.isFinite(value)) return 0\n const truncated = Math.trunc(value)\n if (truncated > Number.MAX_SAFE_INTEGER) return Number.MAX_SAFE_INTEGER\n if (truncated < Number.MIN_SAFE_INTEGER) return Number.MIN_SAFE_INTEGER\n if (truncated === 0) return 0\n return truncated\n}\n\nexport function phpInt(value: unknown): number {\n if (value === null || value === undefined) return 0\n if (typeof value === 'boolean') return value ? 1 : 0\n if (typeof value === 'number') return clampToSafeInt(value)\n if (typeof value === 'string') return clampToSafeInt(leadingNumber(value))\n return 0\n}\n\nfunction leadingNumber(text: string): number {\n const match = PHP_LEADING_NUMBER.exec(text)\n return match === null ? 0 : Number(match[1] as string)\n}\n\nexport function phpJsonEncode(data: unknown, options?: { escapeSlashes?: boolean }): string {\n const encoded = JSON.stringify(data, (_key, value: unknown) => {\n if (typeof value === 'number' && !Number.isFinite(value)) {\n throw new TypeError('Value is not JSON encodable')\n }\n return value\n })\n if (encoded === undefined) throw new TypeError('Value is not JSON encodable')\n return options?.escapeSlashes === true ? encoded.replaceAll('/', '\\\\/') : encoded\n}\n","import { isScalar, phpJsonEncode, phpStrval } from './internal/php.js'\n\nexport type DPayErrorType =\n | 'value_error'\n | 'transport_error'\n | 'signature_verification_error'\n | 'card_encryption_error'\n | 'api_error'\n | 'authentication_error'\n | 'invalid_request_error'\n | 'access_denied_error'\n | 'not_found_error'\n | 'rate_limit_error'\n | 'card_payment_error'\n | 'payment_rejected_error'\n | 'api_server_error'\n\n/** Base class for every error thrown by this SDK. */\nexport class DPayError extends Error {\n /** Stable discriminator, usable in `switch` when `instanceof` is unreliable. */\n readonly type: DPayErrorType = 'value_error'\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options)\n this.name = new.target.name\n Error.captureStackTrace?.(this, new.target)\n }\n}\n\n/** Invalid argument passed to the SDK. Thrown before any network call. */\nexport class DPayValueError extends DPayError {\n override readonly type = 'value_error'\n}\n\n/** Network failure, timeout or abort. The payment status is unknown. */\nexport class TransportError extends DPayError {\n override readonly type = 'transport_error'\n}\n\n/** The IPN payload is malformed or its signature does not match. */\nexport class SignatureVerificationError extends DPayError {\n override readonly type = 'signature_verification_error'\n}\n\n/** Card data could not be encrypted with the public key from the API. */\nexport class CardEncryptionError extends DPayError {\n override readonly type = 'card_encryption_error'\n}\n\n/** The API answered, but rejected the request. */\nexport class ApiError extends DPayError {\n override readonly type: DPayErrorType = 'api_error'\n /** HTTP status of the response, or 200 for rejections carried in a success body. */\n readonly httpStatus: number\n /** Business error code from the API, when present. */\n readonly errorCode: string | null\n /** Per-field validation messages, normalized across the 400 and 422 formats. */\n readonly fieldErrors: Record<string, string[]>\n /** Unparsed response body. */\n readonly rawBody: string\n\n constructor(\n message: string,\n httpStatus: number,\n errorCode: string | null = null,\n fieldErrors: Record<string, string[]> = {},\n rawBody = '',\n ) {\n super(message)\n this.httpStatus = httpStatus\n this.errorCode = errorCode\n this.fieldErrors = fieldErrors\n this.rawBody = rawBody\n }\n}\n\n/** HTTP 401 - usually a wrong checksum. */\nexport class AuthenticationError extends ApiError {\n override readonly type = 'authentication_error'\n}\n\n/** HTTP 400 or 422 - see `fieldErrors`. */\nexport class InvalidRequestError extends ApiError {\n override readonly type = 'invalid_request_error'\n}\n\n/** HTTP 403. */\nexport class AccessDeniedError extends ApiError {\n override readonly type = 'access_denied_error'\n}\n\n/** HTTP 404. */\nexport class NotFoundError extends ApiError {\n override readonly type = 'not_found_error'\n}\n\n/** HTTP 5xx. */\nexport class ApiServerError extends ApiError {\n override readonly type = 'api_server_error'\n}\n\n/** HTTP 429. */\nexport class RateLimitError extends ApiError {\n override readonly type = 'rate_limit_error'\n /** Seconds from the `Retry-After` header. */\n readonly retryAfter: number | null\n /** Value of `X-RateLimit-Limit`. */\n readonly limit: number | null\n /** Value of `X-RateLimit-Remaining`. */\n readonly remaining: number | null\n\n constructor(\n message: string,\n httpStatus: number,\n retryAfter: number | null = null,\n limit: number | null = null,\n remaining: number | null = null,\n rawBody = '',\n ) {\n super(message, httpStatus, null, {}, rawBody)\n this.retryAfter = retryAfter\n this.limit = limit\n this.remaining = remaining\n }\n}\n\n/** Payment registration rejected with HTTP 200 and `error: true`. */\nexport class PaymentRejectedError extends ApiError {\n override readonly type = 'payment_rejected_error'\n /** Transaction identifier returned alongside the rejection, when present. */\n readonly transactionId: string | null\n\n constructor(\n message: string,\n httpStatus: number,\n errorCode: string | null = null,\n fieldErrors: Record<string, string[]> = {},\n rawBody = '',\n transactionId: string | null = null,\n ) {\n super(message, httpStatus, errorCode, fieldErrors, rawBody)\n this.transactionId = transactionId\n }\n\n static fromApi(data: Record<string, unknown>): PaymentRejectedError {\n const message = typeof data.msg === 'string' ? data.msg : 'Payment rejected'\n const additional = isRecord(data.additionalInfo) ? data.additionalInfo : {}\n const errorCode = typeof additional.error === 'string' ? additional.error : null\n const transactionId = isScalar(data.transactionId) ? phpStrval(data.transactionId) : null\n return new PaymentRejectedError(message, 200, errorCode, {}, phpJsonEncode(data), transactionId)\n }\n}\n\n/** Card payment rejected with HTTP 200 and `success != true`. */\nexport class CardPaymentError extends ApiError {\n override readonly type = 'card_payment_error'\n\n static fromApi(data: Record<string, unknown>): CardPaymentError {\n const message = typeof data.message === 'string' ? data.message : 'Card payment failed'\n return new CardPaymentError(message, 200, message, {}, phpJsonEncode(data))\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n","import { DPayValueError } from '../errors.js'\n\nexport type BaseUrlKey = 'apiPayments' | 'panel' | 'gateway'\n\nexport const API_PAYMENTS: BaseUrlKey = 'apiPayments'\nexport const PANEL: BaseUrlKey = 'panel'\nexport const GATEWAY: BaseUrlKey = 'gateway'\n\nexport const DEFAULT_BASE_URLS: Record<BaseUrlKey, string> = {\n apiPayments: 'https://api-payments.dpay.pl',\n panel: 'https://panel.dpay.pl',\n gateway: 'https://secure.dpay.pl',\n}\n\nexport class BaseUrls {\n private readonly urls: Record<string, string>\n\n constructor(overrides: Readonly<Record<string, string>> = {}) {\n for (const key of Object.keys(overrides)) {\n if (!Object.hasOwn(DEFAULT_BASE_URLS, key)) throw new DPayValueError(`Unknown base URL key \"${key}\"`)\n }\n this.urls = { ...DEFAULT_BASE_URLS }\n for (const [key, url] of Object.entries(overrides)) {\n this.urls[key] = url.replace(/\\/+$/, '')\n }\n }\n\n resolve(host: BaseUrlKey): string {\n const url = this.urls[host]\n if (!Object.hasOwn(this.urls, host) || url === undefined)\n throw new DPayValueError(`Unknown API host \"${host}\"`)\n return url\n }\n}\n","import { ApiServerError } from '../errors.js'\nimport type { ApiResponse } from '../http/types.js'\nimport type { BaseUrlKey } from './base-urls.js'\n\nexport interface Operation<T> {\n readonly method: 'GET' | 'POST'\n readonly host: BaseUrlKey\n readonly path: string\n readonly parse: (response: ApiResponse) => T\n readonly body?: Record<string, unknown>\n readonly raiseForStatus?: boolean\n}\n\nexport function decodeJsonOrFail(response: ApiResponse): unknown {\n const data = response.decodeJson()\n if (data === null) {\n throw new ApiServerError('Invalid JSON in API response', response.status, null, {}, response.body)\n }\n return data\n}\n\nexport function decodeRecordOrFail(response: ApiResponse): Record<string, unknown> {\n const data = decodeJsonOrFail(response)\n return typeof data === 'object' && data !== null && !Array.isArray(data)\n ? (data as Record<string, unknown>)\n : {}\n}\n\nexport function decodeArrayOrFail(response: ApiResponse): unknown[] {\n const data = decodeJsonOrFail(response)\n return Array.isArray(data) ? data : []\n}\n","import { DPayValueError } from './errors.js'\n\nconst PATTERN = /^[A-Z]{3}$/\n\n/** Currency codes used by dpay. Any ISO-4217 style code is accepted. */\nexport const Currency = { PLN: 'PLN', EUR: 'EUR', CZK: 'CZK' } as const\n\nexport type Currency = (typeof Currency)[keyof typeof Currency] | (string & {})\n\nexport function isValidCurrency(code: string): boolean {\n return PATTERN.test(code)\n}\n\nexport function assertCurrency(code: string): void {\n if (!isValidCurrency(code)) throw new DPayValueError(`Invalid currency code \"${code}\"`)\n}\n","import { Currency, assertCurrency, isValidCurrency } from './currency.js'\nimport { DPayValueError } from './errors.js'\nimport { phpRound } from './internal/php.js'\n\nconst DECIMAL = /^(-?)(\\d+)(?:\\.(\\d{1,2}))?$/\n\n/** A monetary amount held in minor units, never as a float. */\nexport class Money {\n /** Amount in minor units, for example 1050 for 10.50 PLN. */\n readonly minor: number\n /** Three-letter currency code. */\n readonly currency: string\n\n private constructor(minor: number, currency: string) {\n if (!Number.isSafeInteger(minor)) {\n throw new DPayValueError('Money amount must be a safe integer number of minor units')\n }\n this.minor = minor\n this.currency = currency\n Object.freeze(this)\n }\n\n /** Amount in Polish grosz, for example `Money.pln(1050)` is 10.50 PLN. */\n static pln(minor: number): Money {\n return new Money(minor, Currency.PLN)\n }\n\n /** Amount in minor units of an arbitrary currency. */\n static of(minor: number, currency: string): Money {\n assertCurrency(currency)\n return new Money(minor, currency)\n }\n\n /** Parses a decimal string with at most two fraction digits. */\n static fromDecimal(decimal: string, currency: string): Money {\n assertCurrency(currency)\n const parsed = parseDecimal(decimal)\n if (parsed === null) throw new DPayValueError(`Invalid money amount \"${decimal}\"`)\n return new Money(parsed, currency)\n }\n\n /** Parses whatever shape the API used for this field. Throws on anything unparsable. */\n static fromApiNumber(value: unknown, currency: string): Money {\n const money = Money.tryFromApiNumber(value, currency)\n if (money === null) throw new DPayValueError('Money value must be a number or a decimal string')\n return money\n }\n\n /** Same as `fromApiNumber`, but returns null instead of throwing. */\n static tryFromApiNumber(value: unknown, currency: string): Money | null {\n if (!isValidCurrency(currency)) return null\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) return null\n const minor = phpRound(value * 100)\n return Number.isSafeInteger(minor) ? new Money(minor, currency) : null\n }\n if (typeof value === 'string') {\n const parsed = parseDecimal(value)\n if (parsed === null || !Number.isSafeInteger(parsed)) return null\n return new Money(parsed, currency)\n }\n return null\n }\n\n /** Renders the amount as a decimal string with exactly two fraction digits. */\n toDecimal(): string {\n const absolute = Math.abs(this.minor)\n const sign = this.minor < 0 ? '-' : ''\n const fraction = String(absolute % 100).padStart(2, '0')\n return `${sign}${Math.floor(absolute / 100)}.${fraction}`\n }\n\n get isNegative(): boolean {\n return this.minor < 0\n }\n\n equals(other: Money): boolean {\n return this.minor === other.minor && this.currency === other.currency\n }\n\n toString(): string {\n return `${this.toDecimal()} ${this.currency}`\n }\n\n toJSON(): { minor: number; currency: string } {\n return { minor: this.minor, currency: this.currency }\n }\n}\n\nfunction parseDecimal(decimal: string): number | null {\n const match = DECIMAL.exec(decimal)\n if (match === null) return null\n const fraction = (match[3] ?? '').padEnd(2, '0')\n const minor = Number(match[2]) * 100 + Number(fraction)\n return match[1] === '-' ? -minor : minor\n}\n","import { DPayValueError } from '../errors.js'\n\n/** Payment flow requested at registration time. */\nexport const TransactionType = {\n TRANSFERS: 'transfers',\n DCB_GATEWAY: 'dcb_gateway',\n CARD_AUTH: 'card_auth',\n MB_WAY_DIRECT: 'mb_way_direct',\n BIZUM_DIRECT: 'bizum_direct',\n BLIK_RECURRING: 'blik_recurring',\n CARD_RECURRING: 'card_recurring',\n} as const\n\nexport type TransactionType = (typeof TransactionType)[keyof typeof TransactionType]\n\n/** Validates that the value is a known transaction type, throws DPayValueError otherwise. */\nexport function assertTransactionType(value: string): void {\n if (!Object.values(TransactionType).includes(value as TransactionType)) {\n throw new DPayValueError(`Invalid transaction type \"${value}\"`)\n }\n}\n\n/** Lifecycle state of a transaction. The API may return values outside this list. */\nexport const TransactionStatus = {\n PAID: 'paid',\n CREATED: 'created',\n PROCESSING: 'processing',\n EXPIRED: 'expired',\n CAPTURED: 'captured',\n} as const\n\nexport type TransactionStatus = (typeof TransactionStatus)[keyof typeof TransactionStatus]\n\n/** Who absorbs the payout fee. */\nexport const PayoutFeeMode = { NET: 'net', GROSS: 'gross' } as const\n\nexport type PayoutFeeMode = (typeof PayoutFeeMode)[keyof typeof PayoutFeeMode]\n\n/** Validates that the value is a known payout fee mode, throws DPayValueError otherwise. */\nexport function assertPayoutFeeMode(value: string): void {\n if (!Object.values(PayoutFeeMode).includes(value as PayoutFeeMode)) {\n throw new DPayValueError(`Invalid payout fee mode \"${value}\"`)\n }\n}\n","import { Currency } from '../currency.js'\nimport { isScalar, phpStrval } from '../internal/php.js'\nimport { Money } from '../money.js'\nimport { TransactionStatus } from './enums.js'\n\nconst HTTP_URL = /^https?:\\/\\//\n\n/** Result of a successful payment registration. */\nexport interface RegisteredPayment {\n readonly transactionId: string\n /** Raw `msg` field. Carries either a URL or a status sentence. */\n readonly message: string\n /** KSeF invoice identifier, when e-invoicing was requested. */\n readonly ipksef: string | null\n /** Where to send the payer, or null when there is nothing to redirect to. */\n readonly redirectUrl: string | null\n /** True when the payment was already settled inline. */\n readonly isPaid: boolean\n /** True when dpay is processing the payment without a payer redirect. */\n readonly isInternalProcessing: boolean\n /** Alias returned when a card mandate was registered. */\n readonly cardRecurringAlias: string | null\n readonly raw: Record<string, unknown>\n}\n\n/** A single refund attached to a transaction. */\nexport interface TransactionRefund {\n readonly paymentId: string\n readonly value: Money\n readonly status: TransactionStatus | (string & {})\n readonly creationDate: string | null\n readonly paymentDate: string | null\n readonly raw: Record<string, unknown>\n}\n\n/** Full transaction state from `pbl/details`. */\nexport interface Transaction {\n readonly id: string\n readonly value: Money\n readonly status: TransactionStatus | (string & {})\n readonly paymentMethod: string | null\n readonly creationDate: string | null\n readonly paymentDate: string | null\n readonly isPaid: boolean\n readonly isSettled: boolean\n readonly isRefunded: boolean\n readonly refundedAmount: Money\n readonly availableRefundAmount: Money\n readonly isFullyRefunded: boolean\n readonly isDirect: boolean\n readonly gatewayId: string | null\n readonly payer: Record<string, unknown>\n readonly refunds: readonly TransactionRefund[]\n readonly raw: Record<string, unknown>\n}\n\n/**\n * Builds a frozen `RegisteredPayment` from the raw JSON body of `payments/register`.\n *\n * Reproduces the API's quirks verbatim: `redirectUrl` is set only when `msg` is itself an\n * `http(s)://` URL, and `isPaid` / `isInternalProcessing` are literal string comparisons\n * against the two known status sentences, not a general status parse.\n */\nexport function parseRegisteredPayment(data: Record<string, unknown>): RegisteredPayment {\n const message = scalarString(data, 'msg')\n const additional = record(data.additionalInfo)\n return Object.freeze({\n transactionId: scalarString(data, 'transactionId'),\n message,\n ipksef: strictString(data, 'ipksef'),\n redirectUrl: HTTP_URL.test(message) ? message : null,\n isPaid: message === 'Transaction paid',\n isInternalProcessing: message === 'Internal processing',\n cardRecurringAlias: additional === null ? null : strictString(additional, 'card_recurring_alias'),\n raw: data,\n })\n}\n\n/**\n * Builds a frozen `Transaction` (with frozen nested refunds) from the raw JSON body of\n * `pbl/details`. Amounts that cannot be parsed fall back to `Money.pln(0)` instead of\n * throwing, and an unrecognised `status` is kept as-is rather than rejected.\n */\nexport function parseTransaction(data: Record<string, unknown>): Transaction {\n const inner = record(data.transaction) ?? {}\n const status = scalarString(inner, 'status')\n const refunds = Array.isArray(data.refunds) ? data.refunds : []\n return Object.freeze({\n id: scalarString(inner, 'id'),\n value: moneyOrZero(inner, 'value'),\n status,\n paymentMethod: scalarStringOrNull(inner, 'payment_method'),\n creationDate: scalarStringOrNull(inner, 'creation_date'),\n paymentDate: strictString(inner, 'payment_date'),\n isPaid: status === TransactionStatus.PAID || status === TransactionStatus.CAPTURED,\n isSettled: Boolean(inner.settled),\n isRefunded: Boolean(inner.refunded),\n refundedAmount: moneyOrZero(inner, 'refunded_amount'),\n availableRefundAmount: moneyOrZero(inner, 'available_refund_amount'),\n isFullyRefunded: Boolean(inner.fully_refunded),\n isDirect: Boolean(inner.direct),\n gatewayId: strictString(inner, 'gateway_id'),\n payer: record(data.payer) ?? {},\n refunds: Object.freeze(\n refunds\n .filter((item): item is Record<string, unknown> => record(item) !== null)\n .map(parseTransactionRefund),\n ),\n raw: data,\n })\n}\n\nfunction parseTransactionRefund(data: Record<string, unknown>): TransactionRefund {\n const status = scalarStringOrNull(data, 'status')\n return Object.freeze({\n paymentId: scalarString(data, 'payment_id'),\n value: moneyOrZero(data, 'value'),\n status: status ?? TransactionStatus.PAID,\n creationDate: scalarStringOrNull(data, 'creation_date'),\n paymentDate: scalarStringOrNull(data, 'payment_date'),\n raw: data,\n })\n}\n\n/**\n * Reads `data[key]` as a string when it is a scalar (string, number or boolean), applying\n * PHP's string-cast rules. Returns the empty string for anything else, including missing\n * keys, `null`, arrays and objects. Shared across every response model in the SDK.\n */\nexport function scalarString(data: Record<string, unknown>, key: string): string {\n const value = data[key]\n return isScalar(value) ? phpStrval(value) : ''\n}\n\n/**\n * Same as {@link scalarString}, but returns `null` instead of the empty string when the\n * value is missing or not a scalar, so \"absent\" can be told apart from \"empty\".\n */\nexport function scalarStringOrNull(data: Record<string, unknown>, key: string): string | null {\n const value = data[key]\n return isScalar(value) ? phpStrval(value) : null\n}\n\n/**\n * Reads `data[key]` only when it is already a `string`, returning `null` otherwise. Unlike\n * {@link scalarString} and {@link scalarStringOrNull}, this never coerces numbers or\n * booleans, matching the fields the PHP SDK never stringifies.\n */\nexport function strictString(data: Record<string, unknown>, key: string): string | null {\n const value = data[key]\n return typeof value === 'string' ? value : null\n}\n\n/**\n * Narrows `value` to `Record<string, unknown>` when it is a plain object (not an array,\n * not `null`), returning `null` otherwise. Shared guard for decoding nested API payloads\n * that are not guaranteed to be objects.\n */\nexport function record(value: unknown): Record<string, unknown> | null {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\n/**\n * Parses `data[key]` as a PLN amount, the only currency the response models carry (the\n * API payloads behind these models have no currency field). Returns `Money.pln(0)` when\n * the key is missing or the value cannot be parsed, instead of throwing.\n */\nexport function moneyOrZero(data: Record<string, unknown>, key: string): Money {\n return Money.tryFromApiNumber(data[key] ?? 0, Currency.PLN) ?? Money.pln(0)\n}\n","import { isScalar, phpInt } from '../internal/php.js'\nimport { scalarString, strictString } from '../payment/models.js'\n\n/** A bank offered on the transfer payment page. */\nexport interface Bank {\n readonly id: string\n readonly name: string\n /** Logo file name, when the API provides one. */\n readonly image: string | null\n /** First hour of the day the bank accepts transfers. */\n readonly onFrom: number\n /** Last hour of the day the bank accepts transfers. */\n readonly onTo: number\n readonly iterator: number | null\n readonly isTest: boolean\n readonly type: string | null\n readonly raw: Record<string, unknown>\n}\n\n/** Builds a frozen `Bank` from a single element of the `pbl/banks` response. */\nexport function parseBank(data: Record<string, unknown>): Bank {\n return Object.freeze({\n id: scalarString(data, 'id'),\n name: scalarString(data, 'name'),\n image: strictString(data, 'image'),\n onFrom: isScalar(data.on_from) ? phpInt(data.on_from) : 0,\n onTo: isScalar(data.on_to) ? phpInt(data.on_to) : 0,\n iterator: isScalar(data.iterator) ? phpInt(data.iterator) : null,\n isTest: isScalar(data.test) ? phpBool(data.test) : false,\n type: strictString(data, 'type'),\n raw: data,\n })\n}\n\nfunction phpBool(value: unknown): boolean {\n if (typeof value === 'string') return value !== '' && value !== '0'\n return Boolean(value)\n}\n","import type { ApiResponse } from '../http/types.js'\nimport { PANEL } from '../internal/base-urls.js'\nimport type { ChecksumCalculator } from '../internal/checksum.js'\nimport { type Operation, decodeJsonOrFail } from '../internal/operation.js'\nimport { type Bank, parseBank } from './models.js'\n\nexport function allBanksOperation(): Operation<Bank[]> {\n return { method: 'GET', host: PANEL, path: '/api/v1/pbl/banks', parse: parseBanks }\n}\n\nexport function forServiceOperation(\n service: string,\n checksum: ChecksumCalculator,\n timestamp?: number,\n): Operation<Bank[]> {\n const body: Record<string, unknown> = {\n service,\n timestamp: timestamp ?? Math.floor(Date.now() / 1000),\n }\n body.checksum = checksum.orderedBody(Object.values(body))\n return { method: 'POST', host: PANEL, path: '/api/v1/pbl/banks', body, parse: parseBanks }\n}\n\nfunction parseBanks(response: ApiResponse): Bank[] {\n const data = decodeJsonOrFail(response)\n const items = Array.isArray(data) ? data : Object.values(data as Record<string, unknown>)\n return items\n .filter(\n (item): item is Record<string, unknown> =>\n typeof item === 'object' && item !== null && !Array.isArray(item),\n )\n .map(parseBank)\n}\n","import type { RequestOptions } from '../config.js'\nimport type { ApiRequestor } from '../internal/requestor.js'\nimport type { Bank } from './models.js'\nimport { allBanksOperation, forServiceOperation } from './ops.js'\n\n/** Lists the banks dpay supports for transfer payments. */\nexport class BankService {\n private readonly api: ApiRequestor\n\n constructor(api: ApiRequestor) {\n this.api = api\n }\n\n /** Every bank dpay supports. */\n async all(options?: RequestOptions): Promise<Bank[]> {\n return this.api.execute(allBanksOperation(), options)\n }\n\n /** Banks enabled for this payment point. Defaults `timestamp` to the current clock. */\n async forService(params?: { timestamp?: number }, options?: RequestOptions): Promise<Bank[]> {\n return this.api.execute(\n forServiceOperation(this.api.service, this.api.checksum, params?.timestamp),\n options,\n )\n }\n}\n","import { DPayValueError } from '../errors.js'\n\n/** BLIK alias namespace. */\nexport const BlikAliasType = { UID: 'UID', PAYID: 'PAYID' } as const\n\nexport type BlikAliasType = (typeof BlikAliasType)[keyof typeof BlikAliasType]\n\n/** Validates that the value is a known BLIK alias type, throws DPayValueError otherwise. */\nexport function assertBlikAliasType(value: string): void {\n if (!Object.values(BlikAliasType).includes(value as BlikAliasType)) {\n throw new DPayValueError(`Invalid BLIK alias type \"${value}\"`)\n }\n}\n","import { isPhpBool, isPhpInt, isScalar, phpStrval } from '../internal/php.js'\nimport { record, strictString } from '../payment/models.js'\nimport { BlikAliasType } from './enums.js'\n\n/** A banking app that accepted the alias. */\nexport interface BlikApp {\n readonly key: string | null\n readonly label: string | null\n}\n\n/** A registered BLIK alias. */\nexport interface BlikAlias {\n readonly aliasValue: string\n readonly aliasType: BlikAliasType | (string & {})\n readonly status: string | null\n readonly expirationDate: string | null\n readonly apps: readonly BlikApp[]\n readonly isActive: boolean\n readonly raw: Record<string, unknown>\n}\n\n/** Mandate parameters attached to a recurring alias. */\nexport interface BlikRecurringRegistrationInfo {\n readonly model: string | null\n readonly frequency: string | null\n /** Single charge limit in minor units. */\n readonly limitAmt: number | null\n /** Total limit in minor units. */\n readonly totLimitAmt: number | null\n readonly isLimitAmtFixed: boolean | null\n readonly initDate: string | null\n readonly label: string | null\n readonly registeredAt: string | null\n readonly raw: Record<string, unknown>\n}\n\n/** State of a recurring BLIK mandate. */\nexport interface BlikRecurringStatus {\n readonly aliasValue: string\n readonly aliasType: BlikAliasType | (string & {})\n readonly status: string | null\n readonly expirationDate: string | null\n readonly registration: BlikRecurringRegistrationInfo | null\n readonly isActive: boolean\n readonly raw: Record<string, unknown>\n}\n\n/** Builds a frozen `BlikAlias` from the unwrapped `data` object of `blik/aliases`. */\nexport function parseBlikAlias(data: Record<string, unknown>): BlikAlias {\n const status = strictString(data, 'status')\n const apps = Array.isArray(data.apps) ? data.apps : []\n return Object.freeze({\n aliasValue: scalarStringOr(data, 'alias_value', ''),\n aliasType: scalarStringOr(data, 'alias_type', BlikAliasType.UID),\n status,\n expirationDate: strictString(data, 'expiration_date'),\n apps: Object.freeze(\n apps\n .filter((app): app is Record<string, unknown> => record(app) !== null)\n .map((app) => Object.freeze({ key: strictString(app, 'key'), label: strictString(app, 'label') })),\n ),\n isActive: status === 'ACTIVE',\n raw: data,\n })\n}\n\n/** Builds a frozen `BlikRecurringStatus` from the unwrapped `data` object of `blik/recurring/status`. */\nexport function parseBlikRecurringStatus(data: Record<string, unknown>): BlikRecurringStatus {\n const status = strictString(data, 'status')\n const registration = record(data.registration)\n return Object.freeze({\n aliasValue: scalarStringOr(data, 'alias_value', ''),\n aliasType: scalarStringOr(data, 'alias_type', BlikAliasType.PAYID),\n status,\n expirationDate: strictString(data, 'expiration_date'),\n registration: registration === null ? null : parseRegistrationInfo(registration),\n isActive: status === 'ACTIVE',\n raw: data,\n })\n}\n\nfunction parseRegistrationInfo(data: Record<string, unknown>): BlikRecurringRegistrationInfo {\n return Object.freeze({\n model: strictString(data, 'model'),\n frequency: strictString(data, 'frequency'),\n limitAmt: isPhpInt(data.limit_amt) ? (data.limit_amt as number) : null,\n totLimitAmt: isPhpInt(data.tot_limit_amt) ? (data.tot_limit_amt as number) : null,\n isLimitAmtFixed: isPhpBool(data.is_limit_amt_fixed) ? (data.is_limit_amt_fixed as boolean) : null,\n initDate: strictString(data, 'init_date'),\n label: strictString(data, 'label'),\n registeredAt: strictString(data, 'registered_at'),\n raw: data,\n })\n}\n\nfunction scalarStringOr(data: Record<string, unknown>, key: string, fallback: string): string {\n const value = data[key]\n return isScalar(value) ? phpStrval(value) : fallback\n}\n","import type { ApiResponse } from '../http/types.js'\nimport { API_PAYMENTS } from '../internal/base-urls.js'\nimport type { ChecksumCalculator } from '../internal/checksum.js'\nimport { type Operation, decodeRecordOrFail } from '../internal/operation.js'\nimport { record } from '../payment/models.js'\nimport { type BlikAliasType, assertBlikAliasType } from './enums.js'\nimport {\n type BlikAlias,\n type BlikRecurringStatus,\n parseBlikAlias,\n parseBlikRecurringStatus,\n} from './models.js'\n\nexport interface BlikAliasParams {\n aliasValue: string\n aliasType?: BlikAliasType | (string & {})\n}\n\nexport interface BlikUnregisterAliasParams extends BlikAliasParams {\n reason?: string\n}\n\nfunction aliasBody(service: string, params: BlikAliasParams): Record<string, unknown> {\n const aliasType = params.aliasType ?? 'UID'\n assertBlikAliasType(aliasType)\n return { service, alias_value: params.aliasValue, alias_type: aliasType }\n}\n\nfunction envelope(response: ApiResponse): Record<string, unknown> {\n return record(decodeRecordOrFail(response).data) ?? {}\n}\n\nexport function aliasOperation(\n service: string,\n checksum: ChecksumCalculator,\n params: BlikAliasParams,\n): Operation<BlikAlias> {\n const body = aliasBody(service, params)\n body.checksum = checksum.secretSecond(service, [params.aliasValue])\n return {\n method: 'POST',\n host: API_PAYMENTS,\n path: '/api/v1_0/payments/blik/aliases',\n body,\n parse: (response) => parseBlikAlias(envelope(response)),\n }\n}\n\nexport function unregisterAliasOperation(\n service: string,\n checksum: ChecksumCalculator,\n params: BlikUnregisterAliasParams,\n): Operation<void> {\n const body = aliasBody(service, params)\n if (params.reason !== undefined) body.reason = params.reason\n body.checksum = checksum.secretSecond(service, [params.aliasValue])\n return {\n method: 'POST',\n host: API_PAYMENTS,\n path: '/api/v1_0/payments/blik/aliases/unregister',\n body,\n parse: (response) => {\n decodeRecordOrFail(response)\n },\n }\n}\n\nexport function recurringStatusOperation(\n service: string,\n checksum: ChecksumCalculator,\n params: { aliasValue: string },\n): Operation<BlikRecurringStatus> {\n const body: Record<string, unknown> = { service, alias_value: params.aliasValue }\n body.checksum = checksum.secretSecond(service, [params.aliasValue])\n return {\n method: 'POST',\n host: API_PAYMENTS,\n path: '/api/v1_0/payments/blik/recurring/status',\n body,\n parse: (response) => parseBlikRecurringStatus(envelope(response)),\n }\n}\n","import type { RequestOptions } from '../config.js'\nimport type { ApiRequestor } from '../internal/requestor.js'\nimport type { BlikAlias, BlikRecurringStatus } from './models.js'\nimport {\n type BlikAliasParams,\n type BlikUnregisterAliasParams,\n aliasOperation,\n recurringStatusOperation,\n unregisterAliasOperation,\n} from './ops.js'\n\n/** Registers, reads and unregisters BLIK aliases, and reads recurring mandate status. */\nexport class BlikService {\n private readonly api: ApiRequestor\n\n constructor(api: ApiRequestor) {\n this.api = api\n }\n\n /** Registers a BLIK alias so the payer can pay without a code next time. */\n async alias(params: BlikAliasParams, options?: RequestOptions): Promise<BlikAlias> {\n return this.api.execute(aliasOperation(this.api.service, this.api.checksum, params), options)\n }\n\n /** Removes a BLIK alias. */\n async unregisterAlias(params: BlikUnregisterAliasParams, options?: RequestOptions): Promise<void> {\n return this.api.execute(unregisterAliasOperation(this.api.service, this.api.checksum, params), options)\n }\n\n /** Reads the state of a recurring BLIK mandate. */\n async recurringStatus(\n params: { aliasValue: string },\n options?: RequestOptions,\n ): Promise<BlikRecurringStatus> {\n return this.api.execute(recurringStatusOperation(this.api.service, this.api.checksum, params), options)\n }\n}\n","import { DPayValueError } from '../errors.js'\n\n/** What the merchant must do next after a card operation. */\nexport const RedirectType = {\n SUCCESS: 'SUCCESS',\n FORM: 'FORM',\n URL: 'URL',\n DCC_OFFER: 'DCC_OFFER',\n} as const\n\nexport type RedirectType = (typeof RedirectType)[keyof typeof RedirectType]\n\n/** Payer's answer to a dynamic currency conversion offer. */\nexport const DccDecision = { ACCEPT: 'accept', REJECT: 'reject' } as const\n\nexport type DccDecision = (typeof DccDecision)[keyof typeof DccDecision]\n\n/** Validates that the value is a known DCC decision, throws DPayValueError otherwise. */\nexport function assertDccDecision(value: string): void {\n if (!Object.values(DccDecision).includes(value as DccDecision)) {\n throw new DPayValueError(`Invalid DCC decision \"${value}\"`)\n }\n}\n\n/** Card-on-file operation requested at registration time. */\nexport const CardRecurringOperation = {\n ADD_CARD: 'add_card',\n COF_INITIAL: 'cof_initial',\n CHARGE: 'charge',\n} as const\n\nexport type CardRecurringOperation = (typeof CardRecurringOperation)[keyof typeof CardRecurringOperation]\n\n/** Validates that the value is a known card recurring operation, throws DPayValueError otherwise. */\nexport function assertCardRecurringOperation(value: string): void {\n if (!Object.values(CardRecurringOperation).includes(value as CardRecurringOperation)) {\n throw new DPayValueError(`Invalid card recurring operation \"${value}\"`)\n }\n}\n\n/** Charge cadence of a card mandate. */\nexport const CardRecurringFrequency = {\n DAILY: 'DAILY',\n WEEKLY: 'WEEKLY',\n BIWEEKLY: 'BIWEEKLY',\n MONTHLY: 'MONTHLY',\n QUARTERLY: 'QUARTERLY',\n SEMIANNUAL: 'SEMIANNUAL',\n ANNUAL: 'ANNUAL',\n} as const\n\nexport type CardRecurringFrequency = (typeof CardRecurringFrequency)[keyof typeof CardRecurringFrequency]\n\n/** Validates that the value is a known card recurring frequency, throws DPayValueError otherwise. */\nexport function assertCardRecurringFrequency(value: string): void {\n if (!Object.values(CardRecurringFrequency).includes(value as CardRecurringFrequency)) {\n throw new DPayValueError(`Invalid card recurring frequency \"${value}\"`)\n }\n}\n","import { Currency } from '../currency.js'\nimport { isNumeric } from '../internal/php.js'\nimport { Money } from '../money.js'\nimport { record, scalarString, strictString } from '../payment/models.js'\nimport { RedirectType } from './enums.js'\n\n/** One markup component of a DCC offer. */\nexport interface DccMarkup {\n readonly rate: number\n readonly additionalInfo: string | null\n}\n\n/** Dynamic currency conversion offer the payer must accept or reject. */\nexport interface DccOffer {\n readonly currencyConversionId: string\n readonly originalAmount: Money\n readonly convertedAmount: Money\n readonly exchangeRate: number\n readonly validUntil: string\n /** PSD2 declaration text that must be shown to the payer verbatim. */\n readonly declarationText: string\n readonly isEuropeanEconomicArea: boolean\n readonly markup: readonly DccMarkup[]\n readonly raw: Record<string, unknown>\n}\n\n/** Outcome of a card operation. */\nexport interface CardPaymentResult {\n readonly redirectType: RedirectType | (string & {}) | null\n readonly redirectText: string | null\n readonly isSuccess: boolean\n readonly requiresThreeDsForm: boolean\n readonly requiresRedirect: boolean\n readonly hasDccOffer: boolean\n /** Decoded 3-D Secure form to render, when `requiresThreeDsForm`. */\n readonly threeDsFormHtml: string | null\n /** Decoded URL to send the payer to, when `requiresRedirect`. */\n readonly redirectUrl: string | null\n readonly dccOffer: DccOffer | null\n readonly raw: Record<string, unknown>\n}\n\n/**\n * Builds a frozen `CardPaymentResult` from the raw JSON body of a card operation.\n *\n * Decodes `message.redirectType` into the `isSuccess` / `requiresThreeDsForm` /\n * `requiresRedirect` / `hasDccOffer` flags, and base64-decodes `message.redirectText` into\n * `threeDsFormHtml` only when the type is `FORM` and into `redirectUrl` only when it is\n * `URL`, returning `null` instead of throwing when the text is not valid base64.\n */\nexport function parseCardPaymentResult(data: Record<string, unknown>): CardPaymentResult {\n const message = record(data.message) ?? {}\n const redirectType = strictString(message, 'redirectType')\n const redirectTextRaw = strictString(message, 'redirectText')\n const redirectText = redirectTextRaw === null || redirectTextRaw === '' ? null : redirectTextRaw\n const offer = record(message.dccOffer)\n const requiresThreeDsForm = redirectType === RedirectType.FORM\n const requiresRedirect = redirectType === RedirectType.URL\n\n return Object.freeze({\n redirectType,\n redirectText,\n isSuccess: redirectType === RedirectType.SUCCESS,\n requiresThreeDsForm,\n requiresRedirect,\n hasDccOffer: redirectType === RedirectType.DCC_OFFER,\n threeDsFormHtml: requiresThreeDsForm && redirectText !== null ? decodeBase64(redirectText) : null,\n redirectUrl: requiresRedirect && redirectText !== null ? decodeBase64(redirectText) : null,\n dccOffer: offer === null ? null : parseDccOffer(offer),\n raw: data,\n })\n}\n\nfunction parseDccOffer(data: Record<string, unknown>): DccOffer {\n const markup = Array.isArray(data.markup) ? data.markup : []\n return Object.freeze({\n currencyConversionId: scalarString(data, 'currencyConversionId'),\n originalAmount: amount(data, 'originalAmount', 'originalCurrency'),\n convertedAmount: amount(data, 'convertedAmount', 'convertedCurrency'),\n exchangeRate: floatOrZero(data, 'exchangeRate'),\n validUntil: scalarString(data, 'validUntil'),\n declarationText: scalarString(data, 'declarationText'),\n isEuropeanEconomicArea: Boolean(data.europeanEconomicArea),\n markup: Object.freeze(\n markup\n .filter((item): item is Record<string, unknown> => record(item) !== null)\n .map((item) =>\n Object.freeze({\n rate: floatOrZero(item, 'rate'),\n additionalInfo: strictString(item, 'additionalInfo'),\n }),\n ),\n ),\n raw: data,\n })\n}\n\nfunction amount(data: Record<string, unknown>, amountKey: string, currencyKey: string): Money {\n const currency = data[currencyKey]\n return (\n Money.tryFromApiNumber(data[amountKey] ?? 0, typeof currency === 'string' ? currency : Currency.PLN) ??\n Money.pln(0)\n )\n}\n\nfunction floatOrZero(data: Record<string, unknown>, key: string): number {\n const value = data[key] ?? 0\n return isNumeric(value) ? Number(value) : 0\n}\n\nfunction decodeBase64(text: string): string | null {\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(text) || text.length % 4 !== 0) return null\n return Buffer.from(text, 'base64').toString('utf8')\n}\n","import { DPayValueError } from '../errors.js'\n\nconst EMAIL = /^[^@\\s]+@[^@\\s.]+(\\.[^@\\s.]+)+$/\nconst DATE = /^\\d{4}-\\d{2}-\\d{2}$/\n\nexport function isValidUrl(url: string): boolean {\n if (url === '') return false\n for (const char of url) {\n const code = char.charCodeAt(0)\n if (code <= 0x20 || code === 0x7f) return false\n }\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n return false\n }\n return parsed.protocol !== '' && parsed.host !== ''\n}\n\nexport function isValidEmail(email: string): boolean {\n return EMAIL.test(email)\n}\n\nexport function isValidDate(date: string): boolean {\n return DATE.test(date)\n}\n\nexport function assertDate(date: string): string {\n if (!isValidDate(date)) throw new DPayValueError(`Date \"${date}\" must be in YYYY-MM-DD format`)\n return date\n}\n","import { DPayValueError } from '../errors.js'\nimport { isValidDate } from '../internal/validation.js'\nimport type { Money } from '../money.js'\nimport { PayoutFeeMode, assertPayoutFeeMode } from './enums.js'\n\n/** Where dpay sends the payer back, and where it posts the IPN. */\nexport interface ReturnUrls {\n /** Payer returns here after a successful payment. */\n success: string\n /** Payer returns here after a failed payment. */\n fail: string\n /** dpay posts the IPN here. Must be reachable from the internet. */\n ipn: string\n}\n\n/** Optional payer identity, prefilled on the payment page. */\nexport interface PayerParams {\n email?: string\n firstName?: string\n lastName?: string\n}\n\n/** 3-D Secure device fingerprint, required for card payments. */\nexport interface DeviceInfoParams {\n browserAcceptHeader: string\n browserLanguage: string\n browserColorDepth: number\n browserScreenHeight: number\n browserScreenWidth: number\n /** Timezone offset in minutes, as reported by `Date.prototype.getTimezoneOffset`. */\n browserTz: number\n browserUserAgent: string\n systemFamily: string\n geoLocalization: string\n /** 1 to 64 characters. */\n deviceId: string\n /** 1 to 64 characters. */\n applicationName: string\n browserJavaEnabled?: boolean | undefined\n}\n\n/** KSeF invoice details, only valid together with `efaktura`. */\nexport interface InvoiceParams {\n payerNip?: string\n payerName?: string\n invoiceNumber?: string\n /** YYYY-MM-DD. */\n paymentDueDate?: string\n vatAmount?: Money\n}\n\n/** One leg of a 1:1 payout attached to a payment. */\nexport interface PayoutPositionParams {\n iban: string\n /** 1 to 255 characters. */\n title: string\n amount: Money\n}\n\n/** Payout instruction attached to a payment. */\nexport interface PayoutInstructionParams {\n positions: readonly PayoutPositionParams[]\n /** Defaults to `net`. */\n feeMode?: PayoutFeeMode | (string & {})\n}\n\n/** Builds the wire-format device_info object, validating deviceId and applicationName are 1-64 characters. Throws DPayValueError if length bounds are violated. */\nexport function serializeDeviceInfo(info: DeviceInfoParams): Record<string, unknown> {\n if (info.deviceId === '' || info.deviceId.length > 64) {\n throw new DPayValueError('Device ID must be 1-64 characters')\n }\n if (info.applicationName === '' || info.applicationName.length > 64) {\n throw new DPayValueError('Application name must be 1-64 characters')\n }\n const data: Record<string, unknown> = {\n browserAcceptHeader: info.browserAcceptHeader,\n browserLanguage: info.browserLanguage,\n browserColorDepth: info.browserColorDepth,\n browserScreenHeight: info.browserScreenHeight,\n browserScreenWidth: info.browserScreenWidth,\n browserTZ: info.browserTz,\n browserUserAgent: info.browserUserAgent,\n systemFamily: info.systemFamily,\n geoLocalization: info.geoLocalization,\n deviceID: info.deviceId,\n applicationName: info.applicationName,\n }\n if (info.browserJavaEnabled !== undefined) {\n data.browserJavaEnabled = info.browserJavaEnabled ? 'true' : 'false'\n }\n return data\n}\n\n/** Builds the wire-format invoice object. Throws DPayValueError if payment due date is not in YYYY-MM-DD format. */\nexport function serializeInvoice(invoice: InvoiceParams): Record<string, unknown> {\n const data: Record<string, unknown> = {}\n if (invoice.payerNip !== undefined) data.payer_nip = invoice.payerNip\n if (invoice.payerName !== undefined) data.payer_name = invoice.payerName\n if (invoice.invoiceNumber !== undefined) data.invoice_number = invoice.invoiceNumber\n if (invoice.paymentDueDate !== undefined) {\n if (!isValidDate(invoice.paymentDueDate)) {\n throw new DPayValueError('Payment due date must be in YYYY-MM-DD format')\n }\n data.payment_due_date = invoice.paymentDueDate\n }\n if (invoice.vatAmount !== undefined) data.vat_amount = invoice.vatAmount.minor\n return data\n}\n\n/** Builds the wire-format payout object, requiring at least one position with valid IBAN and title (1-255 characters). Throws DPayValueError if validation fails. */\nexport function serializePayoutInstruction(payout: PayoutInstructionParams): Record<string, unknown> {\n if (payout.positions.length === 0) {\n throw new DPayValueError('Payout instruction requires at least one position')\n }\n const feeMode = payout.feeMode ?? PayoutFeeMode.NET\n assertPayoutFeeMode(feeMode)\n return {\n fee_mode: feeMode,\n positions: payout.positions.map((position) => {\n if (position.iban === '') throw new DPayValueError('Payout IBAN must not be empty')\n if (position.title === '' || position.title.length > 255) {\n throw new DPayValueError('Payout title must be 1-255 characters')\n }\n return { iban: position.iban, title: position.title, amount: Number(position.amount.toDecimal()) }\n }),\n }\n}\n","import type { DeviceInfoParams } from '../payment/params.js'\nimport { serializeDeviceInfo } from '../payment/params.js'\nimport { type DccDecision, assertDccDecision } from './enums.js'\n\n/** Server-to-server card payment. */\nexport interface CardPaymentParams {\n /** 3-D Secure device fingerprint. Required. */\n deviceInfo: DeviceInfoParams\n email?: string\n channelId?: number\n cardHolderFirstName?: string\n cardHolderLastName?: string\n /** Base64 payload produced by `CardEncryptor`. */\n encryptedCardData?: string\n threeDsConfirmed?: boolean\n /** Answer to a pending dynamic currency conversion offer. */\n dccDecision?: DccDecision | (string & {})\n}\n\n/** Google Pay payment. */\nexport interface GooglePayParams {\n token: string\n deviceInfo: DeviceInfoParams\n email?: string\n channelId?: number\n}\n\n/** Apple Pay. Omit `token` to initialise a session. */\nexport interface ApplePayParams {\n deviceInfo: DeviceInfoParams\n token?: string\n channelId?: number\n}\n\n/**\n * Builds the wire-format card payment object, in the exact key order dpay expects on the\n * wire: the card fields, then `deviceInfo`, then the 3-D Secure / DCC fields. Validates\n * `dccDecision` when given. Throws DPayValueError if the decision is invalid.\n */\nexport function serializeCardPayment(params: CardPaymentParams): Record<string, unknown> {\n const body: Record<string, unknown> = {}\n if (params.email !== undefined) body.email = params.email\n if (params.channelId !== undefined) body.channelId = params.channelId\n if (params.cardHolderFirstName !== undefined) body.cardHolderFirstName = params.cardHolderFirstName\n if (params.cardHolderLastName !== undefined) body.cardHolderLastName = params.cardHolderLastName\n if (params.encryptedCardData !== undefined) body.encryptedCardData = params.encryptedCardData\n body.deviceInfo = serializeDeviceInfo(params.deviceInfo)\n if (params.threeDsConfirmed !== undefined) body.threeDsConfirmed = params.threeDsConfirmed\n if (params.dccDecision !== undefined) {\n assertDccDecision(params.dccDecision)\n body.dccDecision = params.dccDecision\n }\n return body\n}\n\n/** Builds the wire-format Google Pay object. Always sends `xPayType: \"GOOGLE_PAY\"` and the token. */\nexport function serializeGooglePay(params: GooglePayParams): Record<string, unknown> {\n const body: Record<string, unknown> = {}\n if (params.email !== undefined) body.email = params.email\n if (params.channelId !== undefined) body.channelId = params.channelId\n body.xPayType = 'GOOGLE_PAY'\n body.xPayToken = params.token\n body.deviceInfo = serializeDeviceInfo(params.deviceInfo)\n return body\n}\n\n/**\n * Builds the wire-format Apple Pay object. Omitting `token` sends `xPayType: \"APPLE_PAY_INIT\"`\n * with no `xPayToken`, to initialise a session; giving a `token` sends `xPayType: \"APPLE_PAY\"`\n * with that token, to pay.\n */\nexport function serializeApplePay(params: ApplePayParams): Record<string, unknown> {\n const body: Record<string, unknown> = {}\n if (params.channelId !== undefined) body.channelId = params.channelId\n body.xPayType = params.token === undefined ? 'APPLE_PAY_INIT' : 'APPLE_PAY'\n if (params.token !== undefined) body.xPayToken = params.token\n body.deviceInfo = serializeDeviceInfo(params.deviceInfo)\n return body\n}\n","import { CardPaymentError } from '../errors.js'\nimport type { ApiResponse } from '../http/types.js'\nimport { API_PAYMENTS } from '../internal/base-urls.js'\nimport { type Operation, decodeRecordOrFail } from '../internal/operation.js'\nimport type { Money } from '../money.js'\nimport { type CardPaymentResult, parseCardPaymentResult } from './models.js'\nimport type { ApplePayParams, CardPaymentParams, GooglePayParams } from './params.js'\nimport { serializeApplePay, serializeCardPayment, serializeGooglePay } from './params.js'\n\nexport function publicKeyOperation(): Operation<string> {\n return {\n method: 'GET',\n host: API_PAYMENTS,\n path: '/api/v1_0/cards/public-key',\n parse: (response) => response.body.trim(),\n }\n}\n\nfunction paymentOperation(\n transactionId: string,\n suffix: string,\n body: Record<string, unknown>,\n): Operation<CardPaymentResult> {\n return {\n method: 'POST',\n host: API_PAYMENTS,\n path: `/api/v1_0/cards/payment/${encodeURIComponent(transactionId)}${suffix}`,\n body,\n parse: parseResult,\n }\n}\n\nfunction parseResult(response: ApiResponse): CardPaymentResult {\n const data = decodeRecordOrFail(response)\n if (data.success !== true) throw CardPaymentError.fromApi(data)\n return parseCardPaymentResult(data)\n}\n\nexport function payOtpOperation(id: string, params: CardPaymentParams): Operation<CardPaymentResult> {\n return paymentOperation(id, '/pay/card-otp', serializeCardPayment(params))\n}\n\nexport function preAuthOperation(id: string, params: CardPaymentParams): Operation<CardPaymentResult> {\n return paymentOperation(id, '/pay/card-pre-auth', serializeCardPayment(params))\n}\n\nexport function captureOperation(id: string, amount?: Money): Operation<CardPaymentResult> {\n return paymentOperation(id, '/capture', amountBody(amount))\n}\n\nexport function cancelOperation(id: string, amount?: Money): Operation<CardPaymentResult> {\n return paymentOperation(id, '/cancellation', amountBody(amount))\n}\n\nexport function googlePayOperation(id: string, params: GooglePayParams): Operation<CardPaymentResult> {\n return paymentOperation(id, '/pay/google-pay', serializeGooglePay(params))\n}\n\nexport function applePayOperation(id: string, params: ApplePayParams): Operation<CardPaymentResult> {\n return paymentOperation(id, '/pay/apple-pay', serializeApplePay(params))\n}\n\nfunction amountBody(amount?: Money): Record<string, unknown> {\n return amount === undefined ? {} : { amount: Number(amount.toDecimal()) }\n}\n","import type { RequestOptions } from '../config.js'\nimport type { ApiRequestor } from '../internal/requestor.js'\nimport type { Money } from '../money.js'\nimport type { CardPaymentResult } from './models.js'\nimport {\n applePayOperation,\n cancelOperation,\n captureOperation,\n googlePayOperation,\n payOtpOperation,\n preAuthOperation,\n publicKeyOperation,\n} from './ops.js'\nimport type { ApplePayParams, CardPaymentParams, GooglePayParams } from './params.js'\n\n/** Charges, authorizes, captures and cancels card payments, including Google Pay and Apple Pay wallets. */\nexport class CardService {\n private readonly api: ApiRequestor\n\n constructor(api: ApiRequestor) {\n this.api = api\n }\n\n /** Current RSA public key. dpay rotates it, so fetch it before every attempt. */\n async publicKey(options?: RequestOptions): Promise<string> {\n return this.api.execute(publicKeyOperation(), options)\n }\n\n /** Charges a card immediately. */\n async payOtp(\n transactionId: string,\n params: CardPaymentParams,\n options?: RequestOptions,\n ): Promise<CardPaymentResult> {\n return this.api.execute(payOtpOperation(transactionId, params), options)\n }\n\n /** Authorizes a card without capturing the funds. */\n async preAuth(\n transactionId: string,\n params: CardPaymentParams,\n options?: RequestOptions,\n ): Promise<CardPaymentResult> {\n return this.api.execute(preAuthOperation(transactionId, params), options)\n }\n\n /** Captures a pre-authorization. Omit `amount` to capture in full. */\n async capture(\n transactionId: string,\n params?: { amount?: Money },\n options?: RequestOptions,\n ): Promise<CardPaymentResult> {\n return this.api.execute(captureOperation(transactionId, params?.amount), options)\n }\n\n /** Cancels a pre-authorization. Omit `amount` to cancel in full. */\n async cancel(\n transactionId: string,\n params?: { amount?: Money },\n options?: RequestOptions,\n ): Promise<CardPaymentResult> {\n return this.api.execute(cancelOperation(transactionId, params?.amount), options)\n }\n\n /** Pays with a Google Pay token. */\n async googlePay(\n transactionId: string,\n params: GooglePayParams,\n options?: RequestOptions,\n ): Promise<CardPaymentResult> {\n return this.api.execute(googlePayOperation(transactionId, params), options)\n }\n\n /** Initialises an Apple Pay session, or pays when `token` is given. */\n async applePay(\n transactionId: string,\n params: ApplePayParams,\n options?: RequestOptions,\n ): Promise<CardPaymentResult> {\n return this.api.execute(applePayOperation(transactionId, params), options)\n }\n}\n","import { DPayValueError } from './errors.js'\nimport type { HttpClient } from './http/types.js'\nimport { BaseUrls } from './internal/base-urls.js'\n\nconst KNOWN_OPTIONS = [\n 'service',\n 'secretHash',\n 'timeout',\n 'httpClient',\n 'baseUrls',\n 'onRequest',\n 'onResponse',\n] as const\n\nfunction ownOption<K extends keyof DPayClientOptions>(\n options: Partial<DPayClientOptions>,\n key: K,\n): DPayClientOptions[K] | undefined {\n return Object.hasOwn(options, key) ? options[key] : undefined\n}\n\n/** Default HTTP timeout in milliseconds. */\nexport const DEFAULT_TIMEOUT = 30_000\n\nconst TIMEOUT_MESSAGE = 'Option \"timeout\" must be a positive integer number of milliseconds'\n\n/**\n * Validates a timeout expressed in milliseconds, throwing `DPayValueError` when it is\n * not a positive integer. Shared by `Config.fromOptions`, for the configured timeout,\n * and by the per-call `RequestOptions.timeout`, so both are held to the same rule and\n * report the same message.\n */\nexport function validateTimeoutMs(timeout: number): number {\n if (!Number.isInteger(timeout) || timeout < 1) {\n throw new DPayValueError(TIMEOUT_MESSAGE)\n }\n return timeout\n}\n\n/** Per-call overrides accepted as the last argument of every service method. */\nexport interface RequestOptions {\n /** Cancels the call. Combined with the configured timeout. */\n signal?: AbortSignal\n /** Timeout for this call only, in milliseconds. */\n timeout?: number\n}\n\n/** What `onRequest` receives. Sensitive values are already redacted. */\nexport interface RequestHookContext {\n readonly method: string\n readonly url: string\n readonly headers: Readonly<Record<string, string>>\n readonly body: string | null\n}\n\n/** What `onResponse` receives. */\nexport interface ResponseHookContext {\n readonly status: number\n readonly url: string\n readonly body: string\n}\n\n/** Options accepted by `new DPayClient(...)`. */\nexport interface DPayClientOptions {\n /** Payment point name from panel.dpay.pl. */\n service: string\n /** Secret Hash key from panel.dpay.pl. Never expose it to a browser. */\n secretHash: string\n /** HTTP timeout in milliseconds. Defaults to 30000. */\n timeout?: number\n /** Custom transport for proxying, retries or tests. */\n httpClient?: HttpClient\n /** Overrides for the `apiPayments`, `panel` and `gateway` hosts. */\n baseUrls?: Record<string, string>\n /** Called before every request, with the checksum and card data redacted. */\n onRequest?: (context: RequestHookContext) => void\n /** Called after every response that reached the SDK. */\n onResponse?: (context: ResponseHookContext) => void\n}\n\nexport class Config {\n readonly service: string\n readonly secretHash: string\n readonly timeout: number\n readonly httpClient: HttpClient | null\n readonly baseUrls: BaseUrls\n readonly onRequest: ((context: RequestHookContext) => void) | null\n readonly onResponse: ((context: ResponseHookContext) => void) | null\n\n private constructor(init: {\n service: string\n secretHash: string\n timeout: number\n httpClient: HttpClient | null\n baseUrls: BaseUrls\n onRequest: ((context: RequestHookContext) => void) | null\n onResponse: ((context: ResponseHookContext) => void) | null\n }) {\n this.service = init.service\n this.secretHash = init.secretHash\n this.timeout = init.timeout\n this.httpClient = init.httpClient\n this.baseUrls = init.baseUrls\n this.onRequest = init.onRequest\n this.onResponse = init.onResponse\n Object.freeze(this)\n }\n\n static fromOptions(options: DPayClientOptions): Config {\n const snapshot = Object.fromEntries(Object.entries(options)) as Partial<DPayClientOptions>\n\n for (const key of Object.keys(snapshot)) {\n if (!(KNOWN_OPTIONS as readonly string[]).includes(key)) {\n throw new DPayValueError(`Unknown option \"${key}\"`)\n }\n }\n\n const service = ownOption(snapshot, 'service')\n if (typeof service !== 'string' || service === '') {\n throw new DPayValueError('Option \"service\" is required and must be a non-empty string')\n }\n\n const secretHash = ownOption(snapshot, 'secretHash')\n if (typeof secretHash !== 'string' || secretHash === '') {\n throw new DPayValueError('Option \"secretHash\" is required and must be a non-empty string')\n }\n\n const timeout = validateTimeoutMs(ownOption(snapshot, 'timeout') ?? DEFAULT_TIMEOUT)\n\n const httpClient = ownOption(snapshot, 'httpClient') ?? null\n if (httpClient !== null && typeof httpClient.request !== 'function') {\n throw new DPayValueError('Option \"httpClient\" must implement HttpClient')\n }\n\n const overrides = ownOption(snapshot, 'baseUrls') ?? {}\n if (typeof overrides !== 'object' || overrides === null || Array.isArray(overrides)) {\n throw new DPayValueError('Option \"baseUrls\" must be an object')\n }\n for (const url of Object.values(overrides)) {\n if (typeof url !== 'string' || url === '') {\n throw new DPayValueError('Base URLs must be non-empty strings')\n }\n }\n\n for (const name of ['onRequest', 'onResponse'] as const) {\n const hook = ownOption(snapshot, name)\n if (hook !== undefined && typeof hook !== 'function') {\n throw new DPayValueError(`Option \"${name}\" must be a function`)\n }\n }\n\n return new Config({\n service,\n secretHash,\n timeout,\n httpClient,\n baseUrls: new BaseUrls(overrides),\n onRequest: ownOption(snapshot, 'onRequest') ?? null,\n onResponse: ownOption(snapshot, 'onResponse') ?? null,\n })\n }\n}\n","/** A single outbound HTTP request built by the SDK. */\nexport interface ApiRequest {\n readonly method: 'GET' | 'POST'\n readonly url: string\n readonly headers: Readonly<Record<string, string>>\n readonly body: string | null\n readonly signal?: AbortSignal\n}\n\n/** A raw HTTP response handed back to the SDK. */\nexport class ApiResponse {\n readonly status: number\n readonly headers: Readonly<Record<string, string>>\n readonly body: string\n\n constructor(status: number, headers: Readonly<Record<string, string>>, body: string) {\n this.status = status\n this.headers = Object.fromEntries(\n Object.entries(headers).map(([name, value]) => [name.toLowerCase(), value]),\n )\n this.body = body\n }\n\n /**\n * Retrieve the response header value by name, performing a case-insensitive lookup.\n * Returns `null` if the header was not present in the response.\n */\n getHeader(name: string): string | null {\n return this.headers[name.toLowerCase()] ?? null\n }\n\n /**\n * Attempt to decode the response body as JSON, returning the parsed value if it is a\n * plain object or array, or `null` if the body is not valid JSON or the parsed value\n * is a primitive (string, number, boolean, null).\n */\n decodeJson(): unknown {\n let decoded: unknown\n try {\n decoded = JSON.parse(this.body)\n } catch {\n return null\n }\n return typeof decoded === 'object' && decoded !== null ? decoded : null\n }\n}\n\n/**\n * Transport contract. Replace the default implementation to add proxying,\n * retries or request recording in tests.\n *\n * Critical invariant: the `request()` method must resolve to an `ApiResponse` for\n * every response the server actually sent, including 4xx and 5xx status codes.\n * It must reject with an error only when no response was obtained at all—that is,\n * for a genuine transport failure such as a connection reset, timeout, or abort.\n *\n * If your implementation rejects on 4xx or 5xx responses, the SDK will be unable\n * to map the status code to its typed error classes, and the SDK's error handling\n * will break silently.\n */\nexport interface HttpClient {\n /**\n * Execute an HTTP request and return the server's response. Must resolve with\n * an `ApiResponse` for every response, and reject only on transport failure.\n */\n request(request: ApiRequest): Promise<ApiResponse>\n}\n","import { TransportError } from '../errors.js'\nimport { ApiResponse } from './types.js'\nimport type { ApiRequest, HttpClient } from './types.js'\n\n/** Default transport, built on the global `fetch`. */\nexport class FetchHttpClient implements HttpClient {\n private readonly fetchImpl: typeof fetch\n\n constructor(fetchImpl: typeof fetch = globalThis.fetch) {\n this.fetchImpl = fetchImpl\n }\n\n async request(request: ApiRequest): Promise<ApiResponse> {\n let response: Response\n try {\n response = await this.fetchImpl(request.url, {\n method: request.method,\n headers: { ...request.headers },\n ...(request.body !== null ? { body: request.body } : {}),\n signal: request.signal ?? null,\n redirect: 'manual',\n })\n } catch (error) {\n throw new TransportError('HTTP request failed', { cause: error })\n }\n\n let body: string\n try {\n body = await response.text()\n } catch (error) {\n throw new TransportError('Unable to read the API response body', { cause: error })\n }\n\n const headers: Record<string, string> = {}\n response.headers.forEach((value, name) => {\n headers[name] = value\n })\n return new ApiResponse(response.status, headers, body)\n }\n}\n","export const SDK_VERSION = '0.1.0'\n","import { createHash } from 'node:crypto'\nimport { phpStrval } from './php.js'\n\nexport class ChecksumCalculator {\n private readonly secretHash: string\n\n constructor(secretHash: string) {\n this.secretHash = secretHash\n }\n\n secretSecond(service: string, fields: readonly unknown[]): string {\n const parts = [service, this.secretHash, ...fields.map(phpStrval)]\n return sha256(parts.join('|'))\n }\n\n orderedBody(values: readonly unknown[]): string {\n const joined = values.map(phpStrval).join('|')\n return sha256(`${joined}|${this.secretHash}`)\n }\n}\n\nfunction sha256(text: string): string {\n return createHash('sha256').update(text, 'utf8').digest('hex')\n}\n","import {\n AccessDeniedError,\n ApiError,\n ApiServerError,\n AuthenticationError,\n InvalidRequestError,\n NotFoundError,\n RateLimitError,\n} from '../errors.js'\nimport type { ApiResponse } from '../http/types.js'\nimport { isNumeric, isScalar, phpInt, phpStrval } from './php.js'\n\nexport function mapError(response: ApiResponse): ApiError {\n const status = response.status\n const rawBody = response.body\n const decoded = response.decodeJson()\n const data: Record<string, unknown> =\n typeof decoded === 'object' && decoded !== null && !Array.isArray(decoded)\n ? (decoded as Record<string, unknown>)\n : {}\n\n let message = 'Unexpected API error'\n if (typeof data.message === 'string') message = data.message\n else if (typeof data.msg === 'string') message = data.msg\n\n const errorCode = typeof data.errorcode === 'string' ? data.errorcode : null\n const fieldErrors = normalizeFieldErrors(data.errors)\n\n if (status === 429) {\n return new RateLimitError(\n message,\n status,\n intHeader(response, 'Retry-After'),\n intHeader(response, 'X-RateLimit-Limit'),\n intHeader(response, 'X-RateLimit-Remaining'),\n rawBody,\n )\n }\n if (status === 401) return new AuthenticationError(message, status, errorCode, fieldErrors, rawBody)\n if (status === 403) return new AccessDeniedError(message, status, errorCode, fieldErrors, rawBody)\n if (status === 404) return new NotFoundError(message, status, errorCode, fieldErrors, rawBody)\n if (status === 400 || status === 422) {\n return new InvalidRequestError(message, status, errorCode, fieldErrors, rawBody)\n }\n if (status >= 500) return new ApiServerError(message, status, errorCode, fieldErrors, rawBody)\n return new ApiError(message, status, errorCode, fieldErrors, rawBody)\n}\n\nfunction normalizeFieldErrors(errors: unknown): Record<string, string[]> {\n let entries: Array<[string, unknown]>\n if (Array.isArray(errors)) {\n entries = errors.map((value, index) => [String(index), value])\n } else if (typeof errors === 'object' && errors !== null) {\n entries = Object.entries(errors as Record<string, unknown>)\n } else {\n return {}\n }\n\n const normalized: Record<string, string[]> = {}\n for (const [field, messages] of entries) {\n if (typeof messages === 'string') {\n normalized[phpStrval(field)] = [messages]\n } else if (Array.isArray(messages)) {\n normalized[phpStrval(field)] = messages.filter(isScalar).map(phpStrval)\n }\n }\n return normalized\n}\n\nfunction intHeader(response: ApiResponse, name: string): number | null {\n const value = response.getHeader(name)\n return value === null || !isNumeric(value) ? null : phpInt(value)\n}\n","import { validateTimeoutMs } from '../config.js'\nimport type { Config, RequestOptions } from '../config.js'\nimport { DPayError, TransportError } from '../errors.js'\nimport type { ApiRequest, ApiResponse, HttpClient } from '../http/types.js'\nimport { SDK_VERSION } from '../version.js'\nimport { ChecksumCalculator } from './checksum.js'\nimport { mapError } from './error-mapper.js'\nimport type { Operation } from './operation.js'\nimport { phpJsonEncode } from './php.js'\n\nconst USER_AGENT = `dpay-node-sdk/${SDK_VERSION} node/${process.versions.node}`\nconst REDACTED_KEYS = ['checksum', 'encryptedCardData', 'xPayToken']\n\nexport class ApiRequestor {\n readonly service: string\n readonly checksum: ChecksumCalculator\n private readonly config: Config\n private readonly httpClient: HttpClient\n\n constructor(config: Config, httpClient: HttpClient) {\n this.config = config\n this.httpClient = httpClient\n this.service = config.service\n this.checksum = new ChecksumCalculator(config.secretHash)\n }\n\n async execute<T>(operation: Operation<T>, options?: RequestOptions): Promise<T> {\n const request = this.buildRequest(operation, options)\n this.notify(() => this.config.onRequest?.(redactRequest(request)))\n\n let response: ApiResponse\n try {\n response = await this.httpClient.request(request)\n } catch (error) {\n if (error instanceof DPayError) throw error\n throw new TransportError('HTTP request failed', { cause: error })\n }\n\n this.notify(() =>\n this.config.onResponse?.({ status: response.status, url: request.url, body: response.body }),\n )\n\n if (operation.raiseForStatus !== false && response.status >= 400) throw mapError(response)\n return operation.parse(response)\n }\n\n private buildRequest<T>(operation: Operation<T>, options?: RequestOptions): ApiRequest {\n const url = this.config.baseUrls.resolve(operation.host) + operation.path\n const headers: Record<string, string> = { Accept: 'application/json', 'User-Agent': USER_AGENT }\n let body: string | null = null\n if (operation.body !== undefined) {\n headers['Content-Type'] = 'application/json'\n try {\n body = phpJsonEncode(operation.body)\n } catch (error) {\n throw new TransportError('Unable to encode request body as JSON', {\n cause: error,\n })\n }\n }\n return { method: operation.method, url, headers, body, signal: this.resolveSignal(options) }\n }\n\n private resolveSignal(options?: RequestOptions): AbortSignal {\n const timeout = AbortSignal.timeout(validateTimeoutMs(options?.timeout ?? this.config.timeout))\n return options?.signal === undefined ? timeout : AbortSignal.any([options.signal, timeout])\n }\n\n private notify(emit: () => unknown): void {\n let outcome: unknown\n try {\n outcome = emit()\n } catch {\n return\n }\n if (isThenable(outcome)) outcome.then(noop, noop)\n }\n}\n\nfunction noop(): void {}\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === 'object' && value !== null && typeof (value as { then?: unknown }).then === 'function'\n )\n}\n\nfunction redactRequest(request: ApiRequest): {\n method: string\n url: string\n headers: Readonly<Record<string, string>>\n body: string | null\n} {\n return {\n method: request.method,\n url: request.url,\n headers: { ...request.headers },\n body: redactBody(request.body),\n }\n}\n\nfunction redactBody(body: string | null): string | null {\n if (body === null) return null\n let decoded: unknown\n try {\n decoded = JSON.parse(body)\n } catch {\n return body\n }\n if (typeof decoded !== 'object' || decoded === null || Array.isArray(decoded)) return body\n try {\n return phpJsonEncode(redactValue(decoded))\n } catch {\n return body\n }\n}\n\nfunction redactValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redactValue)\n if (typeof value !== 'object' || value === null) return value\n const redacted: Record<string, unknown> = {}\n for (const [key, nested] of Object.entries(value as Record<string, unknown>)) {\n redacted[key] = REDACTED_KEYS.includes(key) ? '[redacted]' : redactValue(nested)\n }\n return redacted\n}\n","import { DPayValueError, TransportError } from '../errors.js'\n\n/**\n * Reads the exact bytes of an incoming request body.\n * Accepts a WHATWG `Request`, a Node `IncomingMessage`, a string, a Buffer, or a Uint8Array.\n */\nexport async function readRawBody(request: unknown): Promise<string> {\n if (typeof request === 'string') return request\n if (request instanceof Uint8Array) return Buffer.from(request).toString('utf8')\n\n if (typeof request !== 'object' || request === null) {\n throw new DPayValueError('Unsupported request object passed to the IPN verifier')\n }\n\n const candidate = request as { text?: unknown; body?: unknown; [Symbol.asyncIterator]?: unknown }\n\n if (typeof candidate.text === 'function') {\n try {\n return await (candidate.text as () => Promise<string>)()\n } catch (error) {\n if (error instanceof DPayValueError) {\n throw error\n }\n throw new TransportError('Unable to read the request body', { cause: error })\n }\n }\n\n if (typeof candidate[Symbol.asyncIterator] === 'function') {\n const chunks: Buffer[] = []\n try {\n for await (const chunk of request as AsyncIterable<Buffer | string>) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk, 'utf8') : chunk)\n }\n } catch (error) {\n if (error instanceof DPayValueError) {\n throw error\n }\n throw new TransportError('Unable to read the request body', { cause: error })\n }\n const text = Buffer.concat(chunks).toString('utf8')\n if (text === '' && candidate.body !== undefined) {\n throw new DPayValueError(\n 'The request body was already consumed by a body parser. ' +\n 'Mount the IPN route before express.json(), for example with ' +\n \"express.raw({ type: '*/*' }), and pass the raw Buffer instead.\",\n )\n }\n return text\n }\n\n throw new DPayValueError('Unsupported request object passed to the IPN verifier')\n}\n","import { isNumeric, isScalar, phpInt, phpStrval } from '../internal/php.js'\n\n/** Kind of notification dpay sent. */\nexport const IpnType = { TRANSFER: 'transfer', CAPTURE: 'capture', DCB: 'dcb' } as const\n\nexport type IpnType = (typeof IpnType)[keyof typeof IpnType]\n\n/**\n * Body dpay requires in the IPN response. It must be exactly this string;\n * the HTTP status is ignored.\n */\nexport const IPN_ACK = 'OK'\n\n/** A verified IPN notification. */\nexport interface IpnEvent {\n readonly id: string\n /** Raw decimal string. The payload carries no currency, so compare it to your own order. */\n readonly amount: string\n readonly email: string | null\n readonly type: IpnType | (string & {})\n readonly attempt: number\n readonly version: number\n /** Whatever you passed as `custom` at registration time. */\n readonly custom: string | null\n readonly capturePaymentId: string | null\n readonly signature: string\n readonly isTransfer: boolean\n readonly isCapture: boolean\n readonly isDcb: boolean\n readonly raw: Record<string, unknown>\n}\n\nexport function buildIpnEvent(raw: Record<string, unknown>): IpnEvent {\n const type = scalar(raw, 'type') ?? ''\n return Object.freeze({\n id: scalar(raw, 'id') ?? '',\n amount: scalar(raw, 'amount') ?? '',\n email: scalar(raw, 'email'),\n type,\n attempt: isNumeric(raw.attempt) ? phpInt(raw.attempt) : 0,\n version: isNumeric(raw.version) ? phpInt(raw.version) : 0,\n custom: scalar(raw, 'custom'),\n capturePaymentId: scalar(raw, 'capture_payment_id'),\n signature: scalar(raw, 'signature') ?? '',\n isTransfer: type === IpnType.TRANSFER,\n isCapture: type === IpnType.CAPTURE,\n isDcb: type === IpnType.DCB,\n raw,\n })\n}\n\nfunction scalar(raw: Record<string, unknown>, key: string): string | null {\n const value = raw[key]\n return isScalar(value) ? phpStrval(value) : null\n}\n","import { createHash, timingSafeEqual } from 'node:crypto'\nimport { SignatureVerificationError } from '../errors.js'\nimport { isNumeric, isScalar, phpStrval } from '../internal/php.js'\nimport { type IpnEvent, IpnType, buildIpnEvent } from './event.js'\n\nconst REQUIRED = ['id', 'amount', 'type', 'attempt', 'version', 'signature']\n\n/**\n * Parses and verifies an IPN body. Always pass the exact bytes dpay sent -\n * a re-serialized JSON object will not verify.\n */\nexport function constructIpnEvent(rawBody: string | Uint8Array, secretHash: string): IpnEvent {\n const text = typeof rawBody === 'string' ? rawBody : Buffer.from(rawBody).toString('utf8')\n\n let payload: unknown\n try {\n payload = JSON.parse(text)\n } catch (error) {\n throw new SignatureVerificationError('Invalid IPN payload', { cause: error })\n }\n if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) {\n throw new SignatureVerificationError('Invalid IPN payload')\n }\n\n const raw = payload as Record<string, unknown>\n for (const field of REQUIRED) {\n if (raw[field] === undefined || raw[field] === null) {\n throw new SignatureVerificationError('Invalid IPN payload')\n }\n }\n if (typeof raw.signature !== 'string') throw new SignatureVerificationError('Invalid IPN payload')\n\n const expected = expectedSignature(raw, secretHash)\n const provided = Buffer.from(raw.signature, 'utf8')\n const wanted = Buffer.from(expected, 'utf8')\n if (provided.length !== wanted.length || !timingSafeEqual(provided, wanted)) {\n throw new SignatureVerificationError('Invalid IPN signature')\n }\n\n return buildIpnEvent(raw)\n}\n\nfunction expectedSignature(raw: Record<string, unknown>, secretHash: string): string {\n const type = isScalar(raw.type) ? phpStrval(raw.type) : ''\n const parts = [\n isScalar(raw.id) ? phpStrval(raw.id) : '',\n secretHash,\n isScalar(raw.amount) ? phpStrval(raw.amount) : '',\n ]\n if (type !== IpnType.DCB) parts.push(isScalar(raw.email) ? phpStrval(raw.email) : '')\n parts.push(type)\n parts.push(isNumeric(raw.attempt) ? phpStrval(raw.attempt) : '0')\n parts.push(isNumeric(raw.version) ? phpStrval(raw.version) : '0')\n parts.push(isScalar(raw.custom) ? phpStrval(raw.custom) : '')\n return createHash('sha256').update(parts.join(''), 'utf8').digest('hex')\n}\n","import type { Config } from '../config.js'\nimport type { IpnEvent } from './event.js'\nimport { readRawBody } from './request.js'\nimport { constructIpnEvent } from './verifier.js'\n\n/** Verifies IPN notifications dpay posts to your server after a payment event. */\nexport class IpnService {\n private readonly config: Config\n\n constructor(config: Config) {\n this.config = config\n }\n\n /** Verifies an IPN body. Uses the client's `secretHash` unless one is given. */\n constructEvent(rawBody: string | Uint8Array, secretHash?: string): IpnEvent {\n return constructIpnEvent(rawBody, secretHash ?? this.config.secretHash)\n }\n\n /** Reads and verifies an IPN straight from an incoming HTTP request. */\n async constructEventFromRequest(request: unknown, secretHash?: string): Promise<IpnEvent> {\n return constructIpnEvent(await readRawBody(request), secretHash ?? this.config.secretHash)\n }\n}\n","import { DPayValueError } from '../errors.js'\nimport { assertDate } from '../internal/validation.js'\nimport type { Money } from '../money.js'\nimport { BlikAliasType, assertBlikAliasType } from './enums.js'\n\nconst FREQUENCY = /^[1-9][0-9]{0,2}[DWMQY]$/\nconst MODELS = ['A', 'M', 'O'] as const\n\n/** Registers a one-off BLIK alias alongside a payment. */\nexport interface BlikAliasRegistrationParams {\n /** 1 to 50 characters, shown in the payer's banking app. */\n label: string\n /** Defaults to `UID`. */\n type?: BlikAliasType | (string & {})\n}\n\n/** Registers a recurring BLIK mandate alongside a payment. */\nexport interface BlikRecurringRegistrationParams {\n /** 1 to 50 characters. */\n label: string\n /** `A` automatic, `M` merchant initiated, `O` one-off. */\n model: (typeof MODELS)[number]\n /** Count plus unit, for example `12M`. Units: D, W, M, Q, Y. */\n frequency: string\n value?: Money\n /** Single charge limit in minor units. */\n limitAmt?: number\n /** Total limit in minor units. */\n totLimitAmt?: number\n limitAmtFixed?: boolean\n /** YYYY-MM-DD. */\n expirationDate?: string\n /** YYYY-MM-DD. */\n initDate?: string\n}\n\n/** Builds the wire-format BLIK alias registration object. Defaults `type` to `UID` and validates the label length (1-50 characters) and the type. Throws DPayValueError if validation fails. */\nexport function serializeBlikAliasRegistration(params: BlikAliasRegistrationParams): Record<string, unknown> {\n assertLabel(params.label, 'Alias label must be 1-50 characters')\n const type = params.type ?? BlikAliasType.UID\n assertBlikAliasType(type)\n return { label: params.label, type }\n}\n\n/** Builds the wire-format BLIK recurring registration object. Always forces `type` to `PAYID`, regardless of anything the caller set, and validates the label, model, frequency and any dates. Throws DPayValueError if validation fails. */\nexport function serializeBlikRecurringRegistration(\n params: BlikRecurringRegistrationParams,\n): Record<string, unknown> {\n assertLabel(params.label, 'Alias label must be 1-50 characters')\n if (!(MODELS as readonly string[]).includes(params.model)) {\n throw new DPayValueError(`Invalid recurring model \"${params.model}\"`)\n }\n if (!FREQUENCY.test(params.frequency)) {\n throw new DPayValueError(`Invalid recurring frequency \"${params.frequency}\"`)\n }\n\n const data: Record<string, unknown> = {\n label: params.label,\n type: BlikAliasType.PAYID,\n model: params.model,\n frequency: params.frequency,\n }\n if (params.value !== undefined) data.value = params.value.toDecimal()\n if (params.limitAmt !== undefined) data.limit_amt = params.limitAmt\n if (params.totLimitAmt !== undefined) data.tot_limit_amt = params.totLimitAmt\n if (params.limitAmtFixed !== undefined) data.is_limit_amt_fixed = params.limitAmtFixed\n if (params.expirationDate !== undefined) data.expiration_date = assertDate(params.expirationDate)\n if (params.initDate !== undefined) data.init_date = assertDate(params.initDate)\n return data\n}\n\nfunction assertLabel(label: string, message: string): void {\n if (label === '' || label.length > 50) throw new DPayValueError(message)\n}\n","import { DPayValueError } from '../errors.js'\nimport { assertDate } from '../internal/validation.js'\nimport type { Money } from '../money.js'\nimport { type CardRecurringFrequency, assertCardRecurringFrequency } from './enums.js'\n\n/** Registers a card mandate alongside a payment. */\nexport interface CardRecurringRegistrationParams {\n /** 1 to 50 characters. */\n label: string\n frequency?: CardRecurringFrequency | (string & {})\n limitAmt?: Money\n totLimitAmt?: Money\n limitAmtFixed?: boolean\n /** YYYY-MM-DD. */\n expirationDate?: string\n /** YYYY-MM-DD. */\n initDate?: string\n}\n\n/** Builds the wire-format card recurring registration object, taking `limitAmt` and `totLimitAmt` from `Money.minor`. Validates the label length (1-50 characters), the frequency and any dates. Throws DPayValueError if validation fails. */\nexport function serializeCardRecurringRegistration(\n params: CardRecurringRegistrationParams,\n): Record<string, unknown> {\n if (params.label === '' || params.label.length > 50) {\n throw new DPayValueError('Mandate label must be 1-50 characters')\n }\n const data: Record<string, unknown> = { label: params.label }\n if (params.frequency !== undefined) {\n assertCardRecurringFrequency(params.frequency)\n data.frequency = params.frequency\n }\n if (params.limitAmt !== undefined) data.limit_amt = params.limitAmt.minor\n if (params.totLimitAmt !== undefined) data.tot_limit_amt = params.totLimitAmt.minor\n if (params.limitAmtFixed !== undefined) data.is_limit_amt_fixed = params.limitAmtFixed\n if (params.expirationDate !== undefined) data.expiration_date = assertDate(params.expirationDate)\n if (params.initDate !== undefined) data.init_date = assertDate(params.initDate)\n return data\n}\n","import type { BlikAliasRegistrationParams, BlikRecurringRegistrationParams } from '../blik/params.js'\nimport { serializeBlikAliasRegistration, serializeBlikRecurringRegistration } from '../blik/params.js'\nimport { type CardRecurringOperation, assertCardRecurringOperation } from '../card/enums.js'\nimport type { CardRecurringRegistrationParams } from '../card/recurring-params.js'\nimport { serializeCardRecurringRegistration } from '../card/recurring-params.js'\nimport { assertCurrency } from '../currency.js'\nimport { DPayValueError } from '../errors.js'\nimport { isValidEmail, isValidUrl } from '../internal/validation.js'\nimport type { Money } from '../money.js'\nimport { type TransactionType, assertTransactionType } from './enums.js'\nimport type {\n DeviceInfoParams,\n InvoiceParams,\n PayerParams,\n PayoutInstructionParams,\n ReturnUrls,\n} from './params.js'\nimport { serializeDeviceInfo, serializeInvoice, serializePayoutInstruction } from './params.js'\n\nconst PARTNER_PLATFORM = /^[A-Z0-9]{1,64}$/\nconst BLIK_CODE = /^\\d{6}$/\n\n/** Everything `payments.register` accepts. Only the first three fields are required. */\nexport interface RegisterPaymentParams {\n /** Amount to charge. */\n amount: Money\n /** Payment flow. */\n transactionType: TransactionType | (string & {})\n /** Success, failure and IPN URLs. */\n urls: ReturnUrls\n description?: string\n /** Opaque merchant reference, echoed back in the IPN. */\n custom?: string\n payer?: PayerParams\n acceptTos?: boolean\n /** Payment channel identifier from panel.dpay.pl. */\n channel?: string\n creditCard?: boolean\n paysafecard?: boolean\n blik?: boolean\n installment?: boolean\n paypal?: boolean\n /** Hides the bank list on the payment page. */\n noBanks?: boolean\n /** Requires `currencyCode` to be set as well. */\n phoneNumber?: string\n currencyCode?: string\n /** Uppercase letters and digits, up to 64 characters. */\n partnerPlatform?: string\n /** Required together with `blikCode` or `blikAlias`. */\n userAgent?: string\n /** Required together with `blikCode` or `blikAlias`. */\n userIp?: string\n /** Exactly six digits. Cannot be combined with `blikAlias`. */\n blikCode?: string\n /** Cannot be combined with `blikCode` or any alias registration. */\n blikAlias?: string\n registerBlikAlias?: BlikAliasRegistrationParams\n registerBlikRecurringAlias?: BlikRecurringRegistrationParams\n aliasIpnUrl?: string\n noDelay?: boolean\n /** Cannot be combined with `cardRecurringAlias`. */\n registerCardRecurring?: CardRecurringRegistrationParams\n /** Cannot be combined with `registerCardRecurring`. */\n cardRecurringAlias?: string\n authorizeOnly?: boolean\n cardRecurringOperation?: CardRecurringOperation | (string & {})\n payout?: PayoutInstructionParams\n billingAddress?: Record<string, unknown>\n shippingAddress?: Record<string, unknown>\n deviceInfo?: DeviceInfoParams\n products?: ReadonlyArray<Record<string, unknown>>\n /** Only valid when `transactionType` is `transfers`. */\n efaktura?: boolean\n invoice?: InvoiceParams\n}\n\n/**\n * Builds the request body for `payments/register`, in the exact key order dpay expects on the wire.\n *\n * Validates the mandatory fields (transaction type, URLs, payer email when present), enforces the\n * cross-field exclusions and companion-field requirements the PHP SDK enforced through its builder\n * method signatures, and delegates nested-object serialization to the Task 10/11 serializers.\n *\n * Nested objects and arrays are copied, not aliased, so mutating the caller's `params` after this\n * call cannot change the returned body.\n *\n * Throws `DPayValueError` if any field fails validation or an exclusion/companion rule is violated.\n */\nexport function buildRegisterBody(service: string, params: RegisterPaymentParams): Record<string, unknown> {\n assertTransactionType(params.transactionType)\n assertExclusions(params)\n\n const body: Record<string, unknown> = {\n service,\n value: params.amount.toDecimal(),\n transactionType: params.transactionType,\n url_success: assertUrl(params.urls.success, 'success'),\n url_fail: assertUrl(params.urls.fail, 'fail'),\n url_ipn: assertUrl(params.urls.ipn, 'ipn'),\n }\n\n if (params.description !== undefined) body.description = params.description\n if (params.custom !== undefined) body.custom = params.custom\n if (params.payer?.email !== undefined) {\n if (!isValidEmail(params.payer.email)) throw new DPayValueError(`Invalid email \"${params.payer.email}\"`)\n body.email = params.payer.email\n }\n if (params.payer?.firstName !== undefined) body.client_name = params.payer.firstName\n if (params.payer?.lastName !== undefined) body.client_surname = params.payer.lastName\n if (params.acceptTos !== undefined) body.accept_tos = params.acceptTos\n if (params.channel !== undefined) body.channel = params.channel\n\n const toggles: Array<[string, boolean | undefined]> = [\n ['creditcard', params.creditCard],\n ['paysafecard', params.paysafecard],\n ['blik', params.blik],\n ['installment', params.installment],\n ['paypal', params.paypal],\n ['nobanks', params.noBanks],\n ]\n for (const [key, flag] of toggles) {\n if (flag !== undefined) body[key] = flag ? 1 : 0\n }\n\n if (params.phoneNumber !== undefined) body.phone_number = params.phoneNumber\n if (params.currencyCode !== undefined) {\n assertCurrency(params.currencyCode)\n body.currency_code = params.currencyCode\n }\n if (params.partnerPlatform !== undefined) {\n if (!PARTNER_PLATFORM.test(params.partnerPlatform)) {\n throw new DPayValueError('Partner platform must match ^[A-Z0-9]{1,64}$')\n }\n body.partner_platform = params.partnerPlatform\n }\n if (params.userAgent !== undefined) body.user_agent = params.userAgent\n if (params.userIp !== undefined) body.user_ip = params.userIp\n if (params.blikCode !== undefined) {\n if (!BLIK_CODE.test(params.blikCode)) throw new DPayValueError('BLIK code must be exactly 6 digits')\n body.blik_code = params.blikCode\n }\n if (params.blikAlias !== undefined) body.blik_alias = params.blikAlias\n if (params.registerBlikAlias !== undefined) {\n body.register_blik_alias = serializeBlikAliasRegistration(params.registerBlikAlias)\n }\n if (params.registerBlikRecurringAlias !== undefined) {\n body.register_blik_recurring_alias = serializeBlikRecurringRegistration(params.registerBlikRecurringAlias)\n }\n if (params.aliasIpnUrl !== undefined) {\n if (!isValidUrl(params.aliasIpnUrl)) {\n throw new DPayValueError(`Invalid alias IPN URL \"${params.aliasIpnUrl}\"`)\n }\n body.alias_ipn_url = params.aliasIpnUrl\n }\n if (params.noDelay !== undefined) body.no_delay = params.noDelay\n if (params.registerCardRecurring !== undefined) {\n body.register_card_recurring = serializeCardRecurringRegistration(params.registerCardRecurring)\n }\n if (params.cardRecurringAlias !== undefined) body.card_recurring_alias = params.cardRecurringAlias\n if (params.authorizeOnly !== undefined) body.authorize_only = params.authorizeOnly\n if (params.cardRecurringOperation !== undefined) {\n assertCardRecurringOperation(params.cardRecurringOperation)\n body.card_recurring_operation = params.cardRecurringOperation\n }\n if (params.payout !== undefined) body.payout = serializePayoutInstruction(params.payout)\n if (params.billingAddress !== undefined) body.billing_address = { ...params.billingAddress }\n if (params.shippingAddress !== undefined) body.shipping_address = { ...params.shippingAddress }\n if (params.deviceInfo !== undefined) body.device_info = serializeDeviceInfo(params.deviceInfo)\n if (params.products !== undefined) body.products = params.products.map((product) => ({ ...product }))\n if (params.efaktura !== undefined) body.efaktura = params.efaktura\n if (params.invoice !== undefined) body.invoice = serializeInvoice(params.invoice)\n\n return body\n}\n\nfunction assertExclusions(params: RegisterPaymentParams): void {\n if (params.blikCode !== undefined && params.blikAlias !== undefined) {\n throw new DPayValueError('blik_code cannot be combined with blik_alias')\n }\n if (\n params.blikAlias !== undefined &&\n (params.registerBlikAlias !== undefined || params.registerBlikRecurringAlias !== undefined)\n ) {\n throw new DPayValueError('blik_alias cannot be combined with blik_code or alias registration')\n }\n if (params.registerCardRecurring !== undefined && params.cardRecurringAlias !== undefined) {\n throw new DPayValueError('register_card_recurring cannot be combined with card_recurring_alias')\n }\n if (params.efaktura === true && params.transactionType !== 'transfers') {\n throw new DPayValueError('efaktura is allowed only for transactionType \"transfers\"')\n }\n if (\n (params.blikCode !== undefined || params.blikAlias !== undefined) &&\n (params.userAgent === undefined || params.userIp === undefined)\n ) {\n throw new DPayValueError('blik_code and blik_alias require user_agent and user_ip')\n }\n if (params.phoneNumber !== undefined && params.currencyCode === undefined) {\n throw new DPayValueError('phone_number requires currency_code')\n }\n}\n\nfunction assertUrl(url: string, name: string): string {\n if (!isValidUrl(url)) throw new DPayValueError(`Invalid ${name} URL \"${url}\"`)\n return url\n}\n","import { PaymentRejectedError } from '../errors.js'\nimport type { ApiResponse } from '../http/types.js'\nimport { API_PAYMENTS, PANEL } from '../internal/base-urls.js'\nimport type { ChecksumCalculator } from '../internal/checksum.js'\nimport { type Operation, decodeRecordOrFail } from '../internal/operation.js'\nimport { isScalar, phpStrval } from '../internal/php.js'\nimport {\n type RegisteredPayment,\n type Transaction,\n parseRegisteredPayment,\n parseTransaction,\n} from './models.js'\nimport { type RegisterPaymentParams, buildRegisterBody } from './register-body.js'\n\nexport function registerOperation(\n service: string,\n checksum: ChecksumCalculator,\n params: RegisterPaymentParams,\n): Operation<RegisteredPayment> {\n const body = buildRegisterBody(service, params)\n body.checksum = checksum.secretSecond(service, [\n stringField(body, 'value'),\n stringField(body, 'url_success'),\n stringField(body, 'url_fail'),\n stringField(body, 'url_ipn'),\n ])\n return {\n method: 'POST',\n host: API_PAYMENTS,\n path: '/api/v1_0/payments/register',\n body,\n parse: parseRegisterResponse,\n }\n}\n\nfunction parseRegisterResponse(response: ApiResponse): RegisteredPayment {\n const data = decodeRecordOrFail(response)\n if (data.error === true || data.status === false) throw PaymentRejectedError.fromApi(data)\n return parseRegisteredPayment(data)\n}\n\nexport function detailsOperation(\n service: string,\n checksum: ChecksumCalculator,\n transactionId: string,\n): Operation<Transaction> {\n const body: Record<string, unknown> = { service, transaction_id: transactionId }\n body.checksum = checksum.orderedBody(Object.values(body))\n return {\n method: 'POST',\n host: PANEL,\n path: '/api/v1/pbl/details',\n body,\n parse: (response) => parseTransaction(decodeRecordOrFail(response)),\n }\n}\n\nfunction stringField(body: Record<string, unknown>, key: string): string {\n const value = body[key]\n return isScalar(value) ? phpStrval(value) : ''\n}\n","import type { RequestOptions } from '../config.js'\nimport type { ApiRequestor } from '../internal/requestor.js'\nimport type { RegisteredPayment, Transaction } from './models.js'\nimport { detailsOperation, registerOperation } from './ops.js'\nimport type { RegisterPaymentParams } from './register-body.js'\n\n/** Registers dpay payments and reads their current transaction status. */\nexport class PaymentService {\n private readonly api: ApiRequestor\n\n constructor(api: ApiRequestor) {\n this.api = api\n }\n\n /**\n * Registers a payment and returns the redirect target.\n * Throws `PaymentRejectedError` when dpay rejects it with HTTP 200.\n */\n async register(params: RegisterPaymentParams, options?: RequestOptions): Promise<RegisteredPayment> {\n return this.api.execute(registerOperation(this.api.service, this.api.checksum, params), options)\n }\n\n /** Reads the current state of a transaction, including its refunds. */\n async details(transactionId: string, options?: RequestOptions): Promise<Transaction> {\n return this.api.execute(detailsOperation(this.api.service, this.api.checksum, transactionId), options)\n }\n}\n","import { Currency } from '../currency.js'\nimport { isScalar, phpInt } from '../internal/php.js'\nimport { Money } from '../money.js'\nimport { moneyOrZero, record, strictString } from '../payment/models.js'\n\n/** Beneficiary of a payout. */\nexport interface PayoutReceiver {\n readonly nrb: string | null\n readonly title: string | null\n readonly amount: Money | null\n readonly service: string | null\n readonly receiverName: string | null\n readonly receiverAddress: string | null\n readonly raw: Record<string, unknown>\n}\n\n/** State of a single payout. */\nexport interface PayoutDetails {\n readonly id: number\n /** 0 waiting, 1 processed, -1 failed. */\n readonly state: number\n readonly net: Money\n readonly fee: Money\n readonly gross: Money\n readonly creationDate: string | null\n readonly isDirectSettlement: boolean\n readonly nrb: string | null\n readonly isDeclined: boolean\n readonly declineReason: string | null\n readonly declineStatus: string | null\n readonly receiver: PayoutReceiver | null\n readonly isWaiting: boolean\n readonly isProcessed: boolean\n readonly isFailed: boolean\n readonly raw: Record<string, unknown>\n}\n\n/** Builds a frozen `PayoutDetails` from the raw JSON body of `pbl/withdraws/details`. */\nexport function parsePayoutDetails(data: Record<string, unknown>): PayoutDetails {\n const state = isScalar(data.state) ? phpInt(data.state) : 0\n const receiver = record(data.receiver)\n return Object.freeze({\n id: isScalar(data.id) ? phpInt(data.id) : 0,\n state,\n net: moneyOrZero(data, 'net'),\n fee: moneyOrZero(data, 'fee'),\n gross: moneyOrZero(data, 'gross'),\n creationDate: strictString(data, 'creation_date'),\n isDirectSettlement: flag(data, 'direct_settlement'),\n nrb: strictString(data, 'nrb'),\n isDeclined: flag(data, 'declined'),\n declineReason: strictString(data, 'decline_reason'),\n declineStatus: strictString(data, 'decline_status'),\n receiver: receiver === null ? null : parsePayoutReceiver(receiver),\n isWaiting: state === 0,\n isProcessed: state === 1,\n isFailed: state === -1,\n raw: data,\n })\n}\n\nfunction parsePayoutReceiver(data: Record<string, unknown>): PayoutReceiver {\n return Object.freeze({\n nrb: strictString(data, 'nrb'),\n title: strictString(data, 'title'),\n amount: Money.tryFromApiNumber(data.amount, Currency.PLN),\n service: strictString(data, 'service'),\n receiverName: strictString(data, 'receiverName'),\n receiverAddress: strictString(data, 'receiverAddress'),\n raw: data,\n })\n}\n\nfunction flag(data: Record<string, unknown>, key: string): boolean {\n const value = data[key]\n return isScalar(value) ? phpInt(value) === 1 : false\n}\n","import { PANEL } from '../internal/base-urls.js'\nimport type { ChecksumCalculator } from '../internal/checksum.js'\nimport { type Operation, decodeRecordOrFail } from '../internal/operation.js'\nimport { type PayoutDetails, parsePayoutDetails } from './models.js'\n\nexport interface PayoutDetailsParams {\n withdrawId: number\n timestamp?: number\n}\n\nexport function payoutDetailsOperation(\n service: string,\n checksum: ChecksumCalculator,\n params: PayoutDetailsParams,\n): Operation<PayoutDetails> {\n const body: Record<string, unknown> = { service }\n if (params.timestamp !== undefined) body.timestamp = params.timestamp\n body.withdraw_id = params.withdrawId\n body.checksum = checksum.orderedBody(Object.values(body))\n return {\n method: 'POST',\n host: PANEL,\n path: '/api/v1/pbl/withdraws/details',\n body,\n parse: (response) => parsePayoutDetails(decodeRecordOrFail(response)),\n }\n}\n","import type { RequestOptions } from '../config.js'\nimport type { ApiRequestor } from '../internal/requestor.js'\nimport type { PayoutDetails } from './models.js'\nimport { type PayoutDetailsParams, payoutDetailsOperation } from './ops.js'\n\n/** Reads the state of payouts (withdrawals) from a dpay merchant balance. */\nexport class PayoutService {\n private readonly api: ApiRequestor\n\n constructor(api: ApiRequestor) {\n this.api = api\n }\n\n /** Reads the state of a single payout. */\n async details(params: PayoutDetailsParams, options?: RequestOptions): Promise<PayoutDetails> {\n return this.api.execute(payoutDetailsOperation(this.api.service, this.api.checksum, params), options)\n }\n}\n","import { scalarStringOrNull } from '../payment/models.js'\n\n/** Outcome of a refund request. */\nexport interface Refund {\n readonly isAccepted: boolean\n readonly message: string | null\n readonly raw: Record<string, unknown>\n}\n\n/** Outcome of a refund availability check. */\nexport interface RefundAvailability {\n readonly isAvailable: boolean\n readonly message: string | null\n /** HTTP status the API answered with. The API signals refusal through the status. */\n readonly httpStatus: number\n readonly raw: Record<string, unknown>\n}\n\n/** Builds a frozen `Refund` from the raw JSON body of `pbl/refund`. */\nexport function parseRefund(data: Record<string, unknown>): Refund {\n return Object.freeze({\n isAccepted: data.status === 'success' && data.refund === true,\n message: scalarStringOrNull(data, 'message'),\n raw: data,\n })\n}\n\n/** Builds a frozen `RefundAvailability` from the raw JSON body of `pbl/check-refund-availability`. */\nexport function parseRefundAvailability(\n data: Record<string, unknown>,\n httpStatus: number,\n): RefundAvailability {\n return Object.freeze({\n isAvailable: data.refund === true,\n message: scalarStringOrNull(data, 'message'),\n httpStatus,\n raw: data,\n })\n}\n","import type { ApiResponse } from '../http/types.js'\nimport { PANEL } from '../internal/base-urls.js'\nimport type { ChecksumCalculator } from '../internal/checksum.js'\nimport { mapError } from '../internal/error-mapper.js'\nimport { type Operation, decodeRecordOrFail } from '../internal/operation.js'\nimport type { Money } from '../money.js'\nimport { type Refund, type RefundAvailability, parseRefund, parseRefundAvailability } from './models.js'\n\nconst AVAILABILITY_OUTCOMES = [200, 400, 402, 406, 409, 410, 411]\n\nexport interface RefundParams {\n transactionId: string\n amount?: Money\n reason?: string\n}\n\nfunction signedBody(\n service: string,\n checksum: ChecksumCalculator,\n params: RefundParams,\n): Record<string, unknown> {\n const body: Record<string, unknown> = { service, transaction_id: params.transactionId }\n if (params.amount !== undefined) body.value = params.amount.toDecimal()\n if (params.reason !== undefined) body.reason = params.reason\n body.checksum = checksum.orderedBody(Object.values(body))\n return body\n}\n\nexport function createRefundOperation(\n service: string,\n checksum: ChecksumCalculator,\n params: RefundParams,\n): Operation<Refund> {\n return {\n method: 'POST',\n host: PANEL,\n path: '/api/v1/pbl/refund',\n body: signedBody(service, checksum, params),\n parse: (response) => parseRefund(decodeRecordOrFail(response)),\n }\n}\n\nexport function checkAvailabilityOperation(\n service: string,\n checksum: ChecksumCalculator,\n params: RefundParams,\n): Operation<RefundAvailability> {\n return {\n method: 'POST',\n host: PANEL,\n path: '/api/v1/pbl/check-refund-availability',\n body: signedBody(service, checksum, params),\n raiseForStatus: false,\n parse: parseAvailability,\n }\n}\n\nfunction parseAvailability(response: ApiResponse): RefundAvailability {\n const json = response.decodeJson()\n if (typeof json === 'object' && json !== null && !Array.isArray(json)) {\n const data = json as Record<string, unknown>\n if (Object.hasOwn(data, 'refund') && isOutcome(response.status, data)) {\n return parseRefundAvailability(data, response.status)\n }\n }\n throw mapError(response)\n}\n\nfunction isOutcome(status: number, data: Record<string, unknown>): boolean {\n if (AVAILABILITY_OUTCOMES.includes(status)) return true\n return status === 401 && data.message !== 'Unauthorized request'\n}\n","import type { RequestOptions } from '../config.js'\nimport type { ApiRequestor } from '../internal/requestor.js'\nimport type { Refund, RefundAvailability } from './models.js'\nimport { type RefundParams, checkAvailabilityOperation, createRefundOperation } from './ops.js'\n\n/** Refunds transactions and checks whether a refund would be accepted before performing it. */\nexport class RefundService {\n private readonly api: ApiRequestor\n\n constructor(api: ApiRequestor) {\n this.api = api\n }\n\n /** Refunds a transaction in full, or partially when `amount` is given. */\n async create(params: RefundParams, options?: RequestOptions): Promise<Refund> {\n return this.api.execute(createRefundOperation(this.api.service, this.api.checksum, params), options)\n }\n\n /**\n * Checks whether a refund would be accepted, without performing it.\n * Refusal arrives as a 4xx status carrying an outcome body, not as an error.\n */\n async checkAvailability(params: RefundParams, options?: RequestOptions): Promise<RefundAvailability> {\n return this.api.execute(checkAvailabilityOperation(this.api.service, this.api.checksum, params), options)\n }\n}\n","import { BankService } from './bank/service.js'\nimport { BlikService } from './blik/service.js'\nimport { CardService } from './card/service.js'\nimport { Config } from './config.js'\nimport type { DPayClientOptions } from './config.js'\nimport { FetchHttpClient } from './http/fetch-client.js'\nimport { ApiRequestor } from './internal/requestor.js'\nimport { IpnService } from './ipn/service.js'\nimport { PaymentService } from './payment/service.js'\nimport { PayoutService } from './payout/service.js'\nimport { RefundService } from './refund/service.js'\nimport { SDK_VERSION } from './version.js'\n\n/** Entry point of the SDK. One instance per payment point. */\nexport class DPayClient {\n /** Version of this SDK. */\n readonly VERSION = SDK_VERSION\n /** Register payments and read transaction state. */\n readonly payments: PaymentService\n /** Refund transactions and check refund availability. */\n readonly refunds: RefundService\n /** List banks available on the payment page. */\n readonly banks: BankService\n /** Register, unregister and inspect BLIK aliases. */\n readonly blik: BlikService\n /** Server-to-server card payments, wallets and pre-authorizations. */\n readonly cards: CardService\n /** Read the state of payouts. */\n readonly payouts: PayoutService\n /** Verify incoming IPN notifications. */\n readonly ipn: IpnService\n\n /**\n * Validates `options` eagerly - before any network call - and mounts every service on\n * top of a shared transport. Defaults to `FetchHttpClient` when `options.httpClient` is\n * not given.\n */\n constructor(options: DPayClientOptions) {\n const config = Config.fromOptions(options)\n const transport = config.httpClient ?? new FetchHttpClient()\n const api = new ApiRequestor(config, transport)\n\n this.payments = new PaymentService(api)\n this.refunds = new RefundService(api)\n this.banks = new BankService(api)\n this.blik = new BlikService(api)\n this.cards = new CardService(api)\n this.payouts = new PayoutService(api)\n this.ipn = new IpnService(config)\n }\n}\n","import { inspect } from 'node:util'\nimport { DPayValueError } from '../errors.js'\n\nconst PAN = /^\\d{12,19}$/\nconst CVV = /^\\d{3,4}$/\nconst EXPIRY = /^(0[1-9]|1[0-2])\\/\\d{2}$/\n\n/**\n * Raw card credentials, held only long enough to encrypt them.\n *\n * Redacts itself when logged or serialized, so it never reaches a log sink in clear text.\n * `pan`, `cvv`, and `expiry` are exposed through getters backed by private fields rather than\n * plain enumerable own data properties, so APIs that bypass custom inspection - such as\n * `console.dir(card)` or `Object.keys(card)` - have nothing to dump either.\n */\nexport class CardData {\n /** Card number, normalized to digits only (spaces stripped). */\n readonly #pan: string\n /** Card verification value, 3-4 digits. */\n readonly #cvv: string\n /** Expiry in `MM/YY` format. */\n readonly #expiry: string\n\n constructor(params: { pan: string; cvv: string; expiry: string }) {\n const pan = params.pan.replaceAll(' ', '')\n if (!PAN.test(pan)) throw new DPayValueError('Card number must be 12-19 digits')\n if (!CVV.test(params.cvv)) throw new DPayValueError('CVV must be 3-4 digits')\n if (!EXPIRY.test(params.expiry)) throw new DPayValueError('Expiry must be in MM/YY format')\n this.#pan = pan\n this.#cvv = params.cvv\n this.#expiry = params.expiry\n Object.freeze(this)\n }\n\n /** Card number, normalized to digits only (spaces stripped). */\n get pan(): string {\n return this.#pan\n }\n\n /** Card verification value, 3-4 digits. */\n get cvv(): string {\n return this.#cvv\n }\n\n /** Expiry in `MM/YY` format. */\n get expiry(): string {\n return this.#expiry\n }\n\n private redacted(): { pan: string; cvv: string; expiry: string } {\n return { pan: `****${this.#pan.slice(-4)}`, cvv: '***', expiry: this.#expiry }\n }\n\n /** Redacted representation - `pan` masked to its last 4 digits, `cvv` fully masked. */\n toJSON(): { pan: string; cvv: string; expiry: string } {\n return this.redacted()\n }\n\n /** Redacted representation - `pan` masked to its last 4 digits, `cvv` fully masked. */\n toString(): string {\n const { pan, cvv, expiry } = this.redacted()\n return `CardData(pan='${pan}', cvv='${cvv}', expiry='${expiry}')`\n }\n\n /** Node `util.inspect` hook - delegates to the same redacted `toString()`. */\n [inspect.custom](): string {\n return this.toString()\n }\n}\n","import { constants, createPublicKey, publicEncrypt } from 'node:crypto'\nimport { CardEncryptionError } from '../errors.js'\nimport { phpJsonEncode } from '../internal/php.js'\nimport type { CardData } from './card-data.js'\n\n/** Encrypts card credentials with the rotating RSA key from `cards.publicKey()`. */\nexport class CardEncryptor {\n /**\n * Returns the Base64 payload to put in `encryptedCardData`.\n * Fetch the public key immediately before every attempt - dpay rotates it.\n */\n encrypt(card: CardData, transactionId: string, publicKeyPem: string): string {\n let key: ReturnType<typeof createPublicKey>\n try {\n key = createPublicKey(publicKeyPem)\n } catch (error) {\n throw new CardEncryptionError('Invalid RSA public key', { cause: error })\n }\n\n const payload = phpJsonEncode(\n {\n PN: card.pan,\n SC: card.cvv,\n DT: card.expiry,\n ID: transactionId,\n TX: Math.floor(Date.now() / 1000),\n },\n { escapeSlashes: true },\n )\n\n try {\n return publicEncrypt(\n { key, padding: constants.RSA_PKCS1_PADDING },\n Buffer.from(payload, 'utf8'),\n ).toString('base64')\n } catch (error) {\n throw new CardEncryptionError('Card data encryption failed', { cause: error })\n }\n }\n}\n"]}
|