@sunnyln/lni 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +118 -0
  2. package/dist/errors.d.ts +13 -0
  3. package/dist/errors.d.ts.map +1 -0
  4. package/dist/errors.js +25 -0
  5. package/dist/errors.js.map +1 -0
  6. package/dist/index.d.ts +11 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +11 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/internal/encoding.d.ts +5 -0
  11. package/dist/internal/encoding.d.ts.map +1 -0
  12. package/dist/internal/encoding.js +79 -0
  13. package/dist/internal/encoding.js.map +1 -0
  14. package/dist/internal/http.d.ts +19 -0
  15. package/dist/internal/http.d.ts.map +1 -0
  16. package/dist/internal/http.js +130 -0
  17. package/dist/internal/http.js.map +1 -0
  18. package/dist/internal/polling.d.ts +8 -0
  19. package/dist/internal/polling.d.ts.map +1 -0
  20. package/dist/internal/polling.js +26 -0
  21. package/dist/internal/polling.js.map +1 -0
  22. package/dist/internal/transform.d.ts +10 -0
  23. package/dist/internal/transform.d.ts.map +1 -0
  24. package/dist/internal/transform.js +91 -0
  25. package/dist/internal/transform.js.map +1 -0
  26. package/dist/lnurl.d.ts +13 -0
  27. package/dist/lnurl.d.ts.map +1 -0
  28. package/dist/lnurl.js +156 -0
  29. package/dist/lnurl.js.map +1 -0
  30. package/dist/nodes/blink.d.ts +23 -0
  31. package/dist/nodes/blink.d.ts.map +1 -0
  32. package/dist/nodes/blink.js +292 -0
  33. package/dist/nodes/blink.js.map +1 -0
  34. package/dist/nodes/cln.d.ts +24 -0
  35. package/dist/nodes/cln.d.ts.map +1 -0
  36. package/dist/nodes/cln.js +266 -0
  37. package/dist/nodes/cln.js.map +1 -0
  38. package/dist/nodes/lnd.d.ts +24 -0
  39. package/dist/nodes/lnd.d.ts.map +1 -0
  40. package/dist/nodes/lnd.js +205 -0
  41. package/dist/nodes/lnd.js.map +1 -0
  42. package/dist/nodes/nwc.d.ts +21 -0
  43. package/dist/nodes/nwc.d.ts.map +1 -0
  44. package/dist/nodes/nwc.js +194 -0
  45. package/dist/nodes/nwc.js.map +1 -0
  46. package/dist/nodes/phoenixd.d.ts +22 -0
  47. package/dist/nodes/phoenixd.d.ts.map +1 -0
  48. package/dist/nodes/phoenixd.js +258 -0
  49. package/dist/nodes/phoenixd.js.map +1 -0
  50. package/dist/nodes/speed.d.ts +25 -0
  51. package/dist/nodes/speed.d.ts.map +1 -0
  52. package/dist/nodes/speed.js +170 -0
  53. package/dist/nodes/speed.js.map +1 -0
  54. package/dist/nodes/strike.d.ts +25 -0
  55. package/dist/nodes/strike.d.ts.map +1 -0
  56. package/dist/nodes/strike.js +231 -0
  57. package/dist/nodes/strike.js.map +1 -0
  58. package/dist/types.d.ts +169 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +6 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +70 -0
package/README.md ADDED
@@ -0,0 +1,118 @@
1
+ # LNI TypeScript (Frontend-first)
2
+
3
+ Pure TypeScript port of `crates/lni` HTTP adapters for frontend runtimes.
4
+
5
+ ## Scope
6
+
7
+ Implemented in this package:
8
+
9
+ - `PhoenixdNode`
10
+ - `ClnNode`
11
+ - `LndNode`
12
+ - `NwcNode`
13
+ - `StrikeNode`
14
+ - `SpeedNode`
15
+ - `BlinkNode`
16
+ - LNURL helpers (`detectPaymentType`, `needsResolution`, `resolveToBolt11`, `getPaymentInfo`)
17
+
18
+ Not included yet:
19
+
20
+ - `SparkNode` (intentionally deferred)
21
+
22
+ ## Install
23
+
24
+ ```bash
25
+ npm install @sunnyln/lni
26
+ ```
27
+
28
+ From source:
29
+
30
+ ```bash
31
+ cd bindings/typescript
32
+ npm install
33
+ npm run typecheck
34
+ npm run build
35
+ ```
36
+
37
+ ## Install from this GitHub repo (without publishing)
38
+
39
+ Because this package lives in a monorepo subfolder, install it from a local path after cloning:
40
+
41
+ ```bash
42
+ git clone https://github.com/lightning-node-interface/lni.git
43
+ npm install ./lni/bindings/typescript
44
+ ```
45
+
46
+ One-liner:
47
+
48
+ ```bash
49
+ TMP_DIR=$(mktemp -d) && git clone --depth 1 https://github.com/lightning-node-interface/lni.git "$TMP_DIR/lni" && npm install "$TMP_DIR/lni/bindings/typescript"
50
+ ```
51
+
52
+ From another project:
53
+
54
+ ```bash
55
+ npm install /absolute/path/to/lni/bindings/typescript
56
+ ```
57
+
58
+ ## Packaging and publish
59
+
60
+ ```bash
61
+ cd bindings/typescript
62
+ npm install
63
+ npm run prepack
64
+ npm run pack:dry-run
65
+ ```
66
+
67
+ To publish:
68
+
69
+ ```bash
70
+ npm login
71
+ npm run publish:public
72
+ ```
73
+
74
+ Per-node real integration test scripts are available before publishing:
75
+
76
+ - `npm run test:integration:phoenixd`
77
+ - `npm run test:integration:cln`
78
+ - `npm run test:integration:lnd`
79
+ - `npm run test:integration:strike`
80
+ - `npm run test:integration:speed`
81
+ - `npm run test:integration:blink`
82
+ - `npm run test:integration:nwc`
83
+
84
+ ## Basic usage
85
+
86
+ ```ts
87
+ import { LndNode } from '@sunnyln/lni';
88
+
89
+ const node = new LndNode({
90
+ url: 'https://127.0.0.1:8080',
91
+ macaroon: '...'
92
+ });
93
+
94
+ const info = await node.getInfo();
95
+ console.log(info.sendBalanceMsat);
96
+ ```
97
+
98
+ ## Frontend runtime notes
99
+
100
+ - This package uses `fetch` and does not depend on Node native modules.
101
+ - You can inject a custom fetch implementation via constructor options:
102
+ - `new LndNode(config, { fetch: customFetch })`
103
+ - `socks5Proxy` and `acceptInvalidCerts` are config-compatible with Rust structs, but not applied in browser fetch runtimes.
104
+ - Most backends require secrets (API keys, macaroons, runes, passwords). For production web apps, use a backend proxy/BFF to protect secrets.
105
+
106
+ ## API parity
107
+
108
+ The exported TypeScript interfaces mirror `bindings/lni_nodejs/index.d.ts` shapes:
109
+
110
+ - `NodeInfo`
111
+ - `Transaction`
112
+ - `CreateInvoiceParams`
113
+ - `PayInvoiceParams`
114
+ - `ListTransactionsParams`
115
+ - `LookupInvoiceParams`
116
+ - `OnInvoiceEventParams`
117
+
118
+ Methods are class-based (`getInfo`, `createInvoice`, `payInvoice`, `lookupInvoice`, etc.), with polling callback support via `onInvoiceEvents`.
@@ -0,0 +1,13 @@
1
+ export type LniErrorCode = 'Http' | 'Api' | 'Json' | 'NetworkError' | 'InvalidInput' | 'LnurlError';
2
+ export declare class LniError extends Error {
3
+ readonly code: LniErrorCode;
4
+ readonly status?: number;
5
+ readonly body?: string;
6
+ constructor(code: LniErrorCode, message: string, options?: {
7
+ status?: number;
8
+ body?: string;
9
+ cause?: unknown;
10
+ });
11
+ }
12
+ export declare function asLniError(error: unknown, fallbackCode?: LniErrorCode): LniError;
13
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,KAAK,GACL,MAAM,GACN,cAAc,GACd,cAAc,GACd,YAAY,CAAC;AAEjB,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,IAAI,EAAE,YAAY,CAAC;IACnC,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;gBAElB,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAW/G;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,GAAE,YAAoB,GAAG,QAAQ,CAUvF"}
package/dist/errors.js ADDED
@@ -0,0 +1,25 @@
1
+ export class LniError extends Error {
2
+ code;
3
+ status;
4
+ body;
5
+ constructor(code, message, options) {
6
+ super(message);
7
+ this.name = 'LniError';
8
+ this.code = code;
9
+ this.status = options?.status;
10
+ this.body = options?.body;
11
+ if (options?.cause !== undefined) {
12
+ this.cause = options.cause;
13
+ }
14
+ }
15
+ }
16
+ export function asLniError(error, fallbackCode = 'Api') {
17
+ if (error instanceof LniError) {
18
+ return error;
19
+ }
20
+ if (error instanceof Error) {
21
+ return new LniError(fallbackCode, error.message, { cause: error });
22
+ }
23
+ return new LniError(fallbackCode, 'Unknown error', { cause: error });
24
+ }
25
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjB,IAAI,CAAe;IACnB,MAAM,CAAU;IAChB,IAAI,CAAU;IAE9B,YAAY,IAAkB,EAAE,OAAe,EAAE,OAA6D;QAC5G,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;QAE1B,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,IAAoC,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9D,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,UAAU,CAAC,KAAc,EAAE,eAA6B,KAAK;IAC3E,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC,YAAY,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,11 @@
1
+ export * from './types.js';
2
+ export * from './errors.js';
3
+ export * from './lnurl.js';
4
+ export { PhoenixdNode } from './nodes/phoenixd.js';
5
+ export { ClnNode } from './nodes/cln.js';
6
+ export { LndNode } from './nodes/lnd.js';
7
+ export { NwcNode } from './nodes/nwc.js';
8
+ export { StrikeNode } from './nodes/strike.js';
9
+ export { SpeedNode } from './nodes/speed.js';
10
+ export { BlinkNode } from './nodes/blink.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ export * from './types.js';
2
+ export * from './errors.js';
3
+ export * from './lnurl.js';
4
+ export { PhoenixdNode } from './nodes/phoenixd.js';
5
+ export { ClnNode } from './nodes/cln.js';
6
+ export { LndNode } from './nodes/lnd.js';
7
+ export { NwcNode } from './nodes/nwc.js';
8
+ export { StrikeNode } from './nodes/strike.js';
9
+ export { SpeedNode } from './nodes/speed.js';
10
+ export { BlinkNode } from './nodes/blink.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function encodeBase64(input: string): string;
2
+ export declare function decodeBase64(input: string): Uint8Array;
3
+ export declare function bytesToHex(bytes: Uint8Array): string;
4
+ export declare function hexToBytes(hex: string): Uint8Array;
5
+ //# sourceMappingURL=encoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/internal/encoding.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA2BlD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA2CtD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAelD"}
@@ -0,0 +1,79 @@
1
+ const BASE64_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
2
+ export function encodeBase64(input) {
3
+ if (typeof globalThis.btoa === 'function') {
4
+ return globalThis.btoa(input);
5
+ }
6
+ const maybeBuffer = globalThis.Buffer;
7
+ if (maybeBuffer) {
8
+ return maybeBuffer.from(input, 'utf8').toString('base64');
9
+ }
10
+ const bytes = new TextEncoder().encode(input);
11
+ let output = '';
12
+ for (let i = 0; i < bytes.length; i += 3) {
13
+ const a = bytes[i] ?? 0;
14
+ const b = bytes[i + 1] ?? 0;
15
+ const c = bytes[i + 2] ?? 0;
16
+ const triple = (a << 16) | (b << 8) | c;
17
+ output += BASE64_CHARS[(triple >> 18) & 63];
18
+ output += BASE64_CHARS[(triple >> 12) & 63];
19
+ output += i + 1 < bytes.length ? BASE64_CHARS[(triple >> 6) & 63] : '=';
20
+ output += i + 2 < bytes.length ? BASE64_CHARS[triple & 63] : '=';
21
+ }
22
+ return output;
23
+ }
24
+ export function decodeBase64(input) {
25
+ const normalized = input.replace(/\s+/g, '');
26
+ if (typeof globalThis.atob === 'function') {
27
+ const raw = globalThis.atob(normalized);
28
+ const out = new Uint8Array(raw.length);
29
+ for (let i = 0; i < raw.length; i += 1) {
30
+ out[i] = raw.charCodeAt(i);
31
+ }
32
+ return out;
33
+ }
34
+ const maybeBuffer = globalThis.Buffer;
35
+ if (maybeBuffer) {
36
+ return Uint8Array.from(maybeBuffer.from(normalized, 'base64').values());
37
+ }
38
+ const padding = (4 - (normalized.length % 4 || 4)) % 4;
39
+ const base64 = normalized + '='.repeat(padding);
40
+ let bits = 0;
41
+ let bitCount = 0;
42
+ const output = [];
43
+ for (const char of base64) {
44
+ if (char === '=') {
45
+ break;
46
+ }
47
+ const value = BASE64_CHARS.indexOf(char);
48
+ if (value === -1) {
49
+ throw new Error(`Invalid base64 character: ${char}`);
50
+ }
51
+ bits = (bits << 6) | value;
52
+ bitCount += 6;
53
+ if (bitCount >= 8) {
54
+ bitCount -= 8;
55
+ output.push((bits >> bitCount) & 0xff);
56
+ }
57
+ }
58
+ return Uint8Array.from(output);
59
+ }
60
+ export function bytesToHex(bytes) {
61
+ return Array.from(bytes)
62
+ .map((value) => value.toString(16).padStart(2, '0'))
63
+ .join('');
64
+ }
65
+ export function hexToBytes(hex) {
66
+ const normalized = hex.trim().toLowerCase();
67
+ if (normalized.length % 2 !== 0) {
68
+ throw new Error('Invalid hex length');
69
+ }
70
+ if (!/^[0-9a-f]*$/.test(normalized)) {
71
+ throw new Error('Invalid hex characters');
72
+ }
73
+ const out = new Uint8Array(normalized.length / 2);
74
+ for (let i = 0; i < normalized.length; i += 2) {
75
+ out[i / 2] = Number.parseInt(normalized.slice(i, i + 2), 16);
76
+ }
77
+ return out;
78
+ }
79
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/internal/encoding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { FetchLike } from '../types.js';
2
+ export type QueryValue = string | number | boolean | null | undefined;
3
+ export interface RequestArgs {
4
+ method?: string;
5
+ headers?: HeadersInit;
6
+ query?: Record<string, QueryValue>;
7
+ json?: unknown;
8
+ form?: Record<string, QueryValue>;
9
+ body?: BodyInit | null;
10
+ timeoutMs?: number;
11
+ signal?: AbortSignal;
12
+ }
13
+ export declare function resolveFetch(customFetch?: FetchLike): FetchLike;
14
+ export declare function buildUrl(baseUrl: string, path: string, query?: Record<string, QueryValue>): string;
15
+ export declare function requestText(fetchFn: FetchLike, url: string, args?: RequestArgs): Promise<string>;
16
+ export declare function requestJson<T>(fetchFn: FetchLike, url: string, args?: RequestArgs): Promise<T>;
17
+ export declare function requestMaybeJson<T>(fetchFn: FetchLike, url: string, args?: RequestArgs): Promise<T | string>;
18
+ export declare function toTimeoutMs(timeoutSeconds?: number): number | undefined;
19
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/internal/http.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,SAAS,GAAG,SAAS,CAU/D;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,CAelG;AAgDD,wBAAsB,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CA0C1G;AAED,wBAAsB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,CAexG;AAED,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,CAYtH;AAED,wBAAgB,WAAW,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKvE"}
@@ -0,0 +1,130 @@
1
+ import { LniError } from '../errors.js';
2
+ export function resolveFetch(customFetch) {
3
+ if (customFetch) {
4
+ return customFetch;
5
+ }
6
+ if (typeof globalThis.fetch === 'function') {
7
+ return globalThis.fetch.bind(globalThis);
8
+ }
9
+ throw new LniError('InvalidInput', 'No fetch implementation found. Pass fetch via NodeRequestOptions.');
10
+ }
11
+ export function buildUrl(baseUrl, path, query) {
12
+ const normalizedBase = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
13
+ const normalizedPath = path.startsWith('/') ? path.slice(1) : path;
14
+ const url = new URL(normalizedPath, normalizedBase);
15
+ if (query) {
16
+ for (const [key, value] of Object.entries(query)) {
17
+ if (value === undefined || value === null || value === '') {
18
+ continue;
19
+ }
20
+ url.searchParams.set(key, String(value));
21
+ }
22
+ }
23
+ return url.toString();
24
+ }
25
+ function encodeForm(form) {
26
+ const params = new URLSearchParams();
27
+ for (const [key, value] of Object.entries(form)) {
28
+ if (value === undefined || value === null) {
29
+ continue;
30
+ }
31
+ params.set(key, String(value));
32
+ }
33
+ return params;
34
+ }
35
+ function withTimeout(signal, timeoutMs) {
36
+ if (!timeoutMs || timeoutMs <= 0) {
37
+ return signal;
38
+ }
39
+ const controller = new AbortController();
40
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
41
+ if (signal) {
42
+ if (signal.aborted) {
43
+ clearTimeout(timeoutId);
44
+ controller.abort();
45
+ }
46
+ else {
47
+ signal.addEventListener('abort', () => {
48
+ clearTimeout(timeoutId);
49
+ controller.abort();
50
+ }, { once: true });
51
+ }
52
+ }
53
+ controller.signal.addEventListener('abort', () => {
54
+ clearTimeout(timeoutId);
55
+ }, { once: true });
56
+ return controller.signal;
57
+ }
58
+ export async function requestText(fetchFn, url, args = {}) {
59
+ const headers = new Headers(args.headers);
60
+ let body = args.body;
61
+ if (args.json !== undefined) {
62
+ if (!headers.has('content-type')) {
63
+ headers.set('content-type', 'application/json');
64
+ }
65
+ body = JSON.stringify(args.json);
66
+ }
67
+ else if (args.form) {
68
+ if (!headers.has('content-type')) {
69
+ headers.set('content-type', 'application/x-www-form-urlencoded');
70
+ }
71
+ body = encodeForm(args.form).toString();
72
+ }
73
+ const signal = withTimeout(args.signal, args.timeoutMs);
74
+ let response;
75
+ try {
76
+ response = await fetchFn(url, {
77
+ method: args.method ?? (body ? 'POST' : 'GET'),
78
+ headers,
79
+ body,
80
+ signal,
81
+ });
82
+ }
83
+ catch (error) {
84
+ throw new LniError('NetworkError', `Network request failed: ${error?.message ?? 'unknown error'}`, {
85
+ cause: error,
86
+ });
87
+ }
88
+ const text = await response.text();
89
+ if (!response.ok) {
90
+ throw new LniError('Http', `HTTP ${response.status}: ${text || response.statusText}`, {
91
+ status: response.status,
92
+ body: text,
93
+ });
94
+ }
95
+ return text;
96
+ }
97
+ export async function requestJson(fetchFn, url, args = {}) {
98
+ const text = await requestText(fetchFn, url, args);
99
+ if (!text) {
100
+ return {};
101
+ }
102
+ try {
103
+ return JSON.parse(text);
104
+ }
105
+ catch (error) {
106
+ throw new LniError('Json', `Failed to parse JSON response: ${error?.message ?? 'unknown error'}`, {
107
+ body: text,
108
+ cause: error,
109
+ });
110
+ }
111
+ }
112
+ export async function requestMaybeJson(fetchFn, url, args = {}) {
113
+ const text = await requestText(fetchFn, url, args);
114
+ if (!text) {
115
+ return '';
116
+ }
117
+ try {
118
+ return JSON.parse(text);
119
+ }
120
+ catch {
121
+ return text;
122
+ }
123
+ }
124
+ export function toTimeoutMs(timeoutSeconds) {
125
+ if (!timeoutSeconds || timeoutSeconds <= 0) {
126
+ return undefined;
127
+ }
128
+ return timeoutSeconds * 1000;
129
+ }
130
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/internal/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { InvoiceEventCallback, OnInvoiceEventParams, Transaction } from '../types.js';
2
+ export interface PollInvoiceEventsArgs {
3
+ params: OnInvoiceEventParams;
4
+ lookup: () => Promise<Transaction>;
5
+ callback: InvoiceEventCallback;
6
+ }
7
+ export declare function pollInvoiceEvents(args: PollInvoiceEventsArgs): Promise<void>;
8
+ //# sourceMappingURL=polling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../src/internal/polling.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ3F,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;IACnC,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBlF"}
@@ -0,0 +1,26 @@
1
+ function sleep(ms) {
2
+ return new Promise((resolve) => {
3
+ setTimeout(resolve, ms);
4
+ });
5
+ }
6
+ export async function pollInvoiceEvents(args) {
7
+ const delayMs = Math.max(args.params.pollingDelaySec, 1) * 1000;
8
+ const maxDurationMs = Math.max(args.params.maxPollingSec, 1) * 1000;
9
+ const startedAt = Date.now();
10
+ while (Date.now() - startedAt <= maxDurationMs) {
11
+ try {
12
+ const tx = await args.lookup();
13
+ if (tx.settledAt > 0) {
14
+ args.callback('success', tx);
15
+ return;
16
+ }
17
+ args.callback('pending', tx);
18
+ }
19
+ catch {
20
+ args.callback('failure');
21
+ }
22
+ await sleep(delayMs);
23
+ }
24
+ args.callback('failure');
25
+ }
26
+ //# sourceMappingURL=polling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling.js","sourceRoot":"","sources":["../../src/internal/polling.ts"],"names":[],"mappings":"AAEA,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAA2B;IACjE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAChE,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACpE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,aAAa,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/B,IAAI,EAAE,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { NodeInfo, Transaction } from '../types.js';
2
+ export declare function emptyNodeInfo(overrides?: Partial<NodeInfo>): NodeInfo;
3
+ export declare function emptyTransaction(overrides?: Partial<Transaction>): Transaction;
4
+ export declare function parseOptionalNumber(value: unknown): number;
5
+ export declare function toUnixSeconds(value: unknown): number;
6
+ export declare function rHashToHex(value: string): string;
7
+ export declare function btcToMsats(amount: string | number): number;
8
+ export declare function satsToMsats(amount: string | number): number;
9
+ export declare function matchesSearch(tx: Transaction, search?: string): boolean;
10
+ //# sourceMappingURL=transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/internal/transform.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAEzD,wBAAgB,aAAa,CAAC,SAAS,GAAE,OAAO,CAAC,QAAQ,CAAM,GAAG,QAAQ,CAiBzE;AAED,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW,CAelF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAW1D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAWpD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUhD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAM1D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAM3D;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAYvE"}
@@ -0,0 +1,91 @@
1
+ import { decodeBase64, bytesToHex } from './encoding.js';
2
+ export function emptyNodeInfo(overrides = {}) {
3
+ return {
4
+ alias: '',
5
+ color: '',
6
+ pubkey: '',
7
+ network: '',
8
+ blockHeight: 0,
9
+ blockHash: '',
10
+ sendBalanceMsat: 0,
11
+ receiveBalanceMsat: 0,
12
+ feeCreditBalanceMsat: 0,
13
+ unsettledSendBalanceMsat: 0,
14
+ unsettledReceiveBalanceMsat: 0,
15
+ pendingOpenSendBalance: 0,
16
+ pendingOpenReceiveBalance: 0,
17
+ ...overrides,
18
+ };
19
+ }
20
+ export function emptyTransaction(overrides = {}) {
21
+ return {
22
+ type: '',
23
+ invoice: '',
24
+ description: '',
25
+ descriptionHash: '',
26
+ preimage: '',
27
+ paymentHash: '',
28
+ amountMsats: 0,
29
+ feesPaid: 0,
30
+ createdAt: 0,
31
+ expiresAt: 0,
32
+ settledAt: 0,
33
+ ...overrides,
34
+ };
35
+ }
36
+ export function parseOptionalNumber(value) {
37
+ if (typeof value === 'number') {
38
+ return Number.isFinite(value) ? value : 0;
39
+ }
40
+ if (typeof value === 'string') {
41
+ const parsed = Number(value);
42
+ return Number.isFinite(parsed) ? parsed : 0;
43
+ }
44
+ return 0;
45
+ }
46
+ export function toUnixSeconds(value) {
47
+ const parsed = parseOptionalNumber(value);
48
+ if (!parsed) {
49
+ return 0;
50
+ }
51
+ if (parsed > 10_000_000_000) {
52
+ return Math.floor(parsed / 1000);
53
+ }
54
+ return Math.floor(parsed);
55
+ }
56
+ export function rHashToHex(value) {
57
+ if (!value) {
58
+ return '';
59
+ }
60
+ try {
61
+ return bytesToHex(decodeBase64(value));
62
+ }
63
+ catch {
64
+ return value;
65
+ }
66
+ }
67
+ export function btcToMsats(amount) {
68
+ const num = typeof amount === 'string' ? Number(amount) : amount;
69
+ if (!Number.isFinite(num)) {
70
+ return 0;
71
+ }
72
+ return Math.round(num * 100_000_000_000);
73
+ }
74
+ export function satsToMsats(amount) {
75
+ const num = typeof amount === 'string' ? Number(amount) : amount;
76
+ if (!Number.isFinite(num)) {
77
+ return 0;
78
+ }
79
+ return Math.round(num * 1000);
80
+ }
81
+ export function matchesSearch(tx, search) {
82
+ if (!search) {
83
+ return true;
84
+ }
85
+ const normalized = search.toLowerCase();
86
+ return (tx.paymentHash.toLowerCase().includes(normalized) ||
87
+ tx.description.toLowerCase().includes(normalized) ||
88
+ (tx.payerNote ?? '').toLowerCase().includes(normalized) ||
89
+ tx.invoice.toLowerCase().includes(normalized));
90
+ }
91
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/internal/transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { FetchLike, PaymentInfo } from './types.js';
2
+ export type PaymentDestinationType = 'bolt11' | 'bolt12' | 'lnurl' | 'lightning_address';
3
+ export declare function detectPaymentType(destination: string): PaymentDestinationType;
4
+ export declare function needsResolution(destination: string): boolean;
5
+ export declare function lightningAddressToUrl(user: string, domain: string): string;
6
+ export declare function decodeLnurl(lnurl: string): string;
7
+ export declare function resolveToBolt11(destination: string, amountMsats?: number, options?: {
8
+ fetch?: FetchLike;
9
+ }): Promise<string>;
10
+ export declare function getPaymentInfo(destination: string, amountMsats?: number, options?: {
11
+ fetch?: FetchLike;
12
+ }): Promise<PaymentInfo>;
13
+ //# sourceMappingURL=lnurl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lnurl.d.ts","sourceRoot":"","sources":["../src/lnurl.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzD,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,mBAAmB,CAAC;AAqBzF,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,sBAAsB,CAqB7E;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAejD;AAoED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,GAC9B,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,GAC9B,OAAO,CAAC,WAAW,CAAC,CAmCtB"}