@orcarail/node 1.0.2 → 1.0.4

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
@@ -124,8 +124,8 @@ app.post('/webhooks/orcarail', express.raw({ type: 'application/json' }), (req,
124
124
 
125
125
  // Handle the event
126
126
  switch (event.type) {
127
- case 'payment_intent.succeeded':
128
- console.log('Payment succeeded:', event.data.object.id);
127
+ case 'payment_intent.completed':
128
+ console.log('Payment completed:', event.data.object.id);
129
129
  // Fulfill order, send confirmation email, etc.
130
130
  break;
131
131
  case 'payment_intent.processing':
package/dist/index.cjs CHANGED
@@ -73,9 +73,7 @@ var HttpClient = class {
73
73
  * Create Basic Auth header from API key and secret
74
74
  */
75
75
  getAuthHeader() {
76
- const credentials = Buffer.from(`${this.apiKey}:${this.apiSecret}`).toString(
77
- "base64"
78
- );
76
+ const credentials = Buffer.from(`${this.apiKey}:${this.apiSecret}`).toString("base64");
79
77
  return `Basic ${credentials}`;
80
78
  }
81
79
  /**
@@ -89,7 +87,11 @@ var HttpClient = class {
89
87
  * Make an HTTP request with timeout and error handling
90
88
  */
91
89
  async request(method, path, body, requireAuth = true) {
92
- const url = this.buildUrl(path);
90
+ let url = this.buildUrl(path);
91
+ if (method === "GET") {
92
+ const separator = url.includes("?") ? "&" : "?";
93
+ url = `${url}${separator}_=${Date.now()}`;
94
+ }
93
95
  const headers = {
94
96
  "Content-Type": "application/json",
95
97
  "User-Agent": `orcarail-node/${SDK_VERSION}`
@@ -104,6 +106,9 @@ var HttpClient = class {
104
106
  if (body) {
105
107
  options.body = JSON.stringify(body);
106
108
  }
109
+ if (method === "GET") {
110
+ options.cache = "no-store";
111
+ }
107
112
  const controller = new AbortController();
108
113
  const timeoutId = setTimeout(() => controller.abort(), this.timeout);
109
114
  options.signal = controller.signal;
@@ -123,12 +128,7 @@ var HttpClient = class {
123
128
  if (response.status === 401) {
124
129
  throw new OrcaRailAuthenticationError(errorMessage);
125
130
  }
126
- throw new OrcaRailAPIError(
127
- errorMessage,
128
- response.status,
129
- errorType,
130
- responseData
131
- );
131
+ throw new OrcaRailAPIError(errorMessage, response.status, errorType, responseData);
132
132
  }
133
133
  return responseData;
134
134
  } catch (error) {
@@ -138,9 +138,7 @@ var HttpClient = class {
138
138
  }
139
139
  if (error instanceof Error) {
140
140
  if (error.name === "AbortError") {
141
- throw new OrcaRailError(
142
- `Request timeout after ${this.timeout}ms`
143
- );
141
+ throw new OrcaRailError(`Request timeout after ${this.timeout}ms`);
144
142
  }
145
143
  throw new OrcaRailError(`Request failed: ${error.message}`);
146
144
  }
@@ -224,11 +222,7 @@ var PaymentIntents = class {
224
222
  ...params,
225
223
  payment_method_types: params.payment_method_types && params.payment_method_types.length > 0 ? params.payment_method_types : ["crypto"]
226
224
  };
227
- return this.client.post(
228
- "payment_intents",
229
- requestBody,
230
- true
231
- );
225
+ return this.client.post("payment_intents", requestBody, true);
232
226
  }
233
227
  /**
234
228
  * Retrieve a Payment Intent by ID
@@ -279,7 +273,7 @@ var PaymentIntents = class {
279
273
  }
280
274
  /**
281
275
  * Complete a Payment Intent (API: POST /payment_intents/:id/complete).
282
- * Sets the intent to processing and fires the payment_intent.processing webhook.
276
+ * Sets the intent to processing; when payment is done, payment_intent.completed is sent.
283
277
  * Use when the user is redirected to your success/return URL (e.g. https://yourapp.com/success?payment_intent=pi_34).
284
278
  *
285
279
  * @param id - Payment Intent ID (e.g. "pi_34" or "34")
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/resources/checkout.ts","../src/resources/payment-intents.ts","../src/webhooks.ts","../src/index.ts"],"names":["createHmac","timingSafeEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base error class for all OrcaRail errors\n */\nexport class OrcaRailError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OrcaRailError';\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\n/**\n * Error thrown when the API returns a non-2xx status code\n */\nexport class OrcaRailAPIError extends OrcaRailError {\n /**\n * HTTP status code\n */\n public readonly statusCode: number;\n\n /**\n * Error type from the API response\n */\n public readonly type?: string;\n\n /**\n * Additional error details from the API\n */\n public readonly details?: unknown;\n\n constructor(\n message: string,\n statusCode: number,\n type?: string,\n details?: unknown\n ) {\n super(message);\n this.name = 'OrcaRailAPIError';\n this.statusCode = statusCode;\n this.type = type;\n this.details = details;\n }\n}\n\n/**\n * Error thrown when authentication fails (401)\n */\nexport class OrcaRailAuthenticationError extends OrcaRailAPIError {\n constructor(message: string = 'Authentication failed. Please check your API key and secret.') {\n super(message, 401, 'authentication_error');\n this.name = 'OrcaRailAuthenticationError';\n }\n}\n\n/**\n * Error thrown when webhook signature verification fails\n */\nexport class OrcaRailSignatureVerificationError extends OrcaRailError {\n /**\n * The signature that was provided\n */\n public readonly signature: string;\n\n constructor(\n message: string = 'Webhook signature verification failed',\n signature?: string\n ) {\n super(message);\n this.name = 'OrcaRailSignatureVerificationError';\n this.signature = signature || '';\n }\n}\n","import {\n OrcaRailAPIError,\n OrcaRailAuthenticationError,\n OrcaRailError,\n} from './errors';\nimport type { OrcaRailConfig } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.orcarail.com/api/v1';\nconst DEFAULT_TIMEOUT = 30000;\nconst SDK_VERSION = '1.0.0';\n\n/**\n * HTTP client for making requests to the OrcaRail API\n */\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly apiSecret: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(apiKey: string, apiSecret: string, config?: OrcaRailConfig) {\n if (!apiKey || !apiSecret) {\n throw new OrcaRailError('API key and secret are required');\n }\n\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n this.baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n this.timeout = config?.timeout || DEFAULT_TIMEOUT;\n }\n\n /**\n * Create Basic Auth header from API key and secret\n */\n private getAuthHeader(): string {\n const credentials = Buffer.from(`${this.apiKey}:${this.apiSecret}`).toString(\n 'base64'\n );\n return `Basic ${credentials}`;\n }\n\n /**\n * Build full URL from path\n */\n private buildUrl(path: string): string {\n // Remove leading slash if present\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return `${this.baseUrl}/${cleanPath}`;\n }\n\n /**\n * Make an HTTP request with timeout and error handling\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n requireAuth: boolean = true\n ): Promise<T> {\n const url = this.buildUrl(path);\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': `orcarail-node/${SDK_VERSION}`,\n };\n\n if (requireAuth) {\n headers['Authorization'] = this.getAuthHeader();\n }\n\n const options: RequestInit = {\n method,\n headers,\n };\n\n if (body) {\n options.body = JSON.stringify(body);\n }\n\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n options.signal = controller.signal;\n\n try {\n const response = await fetch(url, options);\n clearTimeout(timeoutId);\n\n // Parse response body\n let responseData: unknown;\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n\n // Handle non-2xx responses\n if (!response.ok) {\n const errorMessage =\n typeof responseData === 'object' &&\n responseData !== null &&\n 'message' in responseData\n ? String((responseData as { message: unknown }).message)\n : `API request failed with status ${response.status}`;\n\n const errorType =\n typeof responseData === 'object' &&\n responseData !== null &&\n 'error' in responseData\n ? String((responseData as { error: unknown }).error)\n : undefined;\n\n if (response.status === 401) {\n throw new OrcaRailAuthenticationError(errorMessage);\n }\n\n throw new OrcaRailAPIError(\n errorMessage,\n response.status,\n errorType,\n responseData\n );\n }\n\n return responseData as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof OrcaRailError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new OrcaRailError(\n `Request timeout after ${this.timeout}ms`\n );\n }\n throw new OrcaRailError(`Request failed: ${error.message}`);\n }\n\n throw new OrcaRailError('An unknown error occurred');\n }\n }\n\n /**\n * GET request\n */\n public async get<T>(path: string, requireAuth: boolean = true): Promise<T> {\n return this.request<T>('GET', path, undefined, requireAuth);\n }\n\n /**\n * POST request\n */\n public async post<T>(\n path: string,\n body?: unknown,\n requireAuth: boolean = true\n ): Promise<T> {\n return this.request<T>('POST', path, body, requireAuth);\n }\n\n /**\n * PATCH request\n */\n public async patch<T>(\n path: string,\n body?: unknown,\n requireAuth: boolean = true\n ): Promise<T> {\n return this.request<T>('PATCH', path, body, requireAuth);\n }\n\n /**\n * PUT request\n */\n public async put<T>(\n path: string,\n body?: unknown,\n requireAuth: boolean = true\n ): Promise<T> {\n return this.request<T>('PUT', path, body, requireAuth);\n }\n\n /**\n * DELETE request\n */\n public async delete<T>(\n path: string,\n requireAuth: boolean = true\n ): Promise<T> {\n return this.request<T>('DELETE', path, undefined, requireAuth);\n }\n}\n","import { HttpClient } from '../client';\nimport type { PaymentIntent } from '../types';\n\n/**\n * Checkout resource for slug-based checkout flows (public endpoints)\n */\nexport class Checkout {\n private readonly client: HttpClient;\n\n constructor(client: HttpClient) {\n this.client = client;\n }\n\n /**\n * Get checkout details by slug\n *\n * @param slug - Checkout slug from the payment link URL\n * @returns Checkout details including payment intent\n */\n public async get(slug: string): Promise<PaymentIntent & Record<string, unknown>> {\n const path = `checkout/${encodeURIComponent(slug)}`;\n return this.client.get<PaymentIntent & Record<string, unknown>>(path, true);\n }\n\n /**\n * Cancel payment intent by checkout slug\n *\n * @param slug - Checkout slug from the payment link URL\n * @returns The canceled payment intent and optional cancel_url for redirect\n */\n public async cancel(slug: string): Promise<PaymentIntent & { cancel_url?: string }> {\n const path = `checkout/${encodeURIComponent(slug)}/cancel`;\n return this.client.post<PaymentIntent & { cancel_url?: string }>(path, {}, true);\n }\n}\n","import { HttpClient } from '../client';\nimport type {\n PaymentIntent,\n PaymentIntentConfirmParams,\n PaymentIntentCreateParams,\n PaymentIntentUpdateParams,\n} from '../types';\n\n/**\n * Payment Intents resource for managing payment intents\n */\nexport class PaymentIntents {\n private readonly client: HttpClient;\n\n constructor(client: HttpClient) {\n this.client = client;\n }\n\n /**\n * Create a new Payment Intent\n *\n * @param params - Payment Intent creation parameters\n * @returns The created Payment Intent\n */\n public async create(\n params: PaymentIntentCreateParams\n ): Promise<PaymentIntent> {\n // Ensure payment_method_types defaults to ['crypto'] if empty\n const requestBody = {\n ...params,\n payment_method_types:\n params.payment_method_types && params.payment_method_types.length > 0\n ? params.payment_method_types\n : ['crypto'],\n };\n\n return this.client.post<PaymentIntent>(\n 'payment_intents',\n requestBody,\n true\n );\n }\n\n /**\n * Retrieve a Payment Intent by ID\n *\n * @param id - Payment Intent ID (e.g., \"pi_1234567890\")\n * @returns The Payment Intent\n */\n public async retrieve(id: string): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}`;\n\n return this.client.get<PaymentIntent>(path, true);\n }\n\n /**\n * Cancel a Payment Intent (API: POST /payment_intents/:id/cancel).\n * Use when the user is redirected to your cancel_url (e.g. https://yourapp.com/cancel?payment_intent=pi_20)\n * and you want to mark the intent as canceled on the backend.\n *\n * @param id - Payment Intent ID (e.g. \"pi_20\" or \"20\")\n * @returns The canceled Payment Intent\n *\n * @example\n * // When user lands on https://localhost:3001/cancel?payment_intent=pi_20\n * const intent = await orcarail.paymentIntents.cancel('pi_20');\n */\n public async cancel(id: string): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}/cancel`;\n\n return this.client.post<PaymentIntent>(path, {}, true);\n }\n\n /**\n * Confirm a Payment Intent (API: POST /payment_intents/:id/confirm).\n * Redirects the customer to the hosted checkout page.\n *\n * @param id - Payment Intent ID (e.g. \"pi_20\" or \"20\")\n * @param params - Confirmation parameters including client_secret and return_url\n * @returns The confirmed Payment Intent\n *\n * @example\n * const intent = await orcarail.paymentIntents.confirm('pi_20', {\n * client_secret: intent.client_secret,\n * return_url: 'https://yourapp.com/return',\n * });\n */\n public async confirm(\n id: string,\n params: PaymentIntentConfirmParams\n ): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}/confirm`;\n\n return this.client.post<PaymentIntent>(path, params, false);\n }\n\n /**\n * Complete a Payment Intent (API: POST /payment_intents/:id/complete).\n * Sets the intent to processing and fires the payment_intent.processing webhook.\n * Use when the user is redirected to your success/return URL (e.g. https://yourapp.com/success?payment_intent=pi_34).\n *\n * @param id - Payment Intent ID (e.g. \"pi_34\" or \"34\")\n * @returns The updated Payment Intent (status processing)\n *\n * @example\n * // When user lands on https://localhost:3001/success?payment_intent=pi_34\n * const intent = await orcarail.paymentIntents.complete('pi_34');\n */\n public async complete(id: string): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}/complete`;\n\n return this.client.post<PaymentIntent>(path, {}, true);\n }\n\n /**\n * Update a Payment Intent\n *\n * @param id - Payment Intent ID\n * @param params - Update parameters (all optional)\n * @returns The updated Payment Intent\n */\n public async update(\n id: string,\n params: PaymentIntentUpdateParams\n ): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}`;\n\n return this.client.patch<PaymentIntent>(path, params, true);\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto';\nimport { OrcaRailSignatureVerificationError } from './errors';\nimport type { WebhookEvent } from './types';\n\n/**\n * Webhook utilities for verifying webhook signatures\n */\nexport class Webhooks {\n /**\n * Verify webhook signature\n *\n * @param rawBody - Raw request body (string or Buffer)\n * @param signature - Signature from x-webhook-signature header\n * @param secret - Webhook secret (API key's secretHash)\n * @returns True if signature is valid, false otherwise\n */\n public verifySignature(\n rawBody: string | Buffer,\n signature: string,\n secret: string\n ): boolean {\n if (!signature || !secret) {\n return false;\n }\n\n // Convert rawBody to string if it's a Buffer\n const bodyString =\n typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8');\n\n // Compute expected signature\n const expectedSignature = createHmac('sha256', secret)\n .update(bodyString)\n .digest('hex');\n\n // Compare signatures using timing-safe comparison\n const signatureBuffer = Buffer.from(signature, 'hex');\n const expectedBuffer = Buffer.from(expectedSignature, 'hex');\n\n // Length check first (prevents timing attacks)\n if (signatureBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return timingSafeEqual(signatureBuffer, expectedBuffer);\n }\n\n /**\n * Construct and verify a webhook event from raw body and signature\n *\n * @param rawBody - Raw request body (string or Buffer)\n * @param signature - Signature from x-webhook-signature header\n * @param secret - Webhook secret (API key's secretHash)\n * @returns Parsed webhook event\n * @throws OrcaRailSignatureVerificationError if signature is invalid\n */\n public constructEvent(\n rawBody: string | Buffer,\n signature: string,\n secret: string\n ): WebhookEvent {\n if (!this.verifySignature(rawBody, signature, secret)) {\n throw new OrcaRailSignatureVerificationError(\n 'Webhook signature verification failed. The signature does not match the expected signature.',\n signature\n );\n }\n\n // Parse JSON body\n const bodyString =\n typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8');\n\n try {\n const event = JSON.parse(bodyString) as WebhookEvent;\n return event;\n } catch (error) {\n throw new OrcaRailSignatureVerificationError(\n `Failed to parse webhook body: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n}\n","import { HttpClient } from './client';\nimport { Checkout } from './resources/checkout';\nimport { PaymentIntents } from './resources/payment-intents';\nimport { Webhooks } from './webhooks';\nimport type { OrcaRailConfig } from './types';\n\n// Re-export all types\nexport type {\n OrcaRailConfig,\n PaymentIntent,\n PaymentIntentCreateParams,\n PaymentIntentUpdateParams,\n PaymentIntentConfirmParams,\n PaymentLink,\n LatestTransaction,\n WebhookEvent,\n WebhookEventType,\n WebhookEventData,\n} from './types';\n\n// Re-export all errors\nexport {\n OrcaRailError,\n OrcaRailAPIError,\n OrcaRailAuthenticationError,\n OrcaRailSignatureVerificationError,\n} from './errors';\n\n/**\n * OrcaRail Node.js SDK\n *\n * @example\n * ```typescript\n * import OrcaRail from '@orcarail/node';\n *\n * const orcarail = new OrcaRail('ak_live_xxx', 'sk_live_xxx');\n *\n * // Create a payment intent\n * const intent = await orcarail.paymentIntents.create({\n * amount: '100.00',\n * currency: 'usd',\n * payment_method_types: ['crypto'],\n * tokenId: 1,\n * networkId: 1,\n * return_url: 'https://merchant.example.com/return',\n * });\n * ```\n */\nexport class OrcaRail {\n /**\n * Payment Intents resource\n */\n public readonly paymentIntents: PaymentIntents;\n\n /**\n * Checkout resource (slug-based get/cancel)\n */\n public readonly checkout: Checkout;\n\n /**\n * Webhooks utilities\n */\n public readonly webhooks: Webhooks;\n\n private readonly client: HttpClient;\n\n /**\n * Create a new OrcaRail client instance\n *\n * @param apiKey - Your OrcaRail API key (e.g., \"ak_live_xxx\")\n * @param apiSecret - Your OrcaRail API secret (e.g., \"sk_live_xxx\")\n * @param config - Optional configuration\n */\n constructor(\n apiKey: string,\n apiSecret: string,\n config?: OrcaRailConfig\n ) {\n this.client = new HttpClient(apiKey, apiSecret, config);\n this.paymentIntents = new PaymentIntents(this.client);\n this.checkout = new Checkout(this.client);\n this.webhooks = new Webhooks();\n }\n}\n\nexport default OrcaRail;\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/resources/checkout.ts","../src/resources/payment-intents.ts","../src/webhooks.ts","../src/index.ts"],"names":["createHmac","timingSafeEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Base error class for all OrcaRail errors\n */\nexport class OrcaRailError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OrcaRailError';\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\n/**\n * Error thrown when the API returns a non-2xx status code\n */\nexport class OrcaRailAPIError extends OrcaRailError {\n /**\n * HTTP status code\n */\n public readonly statusCode: number;\n\n /**\n * Error type from the API response\n */\n public readonly type?: string;\n\n /**\n * Additional error details from the API\n */\n public readonly details?: unknown;\n\n constructor(message: string, statusCode: number, type?: string, details?: unknown) {\n super(message);\n this.name = 'OrcaRailAPIError';\n this.statusCode = statusCode;\n this.type = type;\n this.details = details;\n }\n}\n\n/**\n * Error thrown when authentication fails (401)\n */\nexport class OrcaRailAuthenticationError extends OrcaRailAPIError {\n constructor(message: string = 'Authentication failed. Please check your API key and secret.') {\n super(message, 401, 'authentication_error');\n this.name = 'OrcaRailAuthenticationError';\n }\n}\n\n/**\n * Error thrown when webhook signature verification fails\n */\nexport class OrcaRailSignatureVerificationError extends OrcaRailError {\n /**\n * The signature that was provided\n */\n public readonly signature: string;\n\n constructor(message: string = 'Webhook signature verification failed', signature?: string) {\n super(message);\n this.name = 'OrcaRailSignatureVerificationError';\n this.signature = signature || '';\n }\n}\n","import { OrcaRailAPIError, OrcaRailAuthenticationError, OrcaRailError } from './errors';\nimport type { OrcaRailConfig } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.orcarail.com/api/v1';\nconst DEFAULT_TIMEOUT = 30000;\nconst SDK_VERSION = '1.0.0';\n\n/**\n * HTTP client for making requests to the OrcaRail API\n */\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly apiSecret: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(apiKey: string, apiSecret: string, config?: OrcaRailConfig) {\n if (!apiKey || !apiSecret) {\n throw new OrcaRailError('API key and secret are required');\n }\n\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n this.baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n this.timeout = config?.timeout || DEFAULT_TIMEOUT;\n }\n\n /**\n * Create Basic Auth header from API key and secret\n */\n private getAuthHeader(): string {\n const credentials = Buffer.from(`${this.apiKey}:${this.apiSecret}`).toString('base64');\n return `Basic ${credentials}`;\n }\n\n /**\n * Build full URL from path\n */\n private buildUrl(path: string): string {\n // Remove leading slash if present\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return `${this.baseUrl}/${cleanPath}`;\n }\n\n /**\n * Make an HTTP request with timeout and error handling\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n requireAuth: boolean = true\n ): Promise<T> {\n let url = this.buildUrl(path);\n if (method === 'GET') {\n const separator = url.includes('?') ? '&' : '?';\n url = `${url}${separator}_=${Date.now()}`;\n }\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': `orcarail-node/${SDK_VERSION}`,\n };\n\n if (requireAuth) {\n headers['Authorization'] = this.getAuthHeader();\n }\n\n const options: RequestInit = {\n method,\n headers,\n };\n\n if (body) {\n options.body = JSON.stringify(body);\n }\n\n // Disable fetch cache so GET requests always hit the API (e.g. Next.js Data Cache)\n if (method === 'GET') {\n (options as RequestInit & { cache?: 'no-store' }).cache = 'no-store';\n }\n\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n options.signal = controller.signal;\n\n try {\n const response = await fetch(url, options);\n clearTimeout(timeoutId);\n\n // Parse response body\n let responseData: unknown;\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n\n // Handle non-2xx responses\n if (!response.ok) {\n const errorMessage =\n typeof responseData === 'object' && responseData !== null && 'message' in responseData\n ? String((responseData as { message: unknown }).message)\n : `API request failed with status ${response.status}`;\n\n const errorType =\n typeof responseData === 'object' && responseData !== null && 'error' in responseData\n ? String((responseData as { error: unknown }).error)\n : undefined;\n\n if (response.status === 401) {\n throw new OrcaRailAuthenticationError(errorMessage);\n }\n\n throw new OrcaRailAPIError(errorMessage, response.status, errorType, responseData);\n }\n\n return responseData as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof OrcaRailError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new OrcaRailError(`Request timeout after ${this.timeout}ms`);\n }\n throw new OrcaRailError(`Request failed: ${error.message}`);\n }\n\n throw new OrcaRailError('An unknown error occurred');\n }\n }\n\n /**\n * GET request\n */\n public async get<T>(path: string, requireAuth: boolean = true): Promise<T> {\n return this.request<T>('GET', path, undefined, requireAuth);\n }\n\n /**\n * POST request\n */\n public async post<T>(path: string, body?: unknown, requireAuth: boolean = true): Promise<T> {\n return this.request<T>('POST', path, body, requireAuth);\n }\n\n /**\n * PATCH request\n */\n public async patch<T>(path: string, body?: unknown, requireAuth: boolean = true): Promise<T> {\n return this.request<T>('PATCH', path, body, requireAuth);\n }\n\n /**\n * PUT request\n */\n public async put<T>(path: string, body?: unknown, requireAuth: boolean = true): Promise<T> {\n return this.request<T>('PUT', path, body, requireAuth);\n }\n\n /**\n * DELETE request\n */\n public async delete<T>(path: string, requireAuth: boolean = true): Promise<T> {\n return this.request<T>('DELETE', path, undefined, requireAuth);\n }\n}\n","import { HttpClient } from '../client';\nimport type { PaymentIntent } from '../types';\n\n/**\n * Checkout resource for slug-based checkout flows (public endpoints)\n */\nexport class Checkout {\n private readonly client: HttpClient;\n\n constructor(client: HttpClient) {\n this.client = client;\n }\n\n /**\n * Get checkout details by slug\n *\n * @param slug - Checkout slug from the payment link URL\n * @returns Checkout details including payment intent\n */\n public async get(slug: string): Promise<PaymentIntent & Record<string, unknown>> {\n const path = `checkout/${encodeURIComponent(slug)}`;\n return this.client.get<PaymentIntent & Record<string, unknown>>(path, true);\n }\n\n /**\n * Cancel payment intent by checkout slug\n *\n * @param slug - Checkout slug from the payment link URL\n * @returns The canceled payment intent and optional cancel_url for redirect\n */\n public async cancel(slug: string): Promise<PaymentIntent & { cancel_url?: string }> {\n const path = `checkout/${encodeURIComponent(slug)}/cancel`;\n return this.client.post<PaymentIntent & { cancel_url?: string }>(path, {}, true);\n }\n}\n","import { HttpClient } from '../client';\nimport type {\n PaymentIntent,\n PaymentIntentConfirmParams,\n PaymentIntentCreateParams,\n PaymentIntentUpdateParams,\n} from '../types';\n\n/**\n * Payment Intents resource for managing payment intents\n */\nexport class PaymentIntents {\n private readonly client: HttpClient;\n\n constructor(client: HttpClient) {\n this.client = client;\n }\n\n /**\n * Create a new Payment Intent\n *\n * @param params - Payment Intent creation parameters\n * @returns The created Payment Intent\n */\n public async create(params: PaymentIntentCreateParams): Promise<PaymentIntent> {\n // Ensure payment_method_types defaults to ['crypto'] if empty\n const requestBody = {\n ...params,\n payment_method_types:\n params.payment_method_types && params.payment_method_types.length > 0\n ? params.payment_method_types\n : ['crypto'],\n };\n\n return this.client.post<PaymentIntent>('payment_intents', requestBody, true);\n }\n\n /**\n * Retrieve a Payment Intent by ID\n *\n * @param id - Payment Intent ID (e.g., \"pi_1234567890\")\n * @returns The Payment Intent\n */\n public async retrieve(id: string): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}`;\n\n return this.client.get<PaymentIntent>(path, true);\n }\n\n /**\n * Cancel a Payment Intent (API: POST /payment_intents/:id/cancel).\n * Use when the user is redirected to your cancel_url (e.g. https://yourapp.com/cancel?payment_intent=pi_20)\n * and you want to mark the intent as canceled on the backend.\n *\n * @param id - Payment Intent ID (e.g. \"pi_20\" or \"20\")\n * @returns The canceled Payment Intent\n *\n * @example\n * // When user lands on https://localhost:3001/cancel?payment_intent=pi_20\n * const intent = await orcarail.paymentIntents.cancel('pi_20');\n */\n public async cancel(id: string): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}/cancel`;\n\n return this.client.post<PaymentIntent>(path, {}, true);\n }\n\n /**\n * Confirm a Payment Intent (API: POST /payment_intents/:id/confirm).\n * Redirects the customer to the hosted checkout page.\n *\n * @param id - Payment Intent ID (e.g. \"pi_20\" or \"20\")\n * @param params - Confirmation parameters including client_secret and return_url\n * @returns The confirmed Payment Intent\n *\n * @example\n * const intent = await orcarail.paymentIntents.confirm('pi_20', {\n * client_secret: intent.client_secret,\n * return_url: 'https://yourapp.com/return',\n * });\n */\n public async confirm(id: string, params: PaymentIntentConfirmParams): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}/confirm`;\n\n return this.client.post<PaymentIntent>(path, params, false);\n }\n\n /**\n * Complete a Payment Intent (API: POST /payment_intents/:id/complete).\n * Sets the intent to processing; when payment is done, payment_intent.completed is sent.\n * Use when the user is redirected to your success/return URL (e.g. https://yourapp.com/success?payment_intent=pi_34).\n *\n * @param id - Payment Intent ID (e.g. \"pi_34\" or \"34\")\n * @returns The updated Payment Intent (status processing)\n *\n * @example\n * // When user lands on https://localhost:3001/success?payment_intent=pi_34\n * const intent = await orcarail.paymentIntents.complete('pi_34');\n */\n public async complete(id: string): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}/complete`;\n\n return this.client.post<PaymentIntent>(path, {}, true);\n }\n\n /**\n * Update a Payment Intent\n *\n * @param id - Payment Intent ID\n * @param params - Update parameters (all optional)\n * @returns The updated Payment Intent\n */\n public async update(id: string, params: PaymentIntentUpdateParams): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}`;\n\n return this.client.patch<PaymentIntent>(path, params, true);\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto';\nimport { OrcaRailSignatureVerificationError } from './errors';\nimport type { WebhookEvent } from './types';\n\n/**\n * Webhook utilities for verifying webhook signatures\n */\nexport class Webhooks {\n /**\n * Verify webhook signature\n *\n * @param rawBody - Raw request body (string or Buffer)\n * @param signature - Signature from x-webhook-signature header\n * @param secret - Webhook secret (API key's secretHash)\n * @returns True if signature is valid, false otherwise\n */\n public verifySignature(rawBody: string | Buffer, signature: string, secret: string): boolean {\n if (!signature || !secret) {\n return false;\n }\n\n // Convert rawBody to string if it's a Buffer\n const bodyString = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8');\n\n // Compute expected signature\n const expectedSignature = createHmac('sha256', secret).update(bodyString).digest('hex');\n\n // Compare signatures using timing-safe comparison\n const signatureBuffer = Buffer.from(signature, 'hex');\n const expectedBuffer = Buffer.from(expectedSignature, 'hex');\n\n // Length check first (prevents timing attacks)\n if (signatureBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return timingSafeEqual(signatureBuffer, expectedBuffer);\n }\n\n /**\n * Construct and verify a webhook event from raw body and signature\n *\n * @param rawBody - Raw request body (string or Buffer)\n * @param signature - Signature from x-webhook-signature header\n * @param secret - Webhook secret (API key's secretHash)\n * @returns Parsed webhook event\n * @throws OrcaRailSignatureVerificationError if signature is invalid\n */\n public constructEvent(rawBody: string | Buffer, signature: string, secret: string): WebhookEvent {\n if (!this.verifySignature(rawBody, signature, secret)) {\n throw new OrcaRailSignatureVerificationError(\n 'Webhook signature verification failed. The signature does not match the expected signature.',\n signature\n );\n }\n\n // Parse JSON body\n const bodyString = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8');\n\n try {\n const event = JSON.parse(bodyString) as WebhookEvent;\n return event;\n } catch (error) {\n throw new OrcaRailSignatureVerificationError(\n `Failed to parse webhook body: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n}\n","import { HttpClient } from './client';\nimport { Checkout } from './resources/checkout';\nimport { PaymentIntents } from './resources/payment-intents';\nimport { Webhooks } from './webhooks';\nimport type { OrcaRailConfig } from './types';\n\n// Re-export all types\nexport type {\n OrcaRailConfig,\n PaymentIntent,\n PaymentIntentStatus,\n PaymentIntentCreateParams,\n PaymentIntentUpdateParams,\n PaymentIntentConfirmParams,\n PaymentLink,\n LatestTransaction,\n WebhookEvent,\n WebhookEventType,\n WebhookEventData,\n} from './types';\n\n// Re-export all errors\nexport {\n OrcaRailError,\n OrcaRailAPIError,\n OrcaRailAuthenticationError,\n OrcaRailSignatureVerificationError,\n} from './errors';\n\n/**\n * OrcaRail Node.js SDK\n *\n * @example\n * ```typescript\n * import OrcaRail from '@orcarail/node';\n *\n * const orcarail = new OrcaRail('ak_live_xxx', 'sk_live_xxx');\n *\n * // Create a payment intent\n * const intent = await orcarail.paymentIntents.create({\n * amount: '100.00',\n * currency: 'usd',\n * payment_method_types: ['crypto'],\n * tokenId: 1,\n * networkId: 1,\n * return_url: 'https://merchant.example.com/return',\n * });\n * ```\n */\nexport class OrcaRail {\n /**\n * Payment Intents resource\n */\n public readonly paymentIntents: PaymentIntents;\n\n /**\n * Checkout resource (slug-based get/cancel)\n */\n public readonly checkout: Checkout;\n\n /**\n * Webhooks utilities\n */\n public readonly webhooks: Webhooks;\n\n private readonly client: HttpClient;\n\n /**\n * Create a new OrcaRail client instance\n *\n * @param apiKey - Your OrcaRail API key (e.g., \"ak_live_xxx\")\n * @param apiSecret - Your OrcaRail API secret (e.g., \"sk_live_xxx\")\n * @param config - Optional configuration\n */\n constructor(apiKey: string, apiSecret: string, config?: OrcaRailConfig) {\n this.client = new HttpClient(apiKey, apiSecret, config);\n this.paymentIntents = new PaymentIntents(this.client);\n this.checkout = new Checkout(this.client);\n this.webhooks = new Webhooks();\n }\n}\n\nexport default OrcaRail;\n"]}
package/dist/index.d.mts CHANGED
@@ -36,13 +36,13 @@ interface PaymentIntentCreateParams {
36
36
  */
37
37
  payment_method_types?: string[];
38
38
  /**
39
- * Token ID (e.g., USDC, USDT)
39
+ * Token ID (UUID, e.g., USDC, USDT)
40
40
  */
41
- tokenId: number;
41
+ tokenId: string;
42
42
  /**
43
- * Network ID (e.g., Ethereum, Polygon)
43
+ * Network ID (UUID, e.g., Ethereum, Polygon)
44
44
  */
45
- networkId: number;
45
+ networkId: string;
46
46
  /**
47
47
  * Return URL after payment completion
48
48
  */
@@ -81,13 +81,13 @@ interface PaymentIntentUpdateParams {
81
81
  */
82
82
  payment_method_types?: string[];
83
83
  /**
84
- * Updated token ID
84
+ * Updated token ID (UUID)
85
85
  */
86
- tokenId?: number;
86
+ tokenId?: string;
87
87
  /**
88
- * Updated network ID
88
+ * Updated network ID (UUID)
89
89
  */
90
- networkId?: number;
90
+ networkId?: string;
91
91
  /**
92
92
  * Updated return URL
93
93
  */
@@ -127,9 +127,9 @@ interface PaymentIntentConfirmParams {
127
127
  */
128
128
  interface PaymentLink {
129
129
  /**
130
- * Payment link ID
130
+ * Payment link ID (UUID)
131
131
  */
132
- id: number;
132
+ id: string;
133
133
  /**
134
134
  * Unique slug
135
135
  */
@@ -139,6 +139,11 @@ interface PaymentLink {
139
139
  */
140
140
  link: string;
141
141
  }
142
+ /**
143
+ * Payment transaction status values returned by the API.
144
+ * Aligns with API PaymentStatusEnum.
145
+ */
146
+ type PaymentStatus = 'pending' | 'confirmed' | 'canceled' | 'expired' | 'completed' | 'withdrawn';
142
147
  /**
143
148
  * Latest transaction details
144
149
  */
@@ -148,9 +153,9 @@ interface LatestTransaction {
148
153
  */
149
154
  id: string;
150
155
  /**
151
- * Transaction status
156
+ * Transaction status (enum value from API)
152
157
  */
153
- status: string;
158
+ status: PaymentStatus;
154
159
  /**
155
160
  * Transaction hash
156
161
  */
@@ -185,9 +190,9 @@ interface PaymentIntent {
185
190
  */
186
191
  currency: string;
187
192
  /**
188
- * Current status
193
+ * Current status (enum value from API)
189
194
  */
190
- status: string;
195
+ status: PaymentIntentStatus;
191
196
  /**
192
197
  * Payment method types
193
198
  */
@@ -225,7 +230,7 @@ interface PaymentIntent {
225
230
  */
226
231
  expiresAt?: string;
227
232
  /**
228
- * Latest transaction details (for complete intents)
233
+ * Latest transaction details (for completed intents)
229
234
  */
230
235
  latestTransaction?: LatestTransaction;
231
236
  /**
@@ -237,10 +242,15 @@ interface PaymentIntent {
237
242
  */
238
243
  updatedAt: string;
239
244
  }
245
+ /**
246
+ * Payment Intent status values returned by the API.
247
+ * Aligns with API enum: requires_payment_method | requires_confirmation | processing | completed | canceled
248
+ */
249
+ type PaymentIntentStatus = 'requires_payment_method' | 'requires_confirmation' | 'processing' | 'completed' | 'canceled';
240
250
  /**
241
251
  * Webhook event types
242
252
  */
243
- type WebhookEventType = 'payment_intent.complete' | 'payment_intent.processing' | 'payment_intent.canceled' | 'payment_intent.requires_payment_method' | 'payment_intent.requires_confirmation';
253
+ type WebhookEventType = 'payment_intent.completed' | 'payment_intent.processing' | 'payment_intent.canceled' | 'payment_intent.requires_payment_method' | 'payment_intent.requires_confirmation';
244
254
  /**
245
255
  * Webhook event data object
246
256
  */
@@ -385,7 +395,7 @@ declare class PaymentIntents {
385
395
  confirm(id: string, params: PaymentIntentConfirmParams): Promise<PaymentIntent>;
386
396
  /**
387
397
  * Complete a Payment Intent (API: POST /payment_intents/:id/complete).
388
- * Sets the intent to processing and fires the payment_intent.processing webhook.
398
+ * Sets the intent to processing; when payment is done, payment_intent.completed is sent.
389
399
  * Use when the user is redirected to your success/return URL (e.g. https://yourapp.com/success?payment_intent=pi_34).
390
400
  *
391
401
  * @param id - Payment Intent ID (e.g. "pi_34" or "34")
@@ -516,4 +526,4 @@ declare class OrcaRail {
516
526
  constructor(apiKey: string, apiSecret: string, config?: OrcaRailConfig);
517
527
  }
518
528
 
519
- export { type LatestTransaction, OrcaRail, OrcaRailAPIError, OrcaRailAuthenticationError, type OrcaRailConfig, OrcaRailError, OrcaRailSignatureVerificationError, type PaymentIntent, type PaymentIntentConfirmParams, type PaymentIntentCreateParams, type PaymentIntentUpdateParams, type PaymentLink, type WebhookEvent, type WebhookEventData, type WebhookEventType, OrcaRail as default };
529
+ export { type LatestTransaction, OrcaRail, OrcaRailAPIError, OrcaRailAuthenticationError, type OrcaRailConfig, OrcaRailError, OrcaRailSignatureVerificationError, type PaymentIntent, type PaymentIntentConfirmParams, type PaymentIntentCreateParams, type PaymentIntentStatus, type PaymentIntentUpdateParams, type PaymentLink, type WebhookEvent, type WebhookEventData, type WebhookEventType, OrcaRail as default };
package/dist/index.d.ts CHANGED
@@ -36,13 +36,13 @@ interface PaymentIntentCreateParams {
36
36
  */
37
37
  payment_method_types?: string[];
38
38
  /**
39
- * Token ID (e.g., USDC, USDT)
39
+ * Token ID (UUID, e.g., USDC, USDT)
40
40
  */
41
- tokenId: number;
41
+ tokenId: string;
42
42
  /**
43
- * Network ID (e.g., Ethereum, Polygon)
43
+ * Network ID (UUID, e.g., Ethereum, Polygon)
44
44
  */
45
- networkId: number;
45
+ networkId: string;
46
46
  /**
47
47
  * Return URL after payment completion
48
48
  */
@@ -81,13 +81,13 @@ interface PaymentIntentUpdateParams {
81
81
  */
82
82
  payment_method_types?: string[];
83
83
  /**
84
- * Updated token ID
84
+ * Updated token ID (UUID)
85
85
  */
86
- tokenId?: number;
86
+ tokenId?: string;
87
87
  /**
88
- * Updated network ID
88
+ * Updated network ID (UUID)
89
89
  */
90
- networkId?: number;
90
+ networkId?: string;
91
91
  /**
92
92
  * Updated return URL
93
93
  */
@@ -127,9 +127,9 @@ interface PaymentIntentConfirmParams {
127
127
  */
128
128
  interface PaymentLink {
129
129
  /**
130
- * Payment link ID
130
+ * Payment link ID (UUID)
131
131
  */
132
- id: number;
132
+ id: string;
133
133
  /**
134
134
  * Unique slug
135
135
  */
@@ -139,6 +139,11 @@ interface PaymentLink {
139
139
  */
140
140
  link: string;
141
141
  }
142
+ /**
143
+ * Payment transaction status values returned by the API.
144
+ * Aligns with API PaymentStatusEnum.
145
+ */
146
+ type PaymentStatus = 'pending' | 'confirmed' | 'canceled' | 'expired' | 'completed' | 'withdrawn';
142
147
  /**
143
148
  * Latest transaction details
144
149
  */
@@ -148,9 +153,9 @@ interface LatestTransaction {
148
153
  */
149
154
  id: string;
150
155
  /**
151
- * Transaction status
156
+ * Transaction status (enum value from API)
152
157
  */
153
- status: string;
158
+ status: PaymentStatus;
154
159
  /**
155
160
  * Transaction hash
156
161
  */
@@ -185,9 +190,9 @@ interface PaymentIntent {
185
190
  */
186
191
  currency: string;
187
192
  /**
188
- * Current status
193
+ * Current status (enum value from API)
189
194
  */
190
- status: string;
195
+ status: PaymentIntentStatus;
191
196
  /**
192
197
  * Payment method types
193
198
  */
@@ -225,7 +230,7 @@ interface PaymentIntent {
225
230
  */
226
231
  expiresAt?: string;
227
232
  /**
228
- * Latest transaction details (for complete intents)
233
+ * Latest transaction details (for completed intents)
229
234
  */
230
235
  latestTransaction?: LatestTransaction;
231
236
  /**
@@ -237,10 +242,15 @@ interface PaymentIntent {
237
242
  */
238
243
  updatedAt: string;
239
244
  }
245
+ /**
246
+ * Payment Intent status values returned by the API.
247
+ * Aligns with API enum: requires_payment_method | requires_confirmation | processing | completed | canceled
248
+ */
249
+ type PaymentIntentStatus = 'requires_payment_method' | 'requires_confirmation' | 'processing' | 'completed' | 'canceled';
240
250
  /**
241
251
  * Webhook event types
242
252
  */
243
- type WebhookEventType = 'payment_intent.complete' | 'payment_intent.processing' | 'payment_intent.canceled' | 'payment_intent.requires_payment_method' | 'payment_intent.requires_confirmation';
253
+ type WebhookEventType = 'payment_intent.completed' | 'payment_intent.processing' | 'payment_intent.canceled' | 'payment_intent.requires_payment_method' | 'payment_intent.requires_confirmation';
244
254
  /**
245
255
  * Webhook event data object
246
256
  */
@@ -385,7 +395,7 @@ declare class PaymentIntents {
385
395
  confirm(id: string, params: PaymentIntentConfirmParams): Promise<PaymentIntent>;
386
396
  /**
387
397
  * Complete a Payment Intent (API: POST /payment_intents/:id/complete).
388
- * Sets the intent to processing and fires the payment_intent.processing webhook.
398
+ * Sets the intent to processing; when payment is done, payment_intent.completed is sent.
389
399
  * Use when the user is redirected to your success/return URL (e.g. https://yourapp.com/success?payment_intent=pi_34).
390
400
  *
391
401
  * @param id - Payment Intent ID (e.g. "pi_34" or "34")
@@ -518,4 +528,4 @@ declare class OrcaRail {
518
528
 
519
529
  // @ts-ignore
520
530
  export = OrcaRail;
521
- export { type LatestTransaction, OrcaRail, OrcaRailAPIError, OrcaRailAuthenticationError, type OrcaRailConfig, OrcaRailError, OrcaRailSignatureVerificationError, type PaymentIntent, type PaymentIntentConfirmParams, type PaymentIntentCreateParams, type PaymentIntentUpdateParams, type PaymentLink, type WebhookEvent, type WebhookEventData, type WebhookEventType };
531
+ export { type LatestTransaction, OrcaRail, OrcaRailAPIError, OrcaRailAuthenticationError, type OrcaRailConfig, OrcaRailError, OrcaRailSignatureVerificationError, type PaymentIntent, type PaymentIntentConfirmParams, type PaymentIntentCreateParams, type PaymentIntentStatus, type PaymentIntentUpdateParams, type PaymentLink, type WebhookEvent, type WebhookEventData, type WebhookEventType };
package/dist/index.js CHANGED
@@ -69,9 +69,7 @@ var HttpClient = class {
69
69
  * Create Basic Auth header from API key and secret
70
70
  */
71
71
  getAuthHeader() {
72
- const credentials = Buffer.from(`${this.apiKey}:${this.apiSecret}`).toString(
73
- "base64"
74
- );
72
+ const credentials = Buffer.from(`${this.apiKey}:${this.apiSecret}`).toString("base64");
75
73
  return `Basic ${credentials}`;
76
74
  }
77
75
  /**
@@ -85,7 +83,11 @@ var HttpClient = class {
85
83
  * Make an HTTP request with timeout and error handling
86
84
  */
87
85
  async request(method, path, body, requireAuth = true) {
88
- const url = this.buildUrl(path);
86
+ let url = this.buildUrl(path);
87
+ if (method === "GET") {
88
+ const separator = url.includes("?") ? "&" : "?";
89
+ url = `${url}${separator}_=${Date.now()}`;
90
+ }
89
91
  const headers = {
90
92
  "Content-Type": "application/json",
91
93
  "User-Agent": `orcarail-node/${SDK_VERSION}`
@@ -100,6 +102,9 @@ var HttpClient = class {
100
102
  if (body) {
101
103
  options.body = JSON.stringify(body);
102
104
  }
105
+ if (method === "GET") {
106
+ options.cache = "no-store";
107
+ }
103
108
  const controller = new AbortController();
104
109
  const timeoutId = setTimeout(() => controller.abort(), this.timeout);
105
110
  options.signal = controller.signal;
@@ -119,12 +124,7 @@ var HttpClient = class {
119
124
  if (response.status === 401) {
120
125
  throw new OrcaRailAuthenticationError(errorMessage);
121
126
  }
122
- throw new OrcaRailAPIError(
123
- errorMessage,
124
- response.status,
125
- errorType,
126
- responseData
127
- );
127
+ throw new OrcaRailAPIError(errorMessage, response.status, errorType, responseData);
128
128
  }
129
129
  return responseData;
130
130
  } catch (error) {
@@ -134,9 +134,7 @@ var HttpClient = class {
134
134
  }
135
135
  if (error instanceof Error) {
136
136
  if (error.name === "AbortError") {
137
- throw new OrcaRailError(
138
- `Request timeout after ${this.timeout}ms`
139
- );
137
+ throw new OrcaRailError(`Request timeout after ${this.timeout}ms`);
140
138
  }
141
139
  throw new OrcaRailError(`Request failed: ${error.message}`);
142
140
  }
@@ -220,11 +218,7 @@ var PaymentIntents = class {
220
218
  ...params,
221
219
  payment_method_types: params.payment_method_types && params.payment_method_types.length > 0 ? params.payment_method_types : ["crypto"]
222
220
  };
223
- return this.client.post(
224
- "payment_intents",
225
- requestBody,
226
- true
227
- );
221
+ return this.client.post("payment_intents", requestBody, true);
228
222
  }
229
223
  /**
230
224
  * Retrieve a Payment Intent by ID
@@ -275,7 +269,7 @@ var PaymentIntents = class {
275
269
  }
276
270
  /**
277
271
  * Complete a Payment Intent (API: POST /payment_intents/:id/complete).
278
- * Sets the intent to processing and fires the payment_intent.processing webhook.
272
+ * Sets the intent to processing; when payment is done, payment_intent.completed is sent.
279
273
  * Use when the user is redirected to your success/return URL (e.g. https://yourapp.com/success?payment_intent=pi_34).
280
274
  *
281
275
  * @param id - Payment Intent ID (e.g. "pi_34" or "34")
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/resources/checkout.ts","../src/resources/payment-intents.ts","../src/webhooks.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Base error class for all OrcaRail errors\n */\nexport class OrcaRailError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OrcaRailError';\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\n/**\n * Error thrown when the API returns a non-2xx status code\n */\nexport class OrcaRailAPIError extends OrcaRailError {\n /**\n * HTTP status code\n */\n public readonly statusCode: number;\n\n /**\n * Error type from the API response\n */\n public readonly type?: string;\n\n /**\n * Additional error details from the API\n */\n public readonly details?: unknown;\n\n constructor(\n message: string,\n statusCode: number,\n type?: string,\n details?: unknown\n ) {\n super(message);\n this.name = 'OrcaRailAPIError';\n this.statusCode = statusCode;\n this.type = type;\n this.details = details;\n }\n}\n\n/**\n * Error thrown when authentication fails (401)\n */\nexport class OrcaRailAuthenticationError extends OrcaRailAPIError {\n constructor(message: string = 'Authentication failed. Please check your API key and secret.') {\n super(message, 401, 'authentication_error');\n this.name = 'OrcaRailAuthenticationError';\n }\n}\n\n/**\n * Error thrown when webhook signature verification fails\n */\nexport class OrcaRailSignatureVerificationError extends OrcaRailError {\n /**\n * The signature that was provided\n */\n public readonly signature: string;\n\n constructor(\n message: string = 'Webhook signature verification failed',\n signature?: string\n ) {\n super(message);\n this.name = 'OrcaRailSignatureVerificationError';\n this.signature = signature || '';\n }\n}\n","import {\n OrcaRailAPIError,\n OrcaRailAuthenticationError,\n OrcaRailError,\n} from './errors';\nimport type { OrcaRailConfig } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.orcarail.com/api/v1';\nconst DEFAULT_TIMEOUT = 30000;\nconst SDK_VERSION = '1.0.0';\n\n/**\n * HTTP client for making requests to the OrcaRail API\n */\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly apiSecret: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(apiKey: string, apiSecret: string, config?: OrcaRailConfig) {\n if (!apiKey || !apiSecret) {\n throw new OrcaRailError('API key and secret are required');\n }\n\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n this.baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n this.timeout = config?.timeout || DEFAULT_TIMEOUT;\n }\n\n /**\n * Create Basic Auth header from API key and secret\n */\n private getAuthHeader(): string {\n const credentials = Buffer.from(`${this.apiKey}:${this.apiSecret}`).toString(\n 'base64'\n );\n return `Basic ${credentials}`;\n }\n\n /**\n * Build full URL from path\n */\n private buildUrl(path: string): string {\n // Remove leading slash if present\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return `${this.baseUrl}/${cleanPath}`;\n }\n\n /**\n * Make an HTTP request with timeout and error handling\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n requireAuth: boolean = true\n ): Promise<T> {\n const url = this.buildUrl(path);\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': `orcarail-node/${SDK_VERSION}`,\n };\n\n if (requireAuth) {\n headers['Authorization'] = this.getAuthHeader();\n }\n\n const options: RequestInit = {\n method,\n headers,\n };\n\n if (body) {\n options.body = JSON.stringify(body);\n }\n\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n options.signal = controller.signal;\n\n try {\n const response = await fetch(url, options);\n clearTimeout(timeoutId);\n\n // Parse response body\n let responseData: unknown;\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n\n // Handle non-2xx responses\n if (!response.ok) {\n const errorMessage =\n typeof responseData === 'object' &&\n responseData !== null &&\n 'message' in responseData\n ? String((responseData as { message: unknown }).message)\n : `API request failed with status ${response.status}`;\n\n const errorType =\n typeof responseData === 'object' &&\n responseData !== null &&\n 'error' in responseData\n ? String((responseData as { error: unknown }).error)\n : undefined;\n\n if (response.status === 401) {\n throw new OrcaRailAuthenticationError(errorMessage);\n }\n\n throw new OrcaRailAPIError(\n errorMessage,\n response.status,\n errorType,\n responseData\n );\n }\n\n return responseData as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof OrcaRailError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new OrcaRailError(\n `Request timeout after ${this.timeout}ms`\n );\n }\n throw new OrcaRailError(`Request failed: ${error.message}`);\n }\n\n throw new OrcaRailError('An unknown error occurred');\n }\n }\n\n /**\n * GET request\n */\n public async get<T>(path: string, requireAuth: boolean = true): Promise<T> {\n return this.request<T>('GET', path, undefined, requireAuth);\n }\n\n /**\n * POST request\n */\n public async post<T>(\n path: string,\n body?: unknown,\n requireAuth: boolean = true\n ): Promise<T> {\n return this.request<T>('POST', path, body, requireAuth);\n }\n\n /**\n * PATCH request\n */\n public async patch<T>(\n path: string,\n body?: unknown,\n requireAuth: boolean = true\n ): Promise<T> {\n return this.request<T>('PATCH', path, body, requireAuth);\n }\n\n /**\n * PUT request\n */\n public async put<T>(\n path: string,\n body?: unknown,\n requireAuth: boolean = true\n ): Promise<T> {\n return this.request<T>('PUT', path, body, requireAuth);\n }\n\n /**\n * DELETE request\n */\n public async delete<T>(\n path: string,\n requireAuth: boolean = true\n ): Promise<T> {\n return this.request<T>('DELETE', path, undefined, requireAuth);\n }\n}\n","import { HttpClient } from '../client';\nimport type { PaymentIntent } from '../types';\n\n/**\n * Checkout resource for slug-based checkout flows (public endpoints)\n */\nexport class Checkout {\n private readonly client: HttpClient;\n\n constructor(client: HttpClient) {\n this.client = client;\n }\n\n /**\n * Get checkout details by slug\n *\n * @param slug - Checkout slug from the payment link URL\n * @returns Checkout details including payment intent\n */\n public async get(slug: string): Promise<PaymentIntent & Record<string, unknown>> {\n const path = `checkout/${encodeURIComponent(slug)}`;\n return this.client.get<PaymentIntent & Record<string, unknown>>(path, true);\n }\n\n /**\n * Cancel payment intent by checkout slug\n *\n * @param slug - Checkout slug from the payment link URL\n * @returns The canceled payment intent and optional cancel_url for redirect\n */\n public async cancel(slug: string): Promise<PaymentIntent & { cancel_url?: string }> {\n const path = `checkout/${encodeURIComponent(slug)}/cancel`;\n return this.client.post<PaymentIntent & { cancel_url?: string }>(path, {}, true);\n }\n}\n","import { HttpClient } from '../client';\nimport type {\n PaymentIntent,\n PaymentIntentConfirmParams,\n PaymentIntentCreateParams,\n PaymentIntentUpdateParams,\n} from '../types';\n\n/**\n * Payment Intents resource for managing payment intents\n */\nexport class PaymentIntents {\n private readonly client: HttpClient;\n\n constructor(client: HttpClient) {\n this.client = client;\n }\n\n /**\n * Create a new Payment Intent\n *\n * @param params - Payment Intent creation parameters\n * @returns The created Payment Intent\n */\n public async create(\n params: PaymentIntentCreateParams\n ): Promise<PaymentIntent> {\n // Ensure payment_method_types defaults to ['crypto'] if empty\n const requestBody = {\n ...params,\n payment_method_types:\n params.payment_method_types && params.payment_method_types.length > 0\n ? params.payment_method_types\n : ['crypto'],\n };\n\n return this.client.post<PaymentIntent>(\n 'payment_intents',\n requestBody,\n true\n );\n }\n\n /**\n * Retrieve a Payment Intent by ID\n *\n * @param id - Payment Intent ID (e.g., \"pi_1234567890\")\n * @returns The Payment Intent\n */\n public async retrieve(id: string): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}`;\n\n return this.client.get<PaymentIntent>(path, true);\n }\n\n /**\n * Cancel a Payment Intent (API: POST /payment_intents/:id/cancel).\n * Use when the user is redirected to your cancel_url (e.g. https://yourapp.com/cancel?payment_intent=pi_20)\n * and you want to mark the intent as canceled on the backend.\n *\n * @param id - Payment Intent ID (e.g. \"pi_20\" or \"20\")\n * @returns The canceled Payment Intent\n *\n * @example\n * // When user lands on https://localhost:3001/cancel?payment_intent=pi_20\n * const intent = await orcarail.paymentIntents.cancel('pi_20');\n */\n public async cancel(id: string): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}/cancel`;\n\n return this.client.post<PaymentIntent>(path, {}, true);\n }\n\n /**\n * Confirm a Payment Intent (API: POST /payment_intents/:id/confirm).\n * Redirects the customer to the hosted checkout page.\n *\n * @param id - Payment Intent ID (e.g. \"pi_20\" or \"20\")\n * @param params - Confirmation parameters including client_secret and return_url\n * @returns The confirmed Payment Intent\n *\n * @example\n * const intent = await orcarail.paymentIntents.confirm('pi_20', {\n * client_secret: intent.client_secret,\n * return_url: 'https://yourapp.com/return',\n * });\n */\n public async confirm(\n id: string,\n params: PaymentIntentConfirmParams\n ): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}/confirm`;\n\n return this.client.post<PaymentIntent>(path, params, false);\n }\n\n /**\n * Complete a Payment Intent (API: POST /payment_intents/:id/complete).\n * Sets the intent to processing and fires the payment_intent.processing webhook.\n * Use when the user is redirected to your success/return URL (e.g. https://yourapp.com/success?payment_intent=pi_34).\n *\n * @param id - Payment Intent ID (e.g. \"pi_34\" or \"34\")\n * @returns The updated Payment Intent (status processing)\n *\n * @example\n * // When user lands on https://localhost:3001/success?payment_intent=pi_34\n * const intent = await orcarail.paymentIntents.complete('pi_34');\n */\n public async complete(id: string): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}/complete`;\n\n return this.client.post<PaymentIntent>(path, {}, true);\n }\n\n /**\n * Update a Payment Intent\n *\n * @param id - Payment Intent ID\n * @param params - Update parameters (all optional)\n * @returns The updated Payment Intent\n */\n public async update(\n id: string,\n params: PaymentIntentUpdateParams\n ): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}`;\n\n return this.client.patch<PaymentIntent>(path, params, true);\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto';\nimport { OrcaRailSignatureVerificationError } from './errors';\nimport type { WebhookEvent } from './types';\n\n/**\n * Webhook utilities for verifying webhook signatures\n */\nexport class Webhooks {\n /**\n * Verify webhook signature\n *\n * @param rawBody - Raw request body (string or Buffer)\n * @param signature - Signature from x-webhook-signature header\n * @param secret - Webhook secret (API key's secretHash)\n * @returns True if signature is valid, false otherwise\n */\n public verifySignature(\n rawBody: string | Buffer,\n signature: string,\n secret: string\n ): boolean {\n if (!signature || !secret) {\n return false;\n }\n\n // Convert rawBody to string if it's a Buffer\n const bodyString =\n typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8');\n\n // Compute expected signature\n const expectedSignature = createHmac('sha256', secret)\n .update(bodyString)\n .digest('hex');\n\n // Compare signatures using timing-safe comparison\n const signatureBuffer = Buffer.from(signature, 'hex');\n const expectedBuffer = Buffer.from(expectedSignature, 'hex');\n\n // Length check first (prevents timing attacks)\n if (signatureBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return timingSafeEqual(signatureBuffer, expectedBuffer);\n }\n\n /**\n * Construct and verify a webhook event from raw body and signature\n *\n * @param rawBody - Raw request body (string or Buffer)\n * @param signature - Signature from x-webhook-signature header\n * @param secret - Webhook secret (API key's secretHash)\n * @returns Parsed webhook event\n * @throws OrcaRailSignatureVerificationError if signature is invalid\n */\n public constructEvent(\n rawBody: string | Buffer,\n signature: string,\n secret: string\n ): WebhookEvent {\n if (!this.verifySignature(rawBody, signature, secret)) {\n throw new OrcaRailSignatureVerificationError(\n 'Webhook signature verification failed. The signature does not match the expected signature.',\n signature\n );\n }\n\n // Parse JSON body\n const bodyString =\n typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8');\n\n try {\n const event = JSON.parse(bodyString) as WebhookEvent;\n return event;\n } catch (error) {\n throw new OrcaRailSignatureVerificationError(\n `Failed to parse webhook body: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n}\n","import { HttpClient } from './client';\nimport { Checkout } from './resources/checkout';\nimport { PaymentIntents } from './resources/payment-intents';\nimport { Webhooks } from './webhooks';\nimport type { OrcaRailConfig } from './types';\n\n// Re-export all types\nexport type {\n OrcaRailConfig,\n PaymentIntent,\n PaymentIntentCreateParams,\n PaymentIntentUpdateParams,\n PaymentIntentConfirmParams,\n PaymentLink,\n LatestTransaction,\n WebhookEvent,\n WebhookEventType,\n WebhookEventData,\n} from './types';\n\n// Re-export all errors\nexport {\n OrcaRailError,\n OrcaRailAPIError,\n OrcaRailAuthenticationError,\n OrcaRailSignatureVerificationError,\n} from './errors';\n\n/**\n * OrcaRail Node.js SDK\n *\n * @example\n * ```typescript\n * import OrcaRail from '@orcarail/node';\n *\n * const orcarail = new OrcaRail('ak_live_xxx', 'sk_live_xxx');\n *\n * // Create a payment intent\n * const intent = await orcarail.paymentIntents.create({\n * amount: '100.00',\n * currency: 'usd',\n * payment_method_types: ['crypto'],\n * tokenId: 1,\n * networkId: 1,\n * return_url: 'https://merchant.example.com/return',\n * });\n * ```\n */\nexport class OrcaRail {\n /**\n * Payment Intents resource\n */\n public readonly paymentIntents: PaymentIntents;\n\n /**\n * Checkout resource (slug-based get/cancel)\n */\n public readonly checkout: Checkout;\n\n /**\n * Webhooks utilities\n */\n public readonly webhooks: Webhooks;\n\n private readonly client: HttpClient;\n\n /**\n * Create a new OrcaRail client instance\n *\n * @param apiKey - Your OrcaRail API key (e.g., \"ak_live_xxx\")\n * @param apiSecret - Your OrcaRail API secret (e.g., \"sk_live_xxx\")\n * @param config - Optional configuration\n */\n constructor(\n apiKey: string,\n apiSecret: string,\n config?: OrcaRailConfig\n ) {\n this.client = new HttpClient(apiKey, apiSecret, config);\n this.paymentIntents = new PaymentIntents(this.client);\n this.checkout = new Checkout(this.client);\n this.webhooks = new Webhooks();\n }\n}\n\nexport default OrcaRail;\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/client.ts","../src/resources/checkout.ts","../src/resources/payment-intents.ts","../src/webhooks.ts","../src/index.ts"],"names":[],"mappings":";;;AAGO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,EAChD;AACF;AAKO,IAAM,gBAAA,GAAN,cAA+B,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA,EAIlC,UAAA;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA;AAAA,EAEhB,WAAA,CAAY,OAAA,EAAiB,UAAA,EAAoB,IAAA,EAAe,OAAA,EAAmB;AACjF,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AACF;AAKO,IAAM,2BAAA,GAAN,cAA0C,gBAAA,CAAiB;AAAA,EAChE,WAAA,CAAY,UAAkB,8DAAA,EAAgE;AAC5F,IAAA,KAAA,CAAM,OAAA,EAAS,KAAK,sBAAsB,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,6BAAA;AAAA,EACd;AACF;AAKO,IAAM,kCAAA,GAAN,cAAiD,aAAA,CAAc;AAAA;AAAA;AAAA;AAAA,EAIpD,SAAA;AAAA,EAEhB,WAAA,CAAY,OAAA,GAAkB,uCAAA,EAAyC,SAAA,EAAoB;AACzF,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,oCAAA;AACZ,IAAA,IAAA,CAAK,YAAY,SAAA,IAAa,EAAA;AAAA,EAChC;AACF;;;AC5DA,IAAM,gBAAA,GAAmB,iCAAA;AACzB,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,WAAA,GAAc,OAAA;AAKb,IAAM,aAAN,MAAiB;AAAA,EACL,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EAEjB,WAAA,CAAY,MAAA,EAAgB,SAAA,EAAmB,MAAA,EAAyB;AACtE,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW;AACzB,MAAA,MAAM,IAAI,cAAc,iCAAiC,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,OAAA,IAAW,eAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAwB;AAC9B,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA;AACrF,IAAA,OAAO,SAAS,WAAW,CAAA,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,IAAA,EAAsB;AAErC,IAAA,MAAM,SAAA,GAAY,KAAK,UAAA,CAAW,GAAG,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AACzD,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CACZ,MAAA,EACA,IAAA,EACA,IAAA,EACA,cAAuB,IAAA,EACX;AACZ,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAC5B,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAC5C,MAAA,GAAA,GAAM,GAAG,GAAG,CAAA,EAAG,SAAS,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,IACzC;AACA,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,YAAA,EAAc,iBAAiB,WAAW,CAAA;AAAA,KAC5C;AAEA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,IAAA,CAAK,aAAA,EAAc;AAAA,IAChD;AAEA,IAAA,MAAM,OAAA,GAAuB;AAAA,MAC3B,MAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAA,CAAQ,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,IACpC;AAGA,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAC,QAAiD,KAAA,GAAQ,UAAA;AAAA,IAC5D;AAGA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AACnE,IAAA,OAAA,CAAQ,SAAS,UAAA,CAAW,MAAA;AAE5B,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,OAAO,CAAA;AACzC,MAAA,YAAA,CAAa,SAAS,CAAA;AAGtB,MAAA,IAAI,YAAA;AACJ,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACvD,MAAA,IAAI,WAAA,IAAe,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC3D,QAAA,YAAA,GAAe,MAAM,SAAS,IAAA,EAAK;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,YAAA,GAAe,MAAM,SAAS,IAAA,EAAK;AAAA,MACrC;AAGA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,YAAA,GACJ,OAAO,YAAA,KAAiB,QAAA,IAAY,iBAAiB,IAAA,IAAQ,SAAA,IAAa,YAAA,GACtE,MAAA,CAAQ,YAAA,CAAsC,OAAO,CAAA,GACrD,CAAA,+BAAA,EAAkC,SAAS,MAAM,CAAA,CAAA;AAEvD,QAAA,MAAM,SAAA,GACJ,OAAO,YAAA,KAAiB,QAAA,IAAY,YAAA,KAAiB,IAAA,IAAQ,OAAA,IAAW,YAAA,GACpE,MAAA,CAAQ,YAAA,CAAoC,KAAK,CAAA,GACjD,KAAA,CAAA;AAEN,QAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,UAAA,MAAM,IAAI,4BAA4B,YAAY,CAAA;AAAA,QACpD;AAEA,QAAA,MAAM,IAAI,gBAAA,CAAiB,YAAA,EAAc,QAAA,CAAS,MAAA,EAAQ,WAAW,YAAY,CAAA;AAAA,MACnF;AAEA,MAAA,OAAO,YAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,iBAAiB,aAAA,EAAe;AAClC,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,UAAA,MAAM,IAAI,aAAA,CAAc,CAAA,sBAAA,EAAyB,IAAA,CAAK,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,QACnE;AACA,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,gBAAA,EAAmB,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MAC5D;AAEA,MAAA,MAAM,IAAI,cAAc,2BAA2B,CAAA;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,GAAA,CAAO,IAAA,EAAc,WAAA,GAAuB,IAAA,EAAkB;AACzE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,KAAA,EAAO,IAAA,EAAM,QAAW,WAAW,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,IAAA,CAAQ,IAAA,EAAc,IAAA,EAAgB,cAAuB,IAAA,EAAkB;AAC1F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,MAAA,EAAQ,IAAA,EAAM,MAAM,WAAW,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,KAAA,CAAS,IAAA,EAAc,IAAA,EAAgB,cAAuB,IAAA,EAAkB;AAC3F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,OAAA,EAAS,IAAA,EAAM,MAAM,WAAW,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,GAAA,CAAO,IAAA,EAAc,IAAA,EAAgB,cAAuB,IAAA,EAAkB;AACzF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,KAAA,EAAO,IAAA,EAAM,MAAM,WAAW,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,MAAA,CAAU,IAAA,EAAc,WAAA,GAAuB,IAAA,EAAkB;AAC5E,IAAA,OAAO,IAAA,CAAK,OAAA,CAAW,QAAA,EAAU,IAAA,EAAM,QAAW,WAAW,CAAA;AAAA,EAC/D;AACF,CAAA;;;ACrKO,IAAM,WAAN,MAAe;AAAA,EACH,MAAA;AAAA,EAEjB,YAAY,MAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,IAAI,IAAA,EAAgE;AAC/E,IAAA,MAAM,IAAA,GAAO,CAAA,SAAA,EAAY,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AACjD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAA6C,IAAA,EAAM,IAAI,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,OAAO,IAAA,EAAgE;AAClF,IAAA,MAAM,IAAA,GAAO,CAAA,SAAA,EAAY,kBAAA,CAAmB,IAAI,CAAC,CAAA,OAAA,CAAA;AACjD,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAA8C,IAAA,EAAM,IAAI,IAAI,CAAA;AAAA,EACjF;AACF,CAAA;;;ACvBO,IAAM,iBAAN,MAAqB;AAAA,EACT,MAAA;AAAA,EAEjB,YAAY,MAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,OAAO,MAAA,EAA2D;AAE7E,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAG,MAAA;AAAA,MACH,oBAAA,EACE,MAAA,CAAO,oBAAA,IAAwB,MAAA,CAAO,oBAAA,CAAqB,SAAS,CAAA,GAChE,MAAA,CAAO,oBAAA,GACP,CAAC,QAAQ;AAAA,KACjB;AAEA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAoB,iBAAA,EAAmB,aAAa,IAAI,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAa,SAAS,EAAA,EAAoC;AACxD,IAAA,MAAM,UAAU,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,GAAI,EAAA,GAAK,MAAM,EAAE,CAAA,CAAA;AACpD,IAAA,MAAM,IAAA,GAAO,mBAAmB,OAAO,CAAA,CAAA;AAEvC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAmB,IAAA,EAAM,IAAI,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAa,OAAO,EAAA,EAAoC;AACtD,IAAA,MAAM,UAAU,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,GAAI,EAAA,GAAK,MAAM,EAAE,CAAA,CAAA;AACpD,IAAA,MAAM,IAAA,GAAO,mBAAmB,OAAO,CAAA,OAAA,CAAA;AAEvC,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAAoB,IAAA,EAAM,IAAI,IAAI,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAa,OAAA,CAAQ,EAAA,EAAY,MAAA,EAA4D;AAC3F,IAAA,MAAM,UAAU,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,GAAI,EAAA,GAAK,MAAM,EAAE,CAAA,CAAA;AACpD,IAAA,MAAM,IAAA,GAAO,mBAAmB,OAAO,CAAA,QAAA,CAAA;AAEvC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAoB,IAAA,EAAM,QAAQ,KAAK,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAa,SAAS,EAAA,EAAoC;AACxD,IAAA,MAAM,UAAU,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,GAAI,EAAA,GAAK,MAAM,EAAE,CAAA,CAAA;AACpD,IAAA,MAAM,IAAA,GAAO,mBAAmB,OAAO,CAAA,SAAA,CAAA;AAEvC,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAAoB,IAAA,EAAM,IAAI,IAAI,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAa,MAAA,CAAO,EAAA,EAAY,MAAA,EAA2D;AACzF,IAAA,MAAM,UAAU,EAAA,CAAG,UAAA,CAAW,KAAK,CAAA,GAAI,EAAA,GAAK,MAAM,EAAE,CAAA,CAAA;AACpD,IAAA,MAAM,IAAA,GAAO,mBAAmB,OAAO,CAAA,CAAA;AAEvC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAqB,IAAA,EAAM,QAAQ,IAAI,CAAA;AAAA,EAC5D;AACF,CAAA;ACnHO,IAAM,WAAN,MAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASb,eAAA,CAAgB,OAAA,EAA0B,SAAA,EAAmB,MAAA,EAAyB;AAC3F,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,EAAQ;AACzB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,aAAa,OAAO,OAAA,KAAY,WAAW,OAAA,GAAU,OAAA,CAAQ,SAAS,MAAM,CAAA;AAGlF,IAAA,MAAM,iBAAA,GAAoB,WAAW,QAAA,EAAU,MAAM,EAAE,MAAA,CAAO,UAAU,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAGtF,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AACpD,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,iBAAA,EAAmB,KAAK,CAAA;AAG3D,IAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,cAAA,CAAe,MAAA,EAAQ;AACpD,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,eAAA,CAAgB,iBAAiB,cAAc,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,cAAA,CAAe,OAAA,EAA0B,SAAA,EAAmB,MAAA,EAA8B;AAC/F,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,SAAA,EAAW,MAAM,CAAA,EAAG;AACrD,MAAA,MAAM,IAAI,kCAAA;AAAA,QACR,6FAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,aAAa,OAAO,OAAA,KAAY,WAAW,OAAA,GAAU,OAAA,CAAQ,SAAS,MAAM,CAAA;AAElF,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACnC,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,kCAAA;AAAA,QACR,CAAA,8BAAA,EAAiC,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,OAC3F;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;ACnBO,IAAM,WAAN,MAAe;AAAA;AAAA;AAAA;AAAA,EAIJ,cAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA;AAAA,EAEC,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASjB,WAAA,CAAY,MAAA,EAAgB,SAAA,EAAmB,MAAA,EAAyB;AACtE,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,UAAA,CAAW,MAAA,EAAQ,WAAW,MAAM,CAAA;AACtD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AACpD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AACxC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,EAAS;AAAA,EAC/B;AACF;AAEA,IAAO,aAAA,GAAQ","file":"index.js","sourcesContent":["/**\n * Base error class for all OrcaRail errors\n */\nexport class OrcaRailError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OrcaRailError';\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\n/**\n * Error thrown when the API returns a non-2xx status code\n */\nexport class OrcaRailAPIError extends OrcaRailError {\n /**\n * HTTP status code\n */\n public readonly statusCode: number;\n\n /**\n * Error type from the API response\n */\n public readonly type?: string;\n\n /**\n * Additional error details from the API\n */\n public readonly details?: unknown;\n\n constructor(message: string, statusCode: number, type?: string, details?: unknown) {\n super(message);\n this.name = 'OrcaRailAPIError';\n this.statusCode = statusCode;\n this.type = type;\n this.details = details;\n }\n}\n\n/**\n * Error thrown when authentication fails (401)\n */\nexport class OrcaRailAuthenticationError extends OrcaRailAPIError {\n constructor(message: string = 'Authentication failed. Please check your API key and secret.') {\n super(message, 401, 'authentication_error');\n this.name = 'OrcaRailAuthenticationError';\n }\n}\n\n/**\n * Error thrown when webhook signature verification fails\n */\nexport class OrcaRailSignatureVerificationError extends OrcaRailError {\n /**\n * The signature that was provided\n */\n public readonly signature: string;\n\n constructor(message: string = 'Webhook signature verification failed', signature?: string) {\n super(message);\n this.name = 'OrcaRailSignatureVerificationError';\n this.signature = signature || '';\n }\n}\n","import { OrcaRailAPIError, OrcaRailAuthenticationError, OrcaRailError } from './errors';\nimport type { OrcaRailConfig } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.orcarail.com/api/v1';\nconst DEFAULT_TIMEOUT = 30000;\nconst SDK_VERSION = '1.0.0';\n\n/**\n * HTTP client for making requests to the OrcaRail API\n */\nexport class HttpClient {\n private readonly apiKey: string;\n private readonly apiSecret: string;\n private readonly baseUrl: string;\n private readonly timeout: number;\n\n constructor(apiKey: string, apiSecret: string, config?: OrcaRailConfig) {\n if (!apiKey || !apiSecret) {\n throw new OrcaRailError('API key and secret are required');\n }\n\n this.apiKey = apiKey;\n this.apiSecret = apiSecret;\n this.baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n this.timeout = config?.timeout || DEFAULT_TIMEOUT;\n }\n\n /**\n * Create Basic Auth header from API key and secret\n */\n private getAuthHeader(): string {\n const credentials = Buffer.from(`${this.apiKey}:${this.apiSecret}`).toString('base64');\n return `Basic ${credentials}`;\n }\n\n /**\n * Build full URL from path\n */\n private buildUrl(path: string): string {\n // Remove leading slash if present\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return `${this.baseUrl}/${cleanPath}`;\n }\n\n /**\n * Make an HTTP request with timeout and error handling\n */\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n requireAuth: boolean = true\n ): Promise<T> {\n let url = this.buildUrl(path);\n if (method === 'GET') {\n const separator = url.includes('?') ? '&' : '?';\n url = `${url}${separator}_=${Date.now()}`;\n }\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': `orcarail-node/${SDK_VERSION}`,\n };\n\n if (requireAuth) {\n headers['Authorization'] = this.getAuthHeader();\n }\n\n const options: RequestInit = {\n method,\n headers,\n };\n\n if (body) {\n options.body = JSON.stringify(body);\n }\n\n // Disable fetch cache so GET requests always hit the API (e.g. Next.js Data Cache)\n if (method === 'GET') {\n (options as RequestInit & { cache?: 'no-store' }).cache = 'no-store';\n }\n\n // Create AbortController for timeout\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n options.signal = controller.signal;\n\n try {\n const response = await fetch(url, options);\n clearTimeout(timeoutId);\n\n // Parse response body\n let responseData: unknown;\n const contentType = response.headers.get('content-type');\n if (contentType && contentType.includes('application/json')) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n\n // Handle non-2xx responses\n if (!response.ok) {\n const errorMessage =\n typeof responseData === 'object' && responseData !== null && 'message' in responseData\n ? String((responseData as { message: unknown }).message)\n : `API request failed with status ${response.status}`;\n\n const errorType =\n typeof responseData === 'object' && responseData !== null && 'error' in responseData\n ? String((responseData as { error: unknown }).error)\n : undefined;\n\n if (response.status === 401) {\n throw new OrcaRailAuthenticationError(errorMessage);\n }\n\n throw new OrcaRailAPIError(errorMessage, response.status, errorType, responseData);\n }\n\n return responseData as T;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof OrcaRailError) {\n throw error;\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new OrcaRailError(`Request timeout after ${this.timeout}ms`);\n }\n throw new OrcaRailError(`Request failed: ${error.message}`);\n }\n\n throw new OrcaRailError('An unknown error occurred');\n }\n }\n\n /**\n * GET request\n */\n public async get<T>(path: string, requireAuth: boolean = true): Promise<T> {\n return this.request<T>('GET', path, undefined, requireAuth);\n }\n\n /**\n * POST request\n */\n public async post<T>(path: string, body?: unknown, requireAuth: boolean = true): Promise<T> {\n return this.request<T>('POST', path, body, requireAuth);\n }\n\n /**\n * PATCH request\n */\n public async patch<T>(path: string, body?: unknown, requireAuth: boolean = true): Promise<T> {\n return this.request<T>('PATCH', path, body, requireAuth);\n }\n\n /**\n * PUT request\n */\n public async put<T>(path: string, body?: unknown, requireAuth: boolean = true): Promise<T> {\n return this.request<T>('PUT', path, body, requireAuth);\n }\n\n /**\n * DELETE request\n */\n public async delete<T>(path: string, requireAuth: boolean = true): Promise<T> {\n return this.request<T>('DELETE', path, undefined, requireAuth);\n }\n}\n","import { HttpClient } from '../client';\nimport type { PaymentIntent } from '../types';\n\n/**\n * Checkout resource for slug-based checkout flows (public endpoints)\n */\nexport class Checkout {\n private readonly client: HttpClient;\n\n constructor(client: HttpClient) {\n this.client = client;\n }\n\n /**\n * Get checkout details by slug\n *\n * @param slug - Checkout slug from the payment link URL\n * @returns Checkout details including payment intent\n */\n public async get(slug: string): Promise<PaymentIntent & Record<string, unknown>> {\n const path = `checkout/${encodeURIComponent(slug)}`;\n return this.client.get<PaymentIntent & Record<string, unknown>>(path, true);\n }\n\n /**\n * Cancel payment intent by checkout slug\n *\n * @param slug - Checkout slug from the payment link URL\n * @returns The canceled payment intent and optional cancel_url for redirect\n */\n public async cancel(slug: string): Promise<PaymentIntent & { cancel_url?: string }> {\n const path = `checkout/${encodeURIComponent(slug)}/cancel`;\n return this.client.post<PaymentIntent & { cancel_url?: string }>(path, {}, true);\n }\n}\n","import { HttpClient } from '../client';\nimport type {\n PaymentIntent,\n PaymentIntentConfirmParams,\n PaymentIntentCreateParams,\n PaymentIntentUpdateParams,\n} from '../types';\n\n/**\n * Payment Intents resource for managing payment intents\n */\nexport class PaymentIntents {\n private readonly client: HttpClient;\n\n constructor(client: HttpClient) {\n this.client = client;\n }\n\n /**\n * Create a new Payment Intent\n *\n * @param params - Payment Intent creation parameters\n * @returns The created Payment Intent\n */\n public async create(params: PaymentIntentCreateParams): Promise<PaymentIntent> {\n // Ensure payment_method_types defaults to ['crypto'] if empty\n const requestBody = {\n ...params,\n payment_method_types:\n params.payment_method_types && params.payment_method_types.length > 0\n ? params.payment_method_types\n : ['crypto'],\n };\n\n return this.client.post<PaymentIntent>('payment_intents', requestBody, true);\n }\n\n /**\n * Retrieve a Payment Intent by ID\n *\n * @param id - Payment Intent ID (e.g., \"pi_1234567890\")\n * @returns The Payment Intent\n */\n public async retrieve(id: string): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}`;\n\n return this.client.get<PaymentIntent>(path, true);\n }\n\n /**\n * Cancel a Payment Intent (API: POST /payment_intents/:id/cancel).\n * Use when the user is redirected to your cancel_url (e.g. https://yourapp.com/cancel?payment_intent=pi_20)\n * and you want to mark the intent as canceled on the backend.\n *\n * @param id - Payment Intent ID (e.g. \"pi_20\" or \"20\")\n * @returns The canceled Payment Intent\n *\n * @example\n * // When user lands on https://localhost:3001/cancel?payment_intent=pi_20\n * const intent = await orcarail.paymentIntents.cancel('pi_20');\n */\n public async cancel(id: string): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}/cancel`;\n\n return this.client.post<PaymentIntent>(path, {}, true);\n }\n\n /**\n * Confirm a Payment Intent (API: POST /payment_intents/:id/confirm).\n * Redirects the customer to the hosted checkout page.\n *\n * @param id - Payment Intent ID (e.g. \"pi_20\" or \"20\")\n * @param params - Confirmation parameters including client_secret and return_url\n * @returns The confirmed Payment Intent\n *\n * @example\n * const intent = await orcarail.paymentIntents.confirm('pi_20', {\n * client_secret: intent.client_secret,\n * return_url: 'https://yourapp.com/return',\n * });\n */\n public async confirm(id: string, params: PaymentIntentConfirmParams): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}/confirm`;\n\n return this.client.post<PaymentIntent>(path, params, false);\n }\n\n /**\n * Complete a Payment Intent (API: POST /payment_intents/:id/complete).\n * Sets the intent to processing; when payment is done, payment_intent.completed is sent.\n * Use when the user is redirected to your success/return URL (e.g. https://yourapp.com/success?payment_intent=pi_34).\n *\n * @param id - Payment Intent ID (e.g. \"pi_34\" or \"34\")\n * @returns The updated Payment Intent (status processing)\n *\n * @example\n * // When user lands on https://localhost:3001/success?payment_intent=pi_34\n * const intent = await orcarail.paymentIntents.complete('pi_34');\n */\n public async complete(id: string): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}/complete`;\n\n return this.client.post<PaymentIntent>(path, {}, true);\n }\n\n /**\n * Update a Payment Intent\n *\n * @param id - Payment Intent ID\n * @param params - Update parameters (all optional)\n * @returns The updated Payment Intent\n */\n public async update(id: string, params: PaymentIntentUpdateParams): Promise<PaymentIntent> {\n const cleanId = id.startsWith('pi_') ? id : `pi_${id}`;\n const path = `payment_intents/${cleanId}`;\n\n return this.client.patch<PaymentIntent>(path, params, true);\n }\n}\n","import { createHmac, timingSafeEqual } from 'crypto';\nimport { OrcaRailSignatureVerificationError } from './errors';\nimport type { WebhookEvent } from './types';\n\n/**\n * Webhook utilities for verifying webhook signatures\n */\nexport class Webhooks {\n /**\n * Verify webhook signature\n *\n * @param rawBody - Raw request body (string or Buffer)\n * @param signature - Signature from x-webhook-signature header\n * @param secret - Webhook secret (API key's secretHash)\n * @returns True if signature is valid, false otherwise\n */\n public verifySignature(rawBody: string | Buffer, signature: string, secret: string): boolean {\n if (!signature || !secret) {\n return false;\n }\n\n // Convert rawBody to string if it's a Buffer\n const bodyString = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8');\n\n // Compute expected signature\n const expectedSignature = createHmac('sha256', secret).update(bodyString).digest('hex');\n\n // Compare signatures using timing-safe comparison\n const signatureBuffer = Buffer.from(signature, 'hex');\n const expectedBuffer = Buffer.from(expectedSignature, 'hex');\n\n // Length check first (prevents timing attacks)\n if (signatureBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return timingSafeEqual(signatureBuffer, expectedBuffer);\n }\n\n /**\n * Construct and verify a webhook event from raw body and signature\n *\n * @param rawBody - Raw request body (string or Buffer)\n * @param signature - Signature from x-webhook-signature header\n * @param secret - Webhook secret (API key's secretHash)\n * @returns Parsed webhook event\n * @throws OrcaRailSignatureVerificationError if signature is invalid\n */\n public constructEvent(rawBody: string | Buffer, signature: string, secret: string): WebhookEvent {\n if (!this.verifySignature(rawBody, signature, secret)) {\n throw new OrcaRailSignatureVerificationError(\n 'Webhook signature verification failed. The signature does not match the expected signature.',\n signature\n );\n }\n\n // Parse JSON body\n const bodyString = typeof rawBody === 'string' ? rawBody : rawBody.toString('utf8');\n\n try {\n const event = JSON.parse(bodyString) as WebhookEvent;\n return event;\n } catch (error) {\n throw new OrcaRailSignatureVerificationError(\n `Failed to parse webhook body: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n}\n","import { HttpClient } from './client';\nimport { Checkout } from './resources/checkout';\nimport { PaymentIntents } from './resources/payment-intents';\nimport { Webhooks } from './webhooks';\nimport type { OrcaRailConfig } from './types';\n\n// Re-export all types\nexport type {\n OrcaRailConfig,\n PaymentIntent,\n PaymentIntentStatus,\n PaymentIntentCreateParams,\n PaymentIntentUpdateParams,\n PaymentIntentConfirmParams,\n PaymentLink,\n LatestTransaction,\n WebhookEvent,\n WebhookEventType,\n WebhookEventData,\n} from './types';\n\n// Re-export all errors\nexport {\n OrcaRailError,\n OrcaRailAPIError,\n OrcaRailAuthenticationError,\n OrcaRailSignatureVerificationError,\n} from './errors';\n\n/**\n * OrcaRail Node.js SDK\n *\n * @example\n * ```typescript\n * import OrcaRail from '@orcarail/node';\n *\n * const orcarail = new OrcaRail('ak_live_xxx', 'sk_live_xxx');\n *\n * // Create a payment intent\n * const intent = await orcarail.paymentIntents.create({\n * amount: '100.00',\n * currency: 'usd',\n * payment_method_types: ['crypto'],\n * tokenId: 1,\n * networkId: 1,\n * return_url: 'https://merchant.example.com/return',\n * });\n * ```\n */\nexport class OrcaRail {\n /**\n * Payment Intents resource\n */\n public readonly paymentIntents: PaymentIntents;\n\n /**\n * Checkout resource (slug-based get/cancel)\n */\n public readonly checkout: Checkout;\n\n /**\n * Webhooks utilities\n */\n public readonly webhooks: Webhooks;\n\n private readonly client: HttpClient;\n\n /**\n * Create a new OrcaRail client instance\n *\n * @param apiKey - Your OrcaRail API key (e.g., \"ak_live_xxx\")\n * @param apiSecret - Your OrcaRail API secret (e.g., \"sk_live_xxx\")\n * @param config - Optional configuration\n */\n constructor(apiKey: string, apiSecret: string, config?: OrcaRailConfig) {\n this.client = new HttpClient(apiKey, apiSecret, config);\n this.paymentIntents = new PaymentIntents(this.client);\n this.checkout = new Checkout(this.client);\n this.webhooks = new Webhooks();\n }\n}\n\nexport default OrcaRail;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orcarail/node",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Official Node.js SDK for OrcaRail - Accept crypto payments with Payment Intents",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",