@paybetaby/node-sdk 0.1.1 → 1.0.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/README.md CHANGED
@@ -561,16 +561,16 @@ try {
561
561
 
562
562
  ### `PaybetaError`
563
563
 
564
- Thrown for client-side errors: request timeout, webhook signature failure, missing configuration.
564
+ Thrown for anything that isn't an API response: request timeout, DNS/connection failures, webhook signature failure, missing configuration. Every failure mode `fetch` itself can produce — not just timeouts — is normalized to this one type, so you don't need to separately handle a raw, unwrapped network error; the original error is available as `err.cause` if you need it for debugging.
565
565
 
566
566
  ```typescript
567
567
  import { PaybetaError } from '@paybetaby/node-sdk';
568
568
 
569
569
  try {
570
- const event = paybeta.webhooks.constructEvent(rawBody, signature);
570
+ const event = paybeta.webhooks.constructEvent(rawBody, signature, timestamp);
571
571
  } catch (err) {
572
572
  if (err instanceof PaybetaError) {
573
- // signature mismatch, missing webhookSecret, etc.
573
+ // signature mismatch, missing webhookSecret, network failure, etc.
574
574
  console.error(err.message);
575
575
  }
576
576
  }
package/dist/index.d.mts CHANGED
@@ -424,7 +424,9 @@ declare class PaybetaClient {
424
424
  }
425
425
 
426
426
  declare class PaybetaError extends Error {
427
- constructor(message: string);
427
+ constructor(message: string, options?: {
428
+ cause?: unknown;
429
+ });
428
430
  }
429
431
  declare class PaybetaApiError extends PaybetaError {
430
432
  readonly status: number;
package/dist/index.d.ts CHANGED
@@ -424,7 +424,9 @@ declare class PaybetaClient {
424
424
  }
425
425
 
426
426
  declare class PaybetaError extends Error {
427
- constructor(message: string);
427
+ constructor(message: string, options?: {
428
+ cause?: unknown;
429
+ });
428
430
  }
429
431
  declare class PaybetaApiError extends PaybetaError {
430
432
  readonly status: number;
package/dist/index.js CHANGED
@@ -4,8 +4,8 @@ var crypto = require('crypto');
4
4
 
5
5
  // src/errors.ts
6
6
  var PaybetaError = class extends Error {
7
- constructor(message) {
8
- super(message);
7
+ constructor(message, options) {
8
+ super(message, options?.cause !== void 0 ? { cause: options.cause } : void 0);
9
9
  this.name = "PaybetaError";
10
10
  Object.setPrototypeOf(this, new.target.prototype);
11
11
  }
@@ -57,9 +57,10 @@ var HttpClient = class {
57
57
  });
58
58
  } catch (err) {
59
59
  if (err instanceof Error && err.name === "AbortError") {
60
- throw new PaybetaError(`Request timed out after ${this.config.timeout}ms`);
60
+ throw new PaybetaError(`Request timed out after ${this.config.timeout}ms`, { cause: err });
61
61
  }
62
- throw err;
62
+ const detail = err instanceof Error ? err.message : String(err);
63
+ throw new PaybetaError(`Network request to PayBeta failed: ${detail}`, { cause: err });
63
64
  } finally {
64
65
  clearTimeout(timer);
65
66
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/transactions.ts","../src/resources/payments.ts","../src/resources/escrows.ts","../src/resources/disputes.ts","../src/resources/webhooks.ts","../src/client.ts"],"names":["createHmac","timingSafeEqual"],"mappings":"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","file":"index.js","sourcesContent":["export class PaybetaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PaybetaError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class PaybetaApiError extends PaybetaError {\n readonly status: number;\n readonly code: string;\n readonly traceId: string;\n readonly timestamp: string;\n\n constructor(status: number, code: string, message: string, traceId: string, timestamp: string) {\n super(message);\n this.name = 'PaybetaApiError';\n this.status = status;\n this.code = code;\n this.traceId = traceId;\n this.timestamp = timestamp;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { PaybetaApiError, PaybetaError } from './errors.js';\n\nexport interface HttpClientConfig {\n apiKey: string;\n baseUrl: string;\n timeout: number;\n}\n\ninterface ApiErrorBody {\n error?: {\n code?: string;\n message?: string;\n traceId?: string;\n timestamp?: string;\n };\n message?: string;\n}\n\nexport class HttpClient {\n constructor(private readonly config: HttpClientConfig) {}\n\n async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined | null>;\n },\n ): Promise<T> {\n // The public API is served behind api-gateway under a /v1 prefix — the\n // gateway's route table only matches /v1/... and 404s anything else, so\n // every request must go there regardless of how `path` is written by\n // the resource classes below.\n const url = new URL(`/v1${path}`, this.config.baseUrl);\n\n if (options?.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const headers: Record<string, string> = {\n 'X-API-Key': this.config.apiKey,\n Accept: 'application/json',\n };\n\n let body: string | undefined;\n if (options?.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(options.body);\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.config.timeout);\n\n let response: Response;\n try {\n response = await fetch(url.toString(), {\n method,\n headers,\n body,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw new PaybetaError(`Request timed out after ${this.config.timeout}ms`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n\n let payload: unknown;\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n payload = await response.json().catch(() => null);\n } else {\n payload = await response.text().catch(() => null);\n }\n\n if (!response.ok) {\n const errBody = (payload ?? {}) as ApiErrorBody;\n const errDetail = errBody.error ?? {};\n throw new PaybetaApiError(\n response.status,\n errDetail.code ?? String(response.status),\n errDetail.message ?? errBody.message ?? 'Request failed',\n errDetail.traceId ?? '',\n errDetail.timestamp ?? new Date().toISOString(),\n );\n }\n\n return payload as T;\n }\n\n get<T>(path: string, query?: Record<string, string | number | boolean | undefined | null>): Promise<T> {\n return this.request<T>('GET', path, { query });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PATCH', path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Transaction,\n CreateTransactionParams,\n ListTransactionsParams,\n TransactionEvent,\n} from '../types/transactions.js';\nimport type { RequestOptions } from '../types/common.js';\n\nexport class TransactionsResource {\n constructor(private readonly http: HttpClient) {}\n\n create(params: CreateTransactionParams, opts?: RequestOptions): Promise<Transaction> {\n const body = opts?.idempotencyKey\n ? { ...params, idempotencyKey: opts.idempotencyKey }\n : params;\n return this.http.post<Transaction>('/transactions', body);\n }\n\n /**\n * Lists transactions. The bare `/transactions` endpoint is platform-role\n * only — an API-key (merchant) caller gets a 403 there — so passing\n * `merchantId` routes to `/transactions/merchant/:merchantId` instead.\n */\n list(params?: ListTransactionsParams): Promise<Transaction[]> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/transactions/merchant/${merchantId}` : '/transactions';\n return this.http.get<Transaction[]>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Transaction> {\n return this.http.get<Transaction>(`/transactions/${id}`);\n }\n\n listHistory(id: string): Promise<TransactionEvent[]> {\n return this.http.get<TransactionEvent[]>(`/transactions/${id}/history`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Payment,\n PaymentAttempt,\n InitiatePaymentParams,\n ListPaymentsParams,\n} from '../types/payments.js';\n\nexport class PaymentsResource {\n constructor(private readonly http: HttpClient) {}\n\n initiate(params: InitiatePaymentParams): Promise<Payment> {\n const { idempotencyKey, ...rest } = params;\n const body = idempotencyKey ? { ...rest, idempotencyKey } : rest;\n return this.http.post<Payment>('/payments', body);\n }\n\n /**\n * Lists payments. The bare `/payments` endpoint is platform-role only —\n * an API-key (merchant) caller gets a 403 there — so passing `merchantId`\n * (which every merchant API key call needs) routes to\n * `/payments/merchant/:merchantId` instead, matching what the API\n * actually allows a merchant credential to call.\n */\n list(params?: ListPaymentsParams): Promise<Payment[]> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/payments/merchant/${merchantId}` : '/payments';\n return this.http.get<Payment[]>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Payment> {\n return this.http.get<Payment>(`/payments/${id}`);\n }\n\n verify(id: string): Promise<Payment> {\n return this.http.post<Payment>(`/payments/${id}/verify`);\n }\n\n retry(id: string): Promise<Payment> {\n return this.http.post<Payment>(`/payments/${id}/retry`);\n }\n\n listAttempts(id: string): Promise<PaymentAttempt[]> {\n return this.http.get<PaymentAttempt[]>(`/payments/${id}/attempts`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Escrow,\n EscrowBalance,\n EscrowListResponse,\n EscrowConditionsResponse,\n CreateEscrowParams,\n ListEscrowsParams,\n ReleaseEscrowParams,\n ConfirmDeliveryParams,\n ConfirmBuyerParams,\n} from '../types/escrows.js';\nimport type { RequestOptions } from '../types/common.js';\n\nexport class EscrowsResource {\n constructor(private readonly http: HttpClient) {}\n\n create(params: CreateEscrowParams, opts?: RequestOptions): Promise<Escrow> {\n const body = opts?.idempotencyKey\n ? { ...params, idempotencyKey: opts.idempotencyKey }\n : params;\n return this.http.post<Escrow>('/escrows', body);\n }\n\n /**\n * Lists escrows. The bare `/escrows` endpoint is platform-role only — an\n * API-key (merchant) caller gets a 403 there — so passing `merchantId`\n * routes to `/escrows/merchant/:merchantId` instead. Unlike\n * payments/transactions/disputes, this returns a `{ escrows, total,\n * limit, offset }` envelope rather than a bare array.\n */\n list(params?: ListEscrowsParams): Promise<EscrowListResponse> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/escrows/merchant/${merchantId}` : '/escrows';\n return this.http.get<EscrowListResponse>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Escrow> {\n return this.http.get<Escrow>(`/escrows/${id}`);\n }\n\n retrieveBalance(id: string): Promise<EscrowBalance> {\n return this.http.get<EscrowBalance>(`/escrows/${id}/balance`);\n }\n\n retrieveConditions(id: string): Promise<EscrowConditionsResponse> {\n return this.http.get<EscrowConditionsResponse>(`/escrows/${id}/conditions`);\n }\n\n release(id: string, params?: ReleaseEscrowParams): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/release`, params);\n }\n\n refund(id: string): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/refund`);\n }\n\n dispute(id: string): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/dispute`);\n }\n\n cancel(id: string): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/cancel`);\n }\n\n confirmDelivery(id: string, params?: ConfirmDeliveryParams): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/confirm-delivery`, params);\n }\n\n confirmBuyer(id: string, params?: ConfirmBuyerParams): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/confirm-buyer`, params);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Dispute,\n Evidence,\n OpenDisputeParams,\n ListDisputesParams,\n UploadEvidenceParams,\n ResolveDisputeParams,\n CancelDisputeParams,\n} from '../types/disputes.js';\n\nexport class DisputesResource {\n constructor(private readonly http: HttpClient) {}\n\n open(params: OpenDisputeParams): Promise<Dispute> {\n return this.http.post<Dispute>('/disputes', params);\n }\n\n /**\n * Lists disputes. The bare `/disputes` endpoint is platform-role only —\n * an API-key (merchant) caller gets a 403 there — so passing\n * `merchantId` routes to `/disputes/merchant/:merchantId` instead.\n */\n list(params?: ListDisputesParams): Promise<Dispute[]> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/disputes/merchant/${merchantId}` : '/disputes';\n return this.http.get<Dispute[]>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Dispute> {\n return this.http.get<Dispute>(`/disputes/${id}`);\n }\n\n listEvidence(id: string): Promise<Evidence[]> {\n return this.http.get<Evidence[]>(`/disputes/${id}/evidence`);\n }\n\n uploadEvidence(id: string, params: UploadEvidenceParams): Promise<Evidence> {\n return this.http.post<Evidence>(`/disputes/${id}/evidence`, params);\n }\n\n resolve(id: string, params: ResolveDisputeParams): Promise<Dispute> {\n return this.http.post<Dispute>(`/disputes/${id}/resolve`, params);\n }\n\n cancel(id: string, params: CancelDisputeParams): Promise<Dispute> {\n return this.http.post<Dispute>(`/disputes/${id}/cancel`, params);\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto';\nimport { PaybetaError } from '../errors.js';\nimport type { WebhookEvent } from '../types/webhooks.js';\n\nexport class WebhooksResource {\n constructor(private readonly secret: string) {}\n\n /**\n * Verifies the signature on an incoming webhook and parses the payload.\n *\n * PayBeta signs the concatenation of the delivery timestamp and the raw\n * request body — `HMAC-SHA256(secret, \"${timestamp}.${rawBody}\")` — and\n * sends the result hex-encoded, prefixed with `sha256=`, in the\n * `X-PayBeta-Signature` header (see OutboundWebhookService). The\n * timestamp itself arrives separately in `X-PayBeta-Timestamp`, so both\n * headers are required here, not just the signature.\n *\n * Pass the raw request body (before JSON parsing), the value of the\n * `X-PayBeta-Signature` header, and the value of the `X-PayBeta-Timestamp`\n * header. Throws `PaybetaError` if the signature is invalid or the\n * secret was not configured.\n */\n constructEvent<T = unknown>(\n rawBody: string | Buffer,\n signature: string,\n timestamp: string,\n ): WebhookEvent<T> {\n if (!this.secret) {\n throw new PaybetaError(\n 'webhookSecret must be set on PaybetaClient to verify webhook signatures',\n );\n }\n\n const body = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8');\n\n // Accept the header verbatim (`sha256=<hex>`) or a bare hex digest, so\n // callers who've already stripped the prefix don't get a confusing\n // \"invalid signature format\" error.\n const hexSignature = signature.startsWith('sha256=') ? signature.slice('sha256='.length) : signature;\n\n const expected = createHmac('sha256', this.secret)\n .update(`${timestamp}.${body}`)\n .digest('hex');\n\n let actual: Buffer;\n let expectedBuf: Buffer;\n try {\n actual = Buffer.from(hexSignature, 'hex');\n expectedBuf = Buffer.from(expected, 'hex');\n } catch {\n throw new PaybetaError('Invalid signature format');\n }\n\n if (expectedBuf.length !== actual.length || !timingSafeEqual(expectedBuf, actual)) {\n throw new PaybetaError('Webhook signature verification failed');\n }\n\n return JSON.parse(body) as WebhookEvent<T>;\n }\n}\n","import { HttpClient } from './http.js';\nimport { TransactionsResource } from './resources/transactions.js';\nimport { PaymentsResource } from './resources/payments.js';\nimport { EscrowsResource } from './resources/escrows.js';\nimport { DisputesResource } from './resources/disputes.js';\nimport { WebhooksResource } from './resources/webhooks.js';\n\nexport interface PaybetaClientConfig {\n /** API key obtained from the Paybeta dashboard (pb_live_* or pb_test_*) */\n apiKey: string;\n /** Override the default API base URL. Defaults to https://api.usepaybeta.com */\n baseUrl?: string;\n /** Webhook signing secret used to verify incoming webhook payloads */\n webhookSecret?: string;\n /** Request timeout in milliseconds. Defaults to 30000 */\n timeout?: number;\n}\n\nexport class PaybetaClient {\n readonly transactions: TransactionsResource;\n readonly payments: PaymentsResource;\n readonly escrows: EscrowsResource;\n readonly disputes: DisputesResource;\n readonly webhooks: WebhooksResource;\n\n constructor(config: PaybetaClientConfig) {\n if (!config.apiKey) {\n throw new Error('PaybetaClient: apiKey is required');\n }\n\n const http = new HttpClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.usepaybeta.com',\n timeout: config.timeout ?? 30_000,\n });\n\n this.transactions = new TransactionsResource(http);\n this.payments = new PaymentsResource(http);\n this.escrows = new EscrowsResource(http);\n this.disputes = new DisputesResource(http);\n this.webhooks = new WebhooksResource(config.webhookSecret ?? '');\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/transactions.ts","../src/resources/payments.ts","../src/resources/escrows.ts","../src/resources/disputes.ts","../src/resources/webhooks.ts","../src/client.ts"],"names":["createHmac","timingSafeEqual"],"mappings":"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","file":"index.js","sourcesContent":["export class PaybetaError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options?.cause !== undefined ? { cause: options.cause } : undefined);\n this.name = 'PaybetaError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class PaybetaApiError extends PaybetaError {\n readonly status: number;\n readonly code: string;\n readonly traceId: string;\n readonly timestamp: string;\n\n constructor(status: number, code: string, message: string, traceId: string, timestamp: string) {\n super(message);\n this.name = 'PaybetaApiError';\n this.status = status;\n this.code = code;\n this.traceId = traceId;\n this.timestamp = timestamp;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { PaybetaApiError, PaybetaError } from './errors.js';\n\nexport interface HttpClientConfig {\n apiKey: string;\n baseUrl: string;\n timeout: number;\n}\n\ninterface ApiErrorBody {\n error?: {\n code?: string;\n message?: string;\n traceId?: string;\n timestamp?: string;\n };\n message?: string;\n}\n\nexport class HttpClient {\n constructor(private readonly config: HttpClientConfig) {}\n\n async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined | null>;\n },\n ): Promise<T> {\n // The public API is served behind api-gateway under a /v1 prefix — the\n // gateway's route table only matches /v1/... and 404s anything else, so\n // every request must go there regardless of how `path` is written by\n // the resource classes below.\n const url = new URL(`/v1${path}`, this.config.baseUrl);\n\n if (options?.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const headers: Record<string, string> = {\n 'X-API-Key': this.config.apiKey,\n Accept: 'application/json',\n };\n\n let body: string | undefined;\n if (options?.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(options.body);\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.config.timeout);\n\n let response: Response;\n try {\n response = await fetch(url.toString(), {\n method,\n headers,\n body,\n signal: controller.signal,\n });\n } catch (err) {\n // Every failure that can come out of `fetch` itself — timeout, DNS\n // failure, connection refused, TLS error, etc. — is normalized to\n // PaybetaError here, not just AbortError. Previously only the\n // timeout case was wrapped, so callers had to separately handle a\n // raw, unwrapped TypeError/AggregateError from `fetch` for every\n // other kind of network failure; PaybetaApiError is reserved for\n // \"the API responded, and it was an error,\" which none of these\n // are. The original error is preserved as `cause` for debugging.\n if (err instanceof Error && err.name === 'AbortError') {\n throw new PaybetaError(`Request timed out after ${this.config.timeout}ms`, { cause: err });\n }\n const detail = err instanceof Error ? err.message : String(err);\n throw new PaybetaError(`Network request to PayBeta failed: ${detail}`, { cause: err });\n } finally {\n clearTimeout(timer);\n }\n\n let payload: unknown;\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n payload = await response.json().catch(() => null);\n } else {\n payload = await response.text().catch(() => null);\n }\n\n if (!response.ok) {\n const errBody = (payload ?? {}) as ApiErrorBody;\n const errDetail = errBody.error ?? {};\n throw new PaybetaApiError(\n response.status,\n errDetail.code ?? String(response.status),\n errDetail.message ?? errBody.message ?? 'Request failed',\n errDetail.traceId ?? '',\n errDetail.timestamp ?? new Date().toISOString(),\n );\n }\n\n return payload as T;\n }\n\n get<T>(path: string, query?: Record<string, string | number | boolean | undefined | null>): Promise<T> {\n return this.request<T>('GET', path, { query });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PATCH', path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Transaction,\n CreateTransactionParams,\n ListTransactionsParams,\n TransactionEvent,\n} from '../types/transactions.js';\nimport type { RequestOptions } from '../types/common.js';\n\nexport class TransactionsResource {\n constructor(private readonly http: HttpClient) {}\n\n create(params: CreateTransactionParams, opts?: RequestOptions): Promise<Transaction> {\n const body = opts?.idempotencyKey\n ? { ...params, idempotencyKey: opts.idempotencyKey }\n : params;\n return this.http.post<Transaction>('/transactions', body);\n }\n\n /**\n * Lists transactions. The bare `/transactions` endpoint is platform-role\n * only — an API-key (merchant) caller gets a 403 there — so passing\n * `merchantId` routes to `/transactions/merchant/:merchantId` instead.\n */\n list(params?: ListTransactionsParams): Promise<Transaction[]> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/transactions/merchant/${merchantId}` : '/transactions';\n return this.http.get<Transaction[]>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Transaction> {\n return this.http.get<Transaction>(`/transactions/${id}`);\n }\n\n listHistory(id: string): Promise<TransactionEvent[]> {\n return this.http.get<TransactionEvent[]>(`/transactions/${id}/history`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Payment,\n PaymentAttempt,\n InitiatePaymentParams,\n ListPaymentsParams,\n} from '../types/payments.js';\n\nexport class PaymentsResource {\n constructor(private readonly http: HttpClient) {}\n\n initiate(params: InitiatePaymentParams): Promise<Payment> {\n const { idempotencyKey, ...rest } = params;\n const body = idempotencyKey ? { ...rest, idempotencyKey } : rest;\n return this.http.post<Payment>('/payments', body);\n }\n\n /**\n * Lists payments. The bare `/payments` endpoint is platform-role only —\n * an API-key (merchant) caller gets a 403 there — so passing `merchantId`\n * (which every merchant API key call needs) routes to\n * `/payments/merchant/:merchantId` instead, matching what the API\n * actually allows a merchant credential to call.\n */\n list(params?: ListPaymentsParams): Promise<Payment[]> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/payments/merchant/${merchantId}` : '/payments';\n return this.http.get<Payment[]>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Payment> {\n return this.http.get<Payment>(`/payments/${id}`);\n }\n\n verify(id: string): Promise<Payment> {\n return this.http.post<Payment>(`/payments/${id}/verify`);\n }\n\n retry(id: string): Promise<Payment> {\n return this.http.post<Payment>(`/payments/${id}/retry`);\n }\n\n listAttempts(id: string): Promise<PaymentAttempt[]> {\n return this.http.get<PaymentAttempt[]>(`/payments/${id}/attempts`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Escrow,\n EscrowBalance,\n EscrowListResponse,\n EscrowConditionsResponse,\n CreateEscrowParams,\n ListEscrowsParams,\n ReleaseEscrowParams,\n ConfirmDeliveryParams,\n ConfirmBuyerParams,\n} from '../types/escrows.js';\nimport type { RequestOptions } from '../types/common.js';\n\nexport class EscrowsResource {\n constructor(private readonly http: HttpClient) {}\n\n create(params: CreateEscrowParams, opts?: RequestOptions): Promise<Escrow> {\n const body = opts?.idempotencyKey\n ? { ...params, idempotencyKey: opts.idempotencyKey }\n : params;\n return this.http.post<Escrow>('/escrows', body);\n }\n\n /**\n * Lists escrows. The bare `/escrows` endpoint is platform-role only — an\n * API-key (merchant) caller gets a 403 there — so passing `merchantId`\n * routes to `/escrows/merchant/:merchantId` instead. Unlike\n * payments/transactions/disputes, this returns a `{ escrows, total,\n * limit, offset }` envelope rather than a bare array.\n */\n list(params?: ListEscrowsParams): Promise<EscrowListResponse> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/escrows/merchant/${merchantId}` : '/escrows';\n return this.http.get<EscrowListResponse>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Escrow> {\n return this.http.get<Escrow>(`/escrows/${id}`);\n }\n\n retrieveBalance(id: string): Promise<EscrowBalance> {\n return this.http.get<EscrowBalance>(`/escrows/${id}/balance`);\n }\n\n retrieveConditions(id: string): Promise<EscrowConditionsResponse> {\n return this.http.get<EscrowConditionsResponse>(`/escrows/${id}/conditions`);\n }\n\n release(id: string, params?: ReleaseEscrowParams): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/release`, params);\n }\n\n refund(id: string): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/refund`);\n }\n\n dispute(id: string): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/dispute`);\n }\n\n cancel(id: string): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/cancel`);\n }\n\n confirmDelivery(id: string, params?: ConfirmDeliveryParams): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/confirm-delivery`, params);\n }\n\n confirmBuyer(id: string, params?: ConfirmBuyerParams): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/confirm-buyer`, params);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Dispute,\n Evidence,\n OpenDisputeParams,\n ListDisputesParams,\n UploadEvidenceParams,\n ResolveDisputeParams,\n CancelDisputeParams,\n} from '../types/disputes.js';\n\nexport class DisputesResource {\n constructor(private readonly http: HttpClient) {}\n\n open(params: OpenDisputeParams): Promise<Dispute> {\n return this.http.post<Dispute>('/disputes', params);\n }\n\n /**\n * Lists disputes. The bare `/disputes` endpoint is platform-role only —\n * an API-key (merchant) caller gets a 403 there — so passing\n * `merchantId` routes to `/disputes/merchant/:merchantId` instead.\n */\n list(params?: ListDisputesParams): Promise<Dispute[]> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/disputes/merchant/${merchantId}` : '/disputes';\n return this.http.get<Dispute[]>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Dispute> {\n return this.http.get<Dispute>(`/disputes/${id}`);\n }\n\n listEvidence(id: string): Promise<Evidence[]> {\n return this.http.get<Evidence[]>(`/disputes/${id}/evidence`);\n }\n\n uploadEvidence(id: string, params: UploadEvidenceParams): Promise<Evidence> {\n return this.http.post<Evidence>(`/disputes/${id}/evidence`, params);\n }\n\n resolve(id: string, params: ResolveDisputeParams): Promise<Dispute> {\n return this.http.post<Dispute>(`/disputes/${id}/resolve`, params);\n }\n\n cancel(id: string, params: CancelDisputeParams): Promise<Dispute> {\n return this.http.post<Dispute>(`/disputes/${id}/cancel`, params);\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto';\nimport { PaybetaError } from '../errors.js';\nimport type { WebhookEvent } from '../types/webhooks.js';\n\nexport class WebhooksResource {\n constructor(private readonly secret: string) {}\n\n /**\n * Verifies the signature on an incoming webhook and parses the payload.\n *\n * PayBeta signs the concatenation of the delivery timestamp and the raw\n * request body — `HMAC-SHA256(secret, \"${timestamp}.${rawBody}\")` — and\n * sends the result hex-encoded, prefixed with `sha256=`, in the\n * `X-PayBeta-Signature` header (see OutboundWebhookService). The\n * timestamp itself arrives separately in `X-PayBeta-Timestamp`, so both\n * headers are required here, not just the signature.\n *\n * Pass the raw request body (before JSON parsing), the value of the\n * `X-PayBeta-Signature` header, and the value of the `X-PayBeta-Timestamp`\n * header. Throws `PaybetaError` if the signature is invalid or the\n * secret was not configured.\n */\n constructEvent<T = unknown>(\n rawBody: string | Buffer,\n signature: string,\n timestamp: string,\n ): WebhookEvent<T> {\n if (!this.secret) {\n throw new PaybetaError(\n 'webhookSecret must be set on PaybetaClient to verify webhook signatures',\n );\n }\n\n const body = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8');\n\n // Accept the header verbatim (`sha256=<hex>`) or a bare hex digest, so\n // callers who've already stripped the prefix don't get a confusing\n // \"invalid signature format\" error.\n const hexSignature = signature.startsWith('sha256=') ? signature.slice('sha256='.length) : signature;\n\n const expected = createHmac('sha256', this.secret)\n .update(`${timestamp}.${body}`)\n .digest('hex');\n\n let actual: Buffer;\n let expectedBuf: Buffer;\n try {\n actual = Buffer.from(hexSignature, 'hex');\n expectedBuf = Buffer.from(expected, 'hex');\n } catch {\n throw new PaybetaError('Invalid signature format');\n }\n\n if (expectedBuf.length !== actual.length || !timingSafeEqual(expectedBuf, actual)) {\n throw new PaybetaError('Webhook signature verification failed');\n }\n\n return JSON.parse(body) as WebhookEvent<T>;\n }\n}\n","import { HttpClient } from './http.js';\nimport { TransactionsResource } from './resources/transactions.js';\nimport { PaymentsResource } from './resources/payments.js';\nimport { EscrowsResource } from './resources/escrows.js';\nimport { DisputesResource } from './resources/disputes.js';\nimport { WebhooksResource } from './resources/webhooks.js';\n\nexport interface PaybetaClientConfig {\n /** API key obtained from the Paybeta dashboard (pb_live_* or pb_test_*) */\n apiKey: string;\n /** Override the default API base URL. Defaults to https://api.usepaybeta.com */\n baseUrl?: string;\n /** Webhook signing secret used to verify incoming webhook payloads */\n webhookSecret?: string;\n /** Request timeout in milliseconds. Defaults to 30000 */\n timeout?: number;\n}\n\nexport class PaybetaClient {\n readonly transactions: TransactionsResource;\n readonly payments: PaymentsResource;\n readonly escrows: EscrowsResource;\n readonly disputes: DisputesResource;\n readonly webhooks: WebhooksResource;\n\n constructor(config: PaybetaClientConfig) {\n if (!config.apiKey) {\n throw new Error('PaybetaClient: apiKey is required');\n }\n\n const http = new HttpClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.usepaybeta.com',\n timeout: config.timeout ?? 30_000,\n });\n\n this.transactions = new TransactionsResource(http);\n this.payments = new PaymentsResource(http);\n this.escrows = new EscrowsResource(http);\n this.disputes = new DisputesResource(http);\n this.webhooks = new WebhooksResource(config.webhookSecret ?? '');\n }\n}\n"]}
package/dist/index.mjs CHANGED
@@ -2,8 +2,8 @@ import { createHmac, timingSafeEqual } from 'crypto';
2
2
 
