{"_id":"@lightninglabs/l402","name":"@lightninglabs/l402","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@lightninglabs/l402","type":"module","collaborators":["Dario Anongba Varela <dario.anongba@gmail.com>"],"description":"WebAssembly bindings for L402sdk L402 client SDK via wasm-pack","version":"0.1.0","license":"MIT OR Apache-2.0","repository":{"type":"git","url":"git+https://github.com/lightninglabs/L402sdk.git"},"main":"l402_wasm.js","types":"l402_wasm.d.ts","sideEffects":["./l402_wasm.js","./snippets/*"],"keywords":["l402","lightning","bitcoin","wasm","webassembly"],"_id":"@lightninglabs/l402@0.1.0","gitHead":"882e36c7d5bb4a512d4a60d6378cff24f2ccb6ff","bugs":{"url":"https://github.com/lightninglabs/L402sdk/issues"},"homepage":"https://github.com/lightninglabs/L402sdk#readme","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-Qjq9MnsZw1FwFuRfB7Oqhv4FQutGalHgUR2aqwQTlRnFMNEVqHKZ6cNYk1LJ7CDBB/GATIOhUOtHwrh+wNo0ew==","shasum":"02be3370976169e6282da8f43fdbb0c95fa7e89b","tarball":"https://registry.npmjs.org/@lightninglabs/l402/-/l402-0.1.0.tgz","fileCount":6,"unpackedSize":775350,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@lightninglabs%2fl402@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFLpTdArpA9Zc055fiPcknhNcbCyNvd9c5kxEhFM+LWcAiBx/poUd89C4vQDV5zYhafiWUCTP5VoA9eI7Tr4Zju5dg=="}]},"_npmUser":{"name":"dario_nakamoto","email":"dario.anongba@gmail.com"},"directories":{},"maintainers":[{"name":"roasbeef","email":"laolu32@gmail.com"},{"name":"jamalj","email":"jamal@lightning.engineering"},{"name":"kaloudis","email":"npm@nyxmail.com"},{"name":"dario_nakamoto","email":"dario.anongba@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/l402_0.1.0_1776259689613_0.13007732845643605"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-15T13:28:09.490Z","0.1.0":"2026-04-15T13:28:09.771Z","modified":"2026-04-15T13:28:10.223Z"},"maintainers":[{"name":"roasbeef","email":"laolu32@gmail.com"},{"name":"jamalj","email":"jamal@lightning.engineering"},{"name":"kaloudis","email":"npm@nyxmail.com"},{"name":"dario_nakamoto","email":"dario.anongba@gmail.com"}],"description":"WebAssembly bindings for L402sdk L402 client SDK via wasm-pack","homepage":"https://github.com/lightninglabs/L402sdk#readme","keywords":["l402","lightning","bitcoin","wasm","webassembly"],"repository":{"type":"git","url":"git+https://github.com/lightninglabs/L402sdk.git"},"bugs":{"url":"https://github.com/lightninglabs/L402sdk/issues"},"license":"MIT OR Apache-2.0","readme":"<div align=\"center\">\n  <h1>l402-wasm</h1>\n\n  <p>\n    <strong>WebAssembly bindings for the L402sdk L402 client SDK</strong>\n  </p>\n\n  <p>\n    <a href=\"https://www.npmjs.com/package/@lightninglabs/l402\"><img alt=\"npm\" src=\"https://img.shields.io/npm/v/@lightninglabs/l402.svg\"/></a>\n    <a href=\"https://www.npmjs.com/package/@lightninglabs/l402\"><img alt=\"npm downloads\" src=\"https://img.shields.io/npm/dm/@lightninglabs/l402.svg\"/></a>\n    <a href=\"https://github.com/lightninglabs/L402sdk/blob/main/LICENSE-MIT\"><img alt=\"MIT or Apache-2.0 Licensed\" src=\"https://img.shields.io/badge/license-MIT%2FApache--2.0-blue.svg\"/></a>\n  </p>\n\n</div>\n\nRun L402 Lightning payment flows in browsers, Deno, Cloudflare Workers, and any WASM runtime.\n\n## Install\n\n```bash\nyarn add @lightninglabs/l402\n```\n\n## Overview\n\nl402-wasm compiles the Rust L402 protocol engine to WebAssembly via `wasm-pack`, providing:\n\n- **`WasmL402Client`** — the real Rust `L402Client`, compiled to WASM\n- **Direct backend wrappers** — `WasmLndRestBackend`, `WasmClnRestBackend`, and `WasmSwissKnifeBackend`\n- **Budget configuration and receipts** — shared Rust behavior for spending limits and audit data\n- **Auto-generated TypeScript types** — full type safety in TS/JS projects\n\n## Quick Start\n\n```javascript\nimport init, { WasmL402Client, WasmBudgetConfig } from 'l402-wasm';\n\n// Initialize the WASM module\nawait init();\n\n// Create a client backed by LND REST\nconst client = WasmL402Client.withLndRest(\n  'https://localhost:8080',\n  'hex-encoded-admin-macaroon',\n  WasmBudgetConfig.unlimited(),\n  100,\n);\n\n// Make a request — L402 payment happens automatically\nconst response = await client.get('https://api.example.com/paid-resource');\nconsole.log(response.status);   // 200\nconsole.log(response.paid);     // true or false if cached\nconsole.log(response.body);\n\n// Inspect the payment receipt\nconst receipt = response.receipt;\nconsole.log(receipt.amountSats);\nconsole.log(receipt.paymentHash);   // hex string\nconsole.log(receipt.preimage);      // hex string\n\n// Token caching: second request uses cached token (no payment)\nconst cached = await client.get('https://api.example.com/paid-resource');\nconsole.log(cached.paid);  // false (used cached token)\n\n// Track spending\nconsole.log(await client.totalSpent());\nconsole.log(await client.receipts());\n```\n\n## Budget Enforcement\n\n```javascript\nconst budget = new WasmBudgetConfig(\n  100,     // per-request max: 100 sats\n  1000,    // hourly max: 1,000 sats\n  5000,    // daily max: 5,000 sats\n  50000,   // total max: 50,000 sats\n);\n\nconst client = WasmL402Client.withLndRest(\n  'https://localhost:8080',\n  'hex-encoded-admin-macaroon',\n  budget,\n  100,\n);\n\n// Requests exceeding the budget will reject\ntry {\n  await client.get('https://api.example.com/expensive');\n} catch (e) {\n  console.error(e); // \"payment of X sats exceeds per-request limit\"\n}\n```\n\n## Direct Backend Wrappers\n\nUse the backend wrappers when you want Lightning-node access from JS/TS without going through the full `WasmL402Client` flow.\n\n### LND REST\n\n```javascript\nimport init, { WasmLndRestBackend } from 'l402-wasm';\n\nawait init();\n\nconst lnd = new WasmLndRestBackend('https://localhost:8080', 'deadbeef...');\nconst info = await lnd.getInfo();\nconsole.log(info.alias);\n```\n\n### CLN REST\n\n```javascript\nimport init, { WasmClnRestBackend } from 'l402-wasm';\n\nawait init();\n\nconst cln = WasmClnRestBackend.withRune(\n  'https://localhost:3010',\n  'rune-token-value...',\n);\nconst info = await cln.getInfo();\nconsole.log(info.alias);\n```\n\n### SwissKnife\n\n```javascript\nimport init, { WasmSwissKnifeBackend } from 'l402-wasm';\n\nawait init();\n\nconst backend = new WasmSwissKnifeBackend(\n  'https://api.numeraire.tech',\n  'sk-...',\n);\nconst balance = await backend.getBalance();\nconsole.log(balance);\n```\n\n## Building\n\n```bash\n# Prerequisites\nrustup target add wasm32-unknown-unknown\ncargo install wasm-pack\n\n# Build for web\nwasm-pack build crates/l402-wasm --target web\n\n# Build for Node.js\nwasm-pack build crates/l402-wasm --target nodejs\n\n# Build for bundlers (webpack, etc.)\nwasm-pack build crates/l402-wasm --target bundler\n```\n\n## Testing\n\n```bash\n# Native unit tests\ncargo test -p l402-wasm\n\n# WASM browser tests (requires Chrome/Firefox)\nwasm-pack test --headless --chrome crates/l402-wasm\n```\n\n## Architecture\n\nl402-wasm provides the real Rust L402 client and backend adapters over `wasm-bindgen`:\n\n```\n┌─────────────────────────────────┐\n│        JavaScript / TS          │\n│     (browser / Node / Deno)     │\n└─────────────┬───────────────────┘\n              │ wasm-bindgen\n┌─────────────▼───────────────────┐\n│         l402-wasm            │\n│                                 │\n│  WasmL402Client                 │\n│  WasmLndRestBackend             │\n│  WasmClnRestBackend             │\n│  WasmSwissKnifeBackend          │\n└─────────────────────────────────┘\n              │\n   ┌──────────┼───────────┐\n   ▼          ▼           ▼\n L402sdk-  L402sdk-   L402sdk-\n  core       lnd         cln\n              │           │\n              ▼           ▼\n        LND REST API   CLN REST API\n```\n\n## License\n\nMIT OR Apache-2.0\n","readmeFilename":"README.md","_rev":"1-e5cef7ea05f0da446d531a486e12d07d"}