feat(extensions): add extension loader infrastructure (#3)
Some checks are pending
Docker Compose Actions Workflow / test (push) Waiting to run
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:
parent
72c9872b23
commit
77e5772afd
47 changed files with 10187 additions and 4828 deletions
|
|
@ -1,4 +1,4 @@
|
|||
// @generated by protobuf-ts 2.8.1
|
||||
// @generated by protobuf-ts 2.11.1
|
||||
// @generated from protobuf file "walletunlocker.proto" (package "lnrpc", syntax proto3)
|
||||
// tslint:disable
|
||||
import type { RpcTransport } from "@protobuf-ts/runtime-rpc";
|
||||
|
|
@ -50,7 +50,7 @@ export interface IWalletUnlockerClient {
|
|||
* method should be used to commit the newly generated seed, and create the
|
||||
* wallet.
|
||||
*
|
||||
* @generated from protobuf rpc: GenSeed(lnrpc.GenSeedRequest) returns (lnrpc.GenSeedResponse);
|
||||
* @generated from protobuf rpc: GenSeed
|
||||
*/
|
||||
genSeed(input: GenSeedRequest, options?: RpcOptions): UnaryCall<GenSeedRequest, GenSeedResponse>;
|
||||
/**
|
||||
|
|
@ -68,7 +68,7 @@ export interface IWalletUnlockerClient {
|
|||
* seed, then present it to the user. Once it has been verified by the user,
|
||||
* the seed can be fed into this RPC in order to commit the new wallet.
|
||||
*
|
||||
* @generated from protobuf rpc: InitWallet(lnrpc.InitWalletRequest) returns (lnrpc.InitWalletResponse);
|
||||
* @generated from protobuf rpc: InitWallet
|
||||
*/
|
||||
initWallet(input: InitWalletRequest, options?: RpcOptions): UnaryCall<InitWalletRequest, InitWalletResponse>;
|
||||
/**
|
||||
|
|
@ -76,7 +76,7 @@ export interface IWalletUnlockerClient {
|
|||
* UnlockWallet is used at startup of lnd to provide a password to unlock
|
||||
* the wallet database.
|
||||
*
|
||||
* @generated from protobuf rpc: UnlockWallet(lnrpc.UnlockWalletRequest) returns (lnrpc.UnlockWalletResponse);
|
||||
* @generated from protobuf rpc: UnlockWallet
|
||||
*/
|
||||
unlockWallet(input: UnlockWalletRequest, options?: RpcOptions): UnaryCall<UnlockWalletRequest, UnlockWalletResponse>;
|
||||
/**
|
||||
|
|
@ -84,7 +84,7 @@ export interface IWalletUnlockerClient {
|
|||
* ChangePassword changes the password of the encrypted wallet. This will
|
||||
* automatically unlock the wallet database if successful.
|
||||
*
|
||||
* @generated from protobuf rpc: ChangePassword(lnrpc.ChangePasswordRequest) returns (lnrpc.ChangePasswordResponse);
|
||||
* @generated from protobuf rpc: ChangePassword
|
||||
*/
|
||||
changePassword(input: ChangePasswordRequest, options?: RpcOptions): UnaryCall<ChangePasswordRequest, ChangePasswordResponse>;
|
||||
}
|
||||
|
|
@ -128,7 +128,7 @@ export class WalletUnlockerClient implements IWalletUnlockerClient, ServiceInfo
|
|||
* method should be used to commit the newly generated seed, and create the
|
||||
* wallet.
|
||||
*
|
||||
* @generated from protobuf rpc: GenSeed(lnrpc.GenSeedRequest) returns (lnrpc.GenSeedResponse);
|
||||
* @generated from protobuf rpc: GenSeed
|
||||
*/
|
||||
genSeed(input: GenSeedRequest, options?: RpcOptions): UnaryCall<GenSeedRequest, GenSeedResponse> {
|
||||
const method = this.methods[0], opt = this._transport.mergeOptions(options);
|
||||
|
|
@ -149,7 +149,7 @@ export class WalletUnlockerClient implements IWalletUnlockerClient, ServiceInfo
|
|||
* seed, then present it to the user. Once it has been verified by the user,
|
||||
* the seed can be fed into this RPC in order to commit the new wallet.
|
||||
*
|
||||
* @generated from protobuf rpc: InitWallet(lnrpc.InitWalletRequest) returns (lnrpc.InitWalletResponse);
|
||||
* @generated from protobuf rpc: InitWallet
|
||||
*/
|
||||
initWallet(input: InitWalletRequest, options?: RpcOptions): UnaryCall<InitWalletRequest, InitWalletResponse> {
|
||||
const method = this.methods[1], opt = this._transport.mergeOptions(options);
|
||||
|
|
@ -160,7 +160,7 @@ export class WalletUnlockerClient implements IWalletUnlockerClient, ServiceInfo
|
|||
* UnlockWallet is used at startup of lnd to provide a password to unlock
|
||||
* the wallet database.
|
||||
*
|
||||
* @generated from protobuf rpc: UnlockWallet(lnrpc.UnlockWalletRequest) returns (lnrpc.UnlockWalletResponse);
|
||||
* @generated from protobuf rpc: UnlockWallet
|
||||
*/
|
||||
unlockWallet(input: UnlockWalletRequest, options?: RpcOptions): UnaryCall<UnlockWalletRequest, UnlockWalletResponse> {
|
||||
const method = this.methods[2], opt = this._transport.mergeOptions(options);
|
||||
|
|
@ -171,7 +171,7 @@ export class WalletUnlockerClient implements IWalletUnlockerClient, ServiceInfo
|
|||
* ChangePassword changes the password of the encrypted wallet. This will
|
||||
* automatically unlock the wallet database if successful.
|
||||
*
|
||||
* @generated from protobuf rpc: ChangePassword(lnrpc.ChangePasswordRequest) returns (lnrpc.ChangePasswordResponse);
|
||||
* @generated from protobuf rpc: ChangePassword
|
||||
*/
|
||||
changePassword(input: ChangePasswordRequest, options?: RpcOptions): UnaryCall<ChangePasswordRequest, ChangePasswordResponse> {
|
||||
const method = this.methods[3], opt = this._transport.mergeOptions(options);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue