@contextvm/sdk 0.1.1 → 0.1.3

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 (72) hide show
  1. package/COPYING.LESSER +165 -0
  2. package/README.md +178 -2
  3. package/dist/esm/core/constants.d.ts +65 -0
  4. package/dist/esm/core/constants.d.ts.map +1 -0
  5. package/dist/esm/core/constants.js +70 -0
  6. package/dist/esm/core/constants.js.map +1 -0
  7. package/dist/esm/core/encryption.d.ts +18 -0
  8. package/dist/esm/core/encryption.d.ts.map +1 -0
  9. package/dist/esm/core/encryption.js +40 -0
  10. package/dist/esm/core/encryption.js.map +1 -0
  11. package/dist/esm/core/index.d.ts +5 -0
  12. package/dist/esm/core/index.d.ts.map +1 -0
  13. package/dist/esm/core/index.js +5 -0
  14. package/dist/esm/core/index.js.map +1 -0
  15. package/dist/esm/core/interfaces.d.ts +39 -0
  16. package/dist/esm/core/interfaces.d.ts.map +1 -0
  17. package/dist/esm/core/interfaces.js +13 -0
  18. package/dist/esm/core/interfaces.js.map +1 -0
  19. package/dist/esm/core/utils/serializers.d.ts +29 -0
  20. package/dist/esm/core/utils/serializers.d.ts.map +1 -0
  21. package/dist/esm/core/utils/serializers.js +46 -0
  22. package/dist/esm/core/utils/serializers.js.map +1 -0
  23. package/dist/esm/gateway/index.d.ts +60 -0
  24. package/dist/esm/gateway/index.d.ts.map +1 -0
  25. package/dist/esm/gateway/index.js +110 -0
  26. package/dist/esm/gateway/index.js.map +1 -0
  27. package/dist/esm/index.d.ts +7 -0
  28. package/dist/esm/index.d.ts.map +1 -0
  29. package/dist/esm/index.js +7 -0
  30. package/dist/esm/index.js.map +1 -0
  31. package/dist/esm/package.json +1 -0
  32. package/dist/esm/proxy/index.d.ts +42 -0
  33. package/dist/esm/proxy/index.d.ts.map +1 -0
  34. package/dist/esm/proxy/index.js +59 -0
  35. package/dist/esm/proxy/index.js.map +1 -0
  36. package/dist/esm/proxy/proxy-server.d.ts +3 -0
  37. package/dist/esm/proxy/proxy-server.d.ts.map +1 -0
  38. package/dist/esm/proxy/proxy-server.js +55 -0
  39. package/dist/esm/proxy/proxy-server.js.map +1 -0
  40. package/dist/esm/relay/index.d.ts +2 -0
  41. package/dist/esm/relay/index.d.ts.map +1 -0
  42. package/dist/esm/relay/index.js +2 -0
  43. package/dist/esm/relay/index.js.map +1 -0
  44. package/dist/esm/relay/simple-relay-pool.d.ts +19 -0
  45. package/dist/esm/relay/simple-relay-pool.d.ts.map +1 -0
  46. package/dist/esm/relay/simple-relay-pool.js +44 -0
  47. package/dist/esm/relay/simple-relay-pool.js.map +1 -0
  48. package/dist/esm/signer/index.d.ts +2 -0
  49. package/dist/esm/signer/index.d.ts.map +1 -0
  50. package/dist/esm/signer/index.js +2 -0
  51. package/dist/esm/signer/index.js.map +1 -0
  52. package/dist/esm/signer/private-key-signer.d.ts +16 -0
  53. package/dist/esm/signer/private-key-signer.d.ts.map +1 -0
  54. package/dist/esm/signer/private-key-signer.js +23 -0
  55. package/dist/esm/signer/private-key-signer.js.map +1 -0
  56. package/dist/esm/transport/base-nostr-transport.d.ts +67 -0
  57. package/dist/esm/transport/base-nostr-transport.d.ts.map +1 -0
  58. package/dist/esm/transport/base-nostr-transport.js +122 -0
  59. package/dist/esm/transport/base-nostr-transport.js.map +1 -0
  60. package/dist/esm/transport/index.d.ts +4 -0
  61. package/dist/esm/transport/index.d.ts.map +1 -0
  62. package/dist/esm/transport/index.js +4 -0
  63. package/dist/esm/transport/index.js.map +1 -0
  64. package/dist/esm/transport/nostr-client-transport.d.ts +60 -0
  65. package/dist/esm/transport/nostr-client-transport.d.ts.map +1 -0
  66. package/dist/esm/transport/nostr-client-transport.js +116 -0
  67. package/dist/esm/transport/nostr-client-transport.js.map +1 -0
  68. package/dist/esm/transport/nostr-server-transport.d.ts +128 -0
  69. package/dist/esm/transport/nostr-server-transport.d.ts.map +1 -0
  70. package/dist/esm/transport/nostr-server-transport.js +383 -0
  71. package/dist/esm/transport/nostr-server-transport.js.map +1 -0
  72. package/package.json +2 -2
@@ -0,0 +1,29 @@
1
+ import type { NostrEvent, UnsignedEvent } from 'nostr-tools';
2
+ import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
3
+ /**
4
+ * Serializes an MCP message into a Nostr event object.
5
+ *
6
+ * @param mcpMessage The MCP message (request or response) to serialize.
7
+ * @param pubkey The public key of the sender.
8
+ * @param kind The kind of Nostr event to create.
9
+ * @param tags An array of tags to include in the event.
10
+ * @returns A Nostr event object (without `id` and `sig`).
11
+ */
12
+ export declare function mcpToNostrEvent(mcpMessage: JSONRPCMessage, pubkey: string, kind: number, tags?: string[][]): UnsignedEvent;
13
+ /**
14
+ * Deserializes a Nostr event into an MCP message.
15
+ *
16
+ * @param event The Nostr event to deserialize.
17
+ * @returns An MCP request or response object.
18
+ * @throws Error if the event content is not valid JSON
19
+ */
20
+ export declare function nostrEventToMcpMessage(event: NostrEvent): JSONRPCMessage;
21
+ /**
22
+ * Extracts a specific tag from a Nostr event.
23
+ *
24
+ * @param event The Nostr event.
25
+ * @param tagName The name of the tag to extract (e.g., 'e', 'p', 'd').
26
+ * @returns The value of the tag, or undefined if not found.
27
+ */
28
+ export declare function getNostrEventTag(tags: NostrEvent['tags'], tagName: string): string | undefined;
29
+ //# sourceMappingURL=serializers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializers.d.ts","sourceRoot":"","sources":["../../../../src/core/utils/serializers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAM,EAAE,EAAO,GACpB,aAAa,CAQf;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CASxE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EACxB,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAGpB"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Serializes an MCP message into a Nostr event object.
3
+ *
4
+ * @param mcpMessage The MCP message (request or response) to serialize.
5
+ * @param pubkey The public key of the sender.
6
+ * @param kind The kind of Nostr event to create.
7
+ * @param tags An array of tags to include in the event.
8
+ * @returns A Nostr event object (without `id` and `sig`).
9
+ */
10
+ export function mcpToNostrEvent(mcpMessage, pubkey, kind, tags = []) {
11
+ return {
12
+ pubkey,
13
+ kind,
14
+ tags,
15
+ content: JSON.stringify(mcpMessage),
16
+ created_at: Math.floor(Date.now() / 1000),
17
+ };
18
+ }
19
+ /**
20
+ * Deserializes a Nostr event into an MCP message.
21
+ *
22
+ * @param event The Nostr event to deserialize.
23
+ * @returns An MCP request or response object.
24
+ * @throws Error if the event content is not valid JSON
25
+ */
26
+ export function nostrEventToMcpMessage(event) {
27
+ try {
28
+ const content = JSON.parse(event.content);
29
+ return content;
30
+ }
31
+ catch (error) {
32
+ throw new Error(`Invalid JSON in Nostr event content: ${error instanceof Error ? error.message : 'Unknown error'}`);
33
+ }
34
+ }
35
+ /**
36
+ * Extracts a specific tag from a Nostr event.
37
+ *
38
+ * @param event The Nostr event.
39
+ * @param tagName The name of the tag to extract (e.g., 'e', 'p', 'd').
40
+ * @returns The value of the tag, or undefined if not found.
41
+ */
42
+ export function getNostrEventTag(tags, tagName) {
43
+ const tag = tags.find((t) => t[0] === tagName);
44
+ return tag ? tag[1] : undefined;
45
+ }
46
+ //# sourceMappingURL=serializers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializers.js","sourceRoot":"","sources":["../../../../src/core/utils/serializers.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,UAA0B,EAC1B,MAAc,EACd,IAAY,EACZ,OAAmB,EAAE;IAErB,OAAO;QACL,MAAM;QACN,IAAI;QACJ,IAAI;QACJ,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QACnC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAiB;IACtD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,wCAAwC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CACnG,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAwB,EACxB,OAAe;IAEf,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC;IAC/C,OAAO,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAClC,CAAC"}
@@ -0,0 +1,60 @@
1
+ import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
2
+ import { NostrServerTransportOptions } from '../transport/nostr-server-transport.js';
3
+ /**
4
+ * Options for configuring the NostrMCPGateway.
5
+ */
6
+ export interface NostrMCPGatewayOptions {
7
+ /** The MCP server transport (e.g., StdioServerTransport) to connect to the original MCP server */
8
+ mcpServerTransport: Transport;
9
+ /** Options for configuring the Nostr server transport */
10
+ nostrTransportOptions: NostrServerTransportOptions;
11
+ }
12
+ /**
13
+ * The main gateway class that orchestrates communication between Nostr clients
14
+ * and a local MCP server. It acts as a bridge, receiving MCP requests via Nostr
15
+ * events and forwarding them to the local MCP server, then publishing the
16
+ * responses back to Nostr. All request/response correlation is handled by the
17
+ * NostrServerTransport, making this a simple message forwarder.
18
+ */
19
+ export declare class NostrMCPGateway {
20
+ private readonly mcpServerTransport;
21
+ private readonly nostrServerTransport;
22
+ private isRunning;
23
+ constructor(options: NostrMCPGatewayOptions);
24
+ /**
25
+ * Sets up event handlers for both transports.
26
+ */
27
+ private setupEventHandlers;
28
+ /**
29
+ * Starts the gateway, initializing both transports.
30
+ */
31
+ start(): Promise<void>;
32
+ /**
33
+ * Stops the gateway, closing both transports.
34
+ */
35
+ stop(): Promise<void>;
36
+ /**
37
+ * Handles errors from the Nostr transport.
38
+ * @param error The error that occurred.
39
+ */
40
+ private handleNostrError;
41
+ /**
42
+ * Handles the Nostr transport closing.
43
+ */
44
+ private handleNostrClose;
45
+ /**
46
+ * Handles errors from the MCP server transport.
47
+ * @param error The error that occurred.
48
+ */
49
+ private handleServerError;
50
+ /**
51
+ * Handles the MCP server transport closing.
52
+ */
53
+ private handleServerClose;
54
+ /**
55
+ * Gets the current status of the gateway.
56
+ * @returns True if the gateway is running, false otherwise.
57
+ */
58
+ isActive(): boolean;
59
+ }
60
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/gateway/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAEL,2BAA2B,EAC5B,MAAM,wCAAwC,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,kGAAkG;IAClG,kBAAkB,EAAE,SAAS,CAAC;IAC9B,yDAAyD;IACzD,qBAAqB,EAAE,2BAA2B,CAAC;CACpD;AAED;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAC5D,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,sBAAsB;IAS3C;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAoB1B;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBnC;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBlC;;;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"}
@@ -0,0 +1,110 @@
1
+ import { NostrServerTransport, } from '../transport/nostr-server-transport.js';
2
+ /**
3
+ * The main gateway class that orchestrates communication between Nostr clients
4
+ * and a local MCP server. It acts as a bridge, receiving MCP requests via Nostr
5
+ * events and forwarding them to the local MCP server, then publishing the
6
+ * responses back to Nostr. All request/response correlation is handled by the
7
+ * NostrServerTransport, making this a simple message forwarder.
8
+ */
9
+ export class NostrMCPGateway {
10
+ constructor(options) {
11
+ this.isRunning = false;
12
+ this.mcpServerTransport = options.mcpServerTransport;
13
+ this.nostrServerTransport = new NostrServerTransport(options.nostrTransportOptions);
14
+ this.setupEventHandlers();
15
+ }
16
+ /**
17
+ * Sets up event handlers for both transports.
18
+ */
19
+ setupEventHandlers() {
20
+ // Forward messages from Nostr to the MCP server, handling any potential errors.
21
+ this.nostrServerTransport.onmessage = (message) => {
22
+ this.mcpServerTransport
23
+ .send(message)
24
+ .catch(this.handleServerError.bind(this));
25
+ };
26
+ this.nostrServerTransport.onerror = this.handleNostrError.bind(this);
27
+ this.nostrServerTransport.onclose = this.handleNostrClose.bind(this);
28
+ // Forward messages from the MCP server to the Nostr transport, handling any potential errors.
29
+ this.mcpServerTransport.onmessage = (message) => {
30
+ this.nostrServerTransport
31
+ .send(message)
32
+ .catch(this.handleNostrError.bind(this));
33
+ };
34
+ this.mcpServerTransport.onerror = this.handleServerError.bind(this);
35
+ this.mcpServerTransport.onclose = this.handleServerClose.bind(this);
36
+ }
37
+ /**
38
+ * Starts the gateway, initializing both transports.
39
+ */
40
+ async start() {
41
+ if (this.isRunning) {
42
+ throw new Error('Gateway is already running');
43
+ }
44
+ try {
45
+ // Start both transports
46
+ await this.nostrServerTransport.start();
47
+ await this.mcpServerTransport.start();
48
+ this.isRunning = true;
49
+ console.log('NostrMCPGateway started successfully');
50
+ }
51
+ catch (error) {
52
+ console.error('Failed to start NostrMCPGateway:', error);
53
+ await this.stop();
54
+ throw error;
55
+ }
56
+ }
57
+ /**
58
+ * Stops the gateway, closing both transports.
59
+ */
60
+ async stop() {
61
+ if (!this.isRunning) {
62
+ return;
63
+ }
64
+ try {
65
+ // Stop both transports
66
+ await this.nostrServerTransport.close();
67
+ await this.mcpServerTransport.close();
68
+ this.isRunning = false;
69
+ console.log('NostrMCPGateway stopped successfully');
70
+ }
71
+ catch (error) {
72
+ console.error('Error stopping NostrMCPGateway:', error);
73
+ throw error;
74
+ }
75
+ }
76
+ /**
77
+ * Handles errors from the Nostr transport.
78
+ * @param error The error that occurred.
79
+ */
80
+ handleNostrError(error) {
81
+ console.error('Nostr transport error:', error);
82
+ }
83
+ /**
84
+ * Handles the Nostr transport closing.
85
+ */
86
+ handleNostrClose() {
87
+ console.log('Nostr transport closed');
88
+ }
89
+ /**
90
+ * Handles errors from the MCP server transport.
91
+ * @param error The error that occurred.
92
+ */
93
+ handleServerError(error) {
94
+ console.error('MCP server transport error:', error);
95
+ }
96
+ /**
97
+ * Handles the MCP server transport closing.
98
+ */
99
+ handleServerClose() {
100
+ console.log('MCP server transport closed');
101
+ }
102
+ /**
103
+ * Gets the current status of the gateway.
104
+ * @returns True if the gateway is running, false otherwise.
105
+ */
106
+ isActive() {
107
+ return this.isRunning;
108
+ }
109
+ }
110
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/gateway/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from './core/index.js';
2
+ export * from './relay/index.js';
3
+ export * from './signer/index.js';
4
+ export * from './gateway/index.js';
5
+ export * from './proxy/index.js';
6
+ export * from './transport/index.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,7 @@
1
+ export * from './core/index.js';
2
+ export * from './relay/index.js';
3
+ export * from './signer/index.js';
4
+ export * from './gateway/index.js';
5
+ export * from './proxy/index.js';
6
+ export * from './transport/index.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ {"type": "module"}
@@ -0,0 +1,42 @@
1
+ import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
2
+ import { NostrTransportOptions } from '../transport/nostr-client-transport.js';
3
+ /**
4
+ * Options for configuring the NostrMCPProxy.
5
+ */
6
+ export interface NostrMCPProxyOptions {
7
+ /**
8
+ * The transport for the local MCP Host (e.g., StdioServerTransport).
9
+ */
10
+ mcpHostTransport: Transport;
11
+ /**
12
+ * Configuration options for the client-facing Nostr transport.
13
+ */
14
+ nostrTransportOptions: NostrTransportOptions;
15
+ }
16
+ /**
17
+ * `NostrMCPProxy` acts as a bridge between a local MCP Host
18
+ * and a remote MCP Server accessible via the Nostr network.
19
+ *
20
+ * It listens for MCP messages from the local host, forwards them over Nostr,
21
+ * and relays the responses back.
22
+ */
23
+ export declare class NostrMCPProxy {
24
+ private mcpHostTransport;
25
+ private nostrTransport;
26
+ constructor(options: NostrMCPProxyOptions);
27
+ /**
28
+ * Starts the proxy, establishing connections to both the local MCP host
29
+ * and the remote Nostr transport.
30
+ *
31
+ * @returns Promise that resolves when both transports are started
32
+ */
33
+ start(): Promise<void>;
34
+ /**
35
+ * Stops the proxy and closes all connections.
36
+ *
37
+ * @returns Promise that resolves when both transports are closed
38
+ */
39
+ stop(): Promise<void>;
40
+ private setupEventHandlers;
41
+ }
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/proxy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAE1E,OAAO,EAEL,qBAAqB,EACtB,MAAM,wCAAwC,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,gBAAgB,EAAE,SAAS,CAAC;IAC5B;;OAEG;IACH,qBAAqB,EAAE,qBAAqB,CAAC;CAC9C;AAED;;;;;;GAMG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,gBAAgB,CAAY;IACpC,OAAO,CAAC,cAAc,CAAuB;gBAEjC,OAAO,EAAE,oBAAoB;IAOzC;;;;;OAKG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYnC;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMlC,OAAO,CAAC,kBAAkB;CAwB3B"}
@@ -0,0 +1,59 @@
1
+ import { NostrClientTransport, } from '../transport/nostr-client-transport.js';
2
+ /**
3
+ * `NostrMCPProxy` acts as a bridge between a local MCP Host
4
+ * and a remote MCP Server accessible via the Nostr network.
5
+ *
6
+ * It listens for MCP messages from the local host, forwards them over Nostr,
7
+ * and relays the responses back.
8
+ */
9
+ export class NostrMCPProxy {
10
+ constructor(options) {
11
+ this.mcpHostTransport = options.mcpHostTransport;
12
+ this.nostrTransport = new NostrClientTransport(options.nostrTransportOptions);
13
+ }
14
+ /**
15
+ * Starts the proxy, establishing connections to both the local MCP host
16
+ * and the remote Nostr transport.
17
+ *
18
+ * @returns Promise that resolves when both transports are started
19
+ */
20
+ async start() {
21
+ // Set up message handlers
22
+ this.setupEventHandlers();
23
+ // Start both transports
24
+ await Promise.all([
25
+ this.mcpHostTransport.start(),
26
+ this.nostrTransport.start(),
27
+ ]);
28
+ console.log('NostrMCPProxy started.');
29
+ }
30
+ /**
31
+ * Stops the proxy and closes all connections.
32
+ *
33
+ * @returns Promise that resolves when both transports are closed
34
+ */
35
+ async stop() {
36
+ await this.mcpHostTransport.close();
37
+ await this.nostrTransport.close();
38
+ console.log('NostrMCPProxy stopped.');
39
+ }
40
+ setupEventHandlers() {
41
+ // Forward messages from the local host to Nostr.
42
+ this.mcpHostTransport.onmessage = (message) => {
43
+ this.nostrTransport
44
+ .send(message)
45
+ .catch((err) => console.error('Error sending message to Nostr:', err));
46
+ };
47
+ this.mcpHostTransport.onerror = (err) => console.error('MCP Host Transport Error:', err);
48
+ this.mcpHostTransport.onclose = () => console.log('MCP Host Transport closed');
49
+ // Forward messages from Nostr back to the local host.
50
+ this.nostrTransport.onmessage = (message) => {
51
+ this.mcpHostTransport
52
+ .send(message)
53
+ .catch((err) => console.error('Error sending message to local host:', err));
54
+ };
55
+ this.nostrTransport.onerror = (err) => console.error('Nostr Transport Error:', err);
56
+ this.nostrTransport.onclose = () => console.log('Nostr Transport closed');
57
+ }
58
+ }
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/proxy/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,oBAAoB,GAErB,MAAM,wCAAwC,CAAC;AAgBhD;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IAIxB,YAAY,OAA6B;QACvC,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;QACjD,IAAI,CAAC,cAAc,GAAG,IAAI,oBAAoB,CAC5C,OAAO,CAAC,qBAAqB,CAC9B,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,KAAK;QAChB,0BAA0B;QAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,wBAAwB;QACxB,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;YAC7B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;SAC5B,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IAEO,kBAAkB;QACxB,iDAAiD;QACjD,IAAI,CAAC,gBAAgB,CAAC,SAAS,GAAG,CAAC,OAAuB,EAAE,EAAE;YAC5D,IAAI,CAAC,cAAc;iBAChB,IAAI,CAAC,OAAO,CAAC;iBACb,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE,CACtC,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,gBAAgB,CAAC,OAAO,GAAG,GAAG,EAAE,CACnC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAE3C,sDAAsD;QACtD,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,CAAC,OAAuB,EAAE,EAAE;YAC1D,IAAI,CAAC,gBAAgB;iBAClB,IAAI,CAAC,OAAO,CAAC;iBACb,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CACb,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAC3D,CAAC;QACN,CAAC,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE,CACpC,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC5E,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bun
2
+ export {};
3
+ //# sourceMappingURL=proxy-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-server.d.ts","sourceRoot":"","sources":["../../../src/proxy/proxy-server.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env bun
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { NostrMCPProxy } from './index.js';
4
+ import { PrivateKeySigner } from '../signer/private-key-signer.js';
5
+ import { SimpleRelayPool } from '../relay/simple-relay-pool.js';
6
+ /**
7
+ * Proxy server that exposes a remote Nostr MCP server via stdio.
8
+ * This allows MCP clients to connect to remote servers through the Nostr network.
9
+ */
10
+ async function main() {
11
+ // Get configuration from environment variables
12
+ const relayUrl = process.env.RELAY_URL || 'ws://localhost:7777';
13
+ const clientPrivateKey = process.env.CLIENT_PRIVATE_KEY;
14
+ const serverPubkey = process.env.SERVER_PUBKEY;
15
+ if (!clientPrivateKey) {
16
+ console.error('CLIENT_PRIVATE_KEY environment variable is required');
17
+ process.exit(1);
18
+ }
19
+ if (!serverPubkey) {
20
+ console.error('SERVER_PUBKEY environment variable is required');
21
+ process.exit(1);
22
+ }
23
+ // Set up stdio transport for the server
24
+ const transport = new StdioServerTransport();
25
+ // Create Nostr components
26
+ const signer = new PrivateKeySigner(clientPrivateKey);
27
+ const relayPool = new SimpleRelayPool([relayUrl]);
28
+ // Create and start the proxy
29
+ const proxy = new NostrMCPProxy({
30
+ mcpHostTransport: transport,
31
+ nostrTransportOptions: {
32
+ signer,
33
+ relayHandler: relayPool,
34
+ serverPubkey,
35
+ },
36
+ });
37
+ // Handle cleanup on process termination
38
+ process.on('SIGINT', async () => {
39
+ await proxy.stop();
40
+ process.exit(0);
41
+ });
42
+ process.on('SIGTERM', async () => {
43
+ await proxy.stop();
44
+ process.exit(0);
45
+ });
46
+ // Start the proxy
47
+ await proxy.start();
48
+ console.error('Proxy server started and connected to stdio');
49
+ }
50
+ // Run the server
51
+ main().catch((error) => {
52
+ console.error('Proxy server error:', error);
53
+ process.exit(1);
54
+ });
55
+ //# sourceMappingURL=proxy-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy-server.js","sourceRoot":"","sources":["../../../src/proxy/proxy-server.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE;;;GAGG;AACH,KAAK,UAAU,IAAI;IACjB,+CAA+C;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,qBAAqB,CAAC;IAChE,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACxD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAE/C,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,wCAAwC;IACxC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,0BAA0B;IAC1B,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,IAAI,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAElD,6BAA6B;IAC7B,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC;QAC9B,gBAAgB,EAAE,SAAS;QAC3B,qBAAqB,EAAE;YACrB,MAAM;YACN,YAAY,EAAE,SAAS;YACvB,YAAY;SACb;KACF,CAAC,CAAC;IAEH,wCAAwC;IACxC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;IACpB,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;AAC/D,CAAC;AAED,iBAAiB;AACjB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './simple-relay-pool.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/relay/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './simple-relay-pool.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/relay/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type Filter, type NostrEvent } from 'nostr-tools';
2
+ import { RelayHandler } from '../core/interfaces.js';
3
+ /**
4
+ * A RelayHandler implementation that uses a SimplePool to manage connections and subscriptions.
5
+ * @argument relayUrls - An array of relay URLs to connect to.
6
+ * @returns A RelayHandler implementation that uses a SimplePool to manage connections and subscriptions.
7
+ */
8
+ export declare class SimpleRelayPool implements RelayHandler {
9
+ private readonly relayUrls;
10
+ private pool;
11
+ private subscriptions;
12
+ constructor(relayUrls: string[]);
13
+ connect(): Promise<void>;
14
+ disconnect(relayUrls?: string[]): Promise<void>;
15
+ publish(event: NostrEvent): Promise<void>;
16
+ subscribe(filters: Filter[], onEvent: (event: NostrEvent) => void, onEose?: () => void): Promise<void>;
17
+ unsubscribe(): void;
18
+ }
19
+ //# sourceMappingURL=simple-relay-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-relay-pool.d.ts","sourceRoot":"","sources":["../../../src/relay/simple-relay-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,aAAa,CAAmB;gBAE5B,SAAS,EAAE,MAAM,EAAE;IAKzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASxB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CACb,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACpC,MAAM,CAAC,EAAE,MAAM,IAAI,GAClB,OAAO,CAAC,IAAI,CAAC;IAQhB,WAAW,IAAI,IAAI;CAKpB"}
@@ -0,0 +1,44 @@
1
+ import { SimplePool } from 'nostr-tools';
2
+ /**
3
+ * A RelayHandler implementation that uses a SimplePool to manage connections and subscriptions.
4
+ * @argument relayUrls - An array of relay URLs to connect to.
5
+ * @returns A RelayHandler implementation that uses a SimplePool to manage connections and subscriptions.
6
+ */
7
+ export class SimpleRelayPool {
8
+ constructor(relayUrls) {
9
+ this.subscriptions = [];
10
+ this.relayUrls = relayUrls;
11
+ this.pool = new SimplePool();
12
+ }
13
+ async connect() {
14
+ this.relayUrls.forEach((url) => {
15
+ const normalizedUrl = new URL(url).href;
16
+ if (!this.pool.listConnectionStatus().get(normalizedUrl)) {
17
+ this.pool.ensureRelay(url, { connectionTimeout: 5000 });
18
+ }
19
+ });
20
+ }
21
+ async disconnect(relayUrls) {
22
+ if (!relayUrls) {
23
+ relayUrls = this.relayUrls;
24
+ }
25
+ this.pool.close(relayUrls);
26
+ await Bun.sleep(100);
27
+ }
28
+ async publish(event) {
29
+ await Promise.all(this.pool.publish(this.relayUrls, event));
30
+ }
31
+ async subscribe(filters, onEvent, onEose) {
32
+ const sub = this.pool.subscribeMany(this.relayUrls, filters, {
33
+ onevent: onEvent,
34
+ oneose: onEose,
35
+ });
36
+ this.subscriptions.push(sub);
37
+ }
38
+ unsubscribe() {
39
+ this.subscriptions.forEach((sub) => {
40
+ sub.close();
41
+ });
42
+ }
43
+ }
44
+ //# sourceMappingURL=simple-relay-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple-relay-pool.js","sourceRoot":"","sources":["../../../src/relay/simple-relay-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgC,MAAM,aAAa,CAAC;AAIvE;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAK1B,YAAY,SAAmB;QAFvB,kBAAa,GAAgB,EAAE,CAAC;QAGtC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7B,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;gBACzD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,SAAoB;QACnC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3B,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAiB;QAC7B,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAiB,EACjB,OAAoC,EACpC,MAAmB;QAEnB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE;YAC3D,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,WAAW;QACT,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACjC,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export * from './private-key-signer.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/signer/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './private-key-signer.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/signer/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type NostrEvent, type UnsignedEvent } from 'nostr-tools';
2
+ import { NostrSigner } from '../core/interfaces.js';
3
+ /**
4
+ * A signer that uses a private key to sign events.
5
+ * @argument privateKey - The private key in HEX to use for signing.
6
+ * @returns A signer that uses the provided private key to sign events.
7
+ */
8
+ export declare class PrivateKeySigner implements NostrSigner {
9
+ private readonly privateKey;
10
+ private readonly publicKey;
11
+ constructor(privateKey: string);
12
+ getSecretKey(): Promise<Uint8Array>;
13
+ getPublicKey(): Promise<string>;
14
+ signEvent(event: UnsignedEvent): Promise<NostrEvent>;
15
+ }
16
+ //# sourceMappingURL=private-key-signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-key-signer.d.ts","sourceRoot":"","sources":["../../../src/signer/private-key-signer.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD;;;;GAIG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,UAAU,EAAE,MAAM;IAKxB,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC;IAInC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAI/B,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC;CAG3D"}
@@ -0,0 +1,23 @@
1
+ import { hexToBytes } from '@noble/hashes/utils';
2
+ import { finalizeEvent, getPublicKey, } from 'nostr-tools';
3
+ /**
4
+ * A signer that uses a private key to sign events.
5
+ * @argument privateKey - The private key in HEX to use for signing.
6
+ * @returns A signer that uses the provided private key to sign events.
7
+ */
8
+ export class PrivateKeySigner {
9
+ constructor(privateKey) {
10
+ this.privateKey = hexToBytes(privateKey);
11
+ this.publicKey = getPublicKey(this.privateKey);
12
+ }
13
+ async getSecretKey() {
14
+ return this.privateKey;
15
+ }
16
+ async getPublicKey() {
17
+ return this.publicKey;
18
+ }
19
+ async signEvent(event) {
20
+ return finalizeEvent(event, this.privateKey);
21
+ }
22
+ }
23
+ //# sourceMappingURL=private-key-signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-key-signer.js","sourceRoot":"","sources":["../../../src/signer/private-key-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACL,aAAa,EACb,YAAY,GAGb,MAAM,aAAa,CAAC;AAGrB;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IAI3B,YAAY,UAAkB;QAC5B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAoB;QAClC,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;CACF"}