@contextvm/sdk 0.3.1 → 0.4.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.
- package/dist/esm/core/utils/utils.d.ts +11 -0
- package/dist/esm/core/utils/utils.d.ts.map +1 -1
- package/dist/esm/core/utils/utils.js +15 -0
- package/dist/esm/core/utils/utils.js.map +1 -1
- package/dist/esm/gateway/index.d.ts +10 -8
- package/dist/esm/gateway/index.d.ts.map +1 -1
- package/dist/esm/gateway/index.js +29 -12
- package/dist/esm/gateway/index.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/payments/cap-tags.d.ts +13 -0
- package/dist/esm/payments/cap-tags.d.ts.map +1 -0
- package/dist/esm/payments/cap-tags.js +38 -0
- package/dist/esm/payments/cap-tags.js.map +1 -0
- package/dist/esm/payments/client-payments.d.ts +10 -0
- package/dist/esm/payments/client-payments.d.ts.map +1 -0
- package/dist/esm/payments/client-payments.js +108 -0
- package/dist/esm/payments/client-payments.js.map +1 -0
- package/dist/esm/payments/fake-payment-handler.d.ts +19 -0
- package/dist/esm/payments/fake-payment-handler.d.ts.map +1 -0
- package/dist/esm/payments/fake-payment-handler.js +16 -0
- package/dist/esm/payments/fake-payment-handler.js.map +1 -0
- package/dist/esm/payments/fake-payment-processor.d.ts +34 -0
- package/dist/esm/payments/fake-payment-processor.d.ts.map +1 -0
- package/dist/esm/payments/fake-payment-processor.js +29 -0
- package/dist/esm/payments/fake-payment-processor.js.map +1 -0
- package/dist/esm/payments/handlers/ln-bolt11-lnbits-payment-handler.d.ts +24 -0
- package/dist/esm/payments/handlers/ln-bolt11-lnbits-payment-handler.d.ts.map +1 -0
- package/dist/esm/payments/handlers/ln-bolt11-lnbits-payment-handler.js +44 -0
- package/dist/esm/payments/handlers/ln-bolt11-lnbits-payment-handler.js.map +1 -0
- package/dist/esm/payments/handlers/ln-bolt11-nwc-payment-handler.d.ts +20 -0
- package/dist/esm/payments/handlers/ln-bolt11-nwc-payment-handler.d.ts.map +1 -0
- package/dist/esm/payments/handlers/ln-bolt11-nwc-payment-handler.js +36 -0
- package/dist/esm/payments/handlers/ln-bolt11-nwc-payment-handler.js.map +1 -0
- package/dist/esm/payments/index.d.ts +17 -0
- package/dist/esm/payments/index.d.ts.map +1 -0
- package/dist/esm/payments/index.js +17 -0
- package/dist/esm/payments/index.js.map +1 -0
- package/dist/esm/payments/nip47/connection.d.ts +9 -0
- package/dist/esm/payments/nip47/connection.d.ts.map +1 -0
- package/dist/esm/payments/nip47/connection.js +34 -0
- package/dist/esm/payments/nip47/connection.js.map +1 -0
- package/dist/esm/payments/nip47/nwc-client.d.ts +38 -0
- package/dist/esm/payments/nip47/nwc-client.d.ts.map +1 -0
- package/dist/esm/payments/nip47/nwc-client.js +144 -0
- package/dist/esm/payments/nip47/nwc-client.js.map +1 -0
- package/dist/esm/payments/nip47/types.d.ts +54 -0
- package/dist/esm/payments/nip47/types.d.ts.map +1 -0
- package/dist/esm/payments/nip47/types.js +2 -0
- package/dist/esm/payments/nip47/types.js.map +1 -0
- package/dist/esm/payments/nip47/utils.d.ts +7 -0
- package/dist/esm/payments/nip47/utils.d.ts.map +1 -0
- package/dist/esm/payments/nip47/utils.js +9 -0
- package/dist/esm/payments/nip47/utils.js.map +1 -0
- package/dist/esm/payments/pmi-tags.d.ts +8 -0
- package/dist/esm/payments/pmi-tags.d.ts.map +1 -0
- package/dist/esm/payments/pmi-tags.js +9 -0
- package/dist/esm/payments/pmi-tags.js.map +1 -0
- package/dist/esm/payments/pmis.d.ts +7 -0
- package/dist/esm/payments/pmis.d.ts.map +1 -0
- package/dist/esm/payments/pmis.js +7 -0
- package/dist/esm/payments/pmis.js.map +1 -0
- package/dist/esm/payments/processors/ln-bolt11-lnbits-payment-processor.d.ts +50 -0
- package/dist/esm/payments/processors/ln-bolt11-lnbits-payment-processor.d.ts.map +1 -0
- package/dist/esm/payments/processors/ln-bolt11-lnbits-payment-processor.js +133 -0
- package/dist/esm/payments/processors/ln-bolt11-lnbits-payment-processor.js.map +1 -0
- package/dist/esm/payments/processors/ln-bolt11-nwc-payment-processor.d.ts +41 -0
- package/dist/esm/payments/processors/ln-bolt11-nwc-payment-processor.d.ts.map +1 -0
- package/dist/esm/payments/processors/ln-bolt11-nwc-payment-processor.js +129 -0
- package/dist/esm/payments/processors/ln-bolt11-nwc-payment-processor.js.map +1 -0
- package/dist/esm/payments/server-payments.d.ts +32 -0
- package/dist/esm/payments/server-payments.d.ts.map +1 -0
- package/dist/esm/payments/server-payments.js +199 -0
- package/dist/esm/payments/server-payments.js.map +1 -0
- package/dist/esm/payments/server-transport-payments.d.ts +7 -0
- package/dist/esm/payments/server-transport-payments.d.ts.map +1 -0
- package/dist/esm/payments/server-transport-payments.js +14 -0
- package/dist/esm/payments/server-transport-payments.js.map +1 -0
- package/dist/esm/payments/types.d.ts +174 -0
- package/dist/esm/payments/types.d.ts.map +1 -0
- package/dist/esm/payments/types.js +5 -0
- package/dist/esm/payments/types.js.map +1 -0
- package/dist/esm/transport/nostr-client-transport.d.ts +12 -0
- package/dist/esm/transport/nostr-client-transport.d.ts.map +1 -1
- package/dist/esm/transport/nostr-client-transport.js +49 -18
- package/dist/esm/transport/nostr-client-transport.js.map +1 -1
- package/dist/esm/transport/nostr-server/announcement-manager.d.ts +18 -0
- package/dist/esm/transport/nostr-server/announcement-manager.d.ts.map +1 -1
- package/dist/esm/transport/nostr-server/announcement-manager.js +40 -5
- package/dist/esm/transport/nostr-server/announcement-manager.js.map +1 -1
- package/dist/esm/transport/nostr-server-transport.d.ts +30 -0
- package/dist/esm/transport/nostr-server-transport.d.ts.map +1 -1
- package/dist/esm/transport/nostr-server-transport.js +64 -4
- package/dist/esm/transport/nostr-server-transport.js.map +1 -1
- package/package.json +1 -1
|
@@ -27,4 +27,15 @@ export declare function injectClientPubkey(request: JSONRPCRequest, clientPubkey
|
|
|
27
27
|
* @returns A promise that resolves or rejects with the original result/error, or rejects on timeout.
|
|
28
28
|
*/
|
|
29
29
|
export declare function withTimeout<T>(promise: Promise<T>, timeoutMs: number, errorMessage?: string): Promise<T>;
|
|
30
|
+
/**
|
|
31
|
+
* Validates a string as a 64-character hex string.
|
|
32
|
+
* @param value - The string to validate
|
|
33
|
+
* @returns Whether the string is a valid hex string
|
|
34
|
+
*/
|
|
35
|
+
export declare function isHex64(value: string | undefined): value is string;
|
|
36
|
+
/**
|
|
37
|
+
* Transforms Date.now() to seconds.
|
|
38
|
+
* @returns The current time in seconds
|
|
39
|
+
*/
|
|
40
|
+
export declare function nowSeconds(): number;
|
|
30
41
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,cAAc,EACf,MAAM,oCAAoC,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAI,IAAI,MAAM,qBACmB,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAMvE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,GACnB,IAAI,CAYN;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,CAAC,CAAC,CAgBZ"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,cAAc,EACf,MAAM,oCAAoC,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,KAAK,GAAI,IAAI,MAAM,qBACmB,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAMvE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,GACnB,IAAI,CAYN;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,GAAE,MAA8B,GAC3C,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,MAAM,CAElE;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC"}
|
|
@@ -61,4 +61,19 @@ export function withTimeout(promise, timeoutMs, errorMessage = 'Operation timed
|
|
|
61
61
|
});
|
|
62
62
|
});
|
|
63
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Validates a string as a 64-character hex string.
|
|
66
|
+
* @param value - The string to validate
|
|
67
|
+
* @returns Whether the string is a valid hex string
|
|
68
|
+
*/
|
|
69
|
+
export function isHex64(value) {
|
|
70
|
+
return typeof value === 'string' && /^[0-9a-f]{64}$/i.test(value);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Transforms Date.now() to seconds.
|
|
74
|
+
* @returns The current time in seconds
|
|
75
|
+
*/
|
|
76
|
+
export function nowSeconds() {
|
|
77
|
+
return Math.floor(Date.now() / 1000);
|
|
78
|
+
}
|
|
64
79
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/core/utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,oBAAoB,GAErB,MAAM,oCAAoC,CAAC;AAE5C;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAClC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEpD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,IAAI,CAAC;QACH,OAAO,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAuB,EACvB,YAAoB;IAEpB,+BAA+B;IAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,YAAY,EAAE,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,OAAmB,EACnB,SAAiB,EACjB,eAAuB,qBAAqB;IAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAClC,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,OAAO;aACJ,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/core/utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,oBAAoB,GAErB,MAAM,oCAAoC,CAAC;AAE5C;;;;GAIG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAClC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEpD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,IAAI,CAAC;QACH,OAAO,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAuB,EACvB,YAAoB;IAEpB,+BAA+B;IAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,YAAY,EAAE,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;IACnD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,OAAmB,EACnB,SAAiB,EACjB,eAAuB,qBAAqB;IAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;QAClC,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,OAAO;aACJ,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,KAAyB;IAC/C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -24,14 +24,9 @@ export interface NostrMCPGatewayOptions {
|
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* The main gateway class that orchestrates communication between Nostr clients
|
|
27
|
-
* and a local MCP server.
|
|
28
|
-
* events and forwarding them to the
|
|
29
|
-
*
|
|
30
|
-
* NostrServerTransport, making this a simple message forwarder.
|
|
31
|
-
* @param options - Configuration options for the gateway
|
|
32
|
-
* @param options.mcpClientTransport - The MCP client transport (e.g., StdioServerTransport)
|
|
33
|
-
* used to connect to and communicate with the original MCP server
|
|
34
|
-
* @param options.nostrTransportOptions - Configuration options for the Nostr server transport
|
|
27
|
+
* and a local MCP server. Acts as a bridge, receiving MCP requests via Nostr
|
|
28
|
+
* events and forwarding them to the MCP server. Supports both single-client
|
|
29
|
+
* and per-client transport modes for stateful MCP connections.
|
|
35
30
|
*/
|
|
36
31
|
export declare class NostrMCPGateway {
|
|
37
32
|
private readonly mcpClientTransport;
|
|
@@ -44,12 +39,19 @@ export declare class NostrMCPGateway {
|
|
|
44
39
|
private readonly handleServerErrorBound;
|
|
45
40
|
private readonly handleServerCloseBound;
|
|
46
41
|
private isRunning;
|
|
42
|
+
/**
|
|
43
|
+
* @param options - Configuration options for the gateway
|
|
44
|
+
*/
|
|
47
45
|
constructor(options: NostrMCPGatewayOptions);
|
|
48
46
|
/**
|
|
49
47
|
* Sets up event handlers for both transports.
|
|
50
48
|
*/
|
|
51
49
|
private setupEventHandlers;
|
|
52
50
|
private getOrCreateClientTransport;
|
|
51
|
+
/**
|
|
52
|
+
* Closes and cleans up the MCP transport for a specific client.
|
|
53
|
+
* Handles both active transports and in-flight creation promises.
|
|
54
|
+
*/
|
|
53
55
|
private closeClientTransport;
|
|
54
56
|
private closeTransportForEviction;
|
|
55
57
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/gateway/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/gateway/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAEL,2BAA2B,EAC5B,MAAM,wCAAwC,CAAC;AAMhD,KAAK,YAAY,GAAG,MAAM,CAAC;AAM3B;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,SAAS,CAAC;IAC/B,yDAAyD;IACzD,qBAAqB,EAAE,2BAA2B,CAAC;IAEnD;;;OAGG;IACH,wBAAwB,CAAC,EAAE,CAAC,GAAG,EAAE;QAC/B,YAAY,EAAE,YAAY,CAAC;KAC5B,KAAK,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAErC,mFAAmF;IACnF,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwB;IAC3D,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAC5D,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAE3B;IACd,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkC;IACnE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAE1B;IACd,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAyB;IAC/D,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAa;IACnD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAyB;IAChE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAa;IACpD,OAAO,CAAC,SAAS,CAAS;IAE1B;;OAEG;gBACS,OAAO,EAAE,sBAAsB;IAyC3C;;OAEG;IACH,OAAO,CAAC,kBAAkB;YA8DZ,0BAA0B;IAsDxC;;;OAGG;YACW,oBAAoB;YA6BpB,yBAAyB;IA8BvC;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BnC;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuClC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;OAGG;IACI,QAAQ,IAAI,OAAO;CAG3B"}
|
|
@@ -1,19 +1,18 @@
|
|
|
1
|
+
import { isInitializeRequest, } from '@modelcontextprotocol/sdk/types.js';
|
|
1
2
|
import { NostrServerTransport, } from '../transport/nostr-server-transport.js';
|
|
2
3
|
import { createLogger } from '../core/utils/logger.js';
|
|
3
4
|
import { LruCache } from '../core/utils/lru-cache.js';
|
|
4
5
|
const logger = createLogger('gateway');
|
|
5
6
|
/**
|
|
6
7
|
* The main gateway class that orchestrates communication between Nostr clients
|
|
7
|
-
* and a local MCP server.
|
|
8
|
-
* events and forwarding them to the
|
|
9
|
-
*
|
|
10
|
-
* NostrServerTransport, making this a simple message forwarder.
|
|
11
|
-
* @param options - Configuration options for the gateway
|
|
12
|
-
* @param options.mcpClientTransport - The MCP client transport (e.g., StdioServerTransport)
|
|
13
|
-
* used to connect to and communicate with the original MCP server
|
|
14
|
-
* @param options.nostrTransportOptions - Configuration options for the Nostr server transport
|
|
8
|
+
* and a local MCP server. Acts as a bridge, receiving MCP requests via Nostr
|
|
9
|
+
* events and forwarding them to the MCP server. Supports both single-client
|
|
10
|
+
* and per-client transport modes for stateful MCP connections.
|
|
15
11
|
*/
|
|
16
12
|
export class NostrMCPGateway {
|
|
13
|
+
/**
|
|
14
|
+
* @param options - Configuration options for the gateway
|
|
15
|
+
*/
|
|
17
16
|
constructor(options) {
|
|
18
17
|
var _a;
|
|
19
18
|
this.isRunning = false;
|
|
@@ -62,14 +61,23 @@ export class NostrMCPGateway {
|
|
|
62
61
|
logger.debug('Received message from Nostr:', message);
|
|
63
62
|
this.mcpClientTransport.send(message).catch(this.handleServerErrorBound);
|
|
64
63
|
};
|
|
65
|
-
this.nostrServerTransport.onmessageWithContext = (message, ctx) => {
|
|
64
|
+
this.nostrServerTransport.onmessageWithContext = async (message, ctx) => {
|
|
65
|
+
// Close existing transport on re-initialization to prevent "already initialized"
|
|
66
|
+
// errors with stateful transports (e.g., Streamable HTTP).
|
|
67
|
+
if (isInitializeRequest(message)) {
|
|
68
|
+
await this.closeClientTransport(ctx.clientPubkey);
|
|
69
|
+
}
|
|
66
70
|
logger.debug('Received message from Nostr (context):', {
|
|
67
71
|
clientPubkey: ctx.clientPubkey,
|
|
68
72
|
message,
|
|
69
73
|
});
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
.
|
|
74
|
+
try {
|
|
75
|
+
const transport = await this.getOrCreateClientTransport(ctx.clientPubkey);
|
|
76
|
+
await transport.send(message);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
this.handleServerErrorBound(error instanceof Error ? error : new Error(String(error)));
|
|
80
|
+
}
|
|
73
81
|
};
|
|
74
82
|
this.nostrServerTransport.onerror = this.handleNostrErrorBound;
|
|
75
83
|
this.nostrServerTransport.onclose = this.handleNostrCloseBound;
|
|
@@ -128,6 +136,10 @@ export class NostrMCPGateway {
|
|
|
128
136
|
(_c = this.clientTransportPromises) === null || _c === void 0 ? void 0 : _c.delete(clientPubkey);
|
|
129
137
|
}
|
|
130
138
|
}
|
|
139
|
+
/**
|
|
140
|
+
* Closes and cleans up the MCP transport for a specific client.
|
|
141
|
+
* Handles both active transports and in-flight creation promises.
|
|
142
|
+
*/
|
|
131
143
|
async closeClientTransport(clientPubkey) {
|
|
132
144
|
var _a, _b;
|
|
133
145
|
if (!this.clientTransports) {
|
|
@@ -153,6 +165,11 @@ export class NostrMCPGateway {
|
|
|
153
165
|
}
|
|
154
166
|
async closeTransportForEviction(clientPubkey, transport) {
|
|
155
167
|
var _a;
|
|
168
|
+
// Detach event handlers before closing to prevent expected cleanup errors
|
|
169
|
+
// (e.g., SSE stream aborts) from being logged as errors.
|
|
170
|
+
transport.onmessage = () => { };
|
|
171
|
+
transport.onerror = () => { };
|
|
172
|
+
transport.onclose = () => { };
|
|
156
173
|
try {
|
|
157
174
|
const maybeTerminable = transport;
|
|
158
175
|
await ((_a = maybeTerminable.terminateSession) === null || _a === void 0 ? void 0 : _a.call(maybeTerminable));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/gateway/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/gateway/index.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
package/dist/esm/index.js
CHANGED
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CapTag, PricedCapability } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Converts a priced capability configuration into CEP-8 `cap` tags.
|
|
4
|
+
*
|
|
5
|
+
* Supported capability identifiers:
|
|
6
|
+
* - `tools/call` -> `tool:<tool_name>`
|
|
7
|
+
* - `prompts/get` -> `prompt:<prompt_name>`
|
|
8
|
+
* - `resources/read` -> `resource:<resource_uri>`
|
|
9
|
+
*
|
|
10
|
+
* Tag order is preserved based on `pricedCapabilities`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createCapTagsFromPricedCapabilities(pricedCapabilities: readonly PricedCapability[]): CapTag[];
|
|
13
|
+
//# sourceMappingURL=cap-tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cap-tags.d.ts","sourceRoot":"","sources":["../../../src/payments/cap-tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3D;;;;;;;;;GASG;AACH,wBAAgB,mCAAmC,CACjD,kBAAkB,EAAE,SAAS,gBAAgB,EAAE,GAC9C,MAAM,EAAE,CAcV"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a priced capability configuration into CEP-8 `cap` tags.
|
|
3
|
+
*
|
|
4
|
+
* Supported capability identifiers:
|
|
5
|
+
* - `tools/call` -> `tool:<tool_name>`
|
|
6
|
+
* - `prompts/get` -> `prompt:<prompt_name>`
|
|
7
|
+
* - `resources/read` -> `resource:<resource_uri>`
|
|
8
|
+
*
|
|
9
|
+
* Tag order is preserved based on `pricedCapabilities`.
|
|
10
|
+
*/
|
|
11
|
+
export function createCapTagsFromPricedCapabilities(pricedCapabilities) {
|
|
12
|
+
return pricedCapabilities.flatMap((cap) => {
|
|
13
|
+
const capabilityIdentifier = toCep8CapabilityIdentifier(cap);
|
|
14
|
+
if (!capabilityIdentifier) {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
const price = cap.maxAmount !== undefined
|
|
18
|
+
? `${cap.amount}-${cap.maxAmount}`
|
|
19
|
+
: String(cap.amount);
|
|
20
|
+
return [['cap', capabilityIdentifier, price, cap.currencyUnit]];
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function toCep8CapabilityIdentifier(cap) {
|
|
24
|
+
if (!cap.name) {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
switch (cap.method) {
|
|
28
|
+
case 'tools/call':
|
|
29
|
+
return `tool:${cap.name}`;
|
|
30
|
+
case 'prompts/get':
|
|
31
|
+
return `prompt:${cap.name}`;
|
|
32
|
+
case 'resources/read':
|
|
33
|
+
return `resource:${cap.name}`;
|
|
34
|
+
default:
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=cap-tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cap-tags.js","sourceRoot":"","sources":["../../../src/payments/cap-tags.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,mCAAmC,CACjD,kBAA+C;IAE/C,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAY,EAAE;QAClD,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GACT,GAAG,CAAC,SAAS,KAAK,SAAS;YACzB,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE;YAClC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEzB,OAAO,CAAC,CAAC,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,0BAA0B,CAAC,GAAqB;IACvD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACnB,KAAK,YAAY;YACf,OAAO,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5B,KAAK,aAAa;YAChB,OAAO,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,KAAK,gBAAgB;YACnB,OAAO,YAAY,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
2
|
+
import { PaymentHandler } from './types.js';
|
|
3
|
+
export interface ClientPaymentsOptions {
|
|
4
|
+
handlers: readonly PaymentHandler[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Wraps a transport to automatically handle CEP-8 payment requests.
|
|
8
|
+
*/
|
|
9
|
+
export declare function withClientPayments(transport: Transport, options: ClientPaymentsOptions): Transport;
|
|
10
|
+
//# sourceMappingURL=client-payments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-payments.d.ts","sourceRoot":"","sources":["../../../src/payments/client-payments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAM/E,OAAO,EAAE,cAAc,EAA+B,MAAM,YAAY,CAAC;AASzE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CACrC;AAWD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,qBAAqB,GAC7B,SAAS,CA6HX"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { isJSONRPCNotification, } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { NostrClientTransport } from '../transport/nostr-client-transport.js';
|
|
3
|
+
function isPaymentRequiredNotification(msg) {
|
|
4
|
+
return (isJSONRPCNotification(msg) &&
|
|
5
|
+
msg.method === 'notifications/payment_required');
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Wraps a transport to automatically handle CEP-8 payment requests.
|
|
9
|
+
*/
|
|
10
|
+
export function withClientPayments(transport, options) {
|
|
11
|
+
// Ensure CEP-8 discovery/negotiation: when using Nostr transports, always advertise
|
|
12
|
+
// supported PMIs derived from the handler list (preference order = handler order).
|
|
13
|
+
if (transport instanceof NostrClientTransport) {
|
|
14
|
+
transport.setClientPmis(options.handlers.map((h) => h.pmi));
|
|
15
|
+
}
|
|
16
|
+
const handlersByPmi = new Map(options.handlers.map((h) => [h.pmi, h]));
|
|
17
|
+
// Prevent double-paying if relays or servers deliver duplicate payment_required notifications.
|
|
18
|
+
const inFlightPayReqs = new Set();
|
|
19
|
+
let onmessage;
|
|
20
|
+
let onerror;
|
|
21
|
+
let onclose;
|
|
22
|
+
async function maybeHandlePaymentRequired(message, requestEventId) {
|
|
23
|
+
if (!isPaymentRequiredNotification(message)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const handler = handlersByPmi.get(message.params.pmi);
|
|
27
|
+
if (!handler) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Best-effort client-side dedupe keyed by pay_req.
|
|
31
|
+
// IMPORTANT: claim synchronously before any await to avoid double-pay races.
|
|
32
|
+
if (inFlightPayReqs.has(message.params.pay_req)) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
inFlightPayReqs.add(message.params.pay_req);
|
|
36
|
+
try {
|
|
37
|
+
const req = {
|
|
38
|
+
amount: message.params.amount,
|
|
39
|
+
pay_req: message.params.pay_req,
|
|
40
|
+
description: message.params.description,
|
|
41
|
+
requestEventId,
|
|
42
|
+
};
|
|
43
|
+
const canHandle = handler.canHandle ? await handler.canHandle(req) : true;
|
|
44
|
+
if (!canHandle) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
await handler.handle(req);
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
inFlightPayReqs.delete(message.params.pay_req);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const transportWithContext = transport;
|
|
54
|
+
const wrapped = {
|
|
55
|
+
get onmessage() {
|
|
56
|
+
return onmessage;
|
|
57
|
+
},
|
|
58
|
+
set onmessage(fn) {
|
|
59
|
+
onmessage = fn;
|
|
60
|
+
},
|
|
61
|
+
get onerror() {
|
|
62
|
+
return onerror;
|
|
63
|
+
},
|
|
64
|
+
set onerror(fn) {
|
|
65
|
+
onerror = fn;
|
|
66
|
+
},
|
|
67
|
+
get onclose() {
|
|
68
|
+
return onclose;
|
|
69
|
+
},
|
|
70
|
+
set onclose(fn) {
|
|
71
|
+
onclose = fn;
|
|
72
|
+
},
|
|
73
|
+
async start() {
|
|
74
|
+
transport.onmessage = (message) => {
|
|
75
|
+
// Best-effort: execute handler asynchronously, but never block delivery.
|
|
76
|
+
void maybeHandlePaymentRequired(message, 'unknown').catch((err) => {
|
|
77
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
78
|
+
onerror === null || onerror === void 0 ? void 0 : onerror(error);
|
|
79
|
+
});
|
|
80
|
+
onmessage === null || onmessage === void 0 ? void 0 : onmessage(message);
|
|
81
|
+
};
|
|
82
|
+
// If underlying transport supports correlation context, use it to pass requestEventId.
|
|
83
|
+
if ('onmessageWithContext' in transportWithContext) {
|
|
84
|
+
transportWithContext.onmessageWithContext = (message, ctx) => {
|
|
85
|
+
var _a;
|
|
86
|
+
const requestEventId = (_a = ctx.correlatedEventId) !== null && _a !== void 0 ? _a : 'unknown';
|
|
87
|
+
void maybeHandlePaymentRequired(message, requestEventId).catch((err) => {
|
|
88
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
89
|
+
onerror === null || onerror === void 0 ? void 0 : onerror(error);
|
|
90
|
+
});
|
|
91
|
+
// Keep message delivery consistent with the plain `onmessage` path.
|
|
92
|
+
onmessage === null || onmessage === void 0 ? void 0 : onmessage(message);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
transport.onerror = (err) => onerror === null || onerror === void 0 ? void 0 : onerror(err);
|
|
96
|
+
transport.onclose = () => onclose === null || onclose === void 0 ? void 0 : onclose();
|
|
97
|
+
await transport.start();
|
|
98
|
+
},
|
|
99
|
+
async send(message) {
|
|
100
|
+
await transport.send(message);
|
|
101
|
+
},
|
|
102
|
+
async close() {
|
|
103
|
+
await transport.close();
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
return wrapped;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=client-payments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-payments.js","sourceRoot":"","sources":["../../../src/payments/client-payments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { PaymentHandler, PaymentHandlerRequest } from './types.js';
|
|
2
|
+
export interface FakePaymentHandlerOptions {
|
|
3
|
+
/** The PMI this handler advertises. @default 'fake' */
|
|
4
|
+
pmi?: string;
|
|
5
|
+
/** Artificial delay in ms to simulate a wallet action. @default 50 */
|
|
6
|
+
delayMs?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A fake payment handler that simulates wallet processing using a delay.
|
|
10
|
+
*
|
|
11
|
+
* It does not publish any protocol messages.
|
|
12
|
+
*/
|
|
13
|
+
export declare class FakePaymentHandler implements PaymentHandler {
|
|
14
|
+
readonly pmi: string;
|
|
15
|
+
private readonly delayMs;
|
|
16
|
+
constructor(options?: FakePaymentHandlerOptions);
|
|
17
|
+
handle(_req: PaymentHandlerRequest): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=fake-payment-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-payment-handler.d.ts","sourceRoot":"","sources":["../../../src/payments/fake-payment-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,yBAAyB;IACxC,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,GAAE,yBAA8B;IAKtC,MAAM,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAGhE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A fake payment handler that simulates wallet processing using a delay.
|
|
3
|
+
*
|
|
4
|
+
* It does not publish any protocol messages.
|
|
5
|
+
*/
|
|
6
|
+
export class FakePaymentHandler {
|
|
7
|
+
constructor(options = {}) {
|
|
8
|
+
var _a, _b;
|
|
9
|
+
this.pmi = (_a = options.pmi) !== null && _a !== void 0 ? _a : 'fake';
|
|
10
|
+
this.delayMs = (_b = options.delayMs) !== null && _b !== void 0 ? _b : 50;
|
|
11
|
+
}
|
|
12
|
+
async handle(_req) {
|
|
13
|
+
await new Promise((resolve) => setTimeout(resolve, this.delayMs));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=fake-payment-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-payment-handler.js","sourceRoot":"","sources":["../../../src/payments/fake-payment-handler.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IAI7B,YAAY,UAAqC,EAAE;;QACjD,IAAI,CAAC,GAAG,GAAG,MAAA,OAAO,CAAC,GAAG,mCAAI,MAAM,CAAC;QACjC,IAAI,CAAC,OAAO,GAAG,MAAA,OAAO,CAAC,OAAO,mCAAI,EAAE,CAAC;IACvC,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,IAA2B;QAC7C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { PaymentProcessor, PaymentProcessorCreateParams, PaymentProcessorVerifyParams } from './types.js';
|
|
2
|
+
export interface FakePaymentProcessorOptions {
|
|
3
|
+
/** The PMI this processor issues. @default 'fake' */
|
|
4
|
+
pmi?: string;
|
|
5
|
+
/** Artificial delay in ms for settlement verification. @default 50 */
|
|
6
|
+
verifyDelayMs?: number;
|
|
7
|
+
/** Artificial delay in ms for request creation. @default 0 */
|
|
8
|
+
createDelayMs?: number;
|
|
9
|
+
/** Optional TTL in seconds to include in payment_required. */
|
|
10
|
+
ttl?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A fake payment processor that simulates issuing and verifying payments.
|
|
14
|
+
*/
|
|
15
|
+
export declare class FakePaymentProcessor implements PaymentProcessor {
|
|
16
|
+
readonly pmi: string;
|
|
17
|
+
private readonly verifyDelayMs;
|
|
18
|
+
private readonly createDelayMs;
|
|
19
|
+
private readonly ttl;
|
|
20
|
+
constructor(options?: FakePaymentProcessorOptions);
|
|
21
|
+
createPaymentRequired(params: PaymentProcessorCreateParams): Promise<{
|
|
22
|
+
ttl?: number | undefined;
|
|
23
|
+
amount: number;
|
|
24
|
+
pay_req: string;
|
|
25
|
+
description: string | undefined;
|
|
26
|
+
pmi: string;
|
|
27
|
+
}>;
|
|
28
|
+
verifyPayment(_params: PaymentProcessorVerifyParams): Promise<{
|
|
29
|
+
_meta: {
|
|
30
|
+
settled: boolean;
|
|
31
|
+
};
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=fake-payment-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-payment-processor.d.ts","sourceRoot":"","sources":["../../../src/payments/fake-payment-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,4BAA4B,EAC5B,4BAA4B,EAC7B,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,2BAA2B;IAC1C,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,gBAAgB;IAC3D,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;gBAE7B,OAAO,GAAE,2BAAgC;IAOxC,qBAAqB,CAAC,MAAM,EAAE,4BAA4B;;;;;;;IAe1D,aAAa,CAAC,OAAO,EAAE,4BAA4B;;;;;CAMjE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A fake payment processor that simulates issuing and verifying payments.
|
|
3
|
+
*/
|
|
4
|
+
export class FakePaymentProcessor {
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
var _a, _b, _c;
|
|
7
|
+
this.pmi = (_a = options.pmi) !== null && _a !== void 0 ? _a : 'fake';
|
|
8
|
+
this.verifyDelayMs = (_b = options.verifyDelayMs) !== null && _b !== void 0 ? _b : 50;
|
|
9
|
+
this.createDelayMs = (_c = options.createDelayMs) !== null && _c !== void 0 ? _c : 0;
|
|
10
|
+
this.ttl = options.ttl;
|
|
11
|
+
}
|
|
12
|
+
async createPaymentRequired(params) {
|
|
13
|
+
if (this.createDelayMs > 0) {
|
|
14
|
+
await new Promise((resolve) => setTimeout(resolve, this.createDelayMs));
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
amount: params.amount,
|
|
18
|
+
pay_req: `fake:${params.requestEventId}:${params.clientPubkey}:${params.amount}`,
|
|
19
|
+
description: params.description,
|
|
20
|
+
pmi: this.pmi,
|
|
21
|
+
...(this.ttl !== undefined && { ttl: this.ttl }),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async verifyPayment(_params) {
|
|
25
|
+
await new Promise((resolve) => setTimeout(resolve, this.verifyDelayMs));
|
|
26
|
+
return { _meta: { settled: true } };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=fake-payment-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-payment-processor.js","sourceRoot":"","sources":["../../../src/payments/fake-payment-processor.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAM/B,YAAY,UAAuC,EAAE;;QACnD,IAAI,CAAC,GAAG,GAAG,MAAA,OAAO,CAAC,GAAG,mCAAI,MAAM,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,MAAA,OAAO,CAAC,aAAa,mCAAI,EAAE,CAAC;QACjD,IAAI,CAAC,aAAa,GAAG,MAAA,OAAO,CAAC,aAAa,mCAAI,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAAC,MAAoC;QACrE,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CACxC,CAAC;QACJ,CAAC;QACD,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,QAAQ,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE;YAChF,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;SACjD,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAAqC;QAC9D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CACxC,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { PaymentHandler, PaymentHandlerRequest } from '../types.js';
|
|
2
|
+
export interface LnBolt11LnbitsPaymentHandlerOptions {
|
|
3
|
+
/** LNbits instance base URL (e.g. `https://lnbits.example.com`). */
|
|
4
|
+
lnbitsUrl: string;
|
|
5
|
+
/** LNbits wallet admin key (required for outgoing payments). */
|
|
6
|
+
lnbitsAdminKey: string;
|
|
7
|
+
/** Optional HTTP Basic Auth credentials (`user:password`) for proxied instances. */
|
|
8
|
+
lnbitsBasicAuth?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* CEP-8 client payment handler for PMI `bitcoin-lightning-bolt11` backed by LNbits REST API.
|
|
12
|
+
*
|
|
13
|
+
* Pays BOLT11 invoices by calling the LNbits `/api/v1/payments` endpoint.
|
|
14
|
+
*/
|
|
15
|
+
export declare class LnBolt11LnbitsPaymentHandler implements PaymentHandler {
|
|
16
|
+
readonly pmi: "bitcoin-lightning-bolt11";
|
|
17
|
+
private readonly lnbitsUrl;
|
|
18
|
+
private readonly lnbitsAdminKey;
|
|
19
|
+
private readonly lnbitsBasicAuth?;
|
|
20
|
+
constructor(options: LnBolt11LnbitsPaymentHandlerOptions);
|
|
21
|
+
private buildHeaders;
|
|
22
|
+
handle(req: PaymentHandlerRequest): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ln-bolt11-lnbits-payment-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ln-bolt11-lnbits-payment-handler.d.ts","sourceRoot":"","sources":["../../../../src/payments/handlers/ln-bolt11-lnbits-payment-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzE,MAAM,WAAW,mCAAmC;IAClD,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBAAa,4BAA6B,YAAW,cAAc;IACjE,SAAgB,GAAG,6BAAgC;IAEnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAS;gBAEvB,OAAO,EAAE,mCAAmC;IAM/D,OAAO,CAAC,YAAY;IAYP,MAAM,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAuB/D"}
|