3
3
  // src/errors.ts
4
4
  var PaybetaError = class extends Error {
5
- constructor(message) {
6
- super(message);
5
+ constructor(message, options) {
6
+ super(message, options?.cause !== void 0 ? { cause: options.cause } : void 0);
7
7
  this.name = "PaybetaError";
8
8
  Object.setPrototypeOf(this, new.target.prototype);
9
9
  }
@@ -55,9 +55,10 @@ var HttpClient = class {
55
55
  });
56
56
  } catch (err) {
57
57
  if (err instanceof Error && err.name === "AbortError") {
58
- throw new PaybetaError(`Request timed out after ${this.config.timeout}ms`);
58
+ throw new PaybetaError(`Request timed out after ${this.config.timeout}ms`, { cause: err });
59
59
  }
60
- throw err;
60
+ const detail = err instanceof Error ? err.message : String(err);
61
+ throw new PaybetaError(`Network request to PayBeta failed: ${detail}`, { cause: err });
61
62
  } finally {
62
63
  clearTimeout(timer);
63
64
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/transactions.ts","../src/resources/payments.ts","../src/resources/escrows.ts","../src/resources/disputes.ts","../src/resources/webhooks.ts","../src/client.ts"],"names":[],"mappings":";;;AAAO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;AAEO,IAAM,eAAA,GAAN,cAA8B,YAAA,CAAa;AAAA,EAMhD,WAAA,CAAY,MAAA,EAAgB,IAAA,EAAc,OAAA,EAAiB,SAAiB,SAAA,EAAmB;AAC7F,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,GAAA,CAAA,MAAA,CAAW,SAAS,CAAA;AAAA,EAClD;AACF;;;ACLO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,MAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA2B;AAAA,EAExD,MAAM,OAAA,CACJ,MAAA,EACA,IAAA,EACA,OAAA,EAIY;AAKZ,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,OAAO,CAAA;AAErD,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxD,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,UAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,WAAA,EAAa,KAAK,MAAA,CAAO,MAAA;AAAA,MACzB,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,OAAA,EAAS,SAAS,MAAA,EAAW;AAC/B,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAC1B,MAAA,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,OAAO,CAAA;AAEtE,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS,EAAG;AAAA,QACrC,MAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACrD,QAAA,MAAM,IAAI,YAAA,CAAa,CAAA,wBAAA,EAA2B,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,MAC3E;AACA,MAAA,MAAM,GAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAEA,IAAA,IAAI,OAAA;AACJ,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAC5D,IAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC5C,MAAA,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,OAAA,GAAW,WAAW,EAAC;AAC7B,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,IAAS,EAAC;AACpC,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,QAAA,CAAS,MAAA;AAAA,QACT,SAAA,CAAU,IAAA,IAAQ,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA;AAAA,QACxC,SAAA,CAAU,OAAA,IAAW,OAAA,CAAQ,OAAA,IAAW,gBAAA;AAAA,QACxC,UAAU,OAAA,IAAW,EAAA;AAAA,QACrB,SAAA,CAAU,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA;AAAY,OAChD;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,GAAA,CAAO,MAAc,KAAA,EAAkF;AACrG,IAAA,OAAO,KAAK,OAAA,CAAW,KAAA,EAAO,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEA,IAAA,CAAQ,MAAc,IAAA,EAA4B;AAChD,IAAA,OAAO,KAAK,OAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,EAC/C;AAAA,EAEA,KAAA,CAAS,MAAc,IAAA,EAA4B;AACjD,IAAA,OAAO,KAAK,OAAA,CAAW,OAAA,EAAS,IAAA,EAAM,EAAE,MAAM,CAAA;AAAA,EAChD;AAAA,EAEA,OAAU,IAAA,EAA0B;AAClC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,QAAA,EAAU,IAAI,CAAA;AAAA,EACvC;AACF,CAAA;;;ACvGO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEhD,MAAA,CAAO,QAAiC,IAAA,EAA6C;AACnF,IAAA,MAAM,IAAA,GAAO,MAAM,cAAA,GACf,EAAE,GAAG,MAAA,EAAQ,cAAA,EAAgB,IAAA,CAAK,cAAA,EAAe,GACjD,MAAA;AACJ,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAkB,eAAA,EAAiB,IAAI,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,MAAA,EAAyD;AAC5D,IAAA,MAAM,EAAE,UAAA,EAAY,GAAG,IAAA,EAAK,GAAI,UAAU,EAAC;AAC3C,IAAA,MAAM,IAAA,GAAO,UAAA,GAAa,CAAA,uBAAA,EAA0B,UAAU,CAAA,CAAA,GAAK,eAAA;AACnE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,IAAA,EAAM,IAAmD,CAAA;AAAA,EAC/F;AAAA,EAEA,SAAS,EAAA,EAAkC;AACzC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAiB,CAAA,cAAA,EAAiB,EAAE,CAAA,CAAE,CAAA;AAAA,EACzD;AAAA,EAEA,YAAY,EAAA,EAAyC;AACnD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAwB,CAAA,cAAA,EAAiB,EAAE,CAAA,QAAA,CAAU,CAAA;AAAA,EACxE;AACF,CAAA;;;AC7BO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEhD,SAAS,MAAA,EAAiD;AACxD,IAAA,MAAM,EAAE,cAAA,EAAgB,GAAG,IAAA,EAAK,GAAI,MAAA;AACpC,IAAA,MAAM,OAAO,cAAA,GAAiB,EAAE,GAAG,IAAA,EAAM,gBAAe,GAAI,IAAA;AAC5D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAc,WAAA,EAAa,IAAI,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAK,MAAA,EAAiD;AACpD,IAAA,MAAM,EAAE,UAAA,EAAY,GAAG,IAAA,EAAK,GAAI,UAAU,EAAC;AAC3C,IAAA,MAAM,IAAA,GAAO,UAAA,GAAa,CAAA,mBAAA,EAAsB,UAAU,CAAA,CAAA,GAAK,WAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,IAAA,EAAM,IAAmD,CAAA;AAAA,EAC3F;AAAA,EAEA,SAAS,EAAA,EAA8B;AACrC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,CAAA,UAAA,EAAa,EAAE,CAAA,CAAE,CAAA;AAAA,EACjD;AAAA,EAEA,OAAO,EAAA,EAA8B;AACnC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAc,CAAA,UAAA,EAAa,EAAE,CAAA,OAAA,CAAS,CAAA;AAAA,EACzD;AAAA,EAEA,MAAM,EAAA,EAA8B;AAClC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAc,CAAA,UAAA,EAAa,EAAE,CAAA,MAAA,CAAQ,CAAA;AAAA,EACxD;AAAA,EAEA,aAAa,EAAA,EAAuC;AAClD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAsB,CAAA,UAAA,EAAa,EAAE,CAAA,SAAA,CAAW,CAAA;AAAA,EACnE;AACF,CAAA;;;AC/BO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEhD,MAAA,CAAO,QAA4B,IAAA,EAAwC;AACzE,IAAA,MAAM,IAAA,GAAO,MAAM,cAAA,GACf,EAAE,GAAG,MAAA,EAAQ,cAAA,EAAgB,IAAA,CAAK,cAAA,EAAe,GACjD,MAAA;AACJ,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAa,UAAA,EAAY,IAAI,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAK,MAAA,EAAyD;AAC5D,IAAA,MAAM,EAAE,UAAA,EAAY,GAAG,IAAA,EAAK,GAAI,UAAU,EAAC;AAC3C,IAAA,MAAM,IAAA,GAAO,UAAA,GAAa,CAAA,kBAAA,EAAqB,UAAU,CAAA,CAAA,GAAK,UAAA;AAC9D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAwB,IAAA,EAAM,IAAmD,CAAA;AAAA,EACpG;AAAA,EAEA,SAAS,EAAA,EAA6B;AACpC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAY,CAAA,SAAA,EAAY,EAAE,CAAA,CAAE,CAAA;AAAA,EAC/C;AAAA,EAEA,gBAAgB,EAAA,EAAoC;AAClD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAmB,CAAA,SAAA,EAAY,EAAE,CAAA,QAAA,CAAU,CAAA;AAAA,EAC9D;AAAA,EAEA,mBAAmB,EAAA,EAA+C;AAChE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAA8B,CAAA,SAAA,EAAY,EAAE,CAAA,WAAA,CAAa,CAAA;AAAA,EAC5E;AAAA,EAEA,OAAA,CAAQ,IAAY,MAAA,EAA+C;AACjE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAa,CAAA,SAAA,EAAY,EAAE,YAAY,MAAM,CAAA;AAAA,EAChE;AAAA,EAEA,OAAO,EAAA,EAA6B;AAClC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAa,CAAA,SAAA,EAAY,EAAE,CAAA,OAAA,CAAS,CAAA;AAAA,EACvD;AAAA,EAEA,QAAQ,EAAA,EAA6B;AACnC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAa,CAAA,SAAA,EAAY,EAAE,CAAA,QAAA,CAAU,CAAA;AAAA,EACxD;AAAA,EAEA,OAAO,EAAA,EAA6B;AAClC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAa,CAAA,SAAA,EAAY,EAAE,CAAA,OAAA,CAAS,CAAA;AAAA,EACvD;AAAA,EAEA,eAAA,CAAgB,IAAY,MAAA,EAAiD;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAa,CAAA,SAAA,EAAY,EAAE,qBAAqB,MAAM,CAAA;AAAA,EACzE;AAAA,EAEA,YAAA,CAAa,IAAY,MAAA,EAA8C;AACrE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAa,CAAA,SAAA,EAAY,EAAE,kBAAkB,MAAM,CAAA;AAAA,EACtE;AACF,CAAA;;;AC7DO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAEhD,KAAK,MAAA,EAA6C;AAChD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAc,WAAA,EAAa,MAAM,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,MAAA,EAAiD;AACpD,IAAA,MAAM,EAAE,UAAA,EAAY,GAAG,IAAA,EAAK,GAAI,UAAU,EAAC;AAC3C,IAAA,MAAM,IAAA,GAAO,UAAA,GAAa,CAAA,mBAAA,EAAsB,UAAU,CAAA,CAAA,GAAK,WAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAe,IAAA,EAAM,IAAmD,CAAA;AAAA,EAC3F;AAAA,EAEA,SAAS,EAAA,EAA8B;AACrC,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAa,CAAA,UAAA,EAAa,EAAE,CAAA,CAAE,CAAA;AAAA,EACjD;AAAA,EAEA,aAAa,EAAA,EAAiC;AAC5C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAgB,CAAA,UAAA,EAAa,EAAE,CAAA,SAAA,CAAW,CAAA;AAAA,EAC7D;AAAA,EAEA,cAAA,CAAe,IAAY,MAAA,EAAiD;AAC1E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAe,CAAA,UAAA,EAAa,EAAE,aAAa,MAAM,CAAA;AAAA,EACpE;AAAA,EAEA,OAAA,CAAQ,IAAY,MAAA,EAAgD;AAClE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAc,CAAA,UAAA,EAAa,EAAE,YAAY,MAAM,CAAA;AAAA,EAClE;AAAA,EAEA,MAAA,CAAO,IAAY,MAAA,EAA+C;AAChE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAc,CAAA,UAAA,EAAa,EAAE,WAAW,MAAM,CAAA;AAAA,EACjE;AACF,CAAA;AC5CO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,MAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiB9C,cAAA,CACE,OAAA,EACA,SAAA,EACA,SAAA,EACiB;AACjB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,MAAM,IAAI,YAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,OAAO,OAAA,KAAY,WAAW,OAAA,GAAU,OAAA,CAAQ,SAAS,MAAM,CAAA;AAK5E,IAAA,MAAM,YAAA,GAAe,UAAU,UAAA,CAAW,SAAS,IAAI,SAAA,CAAU,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA,GAAI,SAAA;AAE3F,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,QAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAC9C,MAAA,CAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA,CAC7B,OAAO,KAAK,CAAA;AAEf,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,YAAA,EAAc,KAAK,CAAA;AACxC,MAAA,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,QAAA,EAAU,KAAK,CAAA;AAAA,IAC3C,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,aAAa,0BAA0B,CAAA;AAAA,IACnD;AAEA,IAAA,IAAI,WAAA,CAAY,WAAW,MAAA,CAAO,MAAA,IAAU,CAAC,eAAA,CAAgB,WAAA,EAAa,MAAM,CAAA,EAAG;AACjF,MAAA,MAAM,IAAI,aAAa,uCAAuC,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB;AACF,CAAA;;;ACzCO,IAAM,gBAAN,MAAoB;AAAA,EAOzB,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW;AAAA,MAC1B,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS,OAAO,OAAA,IAAW,4BAAA;AAAA,MAC3B,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC5B,CAAA;AAED,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,oBAAA,CAAqB,IAAI,CAAA;AACjD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,eAAA,CAAgB,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,gBAAA,CAAiB,MAAA,CAAO,iBAAiB,EAAE,CAAA;AAAA,EACjE;AACF","file":"index.mjs","sourcesContent":["export class PaybetaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'PaybetaError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class PaybetaApiError extends PaybetaError {\n readonly status: number;\n readonly code: string;\n readonly traceId: string;\n readonly timestamp: string;\n\n constructor(status: number, code: string, message: string, traceId: string, timestamp: string) {\n super(message);\n this.name = 'PaybetaApiError';\n this.status = status;\n this.code = code;\n this.traceId = traceId;\n this.timestamp = timestamp;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { PaybetaApiError, PaybetaError } from './errors.js';\n\nexport interface HttpClientConfig {\n apiKey: string;\n baseUrl: string;\n timeout: number;\n}\n\ninterface ApiErrorBody {\n error?: {\n code?: string;\n message?: string;\n traceId?: string;\n timestamp?: string;\n };\n message?: string;\n}\n\nexport class HttpClient {\n constructor(private readonly config: HttpClientConfig) {}\n\n async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined | null>;\n },\n ): Promise<T> {\n // The public API is served behind api-gateway under a /v1 prefix — the\n // gateway's route table only matches /v1/... and 404s anything else, so\n // every request must go there regardless of how `path` is written by\n // the resource classes below.\n const url = new URL(`/v1${path}`, this.config.baseUrl);\n\n if (options?.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const headers: Record<string, string> = {\n 'X-API-Key': this.config.apiKey,\n Accept: 'application/json',\n };\n\n let body: string | undefined;\n if (options?.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(options.body);\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.config.timeout);\n\n let response: Response;\n try {\n response = await fetch(url.toString(), {\n method,\n headers,\n body,\n signal: controller.signal,\n });\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n throw new PaybetaError(`Request timed out after ${this.config.timeout}ms`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n\n let payload: unknown;\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n payload = await response.json().catch(() => null);\n } else {\n payload = await response.text().catch(() => null);\n }\n\n if (!response.ok) {\n const errBody = (payload ?? {}) as ApiErrorBody;\n const errDetail = errBody.error ?? {};\n throw new PaybetaApiError(\n response.status,\n errDetail.code ?? String(response.status),\n errDetail.message ?? errBody.message ?? 'Request failed',\n errDetail.traceId ?? '',\n errDetail.timestamp ?? new Date().toISOString(),\n );\n }\n\n return payload as T;\n }\n\n get<T>(path: string, query?: Record<string, string | number | boolean | undefined | null>): Promise<T> {\n return this.request<T>('GET', path, { query });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PATCH', path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Transaction,\n CreateTransactionParams,\n ListTransactionsParams,\n TransactionEvent,\n} from '../types/transactions.js';\nimport type { RequestOptions } from '../types/common.js';\n\nexport class TransactionsResource {\n constructor(private readonly http: HttpClient) {}\n\n create(params: CreateTransactionParams, opts?: RequestOptions): Promise<Transaction> {\n const body = opts?.idempotencyKey\n ? { ...params, idempotencyKey: opts.idempotencyKey }\n : params;\n return this.http.post<Transaction>('/transactions', body);\n }\n\n /**\n * Lists transactions. The bare `/transactions` endpoint is platform-role\n * only — an API-key (merchant) caller gets a 403 there — so passing\n * `merchantId` routes to `/transactions/merchant/:merchantId` instead.\n */\n list(params?: ListTransactionsParams): Promise<Transaction[]> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/transactions/merchant/${merchantId}` : '/transactions';\n return this.http.get<Transaction[]>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Transaction> {\n return this.http.get<Transaction>(`/transactions/${id}`);\n }\n\n listHistory(id: string): Promise<TransactionEvent[]> {\n return this.http.get<TransactionEvent[]>(`/transactions/${id}/history`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Payment,\n PaymentAttempt,\n InitiatePaymentParams,\n ListPaymentsParams,\n} from '../types/payments.js';\n\nexport class PaymentsResource {\n constructor(private readonly http: HttpClient) {}\n\n initiate(params: InitiatePaymentParams): Promise<Payment> {\n const { idempotencyKey, ...rest } = params;\n const body = idempotencyKey ? { ...rest, idempotencyKey } : rest;\n return this.http.post<Payment>('/payments', body);\n }\n\n /**\n * Lists payments. The bare `/payments` endpoint is platform-role only —\n * an API-key (merchant) caller gets a 403 there — so passing `merchantId`\n * (which every merchant API key call needs) routes to\n * `/payments/merchant/:merchantId` instead, matching what the API\n * actually allows a merchant credential to call.\n */\n list(params?: ListPaymentsParams): Promise<Payment[]> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/payments/merchant/${merchantId}` : '/payments';\n return this.http.get<Payment[]>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Payment> {\n return this.http.get<Payment>(`/payments/${id}`);\n }\n\n verify(id: string): Promise<Payment> {\n return this.http.post<Payment>(`/payments/${id}/verify`);\n }\n\n retry(id: string): Promise<Payment> {\n return this.http.post<Payment>(`/payments/${id}/retry`);\n }\n\n listAttempts(id: string): Promise<PaymentAttempt[]> {\n return this.http.get<PaymentAttempt[]>(`/payments/${id}/attempts`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Escrow,\n EscrowBalance,\n EscrowListResponse,\n EscrowConditionsResponse,\n CreateEscrowParams,\n ListEscrowsParams,\n ReleaseEscrowParams,\n ConfirmDeliveryParams,\n ConfirmBuyerParams,\n} from '../types/escrows.js';\nimport type { RequestOptions } from '../types/common.js';\n\nexport class EscrowsResource {\n constructor(private readonly http: HttpClient) {}\n\n create(params: CreateEscrowParams, opts?: RequestOptions): Promise<Escrow> {\n const body = opts?.idempotencyKey\n ? { ...params, idempotencyKey: opts.idempotencyKey }\n : params;\n return this.http.post<Escrow>('/escrows', body);\n }\n\n /**\n * Lists escrows. The bare `/escrows` endpoint is platform-role only — an\n * API-key (merchant) caller gets a 403 there — so passing `merchantId`\n * routes to `/escrows/merchant/:merchantId` instead. Unlike\n * payments/transactions/disputes, this returns a `{ escrows, total,\n * limit, offset }` envelope rather than a bare array.\n */\n list(params?: ListEscrowsParams): Promise<EscrowListResponse> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/escrows/merchant/${merchantId}` : '/escrows';\n return this.http.get<EscrowListResponse>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Escrow> {\n return this.http.get<Escrow>(`/escrows/${id}`);\n }\n\n retrieveBalance(id: string): Promise<EscrowBalance> {\n return this.http.get<EscrowBalance>(`/escrows/${id}/balance`);\n }\n\n retrieveConditions(id: string): Promise<EscrowConditionsResponse> {\n return this.http.get<EscrowConditionsResponse>(`/escrows/${id}/conditions`);\n }\n\n release(id: string, params?: ReleaseEscrowParams): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/release`, params);\n }\n\n refund(id: string): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/refund`);\n }\n\n dispute(id: string): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/dispute`);\n }\n\n cancel(id: string): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/cancel`);\n }\n\n confirmDelivery(id: string, params?: ConfirmDeliveryParams): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/confirm-delivery`, params);\n }\n\n confirmBuyer(id: string, params?: ConfirmBuyerParams): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/confirm-buyer`, params);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Dispute,\n Evidence,\n OpenDisputeParams,\n ListDisputesParams,\n UploadEvidenceParams,\n ResolveDisputeParams,\n CancelDisputeParams,\n} from '../types/disputes.js';\n\nexport class DisputesResource {\n constructor(private readonly http: HttpClient) {}\n\n open(params: OpenDisputeParams): Promise<Dispute> {\n return this.http.post<Dispute>('/disputes', params);\n }\n\n /**\n * Lists disputes. The bare `/disputes` endpoint is platform-role only —\n * an API-key (merchant) caller gets a 403 there — so passing\n * `merchantId` routes to `/disputes/merchant/:merchantId` instead.\n */\n list(params?: ListDisputesParams): Promise<Dispute[]> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/disputes/merchant/${merchantId}` : '/disputes';\n return this.http.get<Dispute[]>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Dispute> {\n return this.http.get<Dispute>(`/disputes/${id}`);\n }\n\n listEvidence(id: string): Promise<Evidence[]> {\n return this.http.get<Evidence[]>(`/disputes/${id}/evidence`);\n }\n\n uploadEvidence(id: string, params: UploadEvidenceParams): Promise<Evidence> {\n return this.http.post<Evidence>(`/disputes/${id}/evidence`, params);\n }\n\n resolve(id: string, params: ResolveDisputeParams): Promise<Dispute> {\n return this.http.post<Dispute>(`/disputes/${id}/resolve`, params);\n }\n\n cancel(id: string, params: CancelDisputeParams): Promise<Dispute> {\n return this.http.post<Dispute>(`/disputes/${id}/cancel`, params);\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto';\nimport { PaybetaError } from '../errors.js';\nimport type { WebhookEvent } from '../types/webhooks.js';\n\nexport class WebhooksResource {\n constructor(private readonly secret: string) {}\n\n /**\n * Verifies the signature on an incoming webhook and parses the payload.\n *\n * PayBeta signs the concatenation of the delivery timestamp and the raw\n * request body — `HMAC-SHA256(secret, \"${timestamp}.${rawBody}\")` — and\n * sends the result hex-encoded, prefixed with `sha256=`, in the\n * `X-PayBeta-Signature` header (see OutboundWebhookService). The\n * timestamp itself arrives separately in `X-PayBeta-Timestamp`, so both\n * headers are required here, not just the signature.\n *\n * Pass the raw request body (before JSON parsing), the value of the\n * `X-PayBeta-Signature` header, and the value of the `X-PayBeta-Timestamp`\n * header. Throws `PaybetaError` if the signature is invalid or the\n * secret was not configured.\n */\n constructEvent<T = unknown>(\n rawBody: string | Buffer,\n signature: string,\n timestamp: string,\n ): WebhookEvent<T> {\n if (!this.secret) {\n throw new PaybetaError(\n 'webhookSecret must be set on PaybetaClient to verify webhook signatures',\n );\n }\n\n const body = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8');\n\n // Accept the header verbatim (`sha256=<hex>`) or a bare hex digest, so\n // callers who've already stripped the prefix don't get a confusing\n // \"invalid signature format\" error.\n const hexSignature = signature.startsWith('sha256=') ? signature.slice('sha256='.length) : signature;\n\n const expected = createHmac('sha256', this.secret)\n .update(`${timestamp}.${body}`)\n .digest('hex');\n\n let actual: Buffer;\n let expectedBuf: Buffer;\n try {\n actual = Buffer.from(hexSignature, 'hex');\n expectedBuf = Buffer.from(expected, 'hex');\n } catch {\n throw new PaybetaError('Invalid signature format');\n }\n\n if (expectedBuf.length !== actual.length || !timingSafeEqual(expectedBuf, actual)) {\n throw new PaybetaError('Webhook signature verification failed');\n }\n\n return JSON.parse(body) as WebhookEvent<T>;\n }\n}\n","import { HttpClient } from './http.js';\nimport { TransactionsResource } from './resources/transactions.js';\nimport { PaymentsResource } from './resources/payments.js';\nimport { EscrowsResource } from './resources/escrows.js';\nimport { DisputesResource } from './resources/disputes.js';\nimport { WebhooksResource } from './resources/webhooks.js';\n\nexport interface PaybetaClientConfig {\n /** API key obtained from the Paybeta dashboard (pb_live_* or pb_test_*) */\n apiKey: string;\n /** Override the default API base URL. Defaults to https://api.usepaybeta.com */\n baseUrl?: string;\n /** Webhook signing secret used to verify incoming webhook payloads */\n webhookSecret?: string;\n /** Request timeout in milliseconds. Defaults to 30000 */\n timeout?: number;\n}\n\nexport class PaybetaClient {\n readonly transactions: TransactionsResource;\n readonly payments: PaymentsResource;\n readonly escrows: EscrowsResource;\n readonly disputes: DisputesResource;\n readonly webhooks: WebhooksResource;\n\n constructor(config: PaybetaClientConfig) {\n if (!config.apiKey) {\n throw new Error('PaybetaClient: apiKey is required');\n }\n\n const http = new HttpClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.usepaybeta.com',\n timeout: config.timeout ?? 30_000,\n });\n\n this.transactions = new TransactionsResource(http);\n this.payments = new PaymentsResource(http);\n this.escrows = new EscrowsResource(http);\n this.disputes = new DisputesResource(http);\n this.webhooks = new WebhooksResource(config.webhookSecret ?? '');\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/http.ts","../src/resources/transactions.ts","../src/resources/payments.ts","../src/resources/escrows.ts","../src/resources/disputes.ts","../src/resources/webhooks.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export class PaybetaError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options?.cause !== undefined ? { cause: options.cause } : undefined);\n this.name = 'PaybetaError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class PaybetaApiError extends PaybetaError {\n readonly status: number;\n readonly code: string;\n readonly traceId: string;\n readonly timestamp: string;\n\n constructor(status: number, code: string, message: string, traceId: string, timestamp: string) {\n super(message);\n this.name = 'PaybetaApiError';\n this.status = status;\n this.code = code;\n this.traceId = traceId;\n this.timestamp = timestamp;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { PaybetaApiError, PaybetaError } from './errors.js';\n\nexport interface HttpClientConfig {\n apiKey: string;\n baseUrl: string;\n timeout: number;\n}\n\ninterface ApiErrorBody {\n error?: {\n code?: string;\n message?: string;\n traceId?: string;\n timestamp?: string;\n };\n message?: string;\n}\n\nexport class HttpClient {\n constructor(private readonly config: HttpClientConfig) {}\n\n async request<T>(\n method: string,\n path: string,\n options?: {\n body?: unknown;\n query?: Record<string, string | number | boolean | undefined | null>;\n },\n ): Promise<T> {\n // The public API is served behind api-gateway under a /v1 prefix — the\n // gateway's route table only matches /v1/... and 404s anything else, so\n // every request must go there regardless of how `path` is written by\n // the resource classes below.\n const url = new URL(`/v1${path}`, this.config.baseUrl);\n\n if (options?.query) {\n for (const [key, value] of Object.entries(options.query)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const headers: Record<string, string> = {\n 'X-API-Key': this.config.apiKey,\n Accept: 'application/json',\n };\n\n let body: string | undefined;\n if (options?.body !== undefined) {\n headers['Content-Type'] = 'application/json';\n body = JSON.stringify(options.body);\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.config.timeout);\n\n let response: Response;\n try {\n response = await fetch(url.toString(), {\n method,\n headers,\n body,\n signal: controller.signal,\n });\n } catch (err) {\n // Every failure that can come out of `fetch` itself — timeout, DNS\n // failure, connection refused, TLS error, etc. — is normalized to\n // PaybetaError here, not just AbortError. Previously only the\n // timeout case was wrapped, so callers had to separately handle a\n // raw, unwrapped TypeError/AggregateError from `fetch` for every\n // other kind of network failure; PaybetaApiError is reserved for\n // \"the API responded, and it was an error,\" which none of these\n // are. The original error is preserved as `cause` for debugging.\n if (err instanceof Error && err.name === 'AbortError') {\n throw new PaybetaError(`Request timed out after ${this.config.timeout}ms`, { cause: err });\n }\n const detail = err instanceof Error ? err.message : String(err);\n throw new PaybetaError(`Network request to PayBeta failed: ${detail}`, { cause: err });\n } finally {\n clearTimeout(timer);\n }\n\n let payload: unknown;\n const contentType = response.headers.get('content-type') ?? '';\n if (contentType.includes('application/json')) {\n payload = await response.json().catch(() => null);\n } else {\n payload = await response.text().catch(() => null);\n }\n\n if (!response.ok) {\n const errBody = (payload ?? {}) as ApiErrorBody;\n const errDetail = errBody.error ?? {};\n throw new PaybetaApiError(\n response.status,\n errDetail.code ?? String(response.status),\n errDetail.message ?? errBody.message ?? 'Request failed',\n errDetail.traceId ?? '',\n errDetail.timestamp ?? new Date().toISOString(),\n );\n }\n\n return payload as T;\n }\n\n get<T>(path: string, query?: Record<string, string | number | boolean | undefined | null>): Promise<T> {\n return this.request<T>('GET', path, { query });\n }\n\n post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', path, { body });\n }\n\n patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PATCH', path, { body });\n }\n\n delete<T>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Transaction,\n CreateTransactionParams,\n ListTransactionsParams,\n TransactionEvent,\n} from '../types/transactions.js';\nimport type { RequestOptions } from '../types/common.js';\n\nexport class TransactionsResource {\n constructor(private readonly http: HttpClient) {}\n\n create(params: CreateTransactionParams, opts?: RequestOptions): Promise<Transaction> {\n const body = opts?.idempotencyKey\n ? { ...params, idempotencyKey: opts.idempotencyKey }\n : params;\n return this.http.post<Transaction>('/transactions', body);\n }\n\n /**\n * Lists transactions. The bare `/transactions` endpoint is platform-role\n * only — an API-key (merchant) caller gets a 403 there — so passing\n * `merchantId` routes to `/transactions/merchant/:merchantId` instead.\n */\n list(params?: ListTransactionsParams): Promise<Transaction[]> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/transactions/merchant/${merchantId}` : '/transactions';\n return this.http.get<Transaction[]>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Transaction> {\n return this.http.get<Transaction>(`/transactions/${id}`);\n }\n\n listHistory(id: string): Promise<TransactionEvent[]> {\n return this.http.get<TransactionEvent[]>(`/transactions/${id}/history`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Payment,\n PaymentAttempt,\n InitiatePaymentParams,\n ListPaymentsParams,\n} from '../types/payments.js';\n\nexport class PaymentsResource {\n constructor(private readonly http: HttpClient) {}\n\n initiate(params: InitiatePaymentParams): Promise<Payment> {\n const { idempotencyKey, ...rest } = params;\n const body = idempotencyKey ? { ...rest, idempotencyKey } : rest;\n return this.http.post<Payment>('/payments', body);\n }\n\n /**\n * Lists payments. The bare `/payments` endpoint is platform-role only —\n * an API-key (merchant) caller gets a 403 there — so passing `merchantId`\n * (which every merchant API key call needs) routes to\n * `/payments/merchant/:merchantId` instead, matching what the API\n * actually allows a merchant credential to call.\n */\n list(params?: ListPaymentsParams): Promise<Payment[]> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/payments/merchant/${merchantId}` : '/payments';\n return this.http.get<Payment[]>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Payment> {\n return this.http.get<Payment>(`/payments/${id}`);\n }\n\n verify(id: string): Promise<Payment> {\n return this.http.post<Payment>(`/payments/${id}/verify`);\n }\n\n retry(id: string): Promise<Payment> {\n return this.http.post<Payment>(`/payments/${id}/retry`);\n }\n\n listAttempts(id: string): Promise<PaymentAttempt[]> {\n return this.http.get<PaymentAttempt[]>(`/payments/${id}/attempts`);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Escrow,\n EscrowBalance,\n EscrowListResponse,\n EscrowConditionsResponse,\n CreateEscrowParams,\n ListEscrowsParams,\n ReleaseEscrowParams,\n ConfirmDeliveryParams,\n ConfirmBuyerParams,\n} from '../types/escrows.js';\nimport type { RequestOptions } from '../types/common.js';\n\nexport class EscrowsResource {\n constructor(private readonly http: HttpClient) {}\n\n create(params: CreateEscrowParams, opts?: RequestOptions): Promise<Escrow> {\n const body = opts?.idempotencyKey\n ? { ...params, idempotencyKey: opts.idempotencyKey }\n : params;\n return this.http.post<Escrow>('/escrows', body);\n }\n\n /**\n * Lists escrows. The bare `/escrows` endpoint is platform-role only — an\n * API-key (merchant) caller gets a 403 there — so passing `merchantId`\n * routes to `/escrows/merchant/:merchantId` instead. Unlike\n * payments/transactions/disputes, this returns a `{ escrows, total,\n * limit, offset }` envelope rather than a bare array.\n */\n list(params?: ListEscrowsParams): Promise<EscrowListResponse> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/escrows/merchant/${merchantId}` : '/escrows';\n return this.http.get<EscrowListResponse>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Escrow> {\n return this.http.get<Escrow>(`/escrows/${id}`);\n }\n\n retrieveBalance(id: string): Promise<EscrowBalance> {\n return this.http.get<EscrowBalance>(`/escrows/${id}/balance`);\n }\n\n retrieveConditions(id: string): Promise<EscrowConditionsResponse> {\n return this.http.get<EscrowConditionsResponse>(`/escrows/${id}/conditions`);\n }\n\n release(id: string, params?: ReleaseEscrowParams): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/release`, params);\n }\n\n refund(id: string): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/refund`);\n }\n\n dispute(id: string): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/dispute`);\n }\n\n cancel(id: string): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/cancel`);\n }\n\n confirmDelivery(id: string, params?: ConfirmDeliveryParams): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/confirm-delivery`, params);\n }\n\n confirmBuyer(id: string, params?: ConfirmBuyerParams): Promise<Escrow> {\n return this.http.post<Escrow>(`/escrows/${id}/confirm-buyer`, params);\n }\n}\n","import type { HttpClient } from '../http.js';\nimport type {\n Dispute,\n Evidence,\n OpenDisputeParams,\n ListDisputesParams,\n UploadEvidenceParams,\n ResolveDisputeParams,\n CancelDisputeParams,\n} from '../types/disputes.js';\n\nexport class DisputesResource {\n constructor(private readonly http: HttpClient) {}\n\n open(params: OpenDisputeParams): Promise<Dispute> {\n return this.http.post<Dispute>('/disputes', params);\n }\n\n /**\n * Lists disputes. The bare `/disputes` endpoint is platform-role only —\n * an API-key (merchant) caller gets a 403 there — so passing\n * `merchantId` routes to `/disputes/merchant/:merchantId` instead.\n */\n list(params?: ListDisputesParams): Promise<Dispute[]> {\n const { merchantId, ...rest } = params ?? {};\n const path = merchantId ? `/disputes/merchant/${merchantId}` : '/disputes';\n return this.http.get<Dispute[]>(path, rest as Record<string, string | number | undefined>);\n }\n\n retrieve(id: string): Promise<Dispute> {\n return this.http.get<Dispute>(`/disputes/${id}`);\n }\n\n listEvidence(id: string): Promise<Evidence[]> {\n return this.http.get<Evidence[]>(`/disputes/${id}/evidence`);\n }\n\n uploadEvidence(id: string, params: UploadEvidenceParams): Promise<Evidence> {\n return this.http.post<Evidence>(`/disputes/${id}/evidence`, params);\n }\n\n resolve(id: string, params: ResolveDisputeParams): Promise<Dispute> {\n return this.http.post<Dispute>(`/disputes/${id}/resolve`, params);\n }\n\n cancel(id: string, params: CancelDisputeParams): Promise<Dispute> {\n return this.http.post<Dispute>(`/disputes/${id}/cancel`, params);\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto';\nimport { PaybetaError } from '../errors.js';\nimport type { WebhookEvent } from '../types/webhooks.js';\n\nexport class WebhooksResource {\n constructor(private readonly secret: string) {}\n\n /**\n * Verifies the signature on an incoming webhook and parses the payload.\n *\n * PayBeta signs the concatenation of the delivery timestamp and the raw\n * request body — `HMAC-SHA256(secret, \"${timestamp}.${rawBody}\")` — and\n * sends the result hex-encoded, prefixed with `sha256=`, in the\n * `X-PayBeta-Signature` header (see OutboundWebhookService). The\n * timestamp itself arrives separately in `X-PayBeta-Timestamp`, so both\n * headers are required here, not just the signature.\n *\n * Pass the raw request body (before JSON parsing), the value of the\n * `X-PayBeta-Signature` header, and the value of the `X-PayBeta-Timestamp`\n * header. Throws `PaybetaError` if the signature is invalid or the\n * secret was not configured.\n */\n constructEvent<T = unknown>(\n rawBody: string | Buffer,\n signature: string,\n timestamp: string,\n ): WebhookEvent<T> {\n if (!this.secret) {\n throw new PaybetaError(\n 'webhookSecret must be set on PaybetaClient to verify webhook signatures',\n );\n }\n\n const body = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8');\n\n // Accept the header verbatim (`sha256=<hex>`) or a bare hex digest, so\n // callers who've already stripped the prefix don't get a confusing\n // \"invalid signature format\" error.\n const hexSignature = signature.startsWith('sha256=') ? signature.slice('sha256='.length) : signature;\n\n const expected = createHmac('sha256', this.secret)\n .update(`${timestamp}.${body}`)\n .digest('hex');\n\n let actual: Buffer;\n let expectedBuf: Buffer;\n try {\n actual = Buffer.from(hexSignature, 'hex');\n expectedBuf = Buffer.from(expected, 'hex');\n } catch {\n throw new PaybetaError('Invalid signature format');\n }\n\n if (expectedBuf.length !== actual.length || !timingSafeEqual(expectedBuf, actual)) {\n throw new PaybetaError('Webhook signature verification failed');\n }\n\n return JSON.parse(body) as WebhookEvent<T>;\n }\n}\n","import { HttpClient } from './http.js';\nimport { TransactionsResource } from './resources/transactions.js';\nimport { PaymentsResource } from './resources/payments.js';\nimport { EscrowsResource } from './resources/escrows.js';\nimport { DisputesResource } from './resources/disputes.js';\nimport { WebhooksResource } from './resources/webhooks.js';\n\nexport interface PaybetaClientConfig {\n /** API key obtained from the Paybeta dashboard (pb_live_* or pb_test_*) */\n apiKey: string;\n /** Override the default API base URL. Defaults to https://api.usepaybeta.com */\n baseUrl?: string;\n /** Webhook signing secret used to verify incoming webhook payloads */\n webhookSecret?: string;\n /** Request timeout in milliseconds. Defaults to 30000 */\n timeout?: number;\n}\n\nexport class PaybetaClient {\n readonly transactions: TransactionsResource;\n readonly payments: PaymentsResource;\n readonly escrows: EscrowsResource;\n readonly disputes: DisputesResource;\n readonly webhooks: WebhooksResource;\n\n constructor(config: PaybetaClientConfig) {\n if (!config.apiKey) {\n throw new Error('PaybetaClient: apiKey is required');\n }\n\n const http = new HttpClient({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl ?? 'https://api.usepaybeta.com',\n timeout: config.timeout ?? 30_000,\n });\n\n this.transactions = new TransactionsResource(http);\n this.payments = new PaymentsResource(http);\n this.escrows = new EscrowsResource(http);\n this.disputes = new DisputesResource(http);\n this.webhooks = new WebhooksResource(config.webhookSecret ?? '');\n }\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,11 @@
1
1
  {
2
2
  "name": "@paybetaby/node-sdk",
3
- "version": "0.1.1",
3
+ "version": "1.0.0",
4
4
  "description": "Official Node.js SDK for the Paybeta payments API",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/Besaiem/paybeta-node-sdk"
8
+ },
5
9
  "main": "./dist/index.js",
6
10
  "module": "./dist/index.mjs",
7
11
  "types": "./dist/index.d.ts",