@lntpay/sdk 0.1.0 → 0.1.5

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
@@ -22,8 +22,7 @@ const client = new LNTPay({
22
22
 
23
23
  ```ts
24
24
  const charge = await client.charges.create({
25
- amount: 2500,
26
- currency: "USD",
25
+ amount_sats: 2500,
27
26
  memo: "Coffee"
28
27
  });
29
28
 
@@ -61,7 +60,7 @@ console.log(event.type);
61
60
 
62
61
  ```ts
63
62
  await client.charges.create(
64
- { amount: 1000, currency: "USD" },
63
+ { amount_sats: 1000 },
65
64
  { idempotencyKey: "charge-2026-02-02-0001" }
66
65
  );
67
66
  ```
package/dist/index.cjs CHANGED
@@ -218,15 +218,15 @@ var LNTPay = class {
218
218
  throw new LNTPayError("apiKey is required");
219
219
  }
220
220
  this.apiKey = config.apiKey;
221
- this.baseUrl = config.baseUrl ?? "https://api.lntpay.com";
221
+ this.baseUrl = config.baseUrl ?? "https://api.lntpay.com/v1";
222
222
  this.timeoutMs = config.timeoutMs ?? 3e4;
223
223
  this.userAgent = config.userAgent ?? "@lntpay/sdk";
224
224
  this.charges = {
225
- create: (params, options) => this.request("POST", "/v0/charges", params, options),
226
- retrieve: (chargeId, options) => this.request("GET", `/v0/charges/${encodeURIComponent(chargeId)}`, void 0, options)
225
+ create: (params, options) => this.request("POST", "/charges", params, options),
226
+ retrieve: (chargeId, options) => this.request("GET", `/charges/${encodeURIComponent(chargeId)}`, void 0, options)
227
227
  };
228
228
  this.withdrawals = {
229
- create: (params, options) => this.request("POST", "/v0/withdrawals", params, options)
229
+ create: (params, options) => this.request("POST", "/withdrawals", params, options)
230
230
  };
231
231
  this.webhooks = {
232
232
  verifySignature,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/internal/request.ts","../src/webhooks.ts"],"sourcesContent":["import { request } from \"./internal/request\";\nimport { constructEvent, verifySignature } from \"./webhooks\";\nimport type {\n Charge,\n ChargeCreateParams,\n LNTPayErrorResponse,\n RequestOptions,\n Withdrawal,\n WithdrawalCreateParams,\n WebhookEvent\n} from \"./types\";\nimport {\n LNTPayAPIError,\n LNTPayError,\n LNTPayNetworkError,\n LNTPayWebhookSignatureError\n} from \"./errors\";\n\nexport interface LNTPayConfig {\n apiKey: string;\n baseUrl?: string;\n timeoutMs?: number;\n userAgent?: string;\n}\n\nexport class LNTPay {\n private apiKey: string;\n private baseUrl: string;\n private timeoutMs: number;\n private userAgent: string;\n\n charges: {\n create: (params: ChargeCreateParams, options?: RequestOptions) => Promise<Charge>;\n retrieve: (chargeId: string, options?: RequestOptions) => Promise<Charge>;\n };\n\n withdrawals: {\n create: (params: WithdrawalCreateParams, options?: RequestOptions) => Promise<Withdrawal>;\n };\n\n webhooks: {\n verifySignature: (rawBody: string | Buffer, signatureHeader: string, secret: string) => boolean;\n constructEvent: <T = WebhookEvent>(\n rawBody: string | Buffer,\n signatureHeader: string,\n secret: string\n ) => T;\n };\n\n constructor(config: LNTPayConfig) {\n if (!config?.apiKey) {\n throw new LNTPayError(\"apiKey is required\");\n }\n\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl ?? \"https://api.lntpay.com\";\n this.timeoutMs = config.timeoutMs ?? 30_000;\n this.userAgent = config.userAgent ?? \"@lntpay/sdk\";\n\n this.charges = {\n create: (params, options) => this.request<Charge>(\"POST\", \"/v0/charges\", params, options),\n retrieve: (chargeId, options) =>\n this.request<Charge>(\"GET\", `/v0/charges/${encodeURIComponent(chargeId)}`, undefined, options)\n };\n\n this.withdrawals = {\n create: (params, options) => this.request<Withdrawal>(\"POST\", \"/v0/withdrawals\", params, options)\n };\n\n this.webhooks = {\n verifySignature,\n constructEvent\n };\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n options: RequestOptions = {}\n ): Promise<T> {\n return request<T>(\n {\n apiKey: this.apiKey,\n baseUrl: this.baseUrl,\n timeoutMs: this.timeoutMs,\n userAgent: this.userAgent\n },\n method,\n path,\n body,\n options\n );\n }\n}\n\nexport {\n Charge,\n ChargeCreateParams,\n RequestOptions,\n LNTPayErrorResponse,\n Withdrawal,\n WithdrawalCreateParams,\n WebhookEvent,\n LNTPayAPIError,\n LNTPayError,\n LNTPayNetworkError,\n LNTPayWebhookSignatureError\n};\n\nexport default LNTPay;\n","export class LNTPayError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LNTPayError\";\n }\n}\n\nexport class LNTPayAPIError extends LNTPayError {\n status: number;\n code?: string;\n type?: string;\n requestId?: string;\n raw?: unknown;\n\n constructor(message: string, status: number, opts?: { code?: string; type?: string; requestId?: string; raw?: unknown }) {\n super(message);\n this.name = \"LNTPayAPIError\";\n this.status = status;\n this.code = opts?.code;\n this.type = opts?.type;\n this.requestId = opts?.requestId;\n this.raw = opts?.raw;\n }\n}\n\nexport class LNTPayNetworkError extends LNTPayError {\n constructor(message: string) {\n super(message);\n this.name = \"LNTPayNetworkError\";\n }\n}\n\nexport class LNTPayWebhookSignatureError extends LNTPayError {\n constructor(message: string) {\n super(message);\n this.name = \"LNTPayWebhookSignatureError\";\n }\n}\n","import { LNTPayAPIError, LNTPayNetworkError } from \"../errors\";\nimport type { LNTPayErrorResponse, RequestOptions } from \"../types\";\n\nexport interface ClientConfig {\n apiKey: string;\n baseUrl: string;\n timeoutMs: number;\n userAgent: string;\n}\n\nexport async function request<T>(\n config: ClientConfig,\n method: string,\n path: string,\n body?: unknown,\n options: RequestOptions = {}\n): Promise<T> {\n const url = buildUrl(config.baseUrl, path);\n const retries = method.toUpperCase() === \"GET\" ? Math.max(0, options.retries ?? 0) : 0;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n try {\n return await doFetch<T>(config, method, url, body, options);\n } catch (err) {\n if (err instanceof LNTPayNetworkError && attempt < retries) {\n lastError = err;\n continue;\n }\n throw err;\n }\n }\n\n throw lastError instanceof Error ? lastError : new LNTPayNetworkError(\"Network error\");\n}\n\nfunction buildUrl(baseUrl: string, path: string): string {\n const normalizedBase = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${normalizedBase}${normalizedPath}`;\n}\n\nasync function doFetch<T>(\n config: ClientConfig,\n method: string,\n url: string,\n body: unknown,\n options: RequestOptions\n): Promise<T> {\n const controller = new AbortController();\n const timeoutMs = options.timeoutMs ?? config.timeoutMs;\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": config.userAgent,\n ...options.headers\n };\n\n if (options.idempotencyKey) {\n headers[\"Idempotency-Key\"] = options.idempotencyKey;\n }\n\n if (options.requestId) {\n headers[\"X-Request-Id\"] = options.requestId;\n }\n\n const hasBody = body !== undefined && method.toUpperCase() !== \"GET\";\n const init: RequestInit = {\n method,\n headers,\n signal: controller.signal\n };\n\n if (hasBody) {\n init.body = JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, init);\n clearTimeout(timeout);\n\n if (!response.ok) {\n const errorPayload = await safeJson(response);\n const { message, code, type, request_id } = normalizeError(errorPayload);\n throw new LNTPayAPIError(message ?? `HTTP ${response.status}`, response.status, {\n code,\n type,\n requestId: request_id,\n raw: errorPayload\n });\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n try {\n return (await response.json()) as T;\n } catch {\n return undefined as T;\n }\n } catch (err) {\n clearTimeout(timeout);\n if (err instanceof LNTPayAPIError) {\n throw err;\n }\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new LNTPayNetworkError(`Request timed out after ${timeoutMs}ms`);\n }\n throw new LNTPayNetworkError(\"Network error\");\n }\n}\n\nasync function safeJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeError(payload: unknown): {\n message?: string;\n code?: string;\n type?: string;\n request_id?: string;\n} {\n const typed = payload as LNTPayErrorResponse | undefined;\n if (typed?.error) {\n return {\n message: typed.error.message,\n code: typed.error.code,\n type: typed.error.type,\n request_id: typed.error.request_id\n };\n }\n return {};\n}\n","import { timingSafeEqual, createHmac } from \"node:crypto\";\nimport { LNTPayWebhookSignatureError } from \"./errors\";\n\nexport function verifySignature(rawBody: string | Buffer, signatureHeader: string, secret: string): boolean {\n if (!signatureHeader || !secret) {\n return false;\n }\n\n const payload = typeof rawBody === \"string\" ? Buffer.from(rawBody, \"utf8\") : rawBody;\n const expected = createHmac(\"sha256\", secret).update(payload).digest(\"hex\");\n const candidates = extractSignatures(signatureHeader);\n\n for (const candidate of candidates) {\n if (safeEqual(candidate, expected)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function constructEvent<T>(\n rawBody: string | Buffer,\n signatureHeader: string,\n secret: string\n): T {\n if (!verifySignature(rawBody, signatureHeader, secret)) {\n throw new LNTPayWebhookSignatureError(\"Invalid webhook signature\");\n }\n\n const body = typeof rawBody === \"string\" ? rawBody : rawBody.toString(\"utf8\");\n return JSON.parse(body) as T;\n}\n\nfunction extractSignatures(signatureHeader: string): string[] {\n const trimmed = signatureHeader.trim();\n if (trimmed.includes(\"v1=\")) {\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter((part) => part.startsWith(\"v1=\"))\n .map((part) => part.slice(3))\n .filter(Boolean);\n }\n return [trimmed];\n}\n\nfunction safeEqual(a: string, b: string): boolean {\n const aBuf = Buffer.from(a, \"utf8\");\n const bBuf = Buffer.from(b, \"utf8\");\n if (aBuf.length !== bBuf.length) {\n return false;\n }\n return timingSafeEqual(aBuf, bBuf);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/internal/request.ts","../src/webhooks.ts"],"sourcesContent":["import { request } from \"./internal/request\";\nimport { constructEvent, verifySignature } from \"./webhooks\";\nimport type {\n Charge,\n ChargeCreateParams,\n LNTPayErrorResponse,\n RequestOptions,\n Withdrawal,\n WithdrawalCreateParams,\n WebhookEvent\n} from \"./types\";\nimport {\n LNTPayAPIError,\n LNTPayError,\n LNTPayNetworkError,\n LNTPayWebhookSignatureError\n} from \"./errors\";\n\nexport interface LNTPayConfig {\n apiKey: string;\n baseUrl?: string;\n timeoutMs?: number;\n userAgent?: string;\n}\n\nexport class LNTPay {\n private apiKey: string;\n private baseUrl: string;\n private timeoutMs: number;\n private userAgent: string;\n\n charges: {\n create: (params: ChargeCreateParams, options?: RequestOptions) => Promise<Charge>;\n retrieve: (chargeId: string, options?: RequestOptions) => Promise<Charge>;\n };\n\n withdrawals: {\n create: (params: WithdrawalCreateParams, options?: RequestOptions) => Promise<Withdrawal>;\n };\n\n webhooks: {\n verifySignature: (rawBody: string | Buffer, signatureHeader: string, secret: string) => boolean;\n constructEvent: <T = WebhookEvent>(\n rawBody: string | Buffer,\n signatureHeader: string,\n secret: string\n ) => T;\n };\n\n constructor(config: LNTPayConfig) {\n if (!config?.apiKey) {\n throw new LNTPayError(\"apiKey is required\");\n }\n\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl ?? \"https://api.lntpay.com/v1\";\n this.timeoutMs = config.timeoutMs ?? 30_000;\n this.userAgent = config.userAgent ?? \"@lntpay/sdk\";\n\n this.charges = {\n create: (params, options) => this.request<Charge>(\"POST\", \"/charges\", params, options),\n retrieve: (chargeId, options) =>\n this.request<Charge>(\"GET\", `/charges/${encodeURIComponent(chargeId)}`, undefined, options)\n };\n\n this.withdrawals = {\n create: (params, options) => this.request<Withdrawal>(\"POST\", \"/withdrawals\", params, options)\n };\n\n this.webhooks = {\n verifySignature,\n constructEvent\n };\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n options: RequestOptions = {}\n ): Promise<T> {\n return request<T>(\n {\n apiKey: this.apiKey,\n baseUrl: this.baseUrl,\n timeoutMs: this.timeoutMs,\n userAgent: this.userAgent\n },\n method,\n path,\n body,\n options\n );\n }\n}\n\nexport {\n Charge,\n ChargeCreateParams,\n RequestOptions,\n LNTPayErrorResponse,\n Withdrawal,\n WithdrawalCreateParams,\n WebhookEvent,\n LNTPayAPIError,\n LNTPayError,\n LNTPayNetworkError,\n LNTPayWebhookSignatureError\n};\n\nexport default LNTPay;\n","export class LNTPayError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LNTPayError\";\n }\n}\n\nexport class LNTPayAPIError extends LNTPayError {\n status: number;\n code?: string;\n type?: string;\n requestId?: string;\n raw?: unknown;\n\n constructor(message: string, status: number, opts?: { code?: string; type?: string; requestId?: string; raw?: unknown }) {\n super(message);\n this.name = \"LNTPayAPIError\";\n this.status = status;\n this.code = opts?.code;\n this.type = opts?.type;\n this.requestId = opts?.requestId;\n this.raw = opts?.raw;\n }\n}\n\nexport class LNTPayNetworkError extends LNTPayError {\n constructor(message: string) {\n super(message);\n this.name = \"LNTPayNetworkError\";\n }\n}\n\nexport class LNTPayWebhookSignatureError extends LNTPayError {\n constructor(message: string) {\n super(message);\n this.name = \"LNTPayWebhookSignatureError\";\n }\n}\n","import { LNTPayAPIError, LNTPayNetworkError } from \"../errors\";\nimport type { LNTPayErrorResponse, RequestOptions } from \"../types\";\n\nexport interface ClientConfig {\n apiKey: string;\n baseUrl: string;\n timeoutMs: number;\n userAgent: string;\n}\n\nexport async function request<T>(\n config: ClientConfig,\n method: string,\n path: string,\n body?: unknown,\n options: RequestOptions = {}\n): Promise<T> {\n const url = buildUrl(config.baseUrl, path);\n const retries = method.toUpperCase() === \"GET\" ? Math.max(0, options.retries ?? 0) : 0;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n try {\n return await doFetch<T>(config, method, url, body, options);\n } catch (err) {\n if (err instanceof LNTPayNetworkError && attempt < retries) {\n lastError = err;\n continue;\n }\n throw err;\n }\n }\n\n throw lastError instanceof Error ? lastError : new LNTPayNetworkError(\"Network error\");\n}\n\nfunction buildUrl(baseUrl: string, path: string): string {\n const normalizedBase = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${normalizedBase}${normalizedPath}`;\n}\n\nasync function doFetch<T>(\n config: ClientConfig,\n method: string,\n url: string,\n body: unknown,\n options: RequestOptions\n): Promise<T> {\n const controller = new AbortController();\n const timeoutMs = options.timeoutMs ?? config.timeoutMs;\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": config.userAgent,\n ...options.headers\n };\n\n if (options.idempotencyKey) {\n headers[\"Idempotency-Key\"] = options.idempotencyKey;\n }\n\n if (options.requestId) {\n headers[\"X-Request-Id\"] = options.requestId;\n }\n\n const hasBody = body !== undefined && method.toUpperCase() !== \"GET\";\n const init: RequestInit = {\n method,\n headers,\n signal: controller.signal\n };\n\n if (hasBody) {\n init.body = JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, init);\n clearTimeout(timeout);\n\n if (!response.ok) {\n const errorPayload = await safeJson(response);\n const { message, code, type, request_id } = normalizeError(errorPayload);\n throw new LNTPayAPIError(message ?? `HTTP ${response.status}`, response.status, {\n code,\n type,\n requestId: request_id,\n raw: errorPayload\n });\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n try {\n return (await response.json()) as T;\n } catch {\n return undefined as T;\n }\n } catch (err) {\n clearTimeout(timeout);\n if (err instanceof LNTPayAPIError) {\n throw err;\n }\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new LNTPayNetworkError(`Request timed out after ${timeoutMs}ms`);\n }\n throw new LNTPayNetworkError(\"Network error\");\n }\n}\n\nasync function safeJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeError(payload: unknown): {\n message?: string;\n code?: string;\n type?: string;\n request_id?: string;\n} {\n const typed = payload as LNTPayErrorResponse | undefined;\n if (typed?.error) {\n return {\n message: typed.error.message,\n code: typed.error.code,\n type: typed.error.type,\n request_id: typed.error.request_id\n };\n }\n return {};\n}\n","import { timingSafeEqual, createHmac } from \"node:crypto\";\nimport { LNTPayWebhookSignatureError } from \"./errors\";\n\nexport function verifySignature(rawBody: string | Buffer, signatureHeader: string, secret: string): boolean {\n if (!signatureHeader || !secret) {\n return false;\n }\n\n const payload = typeof rawBody === \"string\" ? Buffer.from(rawBody, \"utf8\") : rawBody;\n const expected = createHmac(\"sha256\", secret).update(payload).digest(\"hex\");\n const candidates = extractSignatures(signatureHeader);\n\n for (const candidate of candidates) {\n if (safeEqual(candidate, expected)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function constructEvent<T>(\n rawBody: string | Buffer,\n signatureHeader: string,\n secret: string\n): T {\n if (!verifySignature(rawBody, signatureHeader, secret)) {\n throw new LNTPayWebhookSignatureError(\"Invalid webhook signature\");\n }\n\n const body = typeof rawBody === \"string\" ? rawBody : rawBody.toString(\"utf8\");\n return JSON.parse(body) as T;\n}\n\nfunction extractSignatures(signatureHeader: string): string[] {\n const trimmed = signatureHeader.trim();\n if (trimmed.includes(\"v1=\")) {\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter((part) => part.startsWith(\"v1=\"))\n .map((part) => part.slice(3))\n .filter(Boolean);\n }\n return [trimmed];\n}\n\nfunction safeEqual(a: string, b: string): boolean {\n const aBuf = Buffer.from(a, \"utf8\");\n const bBuf = Buffer.from(b, \"utf8\");\n if (aBuf.length !== bBuf.length) {\n return false;\n }\n return timingSafeEqual(aBuf, bBuf);\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -16,8 +16,7 @@ interface LNTPayErrorResponse {
16
16
  type ChargeStatus = "pending" | "paid" | "expired" | "canceled" | string;
17
17
  interface Charge {
18
18
  id: string;
19
- amount?: number;
20
- currency?: string;
19
+ amount_sats?: number;
21
20
  status?: ChargeStatus;
22
21
  bolt11?: string;
23
22
  created_at?: string;
@@ -26,8 +25,9 @@ interface Charge {
26
25
  [key: string]: unknown;
27
26
  }
28
27
  interface ChargeCreateParams {
29
- amount: number;
30
- currency?: string;
28
+ amount_sats: number;
29
+ amount?: never;
30
+ currency?: never;
31
31
  memo?: string;
32
32
  metadata?: Record<string, unknown>;
33
33
  [key: string]: unknown;
package/dist/index.d.ts CHANGED
@@ -16,8 +16,7 @@ interface LNTPayErrorResponse {
16
16
  type ChargeStatus = "pending" | "paid" | "expired" | "canceled" | string;
17
17
  interface Charge {
18
18
  id: string;
19
- amount?: number;
20
- currency?: string;
19
+ amount_sats?: number;
21
20
  status?: ChargeStatus;
22
21
  bolt11?: string;
23
22
  created_at?: string;
@@ -26,8 +25,9 @@ interface Charge {
26
25
  [key: string]: unknown;
27
26
  }
28
27
  interface ChargeCreateParams {
29
- amount: number;
30
- currency?: string;
28
+ amount_sats: number;
29
+ amount?: never;
30
+ currency?: never;
31
31
  memo?: string;
32
32
  metadata?: Record<string, unknown>;
33
33
  [key: string]: unknown;
package/dist/index.js CHANGED
@@ -187,15 +187,15 @@ var LNTPay = class {
187
187
  throw new LNTPayError("apiKey is required");
188
188
  }
189
189
  this.apiKey = config.apiKey;
190
- this.baseUrl = config.baseUrl ?? "https://api.lntpay.com";
190
+ this.baseUrl = config.baseUrl ?? "https://api.lntpay.com/v1";
191
191
  this.timeoutMs = config.timeoutMs ?? 3e4;
192
192
  this.userAgent = config.userAgent ?? "@lntpay/sdk";
193
193
  this.charges = {
194
- create: (params, options) => this.request("POST", "/v0/charges", params, options),
195
- retrieve: (chargeId, options) => this.request("GET", `/v0/charges/${encodeURIComponent(chargeId)}`, void 0, options)
194
+ create: (params, options) => this.request("POST", "/charges", params, options),
195
+ retrieve: (chargeId, options) => this.request("GET", `/charges/${encodeURIComponent(chargeId)}`, void 0, options)
196
196
  };
197
197
  this.withdrawals = {
198
- create: (params, options) => this.request("POST", "/v0/withdrawals", params, options)
198
+ create: (params, options) => this.request("POST", "/withdrawals", params, options)
199
199
  };
200
200
  this.webhooks = {
201
201
  verifySignature,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/internal/request.ts","../src/webhooks.ts","../src/index.ts"],"sourcesContent":["export class LNTPayError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LNTPayError\";\n }\n}\n\nexport class LNTPayAPIError extends LNTPayError {\n status: number;\n code?: string;\n type?: string;\n requestId?: string;\n raw?: unknown;\n\n constructor(message: string, status: number, opts?: { code?: string; type?: string; requestId?: string; raw?: unknown }) {\n super(message);\n this.name = \"LNTPayAPIError\";\n this.status = status;\n this.code = opts?.code;\n this.type = opts?.type;\n this.requestId = opts?.requestId;\n this.raw = opts?.raw;\n }\n}\n\nexport class LNTPayNetworkError extends LNTPayError {\n constructor(message: string) {\n super(message);\n this.name = \"LNTPayNetworkError\";\n }\n}\n\nexport class LNTPayWebhookSignatureError extends LNTPayError {\n constructor(message: string) {\n super(message);\n this.name = \"LNTPayWebhookSignatureError\";\n }\n}\n","import { LNTPayAPIError, LNTPayNetworkError } from \"../errors\";\nimport type { LNTPayErrorResponse, RequestOptions } from \"../types\";\n\nexport interface ClientConfig {\n apiKey: string;\n baseUrl: string;\n timeoutMs: number;\n userAgent: string;\n}\n\nexport async function request<T>(\n config: ClientConfig,\n method: string,\n path: string,\n body?: unknown,\n options: RequestOptions = {}\n): Promise<T> {\n const url = buildUrl(config.baseUrl, path);\n const retries = method.toUpperCase() === \"GET\" ? Math.max(0, options.retries ?? 0) : 0;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n try {\n return await doFetch<T>(config, method, url, body, options);\n } catch (err) {\n if (err instanceof LNTPayNetworkError && attempt < retries) {\n lastError = err;\n continue;\n }\n throw err;\n }\n }\n\n throw lastError instanceof Error ? lastError : new LNTPayNetworkError(\"Network error\");\n}\n\nfunction buildUrl(baseUrl: string, path: string): string {\n const normalizedBase = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${normalizedBase}${normalizedPath}`;\n}\n\nasync function doFetch<T>(\n config: ClientConfig,\n method: string,\n url: string,\n body: unknown,\n options: RequestOptions\n): Promise<T> {\n const controller = new AbortController();\n const timeoutMs = options.timeoutMs ?? config.timeoutMs;\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": config.userAgent,\n ...options.headers\n };\n\n if (options.idempotencyKey) {\n headers[\"Idempotency-Key\"] = options.idempotencyKey;\n }\n\n if (options.requestId) {\n headers[\"X-Request-Id\"] = options.requestId;\n }\n\n const hasBody = body !== undefined && method.toUpperCase() !== \"GET\";\n const init: RequestInit = {\n method,\n headers,\n signal: controller.signal\n };\n\n if (hasBody) {\n init.body = JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, init);\n clearTimeout(timeout);\n\n if (!response.ok) {\n const errorPayload = await safeJson(response);\n const { message, code, type, request_id } = normalizeError(errorPayload);\n throw new LNTPayAPIError(message ?? `HTTP ${response.status}`, response.status, {\n code,\n type,\n requestId: request_id,\n raw: errorPayload\n });\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n try {\n return (await response.json()) as T;\n } catch {\n return undefined as T;\n }\n } catch (err) {\n clearTimeout(timeout);\n if (err instanceof LNTPayAPIError) {\n throw err;\n }\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new LNTPayNetworkError(`Request timed out after ${timeoutMs}ms`);\n }\n throw new LNTPayNetworkError(\"Network error\");\n }\n}\n\nasync function safeJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeError(payload: unknown): {\n message?: string;\n code?: string;\n type?: string;\n request_id?: string;\n} {\n const typed = payload as LNTPayErrorResponse | undefined;\n if (typed?.error) {\n return {\n message: typed.error.message,\n code: typed.error.code,\n type: typed.error.type,\n request_id: typed.error.request_id\n };\n }\n return {};\n}\n","import { timingSafeEqual, createHmac } from \"node:crypto\";\nimport { LNTPayWebhookSignatureError } from \"./errors\";\n\nexport function verifySignature(rawBody: string | Buffer, signatureHeader: string, secret: string): boolean {\n if (!signatureHeader || !secret) {\n return false;\n }\n\n const payload = typeof rawBody === \"string\" ? Buffer.from(rawBody, \"utf8\") : rawBody;\n const expected = createHmac(\"sha256\", secret).update(payload).digest(\"hex\");\n const candidates = extractSignatures(signatureHeader);\n\n for (const candidate of candidates) {\n if (safeEqual(candidate, expected)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function constructEvent<T>(\n rawBody: string | Buffer,\n signatureHeader: string,\n secret: string\n): T {\n if (!verifySignature(rawBody, signatureHeader, secret)) {\n throw new LNTPayWebhookSignatureError(\"Invalid webhook signature\");\n }\n\n const body = typeof rawBody === \"string\" ? rawBody : rawBody.toString(\"utf8\");\n return JSON.parse(body) as T;\n}\n\nfunction extractSignatures(signatureHeader: string): string[] {\n const trimmed = signatureHeader.trim();\n if (trimmed.includes(\"v1=\")) {\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter((part) => part.startsWith(\"v1=\"))\n .map((part) => part.slice(3))\n .filter(Boolean);\n }\n return [trimmed];\n}\n\nfunction safeEqual(a: string, b: string): boolean {\n const aBuf = Buffer.from(a, \"utf8\");\n const bBuf = Buffer.from(b, \"utf8\");\n if (aBuf.length !== bBuf.length) {\n return false;\n }\n return timingSafeEqual(aBuf, bBuf);\n}\n","import { request } from \"./internal/request\";\nimport { constructEvent, verifySignature } from \"./webhooks\";\nimport type {\n Charge,\n ChargeCreateParams,\n LNTPayErrorResponse,\n RequestOptions,\n Withdrawal,\n WithdrawalCreateParams,\n WebhookEvent\n} from \"./types\";\nimport {\n LNTPayAPIError,\n LNTPayError,\n LNTPayNetworkError,\n LNTPayWebhookSignatureError\n} from \"./errors\";\n\nexport interface LNTPayConfig {\n apiKey: string;\n baseUrl?: string;\n timeoutMs?: number;\n userAgent?: string;\n}\n\nexport class LNTPay {\n private apiKey: string;\n private baseUrl: string;\n private timeoutMs: number;\n private userAgent: string;\n\n charges: {\n create: (params: ChargeCreateParams, options?: RequestOptions) => Promise<Charge>;\n retrieve: (chargeId: string, options?: RequestOptions) => Promise<Charge>;\n };\n\n withdrawals: {\n create: (params: WithdrawalCreateParams, options?: RequestOptions) => Promise<Withdrawal>;\n };\n\n webhooks: {\n verifySignature: (rawBody: string | Buffer, signatureHeader: string, secret: string) => boolean;\n constructEvent: <T = WebhookEvent>(\n rawBody: string | Buffer,\n signatureHeader: string,\n secret: string\n ) => T;\n };\n\n constructor(config: LNTPayConfig) {\n if (!config?.apiKey) {\n throw new LNTPayError(\"apiKey is required\");\n }\n\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl ?? \"https://api.lntpay.com\";\n this.timeoutMs = config.timeoutMs ?? 30_000;\n this.userAgent = config.userAgent ?? \"@lntpay/sdk\";\n\n this.charges = {\n create: (params, options) => this.request<Charge>(\"POST\", \"/v0/charges\", params, options),\n retrieve: (chargeId, options) =>\n this.request<Charge>(\"GET\", `/v0/charges/${encodeURIComponent(chargeId)}`, undefined, options)\n };\n\n this.withdrawals = {\n create: (params, options) => this.request<Withdrawal>(\"POST\", \"/v0/withdrawals\", params, options)\n };\n\n this.webhooks = {\n verifySignature,\n constructEvent\n };\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n options: RequestOptions = {}\n ): Promise<T> {\n return request<T>(\n {\n apiKey: this.apiKey,\n baseUrl: this.baseUrl,\n timeoutMs: this.timeoutMs,\n userAgent: this.userAgent\n },\n method,\n path,\n body,\n options\n );\n }\n}\n\nexport {\n Charge,\n ChargeCreateParams,\n RequestOptions,\n LNTPayErrorResponse,\n Withdrawal,\n WithdrawalCreateParams,\n WebhookEvent,\n LNTPayAPIError,\n LNTPayError,\n LNTPayNetworkError,\n LNTPayWebhookSignatureError\n};\n\nexport default LNTPay;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/internal/request.ts","../src/webhooks.ts","../src/index.ts"],"sourcesContent":["export class LNTPayError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LNTPayError\";\n }\n}\n\nexport class LNTPayAPIError extends LNTPayError {\n status: number;\n code?: string;\n type?: string;\n requestId?: string;\n raw?: unknown;\n\n constructor(message: string, status: number, opts?: { code?: string; type?: string; requestId?: string; raw?: unknown }) {\n super(message);\n this.name = \"LNTPayAPIError\";\n this.status = status;\n this.code = opts?.code;\n this.type = opts?.type;\n this.requestId = opts?.requestId;\n this.raw = opts?.raw;\n }\n}\n\nexport class LNTPayNetworkError extends LNTPayError {\n constructor(message: string) {\n super(message);\n this.name = \"LNTPayNetworkError\";\n }\n}\n\nexport class LNTPayWebhookSignatureError extends LNTPayError {\n constructor(message: string) {\n super(message);\n this.name = \"LNTPayWebhookSignatureError\";\n }\n}\n","import { LNTPayAPIError, LNTPayNetworkError } from \"../errors\";\nimport type { LNTPayErrorResponse, RequestOptions } from \"../types\";\n\nexport interface ClientConfig {\n apiKey: string;\n baseUrl: string;\n timeoutMs: number;\n userAgent: string;\n}\n\nexport async function request<T>(\n config: ClientConfig,\n method: string,\n path: string,\n body?: unknown,\n options: RequestOptions = {}\n): Promise<T> {\n const url = buildUrl(config.baseUrl, path);\n const retries = method.toUpperCase() === \"GET\" ? Math.max(0, options.retries ?? 0) : 0;\n\n let lastError: unknown;\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n try {\n return await doFetch<T>(config, method, url, body, options);\n } catch (err) {\n if (err instanceof LNTPayNetworkError && attempt < retries) {\n lastError = err;\n continue;\n }\n throw err;\n }\n }\n\n throw lastError instanceof Error ? lastError : new LNTPayNetworkError(\"Network error\");\n}\n\nfunction buildUrl(baseUrl: string, path: string): string {\n const normalizedBase = baseUrl.endsWith(\"/\") ? baseUrl.slice(0, -1) : baseUrl;\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${normalizedBase}${normalizedPath}`;\n}\n\nasync function doFetch<T>(\n config: ClientConfig,\n method: string,\n url: string,\n body: unknown,\n options: RequestOptions\n): Promise<T> {\n const controller = new AbortController();\n const timeoutMs = options.timeoutMs ?? config.timeoutMs;\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${config.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": config.userAgent,\n ...options.headers\n };\n\n if (options.idempotencyKey) {\n headers[\"Idempotency-Key\"] = options.idempotencyKey;\n }\n\n if (options.requestId) {\n headers[\"X-Request-Id\"] = options.requestId;\n }\n\n const hasBody = body !== undefined && method.toUpperCase() !== \"GET\";\n const init: RequestInit = {\n method,\n headers,\n signal: controller.signal\n };\n\n if (hasBody) {\n init.body = JSON.stringify(body);\n }\n\n try {\n const response = await fetch(url, init);\n clearTimeout(timeout);\n\n if (!response.ok) {\n const errorPayload = await safeJson(response);\n const { message, code, type, request_id } = normalizeError(errorPayload);\n throw new LNTPayAPIError(message ?? `HTTP ${response.status}`, response.status, {\n code,\n type,\n requestId: request_id,\n raw: errorPayload\n });\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n try {\n return (await response.json()) as T;\n } catch {\n return undefined as T;\n }\n } catch (err) {\n clearTimeout(timeout);\n if (err instanceof LNTPayAPIError) {\n throw err;\n }\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new LNTPayNetworkError(`Request timed out after ${timeoutMs}ms`);\n }\n throw new LNTPayNetworkError(\"Network error\");\n }\n}\n\nasync function safeJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeError(payload: unknown): {\n message?: string;\n code?: string;\n type?: string;\n request_id?: string;\n} {\n const typed = payload as LNTPayErrorResponse | undefined;\n if (typed?.error) {\n return {\n message: typed.error.message,\n code: typed.error.code,\n type: typed.error.type,\n request_id: typed.error.request_id\n };\n }\n return {};\n}\n","import { timingSafeEqual, createHmac } from \"node:crypto\";\nimport { LNTPayWebhookSignatureError } from \"./errors\";\n\nexport function verifySignature(rawBody: string | Buffer, signatureHeader: string, secret: string): boolean {\n if (!signatureHeader || !secret) {\n return false;\n }\n\n const payload = typeof rawBody === \"string\" ? Buffer.from(rawBody, \"utf8\") : rawBody;\n const expected = createHmac(\"sha256\", secret).update(payload).digest(\"hex\");\n const candidates = extractSignatures(signatureHeader);\n\n for (const candidate of candidates) {\n if (safeEqual(candidate, expected)) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function constructEvent<T>(\n rawBody: string | Buffer,\n signatureHeader: string,\n secret: string\n): T {\n if (!verifySignature(rawBody, signatureHeader, secret)) {\n throw new LNTPayWebhookSignatureError(\"Invalid webhook signature\");\n }\n\n const body = typeof rawBody === \"string\" ? rawBody : rawBody.toString(\"utf8\");\n return JSON.parse(body) as T;\n}\n\nfunction extractSignatures(signatureHeader: string): string[] {\n const trimmed = signatureHeader.trim();\n if (trimmed.includes(\"v1=\")) {\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter((part) => part.startsWith(\"v1=\"))\n .map((part) => part.slice(3))\n .filter(Boolean);\n }\n return [trimmed];\n}\n\nfunction safeEqual(a: string, b: string): boolean {\n const aBuf = Buffer.from(a, \"utf8\");\n const bBuf = Buffer.from(b, \"utf8\");\n if (aBuf.length !== bBuf.length) {\n return false;\n }\n return timingSafeEqual(aBuf, bBuf);\n}\n","import { request } from \"./internal/request\";\nimport { constructEvent, verifySignature } from \"./webhooks\";\nimport type {\n Charge,\n ChargeCreateParams,\n LNTPayErrorResponse,\n RequestOptions,\n Withdrawal,\n WithdrawalCreateParams,\n WebhookEvent\n} from \"./types\";\nimport {\n LNTPayAPIError,\n LNTPayError,\n LNTPayNetworkError,\n LNTPayWebhookSignatureError\n} from \"./errors\";\n\nexport interface LNTPayConfig {\n apiKey: string;\n baseUrl?: string;\n timeoutMs?: number;\n userAgent?: string;\n}\n\nexport class LNTPay {\n private apiKey: string;\n private baseUrl: string;\n private timeoutMs: number;\n private userAgent: string;\n\n charges: {\n create: (params: ChargeCreateParams, options?: RequestOptions) => Promise<Charge>;\n retrieve: (chargeId: string, options?: RequestOptions) => Promise<Charge>;\n };\n\n withdrawals: {\n create: (params: WithdrawalCreateParams, options?: RequestOptions) => Promise<Withdrawal>;\n };\n\n webhooks: {\n verifySignature: (rawBody: string | Buffer, signatureHeader: string, secret: string) => boolean;\n constructEvent: <T = WebhookEvent>(\n rawBody: string | Buffer,\n signatureHeader: string,\n secret: string\n ) => T;\n };\n\n constructor(config: LNTPayConfig) {\n if (!config?.apiKey) {\n throw new LNTPayError(\"apiKey is required\");\n }\n\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl ?? \"https://api.lntpay.com/v1\";\n this.timeoutMs = config.timeoutMs ?? 30_000;\n this.userAgent = config.userAgent ?? \"@lntpay/sdk\";\n\n this.charges = {\n create: (params, options) => this.request<Charge>(\"POST\", \"/charges\", params, options),\n retrieve: (chargeId, options) =>\n this.request<Charge>(\"GET\", `/charges/${encodeURIComponent(chargeId)}`, undefined, options)\n };\n\n this.withdrawals = {\n create: (params, options) => this.request<Withdrawal>(\"POST\", \"/withdrawals\", params, options)\n };\n\n this.webhooks = {\n verifySignature,\n constructEvent\n };\n }\n\n private async request<T>(\n method: string,\n path: string,\n body?: unknown,\n options: RequestOptions = {}\n ): Promise<T> {\n return request<T>(\n {\n apiKey: this.apiKey,\n baseUrl: this.baseUrl,\n timeoutMs: this.timeoutMs,\n userAgent: this.userAgent\n },\n method,\n path,\n body,\n options\n );\n }\n}\n\nexport {\n Charge,\n ChargeCreateParams,\n RequestOptions,\n LNTPayErrorResponse,\n Withdrawal,\n WithdrawalCreateParams,\n WebhookEvent,\n LNTPayAPIError,\n LNTPayError,\n LNTPayNetworkError,\n LNTPayWebhookSignatureError\n};\n\nexport default LNTPay;\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,13 +1,27 @@
1
1
  {
2
2
  "name": "@lntpay/sdk",
3
- "version": "0.1.0",
3
+ "version": "0.1.5",
4
4
  "description": "Official LNTPay SDK for Node.js",
5
5
  "license": "MIT",
6
- "repository": { "type": "git", "url": "git+https://github.com/lntpay/lntpay-sdk.git" },
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/lntpay/lntpay-sdk.git"
9
+ },
7
10
  "homepage": "https://github.com/lntpay/lntpay-sdk#readme",
8
- "bugs": { "url": "https://github.com/lntpay/lntpay-sdk/issues" },
9
- "keywords": ["lightning", "bitcoin", "payments", "ln", "lntpay", "sdk"],
10
- "publishConfig": { "access": "public" },
11
+ "bugs": {
12
+ "url": "https://github.com/lntpay/lntpay-sdk/issues"
13
+ },
14
+ "keywords": [
15
+ "lightning",
16
+ "bitcoin",
17
+ "payments",
18
+ "ln",
19
+ "lntpay",
20
+ "sdk"
21
+ ],
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
11
25
  "type": "module",
12
26
  "types": "./dist/index.d.ts",
13
27
  "exports": {
@@ -17,16 +31,23 @@
17
31
  "require": "./dist/index.cjs"
18
32
  }
19
33
  },
20
- "files": ["dist", "README.md", "LICENSE", "CHANGELOG.md"],
34
+ "files": [
35
+ "dist",
36
+ "README.md",
37
+ "LICENSE",
38
+ "CHANGELOG.md"
39
+ ],
21
40
  "scripts": {
22
41
  "build": "tsup",
23
- "test": "npm run build && node -e \"const m=require('./dist/index.cjs'); if(!(m.LNTPay||m.default)) process.exit(1); console.log('ok');\"",
42
+ "test": "npm run build && node -e \"const m=require('./dist/index.cjs'); const client=new m.LNTPay({apiKey:'test'}); const params={amount_sats:1}; if(!params.amount_sats||!client) process.exit(1); console.log('ok');\"",
24
43
  "lint": "tsc -p tsconfig.json --noEmit"
25
44
  },
26
- "engines": { "node": ">=18" },
45
+ "engines": {
46
+ "node": ">=18"
47
+ },
27
48
  "devDependencies": {
28
49
  "@types/node": "^20.11.30",
29
50
  "tsup": "^8.0.1",
30
51
  "typescript": "^5.4.5"
31
52
  }
32
- }
53
+ }