feat(extensions): add extension loader infrastructure (#3)
Some checks are pending
Docker Compose Actions Workflow / test (push) Waiting to run

## Summary

- Adds a modular extension system for Lightning.Pub enabling third-party plugins
- Provides isolated SQLite databases per extension for data safety
- Implements ExtensionContext API for accessing Lightning.Pub services (payments, Nostr, storage)
- Supports RPC method registration with automatic namespacing
- Includes HTTP route handling for protocols like LNURL
- Event routing for payment receipts and Nostr events
- Comprehensive documentation with architecture overview and working examples

## Key Components

- `src/extensions/types.ts` - Core extension interfaces
- `src/extensions/loader.ts` - Extension discovery, loading, and lifecycle management
- `src/extensions/context.ts` - Bridge between extensions and Lightning.Pub services
- `src/extensions/database.ts` - SQLite isolation with WAL mode
- `src/extensions/README.md` - Full documentation with examples

## ExtensionContext API

| Method | Description |
|--------|-------------|
| `getApplication()` | Get application info |
| `createInvoice()` | Create Lightning invoice |
| `payInvoice()` | Pay Lightning invoice |
| `getLnurlPayInfo()` | Get LNURL-pay info for a user (enables Lightning Address/zaps) |
| `sendEncryptedDM()` | Send Nostr DM (NIP-44) |
| `publishNostrEvent()` | Publish Nostr event |
| `registerMethod()` | Register RPC method |
| `onPaymentReceived()` | Subscribe to payment callbacks |
| `onNostrEvent()` | Subscribe to Nostr events |

## Test plan

- [x] Review extension loader code for correctness
- [x] Verify TypeScript compilation succeeds
- [x] Test extension discovery from `src/extensions/` directory
- [x] Test RPC method registration and routing
- [x] Test database isolation between extensions

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: boufni95 <boufni95@gmail.com>
Co-authored-by: Patrick Mulligan <patjmulligan@protonmail.com>
Reviewed-on: #3
This commit is contained in:
padreug 2026-04-02 18:47:55 +00:00
parent 72c9872b23
commit 77e5772afd
47 changed files with 10187 additions and 4828 deletions

View file

@ -1172,6 +1172,12 @@ message PendingSweep {
The deadline height used for this output when perform fee bumping.
*/
uint32 deadline_height = 14;
/*
The block height which the input's locktime will expire at. Zero if the
input has no locktime.
*/
uint32 maturity_height = 15;
}
message PendingSweepsRequest {
@ -1188,9 +1194,8 @@ message BumpFeeRequest {
// The input we're attempting to bump the fee of.
lnrpc.OutPoint outpoint = 1;
// Optional. The deadline in number of blocks that the input should be spent
// within. When not set, for new inputs, the default value (1008) is used;
// for existing inputs, their current values will be retained.
// Optional. The conf target the underlying fee estimator will use to
// estimate the starting fee rate for the fee function.
uint32 target_conf = 2;
/*
@ -1217,7 +1222,7 @@ message BumpFeeRequest {
/*
Optional. Whether this input will be swept immediately. When set to true,
the sweeper will sweep this input without waiting for the next batch.
the sweeper will sweep this input without waiting for the next block.
*/
bool immediate = 6;
@ -1230,6 +1235,12 @@ message BumpFeeRequest {
retained.
*/
uint64 budget = 7;
// Optional. The deadline delta in number of blocks that the output
// should be spent within. This translates internally to the width of the
// fee function that the sweeper will use to bump the fee rate. When the
// deadline is reached, ALL the budget will be spent as fees.
uint32 deadline_delta = 8;
}
message BumpFeeResponse {
@ -1243,7 +1254,8 @@ message BumpForceCloseFeeRequest {
lnrpc.ChannelPoint chan_point = 1;
// Optional. The deadline delta in number of blocks that the anchor output
// should be spent within to bump the closing transaction.
// should be spent within to bump the closing transaction. When the
// deadline is reached, ALL the budget will be spent as fees
uint32 deadline_delta = 2;
/*
@ -1270,6 +1282,10 @@ message BumpForceCloseFeeRequest {
transaction of the force closed channel otherwise the fee bumping will fail.
*/
uint64 budget = 5;
// Optional. The conf target the underlying fee estimator will use to
// estimate the starting fee rate for the fee function.
uint32 target_conf = 6;
}
message BumpForceCloseFeeResponse {
@ -1426,6 +1442,16 @@ message FundPsbtRequest {
// The max fee to total output amount ratio that this psbt should adhere to.
double max_fee_ratio = 12;
// The custom lock ID to use for the inputs in the funded PSBT. The value
// if set must be exactly 32 bytes long. If empty, the default lock ID will
// be used.
bytes custom_lock_id = 13;
// If set, then the inputs in the funded PSBT will be locked for the
// specified duration. The lock duration is specified in seconds. If not
// set, the default lock duration will be used.
uint64 lock_expiration_seconds = 14;
}
message FundPsbtResponse {
/*