@candypoets/nipworker 0.89.0 → 0.90.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/cache/index.js +2 -2
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/pkg/cache.d.ts +2 -2
- package/dist/cache/pkg/cache_bg.wasm.d.ts +2 -2
- package/dist/connections/index.d.ts +0 -5
- package/dist/connections/index.d.ts.map +1 -1
- package/dist/connections/index.js +2 -2
- package/dist/connections/index.js.map +1 -1
- package/dist/connections/pkg/connections.d.ts +5 -5
- package/dist/connections/pkg/connections_bg.wasm.d.ts +5 -5
- package/dist/connections/proxy.d.ts +2 -0
- package/dist/connections/proxy.d.ts.map +1 -0
- package/dist/connections/proxy.js +1 -0
- package/dist/connections/proxy.js.map +1 -0
- package/dist/connections/types.d.ts +4 -0
- package/dist/connections/types.d.ts.map +1 -0
- package/dist/generated/nostr/fb/buffer-full.d.ts.map +1 -1
- package/dist/generated/nostr/fb/cache-input-message.d.ts.map +1 -1
- package/dist/generated/nostr/fb/cache-input.d.ts.map +1 -1
- package/dist/generated/nostr/fb/cache-request.d.ts +6 -8
- package/dist/generated/nostr/fb/cache-request.d.ts.map +1 -1
- package/dist/generated/nostr/fb/cache-response.d.ts +4 -6
- package/dist/generated/nostr/fb/cache-response.d.ts.map +1 -1
- package/dist/generated/nostr/fb/cashu-data.d.ts +4 -6
- package/dist/generated/nostr/fb/cashu-data.d.ts.map +1 -1
- package/dist/generated/nostr/fb/code-data.d.ts +7 -9
- package/dist/generated/nostr/fb/code-data.d.ts.map +1 -1
- package/dist/generated/nostr/fb/connection-status.d.ts +10 -12
- package/dist/generated/nostr/fb/connection-status.d.ts.map +1 -1
- package/dist/generated/nostr/fb/contact.d.ts +9 -11
- package/dist/generated/nostr/fb/contact.d.ts.map +1 -1
- package/dist/generated/nostr/fb/content-block.d.ts +7 -9
- package/dist/generated/nostr/fb/content-block.d.ts.map +1 -1
- package/dist/generated/nostr/fb/content-data.d.ts.map +1 -1
- package/dist/generated/nostr/fb/coordinate.d.ts +9 -11
- package/dist/generated/nostr/fb/coordinate.d.ts.map +1 -1
- package/dist/generated/nostr/fb/count-response.d.ts.map +1 -1
- package/dist/generated/nostr/fb/counter-pipe-config.d.ts +4 -6
- package/dist/generated/nostr/fb/counter-pipe-config.d.ts.map +1 -1
- package/dist/generated/nostr/fb/dleqproof.d.ts +10 -12
- package/dist/generated/nostr/fb/dleqproof.d.ts.map +1 -1
- package/dist/generated/nostr/fb/emoji.d.ts +7 -9
- package/dist/generated/nostr/fb/emoji.d.ts.map +1 -1
- package/dist/generated/nostr/fb/eoce.d.ts +4 -6
- package/dist/generated/nostr/fb/eoce.d.ts.map +1 -1
- package/dist/generated/nostr/fb/event-pointer.d.ts +9 -11
- package/dist/generated/nostr/fb/event-pointer.d.ts.map +1 -1
- package/dist/generated/nostr/fb/get-public-key.d.ts.map +1 -1
- package/dist/generated/nostr/fb/hashtag-data.d.ts +4 -6
- package/dist/generated/nostr/fb/hashtag-data.d.ts.map +1 -1
- package/dist/generated/nostr/fb/history-tag.d.ts +13 -15
- package/dist/generated/nostr/fb/history-tag.d.ts.map +1 -1
- package/dist/generated/nostr/fb/htlcwitness.d.ts +6 -8
- package/dist/generated/nostr/fb/htlcwitness.d.ts.map +1 -1
- package/dist/generated/nostr/fb/image-data.d.ts +10 -12
- package/dist/generated/nostr/fb/image-data.d.ts.map +1 -1
- package/dist/generated/nostr/fb/imeta-tag.d.ts +24 -26
- package/dist/generated/nostr/fb/imeta-tag.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind-filter-pipe-config.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind0-parsed.d.ts +61 -63
- package/dist/generated/nostr/fb/kind0-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind1-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind10002-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind10019-parsed.d.ts +6 -8
- package/dist/generated/nostr/fb/kind10019-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind1111-parsed.d.ts +32 -34
- package/dist/generated/nostr/fb/kind1111-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind1311-parsed.d.ts +4 -6
- package/dist/generated/nostr/fb/kind1311-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind17-parsed.d.ts +10 -12
- package/dist/generated/nostr/fb/kind17-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind17375-parsed.d.ts +9 -11
- package/dist/generated/nostr/fb/kind17375-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind20-parsed.d.ts +18 -20
- package/dist/generated/nostr/fb/kind20-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind22-parsed.d.ts +15 -17
- package/dist/generated/nostr/fb/kind22-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind3-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind30023-parsed.d.ts +24 -26
- package/dist/generated/nostr/fb/kind30023-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind4-parsed.d.ts +10 -12
- package/dist/generated/nostr/fb/kind4-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind6-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind7-parsed.d.ts +10 -12
- package/dist/generated/nostr/fb/kind7-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind7374-parsed.d.ts +7 -9
- package/dist/generated/nostr/fb/kind7374-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind7375-parsed.d.ts +6 -8
- package/dist/generated/nostr/fb/kind7375-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind7376-parsed.d.ts +10 -12
- package/dist/generated/nostr/fb/kind7376-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind9321-parsed.d.ts +22 -24
- package/dist/generated/nostr/fb/kind9321-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/kind9735-parsed.d.ts +25 -27
- package/dist/generated/nostr/fb/kind9735-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/link-preview-data.d.ts +13 -15
- package/dist/generated/nostr/fb/link-preview-data.d.ts.map +1 -1
- package/dist/generated/nostr/fb/list-parsed.d.ts +27 -22
- package/dist/generated/nostr/fb/list-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/live-activity-ref.d.ts +10 -12
- package/dist/generated/nostr/fb/live-activity-ref.d.ts.map +1 -1
- package/dist/generated/nostr/fb/live-chat-participant.d.ts +7 -9
- package/dist/generated/nostr/fb/live-chat-participant.d.ts.map +1 -1
- package/dist/generated/nostr/fb/live-chat-thread-ref.d.ts +7 -9
- package/dist/generated/nostr/fb/live-chat-thread-ref.d.ts.map +1 -1
- package/dist/generated/nostr/fb/main-content.d.ts.map +1 -1
- package/dist/generated/nostr/fb/main-message.d.ts.map +1 -1
- package/dist/generated/nostr/fb/media-group-data.d.ts.map +1 -1
- package/dist/generated/nostr/fb/media-item.d.ts.map +1 -1
- package/dist/generated/nostr/fb/message-type.d.ts.map +1 -1
- package/dist/generated/nostr/fb/message.d.ts.map +1 -1
- package/dist/generated/nostr/fb/mint-info.d.ts +6 -8
- package/dist/generated/nostr/fb/mint-info.d.ts.map +1 -1
- package/dist/generated/nostr/fb/mint-proofs.d.ts +4 -6
- package/dist/generated/nostr/fb/mint-proofs.d.ts.map +1 -1
- package/dist/generated/nostr/fb/mute-filter-pipe-config.d.ts +8 -10
- package/dist/generated/nostr/fb/mute-filter-pipe-config.d.ts.map +1 -1
- package/dist/generated/nostr/fb/nostr-data.d.ts +12 -14
- package/dist/generated/nostr/fb/nostr-data.d.ts.map +1 -1
- package/dist/generated/nostr/fb/nostr-event.d.ts +13 -15
- package/dist/generated/nostr/fb/nostr-event.d.ts.map +1 -1
- package/dist/generated/nostr/fb/npub-limiter-pipe-config.d.ts.map +1 -1
- package/dist/generated/nostr/fb/p2-pkwitness.d.ts +2 -4
- package/dist/generated/nostr/fb/p2-pkwitness.d.ts.map +1 -1
- package/dist/generated/nostr/fb/parse-pipe-config.d.ts.map +1 -1
- package/dist/generated/nostr/fb/parsed-data-union.d.ts.map +1 -1
- package/dist/generated/nostr/fb/parsed-data.d.ts.map +1 -1
- package/dist/generated/nostr/fb/parsed-event.d.ts +9 -11
- package/dist/generated/nostr/fb/parsed-event.d.ts.map +1 -1
- package/dist/generated/nostr/fb/pipe-config.d.ts.map +1 -1
- package/dist/generated/nostr/fb/pipe.d.ts.map +1 -1
- package/dist/generated/nostr/fb/pipeline-config.d.ts.map +1 -1
- package/dist/generated/nostr/fb/pre-generic-parsed.d.ts +40 -42
- package/dist/generated/nostr/fb/pre-generic-parsed.d.ts.map +1 -1
- package/dist/generated/nostr/fb/pre-participant.d.ts +13 -15
- package/dist/generated/nostr/fb/pre-participant.d.ts.map +1 -1
- package/dist/generated/nostr/fb/pre-ref-event.d.ts +10 -12
- package/dist/generated/nostr/fb/pre-ref-event.d.ts.map +1 -1
- package/dist/generated/nostr/fb/private-key.d.ts +4 -6
- package/dist/generated/nostr/fb/private-key.d.ts.map +1 -1
- package/dist/generated/nostr/fb/profile-pointer.d.ts +6 -8
- package/dist/generated/nostr/fb/profile-pointer.d.ts.map +1 -1
- package/dist/generated/nostr/fb/proof-verification-pipe-config.d.ts.map +1 -1
- package/dist/generated/nostr/fb/proof.d.ts +10 -12
- package/dist/generated/nostr/fb/proof.d.ts.map +1 -1
- package/dist/generated/nostr/fb/pubkey.d.ts +4 -6
- package/dist/generated/nostr/fb/pubkey.d.ts.map +1 -1
- package/dist/generated/nostr/fb/publish.d.ts +6 -8
- package/dist/generated/nostr/fb/publish.d.ts.map +1 -1
- package/dist/generated/nostr/fb/raw.d.ts +4 -6
- package/dist/generated/nostr/fb/raw.d.ts.map +1 -1
- package/dist/generated/nostr/fb/reaction-type.d.ts.map +1 -1
- package/dist/generated/nostr/fb/relay-info.d.ts +4 -6
- package/dist/generated/nostr/fb/relay-info.d.ts.map +1 -1
- package/dist/generated/nostr/fb/request.d.ts +10 -12
- package/dist/generated/nostr/fb/request.d.ts.map +1 -1
- package/dist/generated/nostr/fb/save-to-db-pipe-config.d.ts.map +1 -1
- package/dist/generated/nostr/fb/serialize-events-pipe-config.d.ts +4 -6
- package/dist/generated/nostr/fb/serialize-events-pipe-config.d.ts.map +1 -1
- package/dist/generated/nostr/fb/set-signer.d.ts.map +1 -1
- package/dist/generated/nostr/fb/sign-event.d.ts.map +1 -1
- package/dist/generated/nostr/fb/signed-event.d.ts.map +1 -1
- package/dist/generated/nostr/fb/signer-op.d.ts.map +1 -1
- package/dist/generated/nostr/fb/signer-request.d.ts +13 -15
- package/dist/generated/nostr/fb/signer-request.d.ts.map +1 -1
- package/dist/generated/nostr/fb/signer-response.d.ts +7 -9
- package/dist/generated/nostr/fb/signer-response.d.ts.map +1 -1
- package/dist/generated/nostr/fb/signer-type.d.ts.map +1 -1
- package/dist/generated/nostr/fb/string-vec.d.ts +2 -4
- package/dist/generated/nostr/fb/string-vec.d.ts.map +1 -1
- package/dist/generated/nostr/fb/subscribe-kind.d.ts.map +1 -1
- package/dist/generated/nostr/fb/subscribe.d.ts +4 -6
- package/dist/generated/nostr/fb/subscribe.d.ts.map +1 -1
- package/dist/generated/nostr/fb/subscription-config.d.ts +4 -6
- package/dist/generated/nostr/fb/subscription-config.d.ts.map +1 -1
- package/dist/generated/nostr/fb/tag.d.ts +29 -0
- package/dist/generated/nostr/fb/tag.d.ts.map +1 -0
- package/dist/generated/nostr/fb/template.d.ts +4 -6
- package/dist/generated/nostr/fb/template.d.ts.map +1 -1
- package/dist/generated/nostr/fb/unsubscribe.d.ts +4 -6
- package/dist/generated/nostr/fb/unsubscribe.d.ts.map +1 -1
- package/dist/generated/nostr/fb/valid-proofs.d.ts.map +1 -1
- package/dist/generated/nostr/fb/video-data.d.ts +7 -9
- package/dist/generated/nostr/fb/video-data.d.ts.map +1 -1
- package/dist/generated/nostr/fb/video-variant.d.ts +21 -23
- package/dist/generated/nostr/fb/video-variant.d.ts.map +1 -1
- package/dist/generated/nostr/fb/witness-string.d.ts +4 -6
- package/dist/generated/nostr/fb/witness-string.d.ts.map +1 -1
- package/dist/generated/nostr/fb/witness.d.ts.map +1 -1
- package/dist/generated/nostr/fb/worker-message.d.ts +7 -9
- package/dist/generated/nostr/fb/worker-message.d.ts.map +1 -1
- package/dist/generated/nostr/fb/zap-request.d.ts +10 -12
- package/dist/generated/nostr/fb/zap-request.d.ts.map +1 -1
- package/dist/generated/nostr/fb.d.ts +1 -0
- package/dist/generated/nostr/fb.d.ts.map +1 -1
- package/dist/index.d.ts +8 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index2.js +1 -1
- package/dist/index2.js.map +1 -1
- package/dist/lib/ConnectionTracker.d.ts.map +1 -1
- package/dist/parser/index.js +2 -2
- package/dist/parser/index.js.map +1 -1
- package/dist/proxy/index.d.ts +1 -1
- package/dist/proxy/index.d.ts.map +1 -1
- package/dist/proxy/index.js +0 -1
- package/dist/proxy/index.js.map +1 -1
- package/dist/proxy/relayProxyServer.d.ts +2 -2
- package/dist/proxy/relayProxyServer.d.ts.map +1 -1
- package/dist/relayProxyServer.js +1 -1
- package/dist/relayProxyServer.js.map +1 -1
- package/dist/signer-response.js +1 -1
- package/dist/signer-response.js.map +1 -1
- package/dist/utils.d.ts +0 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +4 -4
- package/dist/utils.js.map +1 -1
- package/dist/worker-message.js +1 -1
- package/dist/worker-message.js.map +1 -1
- package/package.json +2 -2
- package/dist/generated/message.d.ts +0 -91
- package/dist/generated/message.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind0parsed.d.ts +0 -100
- package/dist/generated/nostr/fb/kind0parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind10002parsed.d.ts +0 -25
- package/dist/generated/nostr/fb/kind10002parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind10019parsed.d.ts +0 -38
- package/dist/generated/nostr/fb/kind10019parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind17375parsed.d.ts +0 -38
- package/dist/generated/nostr/fb/kind17375parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind17parsed.d.ts +0 -42
- package/dist/generated/nostr/fb/kind17parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind1parsed.d.ts +0 -50
- package/dist/generated/nostr/fb/kind1parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind30023parsed.d.ts +0 -58
- package/dist/generated/nostr/fb/kind30023parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind3parsed.d.ts +0 -25
- package/dist/generated/nostr/fb/kind3parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind4parsed.d.ts +0 -39
- package/dist/generated/nostr/fb/kind4parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind6parsed.d.ts +0 -22
- package/dist/generated/nostr/fb/kind6parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind7374parsed.d.ts +0 -31
- package/dist/generated/nostr/fb/kind7374parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind7375parsed.d.ts +0 -41
- package/dist/generated/nostr/fb/kind7375parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind7376parsed.d.ts +0 -58
- package/dist/generated/nostr/fb/kind7376parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind7parsed.d.ts +0 -42
- package/dist/generated/nostr/fb/kind7parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind9321parsed.d.ts +0 -64
- package/dist/generated/nostr/fb/kind9321parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/kind9735parsed.d.ts +0 -64
- package/dist/generated/nostr/fb/kind9735parsed.d.ts.map +0 -1
- package/dist/generated/nostr/fb/p2pkwitness.d.ts +0 -27
- package/dist/generated/nostr/fb/p2pkwitness.d.ts.map +0 -1
- package/dist/lib/ByteString.d.ts +0 -32
- package/dist/lib/ByteString.d.ts.map +0 -1
package/dist/proxy/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {};
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/proxy/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC"}
|
package/dist/proxy/index.js
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{attachRelayProxyToServer as e,createExpressRelayProxyMiddleware as r,createRelayProxyServer as a}from"../relayProxyServer.js";export{e as attachRelayProxyToServer,r as createExpressRelayProxyMiddleware,a as createRelayProxyServer};
|
package/dist/proxy/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -68,7 +68,7 @@ export declare function createRelayProxyWebSocketServer(options: Omit<AttachRela
|
|
|
68
68
|
* // SvelteKit with adapter-node
|
|
69
69
|
* import { createServer } from 'http';
|
|
70
70
|
* import { handler } from './build/handler.js';
|
|
71
|
-
* import { attachRelayProxyToServer } from '@candypoets/nipworker/proxy';
|
|
71
|
+
* import { attachRelayProxyToServer } from '@candypoets/nipworker/proxy/server';
|
|
72
72
|
*
|
|
73
73
|
* const server = createServer(handler);
|
|
74
74
|
* attachRelayProxyToServer({ server, path: '/ws-proxy' });
|
|
@@ -81,7 +81,7 @@ export declare function attachRelayProxyToServer(options: AttachRelayProxyOption
|
|
|
81
81
|
*
|
|
82
82
|
* @example
|
|
83
83
|
* import express from 'express';
|
|
84
|
-
* import { createExpressRelayProxyMiddleware } from '@candypoets/nipworker/proxy';
|
|
84
|
+
* import { createExpressRelayProxyMiddleware } from '@candypoets/nipworker/proxy/server';
|
|
85
85
|
*
|
|
86
86
|
* const app = express();
|
|
87
87
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relayProxyServer.d.ts","sourceRoot":"","sources":["../../src/proxy/relayProxyServer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAa,eAAe,EAAE,MAAM,IAAI,CAAC;AAWhD,KAAK,sBAAsB,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAEvE,MAAM,MAAM,uBAAuB,GAAG;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,yCAAyC;IACzC,MAAM,EAAE,UAAU,GAAG,WAAW,CAAC;IACjC,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,qEAAqE;IACrE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,GAAG,EAAE,eAAe,CAAC;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,kDAAkD;IAClD,aAAa,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChF,CAAC;
|
|
1
|
+
{"version":3,"file":"relayProxyServer.d.ts","sourceRoot":"","sources":["../../src/proxy/relayProxyServer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,EAAa,eAAe,EAAE,MAAM,IAAI,CAAC;AAWhD,KAAK,sBAAsB,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;AAEvE,MAAM,MAAM,uBAAuB,GAAG;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACrC,yCAAyC;IACzC,MAAM,EAAE,UAAU,GAAG,WAAW,CAAC;IACjC,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,qEAAqE;IACrE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IACjC,GAAG,EAAE,eAAe,CAAC;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,kDAAkD;IAClD,aAAa,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChF,CAAC;AAwCF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,gBAAgB,CA4E9F;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,+BAA+B,CAC9C,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,UAAU,GAAG,WAAW,CAAA;CAAE,GACtF,mBAAmB,CAkFrB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,uBAAuB,GAAG,kBAAkB,CAoD7F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,iCAAiC,CAChD,CAAC,SAAS;IAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,UAAU,GAAG,WAAW,CAAA;CAAE,EACjE,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,uBAAuB,EAAE,QAAQ,CAAC,GAAG,kBAAkB,CAoF9E"}
|
package/dist/relayProxyServer.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as b from"flatbuffers";import{WebSocketServer as
|
|
1
|
+
import*as b from"flatbuffers";import{WebSocketServer as v,WebSocket as l}from"ws";import{R as C,W as m,M as h,e as E,N as B,d as R,S as N}from"./worker-message.js";function F(e={}){const r=e.host??"127.0.0.1",n=e.port??7777,o=e.path??"/",t=e.logger??console;let s;try{s=new v({host:r,port:n,path:o})}catch(c){throw t.error(`[relay-proxy] failed to create WebSocketServer: ${String(c)}`),c}let i=n;const a=s.address();return a&&typeof a=="object"&&(i=a.port),s.on("error",c=>{t.error(`[relay-proxy] WebSocketServer error: ${String(c)}`)}),s.on("connection",c=>{const f={relaySockets:new Map,pendingFrames:new Map,dedupBySubId:new Map,lastSubIdByRelay:new Map};c.on("message",(u,S)=>{if(S){const d=L(u);if(!d)return;T(f,c,d,t);return}const g=A(u);g&&_(f,g,t)}),c.on("close",()=>{I(f)}),c.on("error",()=>{I(f)})}),t.info(`[relay-proxy] listening on ws://${r}:${i}${o}`),{port:i,close:()=>new Promise((c,f)=>{s.close(u=>{if(u){f(u);return}c()})})}}function _(e,r,n){let o;try{o=JSON.parse(r)}catch{return}if(P(o)){const t=JSON.stringify(["AUTH",o.event]);O(e,o.relay,t,n);return}if(V(o)){e.dedupBySubId.delete(o.subscription_id);for(const[t,s]of e.relaySockets.entries())s.readyState===l.OPEN&&s.send(JSON.stringify(["CLOSE",o.subscription_id])),e.lastSubIdByRelay.set(t,o.subscription_id)}}function T(e,r,n,o){const t=n.frames.map(s=>({frame:s,state:W(s)}));for(const s of n.relays){M(e,r,s,o);for(const i of t){U(e,s,i.state);const a=i.frame;O(e,s,a,o)}}}function M(e,r,n,o){const t=e.relaySockets.get(n);if(t&&t.readyState!==l.CLOSED)return;const s=new l(n);e.relaySockets.set(n,s),e.pendingFrames.set(n,[]),s.on("open",()=>{const i=e.pendingFrames.get(n);if(i){for(const a of i)s.send(a);e.pendingFrames.set(n,[])}}),s.on("message",i=>{const a=A(i);if(!a||r.readyState!==l.OPEN)return;const c=e.lastSubIdByRelay.get(n),f=$(e,n,a,c);f&&r.send(f,{binary:!0})}),s.on("close",()=>{e.pendingFrames.delete(n)}),s.on("error",i=>{if(!e.pendingFrames.has(n))return;const a=String(i);!a.includes("ECONNREFUSED")&&!a.includes("ENOTFOUND")&&o.warn(`[relay-proxy] relay socket error for ${n}: ${a.slice(0,100)}`),e.pendingFrames.delete(n)})}function U(e,r,n){if(n){if(e.lastSubIdByRelay.set(r,n.subId),n.type==="REQ"){const o=n.subId;e.dedupBySubId.has(o)||e.dedupBySubId.set(o,new Set);return}e.dedupBySubId.delete(n.subId)}}function W(e){const r=w(e);if(!r)return null;const n=r[0];if(n!=="REQ"&&n!=="CLOSE")return null;const o=typeof r[1]=="string"?r[1]:null;return o?{type:n,subId:o}:null}function O(e,r,n,o){const t=e.relaySockets.get(r);if(t){if(t.readyState===l.OPEN){t.send(n);return}if(t.readyState===l.CONNECTING){const s=e.pendingFrames.get(r)??[];s.push(n),e.pendingFrames.set(r,s);return}o.warn(`[relay-proxy] dropping frame for closed relay socket ${r}`)}}function $(e,r,n,o){const t=w(n);if(!t||t.length<1||typeof t[0]!="string")return k(o??"",r,n);const s=t[0];if(s==="EVENT"){const i=typeof t[1]=="string"?t[1]:"",a=D(t[2]);if(!i||!a)return k(i,r,n);const c=e.dedupBySubId.get(i);return c&&c.has(a.id)?null:(c&&c.add(a.id),x(i,r,a))}if(s==="NOTICE"){const i=t[1]===void 0?null:String(t[1]);return y("",r,"NOTICE",i)}if(s==="AUTH"){const i=t[1]===void 0?null:String(t[1]);return y(o??"",r,"AUTH",i)}if(s==="CLOSED"){const i=typeof t[1]=="string"?t[1]:"",a=t[2]===void 0?null:String(t[2]);return y(i,r,"CLOSED",a)}if(s==="OK"){const i=typeof t[1]=="string"?t[1]:"",a=t[2]===void 0?"false":String(t[2]),c=t[3]===void 0?null:String(t[3]);return y(i,r,a,c)}if(s==="EOSE"){const i=typeof t[1]=="string"?t[1]:"";return y(i,r,"EOSE",null)}return k(o??"",r,n)}function x(e,r,n){const o=new b.Builder(1024),t=e?o.createString(e):0,s=o.createString(r),i=o.createString(n.id),a=o.createString(n.pubkey),c=o.createString(n.content),f=o.createString(n.sig),u=new Array(n.tags.length);for(let p=0;p<n.tags.length;p++)u[p]=J(o,n.tags[p]);const S=B.createTagsVector(o,u),g=B.createNostrEvent(o,i,a,n.kind,c,S,n.created_at,f),d=m.createWorkerMessage(o,t,s,h.NostrEvent,E.NostrEvent,g);return o.finish(d),o.asUint8Array()}function y(e,r,n,o){const t=new b.Builder(256),s=e?t.createString(e):0,i=t.createString(r),a=t.createString(n),c=o===null?0:t.createString(o),f=R.createConnectionStatus(t,i,a,c),u=m.createWorkerMessage(t,s,i,h.ConnectionStatus,E.ConnectionStatus,f);return t.finish(u),t.asUint8Array()}function k(e,r,n){const o=new b.Builder(256),t=e?o.createString(e):0,s=o.createString(r),i=o.createString(n),a=C.createRaw(o,i),c=m.createWorkerMessage(o,t,s,h.Raw,E.Raw,a);return o.finish(c),o.asUint8Array()}function D(e){if(!e||typeof e!="object")return null;const r=e;if(typeof r.id!="string"||typeof r.pubkey!="string"||typeof r.kind!="number"||typeof r.content!="string"||typeof r.created_at!="number"||typeof r.sig!="string"||!Array.isArray(r.tags))return null;const n=r.tags;let o=!1;for(const s of n){if(!Array.isArray(s)||s.length===0){o=!0;continue}for(const i of s)if(typeof i!="string"){o=!0;break}}let t;if(!o)t=n;else{t=[];for(const s of n){if(!Array.isArray(s))continue;const i=[];for(const a of s)typeof a=="string"&&i.push(a);i.length>0&&t.push(i)}}return{id:r.id,pubkey:r.pubkey,kind:r.kind,content:r.content,created_at:r.created_at,sig:r.sig,tags:t}}function J(e,r){const n=new Array(r.length);for(let t=0;t<r.length;t++)n[t]=e.createString(r[t]);const o=N.createItemsVector(e,n);return N.createStringVec(e,o)}function w(e){try{const r=JSON.parse(e);return Array.isArray(r)?r:null}catch{return null}}function L(e){const r=A(e);if(!r)return null;try{const n=JSON.parse(r);if(!Array.isArray(n.relays)||!Array.isArray(n.frames))return null;const o=n.relays.filter(s=>typeof s=="string"),t=n.frames.filter(s=>typeof s=="string");return o.length===0||t.length===0?null:{relays:o,frames:t}}catch{return null}}function A(e){return typeof e=="string"?e:e instanceof ArrayBuffer?Buffer.from(e).toString("utf8"):Buffer.isBuffer(e)?e.toString("utf8"):e instanceof Uint8Array?Buffer.from(e).toString("utf8"):Array.isArray(e)?Buffer.concat(e.filter(r=>Buffer.isBuffer(r))).toString("utf8"):""}function P(e){if(!e||typeof e!="object")return!1;const r=e;return r.type==="auth_response"&&typeof r.relay=="string"&&r.event!==void 0}function V(e){if(!e||typeof e!="object")return!1;const r=e;return r.type==="close_sub"&&typeof r.subscription_id=="string"}function I(e){e.dedupBySubId.clear(),e.lastSubIdByRelay.clear();for(const r of e.relaySockets.values())try{r.close()}catch{}e.relaySockets.clear(),e.pendingFrames.clear()}export{F as createRelayProxyServer};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relayProxyServer.js","sources":["../src/proxy/relayProxyServer.ts"],"sourcesContent":["/// <reference types=\"node\" />\n\nimport type { Server as HttpServer } from 'http';\nimport type { Server as HttpsServer } from 'https';\nimport type { IncomingMessage } from 'http';\nimport type { Duplex } from 'stream';\nimport * as flatbuffers from 'flatbuffers';\nimport { WebSocket, WebSocketServer } from 'ws';\nimport {\n\tConnectionStatusT,\n\tMessage,\n\tMessageType,\n\tNostrEventT,\n\tRawT,\n\tStringVecT,\n\tWorkerMessageT\n} from '../generated/nostr/fb';\n\ntype RelayProxyServerLogger = Pick<Console, 'info' | 'warn' | 'error'>;\n\nexport type RelayProxyServerOptions = {\n\thost?: string;\n\tport?: number;\n\tpath?: string;\n\tlogger?: RelayProxyServerLogger;\n};\n\nexport type RelayProxyServer = {\n\tport: number;\n\tclose: () => Promise<void>;\n};\n\nexport type AttachRelayProxyOptions = {\n\t/** The HTTP/HTTPS server to attach to */\n\tserver: HttpServer | HttpsServer;\n\t/** The path to mount the WebSocket endpoint on (e.g., '/ws-proxy') */\n\tpath?: string;\n\tlogger?: RelayProxyServerLogger;\n};\n\nexport type AttachedRelayProxy = {\n\t/** Stop accepting new connections and close all existing sessions */\n\tclose: () => Promise<void>;\n};\n\nexport type WebSocketRelayProxy = {\n\twss: WebSocketServer;\n\tclose: () => Promise<void>;\n\t/** Manually handle a WebSocket upgrade request */\n\thandleUpgrade: (request: IncomingMessage, socket: Duplex, head: Buffer) => void;\n};\n\ntype Envelope = {\n\trelays: string[];\n\tframes: string[];\n};\n\ntype AuthResponseCommand = {\n\ttype: 'auth_response';\n\trelay: string;\n\tevent: unknown;\n};\n\ntype CloseSubCommand = {\n\ttype: 'close_sub';\n\tsubscription_id: string;\n};\n\ntype NostrEventJson = {\n\tid: string;\n\tpubkey: string;\n\tkind: number;\n\tcontent: string;\n\ttags: string[][];\n\tcreated_at: number;\n\tsig: string;\n};\n\ntype Session = {\n\trelaySockets: Map<string, WebSocket>;\n\tpendingFrames: Map<string, string[]>;\n\tdedupBySubId: Map<string, Set<string>>;\n\tlastSubIdByRelay: Map<string, string>;\n};\n\n/**\n * Create a standalone relay proxy server on its own port.\n * Use this for simple deployments or when you don't have an existing HTTP server.\n */\nexport function createRelayProxyServer(options: RelayProxyServerOptions = {}): RelayProxyServer {\n\tconst host = options.host ?? '127.0.0.1';\n\tconst port = options.port ?? 7777;\n\tconst path = options.path ?? '/';\n\tconst logger = options.logger ?? console;\n\n\tlet wss: WebSocketServer;\n\ttry {\n\t\twss = new WebSocketServer({\n\t\t\thost,\n\t\t\tport,\n\t\t\tpath\n\t\t});\n\t} catch (err) {\n\t\tlogger.error(`[relay-proxy] failed to create WebSocketServer: ${String(err)}`);\n\t\tthrow err;\n\t}\n\n\t// Get the actual port (in case port 0 was passed)\n\t// If the server is not yet listening, wss.address() returns null\n\t// In that case, wait for the 'listening' event\n\tlet actualPort = port;\n\tconst address = wss.address();\n\tif (address && typeof address === 'object') {\n\t\tactualPort = address.port;\n\t}\n\n\twss.on('error', (err) => {\n\t\tlogger.error(`[relay-proxy] WebSocketServer error: ${String(err)}`);\n\t});\n\n\twss.on('connection', (clientSocket) => {\n\t\tconst session: Session = {\n\t\t\trelaySockets: new Map(),\n\t\t\tpendingFrames: new Map(),\n\t\t\tdedupBySubId: new Map(),\n\t\t\tlastSubIdByRelay: new Map()\n\t\t};\n\n\t\tclientSocket.on('message', (data, isBinary) => {\n\t\t\tif (isBinary) {\n\t\t\t\tconst envelope = parseEnvelope(data);\n\t\t\t\tif (!envelope) return;\n\t\t\t\thandleEnvelope(session, clientSocket, envelope, logger);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst text = toUtf8(data);\n\t\t\tif (!text) return;\n\t\t\thandleClientCommand(session, text, logger);\n\t\t});\n\n\t\tclientSocket.on('close', () => {\n\t\t\tcloseSession(session);\n\t\t});\n\n\t\tclientSocket.on('error', () => {\n\t\t\tcloseSession(session);\n\t\t});\n\t});\n\n\tlogger.info(`[relay-proxy] listening on ws://${host}:${actualPort}${path}`);\n\n\treturn {\n\t\tport: actualPort,\n\t\tclose: () =>\n\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\twss.close((err) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t})\n\t};\n}\n\n/**\n * Create a WebSocket relay proxy that supports manual upgrade handling.\n * Use this for Vite development servers where SvelteKit middleware might interfere\n * with the standard WebSocket upgrade mechanism.\n *\n * @example\n * // In a Vite plugin\n * const relayProxy = createRelayProxyWebSocketServer({ path: '/ws-proxy' });\n *\n * // In configureServer middleware\n * server.middlewares.use((req, res, next) => {\n * if (req.url?.startsWith('/ws-proxy') && req.headers.upgrade === 'websocket') {\n * server.httpServer.once('upgrade', (request, socket, head) => {\n * if (request.url?.startsWith('/ws-proxy')) {\n * relayProxy.handleUpgrade(request, socket, head);\n * }\n * });\n * }\n * next();\n * });\n */\nexport function createRelayProxyWebSocketServer(\n\toptions: Omit<AttachRelayProxyOptions, 'server'> & { server?: HttpServer | HttpsServer }\n): WebSocketRelayProxy {\n\tconst path = options.path ?? '/';\n\tconst logger = options.logger ?? console;\n\n\t// Create WebSocket server with noServer mode to handle upgrades manually\n\tconst wss = new WebSocketServer({\n\t\tnoServer: true\n\t});\n\n\tconst sessions = new Map<WebSocket, Session>();\n\n\twss.on('connection', (clientSocket) => {\n\t\tconst session: Session = {\n\t\t\trelaySockets: new Map(),\n\t\t\tpendingFrames: new Map(),\n\t\t\tdedupBySubId: new Map(),\n\t\t\tlastSubIdByRelay: new Map()\n\t\t};\n\t\tsessions.set(clientSocket, session);\n\n\t\tclientSocket.on('message', (data, isBinary) => {\n\t\t\tconst session = sessions.get(clientSocket);\n\t\t\tif (!session) return;\n\n\t\t\tif (isBinary) {\n\t\t\t\tconst envelope = parseEnvelope(data);\n\t\t\t\tif (!envelope) return;\n\t\t\t\thandleEnvelope(session, clientSocket, envelope, logger);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst text = toUtf8(data);\n\t\t\tif (!text) return;\n\t\t\thandleClientCommand(session, text, logger);\n\t\t});\n\n\t\tclientSocket.on('close', () => {\n\t\t\tconst session = sessions.get(clientSocket);\n\t\t\tif (session) {\n\t\t\t\tcloseSession(session);\n\t\t\t\tsessions.delete(clientSocket);\n\t\t\t}\n\t\t});\n\n\t\tclientSocket.on('error', () => {\n\t\t\tconst session = sessions.get(clientSocket);\n\t\t\tif (session) {\n\t\t\t\tcloseSession(session);\n\t\t\t\tsessions.delete(clientSocket);\n\t\t\t}\n\t\t});\n\t});\n\n\tconst handleUpgrade = (request: IncomingMessage, socket: Duplex, head: Buffer) => {\n\t\t// Verify path matches\n\t\tconst url = request.url ?? '';\n\t\tif (!url.startsWith(path)) {\n\t\t\treturn;\n\t\t}\n\n\t\twss.handleUpgrade(request, socket, head, (ws) => {\n\t\t\twss.emit('connection', ws, request);\n\t\t});\n\t};\n\n\treturn {\n\t\twss,\n\t\tclose: () =>\n\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\t// Close all sessions first\n\t\t\t\tsessions.forEach((session) => closeSession(session));\n\t\t\t\tsessions.clear();\n\t\t\t\twss.close((err) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t}),\n\t\thandleUpgrade\n\t};\n}\n\n/**\n * Attach the relay proxy to an existing HTTP/HTTPS server.\n * Use this for embedding in SvelteKit (adapter-node), Express, or any Node.js server.\n *\n * @example\n * // SvelteKit with adapter-node\n * import { createServer } from 'http';\n * import { handler } from './build/handler.js';\n * import { attachRelayProxyToServer } from '@candypoets/nipworker/proxy';\n *\n * const server = createServer(handler);\n * attachRelayProxyToServer({ server, path: '/ws-proxy' });\n * server.listen(3000);\n */\nexport function attachRelayProxyToServer(options: AttachRelayProxyOptions): AttachedRelayProxy {\n\tconst { server, path = '/', logger = console } = options;\n\n\tconst wss = new WebSocketServer({\n\t\tserver,\n\t\tpath\n\t});\n\n\twss.on('connection', (clientSocket) => {\n\t\tconst session: Session = {\n\t\t\trelaySockets: new Map(),\n\t\t\tpendingFrames: new Map(),\n\t\t\tdedupBySubId: new Map(),\n\t\t\tlastSubIdByRelay: new Map()\n\t\t};\n\n\t\tclientSocket.on('message', (data, isBinary) => {\n\t\t\tif (isBinary) {\n\t\t\t\tconst envelope = parseEnvelope(data);\n\t\t\t\tif (!envelope) return;\n\t\t\t\thandleEnvelope(session, clientSocket, envelope, logger);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst text = toUtf8(data);\n\t\t\tif (!text) return;\n\t\t\thandleClientCommand(session, text, logger);\n\t\t});\n\n\t\tclientSocket.on('close', () => {\n\t\t\tcloseSession(session);\n\t\t});\n\n\t\tclientSocket.on('error', () => {\n\t\t\tcloseSession(session);\n\t\t});\n\t});\n\n\tlogger.info(`[relay-proxy] attached to server at path: ${path}`);\n\n\treturn {\n\t\tclose: () =>\n\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\twss.close((err) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t})\n\t};\n}\n\n/**\n * Create an Express middleware that attaches the relay proxy to the Express server's underlying HTTP server.\n * Call this after setting up your Express app but before calling app.listen().\n *\n * @example\n * import express from 'express';\n * import { createExpressRelayProxyMiddleware } from '@candypoets/nipworker/proxy';\n *\n * const app = express();\n *\n * // Your Express routes...\n * app.get('/api/health', (req, res) => res.json({ ok: true }));\n *\n * // Attach relay proxy\n * const relayProxy = createExpressRelayProxyMiddleware(app, { path: '/ws-proxy' });\n *\n * const server = app.listen(3000, () => {\n * console.log('Server with relay proxy running on port 3000');\n * });\n *\n * // Cleanup on shutdown\n * process.on('SIGTERM', async () => {\n * await relayProxy.close();\n * server.close();\n * });\n */\nexport function createExpressRelayProxyMiddleware<\n\tT extends { listen: (...args: any[]) => HttpServer | HttpsServer }\n>(app: T, options: Omit<AttachRelayProxyOptions, 'server'>): AttachedRelayProxy {\n\tconst path = options.path ?? '/ws-proxy';\n\tconst logger = options.logger ?? console;\n\n\t// Store reference to the server once it's created\n\tlet wss: WebSocketServer | null = null;\n\tconst sessions = new Map<WebSocket, Session>();\n\n\t// Monkey-patch app.listen to capture the server instance\n\tconst originalListen = app.listen.bind(app);\n\t(app as any).listen = (...args: any[]) => {\n\t\tconst server = originalListen(...args);\n\n\t\twss = new WebSocketServer({\n\t\t\tserver,\n\t\t\tpath\n\t\t});\n\n\t\twss.on('connection', (clientSocket) => {\n\t\t\tconst session: Session = {\n\t\t\t\trelaySockets: new Map(),\n\t\t\t\tpendingFrames: new Map(),\n\t\t\t\tdedupBySubId: new Map(),\n\t\t\t\tlastSubIdByRelay: new Map()\n\t\t\t};\n\t\t\tsessions.set(clientSocket, session);\n\n\t\t\tclientSocket.on('message', (data, isBinary) => {\n\t\t\t\tconst session = sessions.get(clientSocket);\n\t\t\t\tif (!session) return;\n\n\t\t\t\tif (isBinary) {\n\t\t\t\t\tconst envelope = parseEnvelope(data);\n\t\t\t\t\tif (!envelope) return;\n\t\t\t\t\thandleEnvelope(session, clientSocket, envelope, logger);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst text = toUtf8(data);\n\t\t\t\tif (!text) return;\n\t\t\t\thandleClientCommand(session, text, logger);\n\t\t\t});\n\n\t\t\tclientSocket.on('close', () => {\n\t\t\t\tconst session = sessions.get(clientSocket);\n\t\t\t\tif (session) {\n\t\t\t\t\tcloseSession(session);\n\t\t\t\t\tsessions.delete(clientSocket);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tclientSocket.on('error', () => {\n\t\t\t\tconst session = sessions.get(clientSocket);\n\t\t\t\tif (session) {\n\t\t\t\t\tcloseSession(session);\n\t\t\t\t\tsessions.delete(clientSocket);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tlogger.info(`[relay-proxy] attached to Express server at path: ${path}`);\n\n\t\treturn server;\n\t};\n\n\treturn {\n\t\tclose: () =>\n\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\tif (!wss) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Close all sessions first\n\t\t\t\tsessions.forEach((session) => closeSession(session));\n\t\t\t\tsessions.clear();\n\t\t\t\twss.close((err) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t})\n\t};\n}\n\nfunction handleClientCommand(session: Session, text: string, logger: RelayProxyServerLogger) {\n\tlet command: unknown;\n\ttry {\n\t\tcommand = JSON.parse(text);\n\t} catch {\n\t\treturn;\n\t}\n\n\tif (isAuthResponseCommand(command)) {\n\t\tconst frame = JSON.stringify(['AUTH', command.event]);\n\t\tsendFrameToRelay(session, command.relay, frame, logger);\n\t\treturn;\n\t}\n\n\tif (isCloseSubCommand(command)) {\n\t\tsession.dedupBySubId.delete(command.subscription_id);\n\t\tfor (const [relayUrl, relaySocket] of session.relaySockets.entries()) {\n\t\t\tif (relaySocket.readyState === WebSocket.OPEN) {\n\t\t\t\trelaySocket.send(JSON.stringify(['CLOSE', command.subscription_id]));\n\t\t\t}\n\t\t\tsession.lastSubIdByRelay.set(relayUrl, command.subscription_id);\n\t\t}\n\t}\n}\n\nfunction handleEnvelope(\n\tsession: Session,\n\tclientSocket: WebSocket,\n\tenvelope: Envelope,\n\tlogger: RelayProxyServerLogger\n) {\n\tfor (const relay of envelope.relays) {\n\t\tensureRelaySocket(session, clientSocket, relay, logger);\n\t\tfor (const frame of envelope.frames) {\n\t\t\ttrackSubscriptionState(session, relay, frame);\n\t\t\tsendFrameToRelay(session, relay, frame, logger);\n\t\t}\n\t}\n}\n\nfunction ensureRelaySocket(\n\tsession: Session,\n\tclientSocket: WebSocket,\n\trelayUrl: string,\n\tlogger: RelayProxyServerLogger\n) {\n\tconst existing = session.relaySockets.get(relayUrl);\n\tif (existing && existing.readyState !== WebSocket.CLOSED) return;\n\n\tconst upstream = new WebSocket(relayUrl);\n\tsession.relaySockets.set(relayUrl, upstream);\n\tsession.pendingFrames.set(relayUrl, []);\n\n\tupstream.on('open', () => {\n\t\tconst pending = session.pendingFrames.get(relayUrl);\n\t\tif (!pending) return;\n\t\tfor (const frame of pending) {\n\t\t\tupstream.send(frame);\n\t\t}\n\t\tsession.pendingFrames.set(relayUrl, []);\n\t});\n\n\tupstream.on('message', (data) => {\n\t\tconst raw = toUtf8(data);\n\t\tif (!raw || clientSocket.readyState !== WebSocket.OPEN) return;\n\t\tconst subIdHint = session.lastSubIdByRelay.get(relayUrl);\n\t\tconst workerMessage = relayFrameToWorkerMessage(session, relayUrl, raw, subIdHint);\n\t\tif (!workerMessage) return;\n\t\tclientSocket.send(workerMessage, { binary: true });\n\t});\n\n\tupstream.on('close', () => {\n\t\t// Mark as closed but don't delete - ensureRelaySocket will reconnect on next use\n\t\t// This keeps subscriptions alive across reconnects\n\t\tsession.pendingFrames.delete(relayUrl);\n\t});\n\n\tupstream.on('error', (err) => {\n\t\t// Only log the first error per relay to reduce spam\n\t\tif (!session.pendingFrames.has(relayUrl)) return;\n\t\tconst errorMsg = String(err);\n\t\t// Skip common repetitive errors\n\t\tif (!errorMsg.includes('ECONNREFUSED') && !errorMsg.includes('ENOTFOUND')) {\n\t\t\tlogger.warn(`[relay-proxy] relay socket error for ${relayUrl}: ${errorMsg.slice(0, 100)}`);\n\t\t}\n\t\tsession.pendingFrames.delete(relayUrl);\n\t});\n}\n\nfunction trackSubscriptionState(session: Session, relayUrl: string, frame: string) {\n\tconst parsed = parseRelayFrame(frame);\n\tif (!parsed) return;\n\tconst type = parsed[0];\n\tif (type !== 'REQ' && type !== 'CLOSE') return;\n\n\tconst subId = typeof parsed[1] === 'string' ? parsed[1] : null;\n\tif (!subId) return;\n\tsession.lastSubIdByRelay.set(relayUrl, subId);\n\n\tif (type === 'REQ') {\n\t\tif (!session.dedupBySubId.has(subId)) {\n\t\t\tsession.dedupBySubId.set(subId, new Set());\n\t\t}\n\t\treturn;\n\t}\n\n\tsession.dedupBySubId.delete(subId);\n}\n\nfunction sendFrameToRelay(\n\tsession: Session,\n\trelayUrl: string,\n\tframe: string,\n\tlogger: RelayProxyServerLogger\n) {\n\tconst relaySocket = session.relaySockets.get(relayUrl);\n\tif (!relaySocket) return;\n\n\tif (relaySocket.readyState === WebSocket.OPEN) {\n\t\trelaySocket.send(frame);\n\t\treturn;\n\t}\n\n\tif (relaySocket.readyState === WebSocket.CONNECTING) {\n\t\tconst pending = session.pendingFrames.get(relayUrl) ?? [];\n\t\tpending.push(frame);\n\t\tsession.pendingFrames.set(relayUrl, pending);\n\t\treturn;\n\t}\n\n\tlogger.warn(`[relay-proxy] dropping frame for closed relay socket ${relayUrl}`);\n}\n\nfunction relayFrameToWorkerMessage(\n\tsession: Session,\n\trelayUrl: string,\n\trawFrame: string,\n\tsubIdHint?: string\n): Uint8Array | null {\n\tconst frame = parseRelayFrame(rawFrame);\n\tif (!frame || frame.length < 1 || typeof frame[0] !== 'string') {\n\t\treturn buildRawWorkerMessage(subIdHint ?? '', relayUrl, rawFrame);\n\t}\n\n\tconst kind = frame[0];\n\tif (kind === 'EVENT') {\n\t\tconst subId = typeof frame[1] === 'string' ? frame[1] : '';\n\t\tconst event = asNostrEvent(frame[2]);\n\t\tif (!subId || !event) {\n\t\t\treturn buildRawWorkerMessage(subId, relayUrl, rawFrame);\n\t\t}\n\n\t\tconst dedupSet = session.dedupBySubId.get(subId);\n\t\tif (dedupSet && dedupSet.has(event.id)) {\n\t\t\treturn null;\n\t\t}\n\t\tif (dedupSet) dedupSet.add(event.id);\n\n\t\treturn buildNostrEventWorkerMessage(subId, relayUrl, event);\n\t}\n\n\tif (kind === 'NOTICE') {\n\t\tconst message = frame[1] === undefined ? null : String(frame[1]);\n\t\treturn buildConnectionStatusWorkerMessage('', relayUrl, 'NOTICE', message);\n\t}\n\n\tif (kind === 'AUTH') {\n\t\tconst challenge = frame[1] === undefined ? null : String(frame[1]);\n\t\treturn buildConnectionStatusWorkerMessage(subIdHint ?? '', relayUrl, 'AUTH', challenge);\n\t}\n\n\tif (kind === 'CLOSED') {\n\t\tconst subId = typeof frame[1] === 'string' ? frame[1] : '';\n\t\tconst message = frame[2] === undefined ? null : String(frame[2]);\n\t\treturn buildConnectionStatusWorkerMessage(subId, relayUrl, 'CLOSED', message);\n\t}\n\n\tif (kind === 'OK') {\n\t\tconst eventId = typeof frame[1] === 'string' ? frame[1] : '';\n\t\tconst accepted = frame[2] === undefined ? 'false' : String(frame[2]);\n\t\tconst reason = frame[3] === undefined ? null : String(frame[3]);\n\t\treturn buildConnectionStatusWorkerMessage(eventId, relayUrl, accepted, reason);\n\t}\n\n\tif (kind === 'EOSE') {\n\t\tconst subId = typeof frame[1] === 'string' ? frame[1] : '';\n\t\treturn buildConnectionStatusWorkerMessage(subId, relayUrl, 'EOSE', null);\n\t}\n\n\treturn buildRawWorkerMessage(subIdHint ?? '', relayUrl, rawFrame);\n}\n\nfunction buildNostrEventWorkerMessage(subId: string, relayUrl: string, event: NostrEventJson): Uint8Array {\n\tconst builder = new flatbuffers.Builder(1024);\n\tconst workerMessage = new WorkerMessageT(\n\t\tsubId || null,\n\t\trelayUrl,\n\t\tMessageType.NostrEvent,\n\t\tMessage.NostrEvent,\n\t\tnew NostrEventT(\n\t\t\tevent.id,\n\t\t\tevent.pubkey,\n\t\t\tevent.kind,\n\t\t\tevent.content,\n\t\t\tevent.tags.map((tag) => new StringVecT(tag)),\n\t\t\tevent.created_at,\n\t\t\tevent.sig\n\t\t)\n\t);\n\tbuilder.finish(workerMessage.pack(builder));\n\treturn builder.asUint8Array();\n}\n\nfunction buildConnectionStatusWorkerMessage(\n\tsubId: string,\n\trelayUrl: string,\n\tstatus: string,\n\tmessage: string | null\n): Uint8Array {\n\tconst builder = new flatbuffers.Builder(256);\n\tconst workerMessage = new WorkerMessageT(\n\t\tsubId || null,\n\t\trelayUrl,\n\t\tMessageType.ConnectionStatus,\n\t\tMessage.ConnectionStatus,\n\t\tnew ConnectionStatusT(relayUrl, status, message)\n\t);\n\tbuilder.finish(workerMessage.pack(builder));\n\treturn builder.asUint8Array();\n}\n\nfunction buildRawWorkerMessage(subId: string, relayUrl: string, rawFrame: string): Uint8Array {\n\tconst builder = new flatbuffers.Builder(256);\n\tconst workerMessage = new WorkerMessageT(\n\t\tsubId || null,\n\t\trelayUrl,\n\t\tMessageType.Raw,\n\t\tMessage.Raw,\n\t\tnew RawT(rawFrame)\n\t);\n\tbuilder.finish(workerMessage.pack(builder));\n\treturn builder.asUint8Array();\n}\n\nfunction asNostrEvent(value: unknown): NostrEventJson | null {\n\tif (!value || typeof value !== 'object') return null;\n\tconst candidate = value as Partial<NostrEventJson>;\n\tif (\n\t\ttypeof candidate.id !== 'string' ||\n\t\ttypeof candidate.pubkey !== 'string' ||\n\t\ttypeof candidate.kind !== 'number' ||\n\t\ttypeof candidate.content !== 'string' ||\n\t\ttypeof candidate.created_at !== 'number' ||\n\t\ttypeof candidate.sig !== 'string' ||\n\t\t!Array.isArray(candidate.tags)\n\t) {\n\t\treturn null;\n\t}\n\n\tconst tags = candidate.tags\n\t\t.map((tag) => (Array.isArray(tag) ? tag.filter((item) => typeof item === 'string') : []))\n\t\t.filter((tag) => tag.length > 0);\n\n\treturn {\n\t\tid: candidate.id,\n\t\tpubkey: candidate.pubkey,\n\t\tkind: candidate.kind,\n\t\tcontent: candidate.content,\n\t\tcreated_at: candidate.created_at,\n\t\tsig: candidate.sig,\n\t\ttags\n\t};\n}\n\nfunction parseRelayFrame(rawFrame: string): unknown[] | null {\n\ttry {\n\t\tconst parsed = JSON.parse(rawFrame);\n\t\tif (!Array.isArray(parsed)) return null;\n\t\treturn parsed;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction parseEnvelope(data: unknown): Envelope | null {\n\tconst text = toUtf8(data);\n\tif (!text) return null;\n\n\ttry {\n\t\tconst parsed = JSON.parse(text) as Partial<Envelope>;\n\t\tif (!Array.isArray(parsed.relays) || !Array.isArray(parsed.frames)) return null;\n\t\tconst relays = parsed.relays.filter((relay): relay is string => typeof relay === 'string');\n\t\tconst frames = parsed.frames.filter((frame): frame is string => typeof frame === 'string');\n\t\tif (relays.length === 0 || frames.length === 0) return null;\n\t\treturn { relays, frames };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction toUtf8(data: unknown): string {\n\tif (typeof data === 'string') return data;\n\tif (data instanceof ArrayBuffer) return Buffer.from(data).toString('utf8');\n\tif (Buffer.isBuffer(data)) return data.toString('utf8');\n\tif (data instanceof Uint8Array) return Buffer.from(data).toString('utf8');\n\tif (Array.isArray(data)) {\n\t\treturn Buffer.concat(data.filter((item): item is Buffer => Buffer.isBuffer(item))).toString('utf8');\n\t}\n\treturn '';\n}\n\nfunction isAuthResponseCommand(value: unknown): value is AuthResponseCommand {\n\tif (!value || typeof value !== 'object') return false;\n\tconst candidate = value as Partial<AuthResponseCommand>;\n\treturn (\n\t\tcandidate.type === 'auth_response' &&\n\t\ttypeof candidate.relay === 'string' &&\n\t\tcandidate.event !== undefined\n\t);\n}\n\nfunction isCloseSubCommand(value: unknown): value is CloseSubCommand {\n\tif (!value || typeof value !== 'object') return false;\n\tconst candidate = value as Partial<CloseSubCommand>;\n\treturn candidate.type === 'close_sub' && typeof candidate.subscription_id === 'string';\n}\n\nfunction closeSession(session: Session) {\n\tsession.dedupBySubId.clear();\n\tsession.lastSubIdByRelay.clear();\n\tfor (const socket of session.relaySockets.values()) {\n\t\ttry {\n\t\t\tsocket.close();\n\t\t} catch {\n\t\t\t// Best effort.\n\t\t}\n\t}\n\tsession.relaySockets.clear();\n\tsession.pendingFrames.clear();\n}\n"],"names":["createRelayProxyServer","options","host","port","path","logger","wss","WebSocketServer","err","actualPort","address","clientSocket","session","data","isBinary","envelope","parseEnvelope","handleEnvelope","text","toUtf8","handleClientCommand","closeSession","resolve","reject","attachRelayProxyToServer","server","createExpressRelayProxyMiddleware","app","sessions","originalListen","args","command","isAuthResponseCommand","frame","sendFrameToRelay","isCloseSubCommand","relayUrl","relaySocket","WebSocket","relay","ensureRelaySocket","trackSubscriptionState","existing","upstream","pending","raw","subIdHint","workerMessage","relayFrameToWorkerMessage","errorMsg","parsed","parseRelayFrame","type","subId","rawFrame","buildRawWorkerMessage","kind","event","asNostrEvent","dedupSet","buildNostrEventWorkerMessage","message","buildConnectionStatusWorkerMessage","challenge","eventId","accepted","reason","builder","flatbuffers","WorkerMessageT","MessageType","Message","NostrEventT","tag","StringVecT","status","ConnectionStatusT","RawT","value","candidate","tags","item","relays","frames","socket"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"relayProxyServer.js","sources":["../src/proxy/relayProxyServer.ts"],"sourcesContent":["/// <reference types=\"node\" />\n\nimport type { Server as HttpServer } from 'http';\nimport type { Server as HttpsServer } from 'https';\nimport type { IncomingMessage } from 'http';\nimport type { Duplex } from 'stream';\nimport * as flatbuffers from 'flatbuffers';\nimport { WebSocket, WebSocketServer } from 'ws';\nimport {\n\tConnectionStatus,\n\tMessage,\n\tMessageType,\n\tNostrEvent,\n\tRaw,\n\tStringVec,\n\tWorkerMessage\n} from '../generated/nostr/fb';\n\ntype RelayProxyServerLogger = Pick<Console, 'info' | 'warn' | 'error'>;\n\nexport type RelayProxyServerOptions = {\n\thost?: string;\n\tport?: number;\n\tpath?: string;\n\tlogger?: RelayProxyServerLogger;\n};\n\nexport type RelayProxyServer = {\n\tport: number;\n\tclose: () => Promise<void>;\n};\n\nexport type AttachRelayProxyOptions = {\n\t/** The HTTP/HTTPS server to attach to */\n\tserver: HttpServer | HttpsServer;\n\t/** The path to mount the WebSocket endpoint on (e.g., '/ws-proxy') */\n\tpath?: string;\n\tlogger?: RelayProxyServerLogger;\n};\n\nexport type AttachedRelayProxy = {\n\t/** Stop accepting new connections and close all existing sessions */\n\tclose: () => Promise<void>;\n};\n\nexport type WebSocketRelayProxy = {\n\twss: WebSocketServer;\n\tclose: () => Promise<void>;\n\t/** Manually handle a WebSocket upgrade request */\n\thandleUpgrade: (request: IncomingMessage, socket: Duplex, head: Buffer) => void;\n};\n\ntype Envelope = {\n\trelays: string[];\n\tframes: string[];\n};\n\ntype AuthResponseCommand = {\n\ttype: 'auth_response';\n\trelay: string;\n\tevent: unknown;\n};\n\ntype CloseSubCommand = {\n\ttype: 'close_sub';\n\tsubscription_id: string;\n};\n\ntype NostrEventJson = {\n\tid: string;\n\tpubkey: string;\n\tkind: number;\n\tcontent: string;\n\ttags: string[][];\n\tcreated_at: number;\n\tsig: string;\n};\n\ntype Session = {\n\trelaySockets: Map<string, WebSocket>;\n\tpendingFrames: Map<string, string[]>;\n\tdedupBySubId: Map<string, Set<string>>;\n\tlastSubIdByRelay: Map<string, string>;\n};\n\ntype SubscriptionFrameState = {\n\ttype: 'REQ' | 'CLOSE';\n\tsubId: string;\n} | null;\n\n/**\n * Create a standalone relay proxy server on its own port.\n * Use this for simple deployments or when you don't have an existing HTTP server.\n */\nexport function createRelayProxyServer(options: RelayProxyServerOptions = {}): RelayProxyServer {\n\tconst host = options.host ?? '127.0.0.1';\n\tconst port = options.port ?? 7777;\n\tconst path = options.path ?? '/';\n\tconst logger = options.logger ?? console;\n\n\tlet wss: WebSocketServer;\n\ttry {\n\t\twss = new WebSocketServer({\n\t\t\thost,\n\t\t\tport,\n\t\t\tpath\n\t\t});\n\t} catch (err) {\n\t\tlogger.error(`[relay-proxy] failed to create WebSocketServer: ${String(err)}`);\n\t\tthrow err;\n\t}\n\n\t// Get the actual port (in case port 0 was passed)\n\t// If the server is not yet listening, wss.address() returns null\n\t// In that case, wait for the 'listening' event\n\tlet actualPort = port;\n\tconst address = wss.address();\n\tif (address && typeof address === 'object') {\n\t\tactualPort = address.port;\n\t}\n\n\twss.on('error', (err) => {\n\t\tlogger.error(`[relay-proxy] WebSocketServer error: ${String(err)}`);\n\t});\n\n\twss.on('connection', (clientSocket) => {\n\t\tconst session: Session = {\n\t\t\trelaySockets: new Map(),\n\t\t\tpendingFrames: new Map(),\n\t\t\tdedupBySubId: new Map(),\n\t\t\tlastSubIdByRelay: new Map()\n\t\t};\n\n\t\tclientSocket.on('message', (data, isBinary) => {\n\t\t\tif (isBinary) {\n\t\t\t\tconst envelope = parseEnvelope(data);\n\t\t\t\tif (!envelope) return;\n\t\t\t\thandleEnvelope(session, clientSocket, envelope, logger);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst text = toUtf8(data);\n\t\t\tif (!text) return;\n\t\t\thandleClientCommand(session, text, logger);\n\t\t});\n\n\t\tclientSocket.on('close', () => {\n\t\t\tcloseSession(session);\n\t\t});\n\n\t\tclientSocket.on('error', () => {\n\t\t\tcloseSession(session);\n\t\t});\n\t});\n\n\tlogger.info(`[relay-proxy] listening on ws://${host}:${actualPort}${path}`);\n\n\treturn {\n\t\tport: actualPort,\n\t\tclose: () =>\n\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\twss.close((err) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t})\n\t};\n}\n\n/**\n * Create a WebSocket relay proxy that supports manual upgrade handling.\n * Use this for Vite development servers where SvelteKit middleware might interfere\n * with the standard WebSocket upgrade mechanism.\n *\n * @example\n * // In a Vite plugin\n * const relayProxy = createRelayProxyWebSocketServer({ path: '/ws-proxy' });\n *\n * // In configureServer middleware\n * server.middlewares.use((req, res, next) => {\n * if (req.url?.startsWith('/ws-proxy') && req.headers.upgrade === 'websocket') {\n * server.httpServer.once('upgrade', (request, socket, head) => {\n * if (request.url?.startsWith('/ws-proxy')) {\n * relayProxy.handleUpgrade(request, socket, head);\n * }\n * });\n * }\n * next();\n * });\n */\nexport function createRelayProxyWebSocketServer(\n\toptions: Omit<AttachRelayProxyOptions, 'server'> & { server?: HttpServer | HttpsServer }\n): WebSocketRelayProxy {\n\tconst path = options.path ?? '/';\n\tconst logger = options.logger ?? console;\n\n\t// Create WebSocket server with noServer mode to handle upgrades manually\n\tconst wss = new WebSocketServer({\n\t\tnoServer: true\n\t});\n\n\tconst sessions = new Map<WebSocket, Session>();\n\n\twss.on('connection', (clientSocket) => {\n\t\tconst session: Session = {\n\t\t\trelaySockets: new Map(),\n\t\t\tpendingFrames: new Map(),\n\t\t\tdedupBySubId: new Map(),\n\t\t\tlastSubIdByRelay: new Map()\n\t\t};\n\t\tsessions.set(clientSocket, session);\n\n\t\tclientSocket.on('message', (data, isBinary) => {\n\t\t\tconst session = sessions.get(clientSocket);\n\t\t\tif (!session) return;\n\n\t\t\tif (isBinary) {\n\t\t\t\tconst envelope = parseEnvelope(data);\n\t\t\t\tif (!envelope) return;\n\t\t\t\thandleEnvelope(session, clientSocket, envelope, logger);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst text = toUtf8(data);\n\t\t\tif (!text) return;\n\t\t\thandleClientCommand(session, text, logger);\n\t\t});\n\n\t\tclientSocket.on('close', () => {\n\t\t\tconst session = sessions.get(clientSocket);\n\t\t\tif (session) {\n\t\t\t\tcloseSession(session);\n\t\t\t\tsessions.delete(clientSocket);\n\t\t\t}\n\t\t});\n\n\t\tclientSocket.on('error', () => {\n\t\t\tconst session = sessions.get(clientSocket);\n\t\t\tif (session) {\n\t\t\t\tcloseSession(session);\n\t\t\t\tsessions.delete(clientSocket);\n\t\t\t}\n\t\t});\n\t});\n\n\tconst handleUpgrade = (request: IncomingMessage, socket: Duplex, head: Buffer) => {\n\t\t// Verify path matches\n\t\tconst url = request.url ?? '';\n\t\tif (!url.startsWith(path)) {\n\t\t\treturn;\n\t\t}\n\n\t\twss.handleUpgrade(request, socket, head, (ws) => {\n\t\t\twss.emit('connection', ws, request);\n\t\t});\n\t};\n\n\treturn {\n\t\twss,\n\t\tclose: () =>\n\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\t// Close all sessions first\n\t\t\t\tsessions.forEach((session) => closeSession(session));\n\t\t\t\tsessions.clear();\n\t\t\t\twss.close((err) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t}),\n\t\thandleUpgrade\n\t};\n}\n\n/**\n * Attach the relay proxy to an existing HTTP/HTTPS server.\n * Use this for embedding in SvelteKit (adapter-node), Express, or any Node.js server.\n *\n * @example\n * // SvelteKit with adapter-node\n * import { createServer } from 'http';\n * import { handler } from './build/handler.js';\n * import { attachRelayProxyToServer } from '@candypoets/nipworker/proxy/server';\n *\n * const server = createServer(handler);\n * attachRelayProxyToServer({ server, path: '/ws-proxy' });\n * server.listen(3000);\n */\nexport function attachRelayProxyToServer(options: AttachRelayProxyOptions): AttachedRelayProxy {\n\tconst { server, path = '/', logger = console } = options;\n\n\tconst wss = new WebSocketServer({\n\t\tserver,\n\t\tpath\n\t});\n\n\twss.on('connection', (clientSocket) => {\n\t\tconst session: Session = {\n\t\t\trelaySockets: new Map(),\n\t\t\tpendingFrames: new Map(),\n\t\t\tdedupBySubId: new Map(),\n\t\t\tlastSubIdByRelay: new Map()\n\t\t};\n\n\t\tclientSocket.on('message', (data, isBinary) => {\n\t\t\tif (isBinary) {\n\t\t\t\tconst envelope = parseEnvelope(data);\n\t\t\t\tif (!envelope) return;\n\t\t\t\thandleEnvelope(session, clientSocket, envelope, logger);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst text = toUtf8(data);\n\t\t\tif (!text) return;\n\t\t\thandleClientCommand(session, text, logger);\n\t\t});\n\n\t\tclientSocket.on('close', () => {\n\t\t\tcloseSession(session);\n\t\t});\n\n\t\tclientSocket.on('error', () => {\n\t\t\tcloseSession(session);\n\t\t});\n\t});\n\n\tlogger.info(`[relay-proxy] attached to server at path: ${path}`);\n\n\treturn {\n\t\tclose: () =>\n\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\twss.close((err) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t})\n\t};\n}\n\n/**\n * Create an Express middleware that attaches the relay proxy to the Express server's underlying HTTP server.\n * Call this after setting up your Express app but before calling app.listen().\n *\n * @example\n * import express from 'express';\n * import { createExpressRelayProxyMiddleware } from '@candypoets/nipworker/proxy/server';\n *\n * const app = express();\n *\n * // Your Express routes...\n * app.get('/api/health', (req, res) => res.json({ ok: true }));\n *\n * // Attach relay proxy\n * const relayProxy = createExpressRelayProxyMiddleware(app, { path: '/ws-proxy' });\n *\n * const server = app.listen(3000, () => {\n * console.log('Server with relay proxy running on port 3000');\n * });\n *\n * // Cleanup on shutdown\n * process.on('SIGTERM', async () => {\n * await relayProxy.close();\n * server.close();\n * });\n */\nexport function createExpressRelayProxyMiddleware<\n\tT extends { listen: (...args: any[]) => HttpServer | HttpsServer }\n>(app: T, options: Omit<AttachRelayProxyOptions, 'server'>): AttachedRelayProxy {\n\tconst path = options.path ?? '/ws-proxy';\n\tconst logger = options.logger ?? console;\n\n\t// Store reference to the server once it's created\n\tlet wss: WebSocketServer | null = null;\n\tconst sessions = new Map<WebSocket, Session>();\n\n\t// Monkey-patch app.listen to capture the server instance\n\tconst originalListen = app.listen.bind(app);\n\t(app as any).listen = (...args: any[]) => {\n\t\tconst server = originalListen(...args);\n\n\t\twss = new WebSocketServer({\n\t\t\tserver,\n\t\t\tpath\n\t\t});\n\n\t\twss.on('connection', (clientSocket) => {\n\t\t\tconst session: Session = {\n\t\t\t\trelaySockets: new Map(),\n\t\t\t\tpendingFrames: new Map(),\n\t\t\t\tdedupBySubId: new Map(),\n\t\t\t\tlastSubIdByRelay: new Map()\n\t\t\t};\n\t\t\tsessions.set(clientSocket, session);\n\n\t\t\tclientSocket.on('message', (data, isBinary) => {\n\t\t\t\tconst session = sessions.get(clientSocket);\n\t\t\t\tif (!session) return;\n\n\t\t\t\tif (isBinary) {\n\t\t\t\t\tconst envelope = parseEnvelope(data);\n\t\t\t\t\tif (!envelope) return;\n\t\t\t\t\thandleEnvelope(session, clientSocket, envelope, logger);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst text = toUtf8(data);\n\t\t\t\tif (!text) return;\n\t\t\t\thandleClientCommand(session, text, logger);\n\t\t\t});\n\n\t\t\tclientSocket.on('close', () => {\n\t\t\t\tconst session = sessions.get(clientSocket);\n\t\t\t\tif (session) {\n\t\t\t\t\tcloseSession(session);\n\t\t\t\t\tsessions.delete(clientSocket);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tclientSocket.on('error', () => {\n\t\t\t\tconst session = sessions.get(clientSocket);\n\t\t\t\tif (session) {\n\t\t\t\t\tcloseSession(session);\n\t\t\t\t\tsessions.delete(clientSocket);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tlogger.info(`[relay-proxy] attached to Express server at path: ${path}`);\n\n\t\treturn server;\n\t};\n\n\treturn {\n\t\tclose: () =>\n\t\t\tnew Promise<void>((resolve, reject) => {\n\t\t\t\tif (!wss) {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Close all sessions first\n\t\t\t\tsessions.forEach((session) => closeSession(session));\n\t\t\t\tsessions.clear();\n\t\t\t\twss.close((err) => {\n\t\t\t\t\tif (err) {\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t})\n\t};\n}\n\nfunction handleClientCommand(session: Session, text: string, logger: RelayProxyServerLogger) {\n\tlet command: unknown;\n\ttry {\n\t\tcommand = JSON.parse(text);\n\t} catch {\n\t\treturn;\n\t}\n\n\tif (isAuthResponseCommand(command)) {\n\t\tconst frame = JSON.stringify(['AUTH', command.event]);\n\t\tsendFrameToRelay(session, command.relay, frame, logger);\n\t\treturn;\n\t}\n\n\tif (isCloseSubCommand(command)) {\n\t\tsession.dedupBySubId.delete(command.subscription_id);\n\t\tfor (const [relayUrl, relaySocket] of session.relaySockets.entries()) {\n\t\t\tif (relaySocket.readyState === WebSocket.OPEN) {\n\t\t\t\trelaySocket.send(JSON.stringify(['CLOSE', command.subscription_id]));\n\t\t\t}\n\t\t\tsession.lastSubIdByRelay.set(relayUrl, command.subscription_id);\n\t\t}\n\t}\n}\n\nfunction handleEnvelope(\n\tsession: Session,\n\tclientSocket: WebSocket,\n\tenvelope: Envelope,\n\tlogger: RelayProxyServerLogger\n) {\n\tconst trackedFrames = envelope.frames.map((frame) => ({\n\t\tframe,\n\t\tstate: parseSubscriptionFrameState(frame)\n\t}));\n\n\tfor (const relay of envelope.relays) {\n\t\tensureRelaySocket(session, clientSocket, relay, logger);\n\t\tfor (const tracked of trackedFrames) {\n\t\t\ttrackSubscriptionState(session, relay, tracked.state);\n\t\t\tconst frame = tracked.frame;\n\t\t\tsendFrameToRelay(session, relay, frame, logger);\n\t\t}\n\t}\n}\n\nfunction ensureRelaySocket(\n\tsession: Session,\n\tclientSocket: WebSocket,\n\trelayUrl: string,\n\tlogger: RelayProxyServerLogger\n) {\n\tconst existing = session.relaySockets.get(relayUrl);\n\tif (existing && existing.readyState !== WebSocket.CLOSED) return;\n\n\tconst upstream = new WebSocket(relayUrl);\n\tsession.relaySockets.set(relayUrl, upstream);\n\tsession.pendingFrames.set(relayUrl, []);\n\n\tupstream.on('open', () => {\n\t\tconst pending = session.pendingFrames.get(relayUrl);\n\t\tif (!pending) return;\n\t\tfor (const frame of pending) {\n\t\t\tupstream.send(frame);\n\t\t}\n\t\tsession.pendingFrames.set(relayUrl, []);\n\t});\n\n\tupstream.on('message', (data) => {\n\t\tconst raw = toUtf8(data);\n\t\tif (!raw || clientSocket.readyState !== WebSocket.OPEN) return;\n\t\tconst subIdHint = session.lastSubIdByRelay.get(relayUrl);\n\t\tconst workerMessage = relayFrameToWorkerMessage(session, relayUrl, raw, subIdHint);\n\t\tif (!workerMessage) return;\n\t\tclientSocket.send(workerMessage, { binary: true });\n\t});\n\n\tupstream.on('close', () => {\n\t\t// Mark as closed but don't delete - ensureRelaySocket will reconnect on next use\n\t\t// This keeps subscriptions alive across reconnects\n\t\tsession.pendingFrames.delete(relayUrl);\n\t});\n\n\tupstream.on('error', (err) => {\n\t\t// Only log the first error per relay to reduce spam\n\t\tif (!session.pendingFrames.has(relayUrl)) return;\n\t\tconst errorMsg = String(err);\n\t\t// Skip common repetitive errors\n\t\tif (!errorMsg.includes('ECONNREFUSED') && !errorMsg.includes('ENOTFOUND')) {\n\t\t\tlogger.warn(`[relay-proxy] relay socket error for ${relayUrl}: ${errorMsg.slice(0, 100)}`);\n\t\t}\n\t\tsession.pendingFrames.delete(relayUrl);\n\t});\n}\n\nfunction trackSubscriptionState(session: Session, relayUrl: string, state: SubscriptionFrameState) {\n\tif (!state) return;\n\tsession.lastSubIdByRelay.set(relayUrl, state.subId);\n\n\tif (state.type === 'REQ') {\n\t\tconst subId = state.subId;\n\t\tif (!session.dedupBySubId.has(subId)) {\n\t\t\tsession.dedupBySubId.set(subId, new Set());\n\t\t}\n\t\treturn;\n\t}\n\n\tsession.dedupBySubId.delete(state.subId);\n}\n\nfunction parseSubscriptionFrameState(frame: string): SubscriptionFrameState {\n\tconst parsed = parseRelayFrame(frame);\n\tif (!parsed) return null;\n\tconst type = parsed[0];\n\tif (type !== 'REQ' && type !== 'CLOSE') return null;\n\n\tconst subId = typeof parsed[1] === 'string' ? parsed[1] : null;\n\tif (!subId) return null;\n\treturn { type, subId };\n}\n\nfunction sendFrameToRelay(\n\tsession: Session,\n\trelayUrl: string,\n\tframe: string,\n\tlogger: RelayProxyServerLogger\n) {\n\tconst relaySocket = session.relaySockets.get(relayUrl);\n\tif (!relaySocket) return;\n\n\tif (relaySocket.readyState === WebSocket.OPEN) {\n\t\trelaySocket.send(frame);\n\t\treturn;\n\t}\n\n\tif (relaySocket.readyState === WebSocket.CONNECTING) {\n\t\tconst pending = session.pendingFrames.get(relayUrl) ?? [];\n\t\tpending.push(frame);\n\t\tsession.pendingFrames.set(relayUrl, pending);\n\t\treturn;\n\t}\n\n\tlogger.warn(`[relay-proxy] dropping frame for closed relay socket ${relayUrl}`);\n}\n\nfunction relayFrameToWorkerMessage(\n\tsession: Session,\n\trelayUrl: string,\n\trawFrame: string,\n\tsubIdHint?: string\n): Uint8Array | null {\n\tconst frame = parseRelayFrame(rawFrame);\n\tif (!frame || frame.length < 1 || typeof frame[0] !== 'string') {\n\t\treturn buildRawWorkerMessage(subIdHint ?? '', relayUrl, rawFrame);\n\t}\n\n\tconst kind = frame[0];\n\tif (kind === 'EVENT') {\n\t\tconst subId = typeof frame[1] === 'string' ? frame[1] : '';\n\t\tconst event = asNostrEvent(frame[2]);\n\t\tif (!subId || !event) {\n\t\t\treturn buildRawWorkerMessage(subId, relayUrl, rawFrame);\n\t\t}\n\n\t\tconst dedupSet = session.dedupBySubId.get(subId);\n\t\tif (dedupSet && dedupSet.has(event.id)) {\n\t\t\treturn null;\n\t\t}\n\t\tif (dedupSet) dedupSet.add(event.id);\n\n\t\treturn buildNostrEventWorkerMessage(subId, relayUrl, event);\n\t}\n\n\tif (kind === 'NOTICE') {\n\t\tconst message = frame[1] === undefined ? null : String(frame[1]);\n\t\treturn buildConnectionStatusWorkerMessage('', relayUrl, 'NOTICE', message);\n\t}\n\n\tif (kind === 'AUTH') {\n\t\tconst challenge = frame[1] === undefined ? null : String(frame[1]);\n\t\treturn buildConnectionStatusWorkerMessage(subIdHint ?? '', relayUrl, 'AUTH', challenge);\n\t}\n\n\tif (kind === 'CLOSED') {\n\t\tconst subId = typeof frame[1] === 'string' ? frame[1] : '';\n\t\tconst message = frame[2] === undefined ? null : String(frame[2]);\n\t\treturn buildConnectionStatusWorkerMessage(subId, relayUrl, 'CLOSED', message);\n\t}\n\n\tif (kind === 'OK') {\n\t\tconst eventId = typeof frame[1] === 'string' ? frame[1] : '';\n\t\tconst accepted = frame[2] === undefined ? 'false' : String(frame[2]);\n\t\tconst reason = frame[3] === undefined ? null : String(frame[3]);\n\t\treturn buildConnectionStatusWorkerMessage(eventId, relayUrl, accepted, reason);\n\t}\n\n\tif (kind === 'EOSE') {\n\t\tconst subId = typeof frame[1] === 'string' ? frame[1] : '';\n\t\treturn buildConnectionStatusWorkerMessage(subId, relayUrl, 'EOSE', null);\n\t}\n\n\treturn buildRawWorkerMessage(subIdHint ?? '', relayUrl, rawFrame);\n}\n\nfunction buildNostrEventWorkerMessage(subId: string, relayUrl: string, event: NostrEventJson): Uint8Array {\n\tconst builder = new flatbuffers.Builder(1024);\n\n\tconst subIdOffset = subId ? builder.createString(subId) : 0;\n\tconst relayUrlOffset = builder.createString(relayUrl);\n\tconst idOffset = builder.createString(event.id);\n\tconst pubkeyOffset = builder.createString(event.pubkey);\n\tconst contentOffset = builder.createString(event.content);\n\tconst sigOffset = builder.createString(event.sig);\n\n\tconst tagOffsets = new Array<flatbuffers.Offset>(event.tags.length);\n\tfor (let i = 0; i < event.tags.length; i++) {\n\t\ttagOffsets[i] = createStringVecOffset(builder, event.tags[i]!);\n\t}\n\tconst tagsOffset = NostrEvent.createTagsVector(builder, tagOffsets);\n\n\tconst eventOffset = NostrEvent.createNostrEvent(\n\t\tbuilder,\n\t\tidOffset,\n\t\tpubkeyOffset,\n\t\tevent.kind,\n\t\tcontentOffset,\n\t\ttagsOffset,\n\t\tevent.created_at,\n\t\tsigOffset\n\t);\n\n\tconst workerMessageOffset = WorkerMessage.createWorkerMessage(\n\t\tbuilder,\n\t\tsubIdOffset,\n\t\trelayUrlOffset,\n\t\tMessageType.NostrEvent,\n\t\tMessage.NostrEvent,\n\t\teventOffset\n\t);\n\n\tbuilder.finish(workerMessageOffset);\n\treturn builder.asUint8Array();\n}\n\nfunction buildConnectionStatusWorkerMessage(\n\tsubId: string,\n\trelayUrl: string,\n\tstatus: string,\n\tmessage: string | null\n): Uint8Array {\n\tconst builder = new flatbuffers.Builder(256);\n\n\tconst subIdOffset = subId ? builder.createString(subId) : 0;\n\tconst relayUrlOffset = builder.createString(relayUrl);\n\tconst statusOffset = builder.createString(status);\n\tconst messageOffset = message === null ? 0 : builder.createString(message);\n\n\tconst contentOffset = ConnectionStatus.createConnectionStatus(\n\t\tbuilder,\n\t\trelayUrlOffset,\n\t\tstatusOffset,\n\t\tmessageOffset\n\t);\n\n\tconst workerMessageOffset = WorkerMessage.createWorkerMessage(\n\t\tbuilder,\n\t\tsubIdOffset,\n\t\trelayUrlOffset,\n\t\tMessageType.ConnectionStatus,\n\t\tMessage.ConnectionStatus,\n\t\tcontentOffset\n\t);\n\n\tbuilder.finish(workerMessageOffset);\n\treturn builder.asUint8Array();\n}\n\nfunction buildRawWorkerMessage(subId: string, relayUrl: string, rawFrame: string): Uint8Array {\n\tconst builder = new flatbuffers.Builder(256);\n\n\tconst subIdOffset = subId ? builder.createString(subId) : 0;\n\tconst relayUrlOffset = builder.createString(relayUrl);\n\tconst rawOffset = builder.createString(rawFrame);\n\tconst contentOffset = Raw.createRaw(builder, rawOffset);\n\n\tconst workerMessageOffset = WorkerMessage.createWorkerMessage(\n\t\tbuilder,\n\t\tsubIdOffset,\n\t\trelayUrlOffset,\n\t\tMessageType.Raw,\n\t\tMessage.Raw,\n\t\tcontentOffset\n\t);\n\n\tbuilder.finish(workerMessageOffset);\n\treturn builder.asUint8Array();\n}\n\nfunction asNostrEvent(value: unknown): NostrEventJson | null {\n\tif (!value || typeof value !== 'object') return null;\n\tconst candidate = value as Partial<NostrEventJson>;\n\tif (\n\t\ttypeof candidate.id !== 'string' ||\n\t\ttypeof candidate.pubkey !== 'string' ||\n\t\ttypeof candidate.kind !== 'number' ||\n\t\ttypeof candidate.content !== 'string' ||\n\t\ttypeof candidate.created_at !== 'number' ||\n\t\ttypeof candidate.sig !== 'string' ||\n\t\t!Array.isArray(candidate.tags)\n\t) {\n\t\treturn null;\n\t}\n\n\tconst rawTags = candidate.tags;\n\tlet needsSanitization = false;\n\tfor (const tag of rawTags) {\n\t\tif (!Array.isArray(tag) || tag.length === 0) {\n\t\t\tneedsSanitization = true;\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const item of tag) {\n\t\t\tif (typeof item !== 'string') {\n\t\t\t\tneedsSanitization = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tlet tags: string[][];\n\tif (!needsSanitization) {\n\t\ttags = rawTags as string[][];\n\t} else {\n\t\ttags = [];\n\t\tfor (const tag of rawTags) {\n\t\t\tif (!Array.isArray(tag)) continue;\n\t\t\tconst sanitizedTag: string[] = [];\n\t\t\tfor (const item of tag) {\n\t\t\t\tif (typeof item === 'string') {\n\t\t\t\t\tsanitizedTag.push(item);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (sanitizedTag.length > 0) {\n\t\t\t\ttags.push(sanitizedTag);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tid: candidate.id,\n\t\tpubkey: candidate.pubkey,\n\t\tkind: candidate.kind,\n\t\tcontent: candidate.content,\n\t\tcreated_at: candidate.created_at,\n\t\tsig: candidate.sig,\n\t\ttags\n\t};\n}\n\nfunction createStringVecOffset(builder: flatbuffers.Builder, values: string[]): flatbuffers.Offset {\n\tconst itemOffsets = new Array<flatbuffers.Offset>(values.length);\n\tfor (let i = 0; i < values.length; i++) {\n\t\titemOffsets[i] = builder.createString(values[i]!);\n\t}\n\tconst itemsOffset = StringVec.createItemsVector(builder, itemOffsets);\n\treturn StringVec.createStringVec(builder, itemsOffset);\n}\n\nfunction parseRelayFrame(rawFrame: string): unknown[] | null {\n\ttry {\n\t\tconst parsed = JSON.parse(rawFrame);\n\t\tif (!Array.isArray(parsed)) return null;\n\t\treturn parsed;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction parseEnvelope(data: unknown): Envelope | null {\n\tconst text = toUtf8(data);\n\tif (!text) return null;\n\n\ttry {\n\t\tconst parsed = JSON.parse(text) as Partial<Envelope>;\n\t\tif (!Array.isArray(parsed.relays) || !Array.isArray(parsed.frames)) return null;\n\t\tconst relays = parsed.relays.filter((relay): relay is string => typeof relay === 'string');\n\t\tconst frames = parsed.frames.filter((frame): frame is string => typeof frame === 'string');\n\t\tif (relays.length === 0 || frames.length === 0) return null;\n\t\treturn { relays, frames };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction toUtf8(data: unknown): string {\n\tif (typeof data === 'string') return data;\n\tif (data instanceof ArrayBuffer) return Buffer.from(data).toString('utf8');\n\tif (Buffer.isBuffer(data)) return data.toString('utf8');\n\tif (data instanceof Uint8Array) return Buffer.from(data).toString('utf8');\n\tif (Array.isArray(data)) {\n\t\treturn Buffer.concat(data.filter((item): item is Buffer => Buffer.isBuffer(item))).toString('utf8');\n\t}\n\treturn '';\n}\n\nfunction isAuthResponseCommand(value: unknown): value is AuthResponseCommand {\n\tif (!value || typeof value !== 'object') return false;\n\tconst candidate = value as Partial<AuthResponseCommand>;\n\treturn (\n\t\tcandidate.type === 'auth_response' &&\n\t\ttypeof candidate.relay === 'string' &&\n\t\tcandidate.event !== undefined\n\t);\n}\n\nfunction isCloseSubCommand(value: unknown): value is CloseSubCommand {\n\tif (!value || typeof value !== 'object') return false;\n\tconst candidate = value as Partial<CloseSubCommand>;\n\treturn candidate.type === 'close_sub' && typeof candidate.subscription_id === 'string';\n}\n\nfunction closeSession(session: Session) {\n\tsession.dedupBySubId.clear();\n\tsession.lastSubIdByRelay.clear();\n\tfor (const socket of session.relaySockets.values()) {\n\t\ttry {\n\t\t\tsocket.close();\n\t\t} catch {\n\t\t\t// Best effort.\n\t\t}\n\t}\n\tsession.relaySockets.clear();\n\tsession.pendingFrames.clear();\n}\n"],"names":["createRelayProxyServer","options","host","port","path","logger","wss","WebSocketServer","err","actualPort","address","clientSocket","session","data","isBinary","envelope","parseEnvelope","handleEnvelope","text","toUtf8","handleClientCommand","closeSession","resolve","reject","command","isAuthResponseCommand","frame","sendFrameToRelay","isCloseSubCommand","relayUrl","relaySocket","WebSocket","trackedFrames","parseSubscriptionFrameState","relay","ensureRelaySocket","tracked","trackSubscriptionState","existing","upstream","pending","raw","subIdHint","workerMessage","relayFrameToWorkerMessage","errorMsg","state","subId","parsed","parseRelayFrame","type","rawFrame","buildRawWorkerMessage","kind","event","asNostrEvent","dedupSet","buildNostrEventWorkerMessage","message","buildConnectionStatusWorkerMessage","challenge","eventId","accepted","reason","builder","flatbuffers","subIdOffset","relayUrlOffset","idOffset","pubkeyOffset","contentOffset","sigOffset","tagOffsets","i","createStringVecOffset","tagsOffset","NostrEvent","eventOffset","workerMessageOffset","WorkerMessage","MessageType","Message","status","statusOffset","messageOffset","ConnectionStatus","rawOffset","Raw","value","candidate","rawTags","needsSanitization","tag","item","tags","sanitizedTag","values","itemOffsets","itemsOffset","StringVec","relays","frames","socket"],"mappings":"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"}
|
package/dist/signer-response.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as
|
|
1
|
+
import*as a from"flatbuffers";var u=(s=>(s[s.GetPubkey=0]="GetPubkey",s[s.SignEvent=1]="SignEvent",s[s.Nip04Encrypt=2]="Nip04Encrypt",s[s.Nip04Decrypt=3]="Nip04Decrypt",s[s.Nip44Encrypt=4]="Nip44Encrypt",s[s.Nip44Decrypt=5]="Nip44Decrypt",s[s.Nip04DecryptBetween=6]="Nip04DecryptBetween",s[s.Nip44DecryptBetween=7]="Nip44DecryptBetween",s[s.VerifyProof=8]="VerifyProof",s[s.AuthEvent=9]="AuthEvent",s))(u||{});class i{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsSignerRequest(t,e){return(e||new i).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsSignerRequest(t,e){return t.setPosition(t.position()+a.SIZE_PREFIX_LENGTH),(e||new i).__init(t.readInt32(t.position())+t.position(),t)}requestId(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readUint64(this.bb_pos+t):BigInt("0")}op(){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.readUint32(this.bb_pos+t):u.GetPubkey}payload(t){const e=this.bb.__offset(this.bb_pos,8);return e?this.bb.__string(this.bb_pos+e,t):null}pubkey(t){const e=this.bb.__offset(this.bb_pos,10);return e?this.bb.__string(this.bb_pos+e,t):null}senderPubkey(t){const e=this.bb.__offset(this.bb_pos,12);return e?this.bb.__string(this.bb_pos+e,t):null}recipientPubkey(t){const e=this.bb.__offset(this.bb_pos,14);return e?this.bb.__string(this.bb_pos+e,t):null}static startSignerRequest(t){t.startObject(6)}static addRequestId(t,e){t.addFieldInt64(0,e,BigInt("0"))}static addOp(t,e){t.addFieldInt32(1,e,u.GetPubkey)}static addPayload(t,e){t.addFieldOffset(2,e,0)}static addPubkey(t,e){t.addFieldOffset(3,e,0)}static addSenderPubkey(t,e){t.addFieldOffset(4,e,0)}static addRecipientPubkey(t,e){t.addFieldOffset(5,e,0)}static endSignerRequest(t){return t.endObject()}static createSignerRequest(t,e,r,b,o,d,c){return i.startSignerRequest(t),i.addRequestId(t,e),i.addOp(t,r),i.addPayload(t,b),i.addPubkey(t,o),i.addSenderPubkey(t,d),i.addRecipientPubkey(t,c),i.endSignerRequest(t)}unpack(){return new p(this.requestId(),this.op(),this.payload(),this.pubkey(),this.senderPubkey(),this.recipientPubkey())}unpackTo(t){t.requestId=this.requestId(),t.op=this.op(),t.payload=this.payload(),t.pubkey=this.pubkey(),t.senderPubkey=this.senderPubkey(),t.recipientPubkey=this.recipientPubkey()}}class p{constructor(t=BigInt("0"),e=u.GetPubkey,r=null,b=null,o=null,d=null){this.requestId=t,this.op=e,this.payload=r,this.pubkey=b,this.senderPubkey=o,this.recipientPubkey=d}pack(t){const e=this.payload!==null?t.createString(this.payload):0,r=this.pubkey!==null?t.createString(this.pubkey):0,b=this.senderPubkey!==null?t.createString(this.senderPubkey):0,o=this.recipientPubkey!==null?t.createString(this.recipientPubkey):0;return i.createSignerRequest(t,this.requestId,this.op,e,r,b,o)}}class n{constructor(){this.bb=null,this.bb_pos=0}__init(t,e){return this.bb_pos=t,this.bb=e,this}static getRootAsSignerResponse(t,e){return(e||new n).__init(t.readInt32(t.position())+t.position(),t)}static getSizePrefixedRootAsSignerResponse(t,e){return t.setPosition(t.position()+a.SIZE_PREFIX_LENGTH),(e||new n).__init(t.readInt32(t.position())+t.position(),t)}requestId(){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.readUint64(this.bb_pos+t):BigInt("0")}result(t){const e=this.bb.__offset(this.bb_pos,6);return e?this.bb.__string(this.bb_pos+e,t):null}error(t){const e=this.bb.__offset(this.bb_pos,8);return e?this.bb.__string(this.bb_pos+e,t):null}static startSignerResponse(t){t.startObject(3)}static addRequestId(t,e){t.addFieldInt64(0,e,BigInt("0"))}static addResult(t,e){t.addFieldOffset(1,e,0)}static addError(t,e){t.addFieldOffset(2,e,0)}static endSignerResponse(t){return t.endObject()}static createSignerResponse(t,e,r,b){return n.startSignerResponse(t),n.addRequestId(t,e),n.addResult(t,r),n.addError(t,b),n.endSignerResponse(t)}unpack(){return new h(this.requestId(),this.result(),this.error())}unpackTo(t){t.requestId=this.requestId(),t.result=this.result(),t.error=this.error()}}class h{constructor(t=BigInt("0"),e=null,r=null){this.requestId=t,this.result=e,this.error=r}pack(t){const e=this.result!==null?t.createString(this.result):0,r=this.error!==null?t.createString(this.error):0;return n.createSignerResponse(t,this.requestId,e,r)}}export{p as S,u as a,n as b,i as c,h as d};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signer-response.js","sources":["../src/lib/ByteString.ts","../src/generated/nostr/fb/signer-op.ts","../src/generated/nostr/fb/signer-request.ts","../src/generated/nostr/fb/signer-response.ts"],"sourcesContent":["import { ByteBuffer } from 'flatbuffers';\n\n(ByteBuffer.prototype as any).__stringByteString = function (offset: number): ByteString {\n\t// Follow indirect: add the relative offset stored at this location\n\toffset += this.readInt32(offset);\n\n\t// Now at the start of the string object → first 4 bytes = length\n\tconst length = this.readInt32(offset);\n\tconst start = offset + 4;\n\n\t// Slice out exactly [start, start+length]\n\tconst slice = this.bytes().subarray(start, start + length);\n\n\treturn new ByteString(slice);\n};\n\n// Shared decoder for all instances (cheap, stateless for non-streaming use)\nconst UTF8_DECODER = new TextDecoder('utf-8');\n\n// Hex lookup table to speed up toHex()\nconst HEX_TABLE: string[] = (() => {\n\tconst t = new Array(256);\n\tfor (let i = 0; i < 256; i++) t[i] = i.toString(16).padStart(2, '0');\n\treturn t;\n})();\n\n// Convert Uint8Array to string using the browser's built-in decoder\nfunction byteArrayToString(bytes: Uint8Array): string {\n\treturn UTF8_DECODER.decode(bytes);\n}\n\n// lib/ByteString.ts\nexport class ByteString {\n\tprivate readonly view: Uint8Array;\n\n\tconstructor(view: Uint8Array) {\n\t\tthis.view = view;\n\t}\n\n\t/**\n\t * Access underlying bytes\n\t */\n\tbytes(): Uint8Array {\n\t\treturn this.view;\n\t}\n\n\t/**\n\t * Fast numeric discriminant (FNV-1a hash).\n\t * Not cryptographically secure, but great for Map/Set keys.\n\t */\n\tfnv1aHash(): number {\n\t\tlet h = 2166136261 >>> 0;\n\t\tconst v = this.view;\n\t\tfor (let i = 0; i < v.length; i++) {\n\t\t\th ^= v[i];\n\t\t\th = Math.imul(h, 16777619);\n\t\t}\n\t\treturn h >>> 0;\n\t}\n\n\t/**\n\t * Return a stable hex string representation.\n\t */\n\ttoHex(): string {\n\t\tconst v = this.view;\n\t\tlet out = '';\n\t\tfor (let i = 0; i < v.length; i++) out += HEX_TABLE[v[i]];\n\t\treturn out;\n\t}\n\n\t/**\n\t * Decode as UTF-8 string.\n\t * If backed by SharedArrayBuffer, makes a safe copy.\n\t * No caching to allow proper GC of event data.\n\t */\n\tutf8String(): string {\n\t\treturn byteArrayToString(this.view);\n\t}\n\n\t/**\n\t * For debugging/logging\n\t */\n\ttoString(): string {\n\t\treturn this.utf8String();\n\t}\n\n\t/**\n\t * Equality check by bytes\n\t */\n\tequals(other: ByteString): boolean {\n\t\tconst a = this.view,\n\t\t\tb = other.view;\n\t\tif (a.length !== b.length) return false;\n\t\tfor (let i = 0; i < a.length; i++) {\n\t\t\tif (a[i] !== b[i]) return false;\n\t\t}\n\t\treturn true;\n\t}\n}\n","import { ByteString } from \"src/lib/ByteString\";\n// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum SignerOp {\n GetPubkey = 0,\n SignEvent = 1,\n Nip04Encrypt = 2,\n Nip04Decrypt = 3,\n Nip44Encrypt = 4,\n Nip44Decrypt = 5,\n Nip04DecryptBetween = 6,\n Nip44DecryptBetween = 7,\n VerifyProof = 8,\n AuthEvent = 9\n}\n","import { ByteString } from \"src/lib/ByteString\";\n// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { SignerOp } from '../../nostr/fb/signer-op.js';\n\n\nexport class SignerRequest implements flatbuffers.IUnpackableObject<SignerRequestT> {\n bb: flatbuffers.ByteBuffer|null = null;\n bb_pos = 0;\n __init(i:number, bb:flatbuffers.ByteBuffer):SignerRequest {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n}\n\nstatic getRootAsSignerRequest(bb:flatbuffers.ByteBuffer, obj?:SignerRequest):SignerRequest {\n return (obj || new SignerRequest()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsSignerRequest(bb:flatbuffers.ByteBuffer, obj?:SignerRequest):SignerRequest {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new SignerRequest()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nrequestId():bigint {\n const offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nop():SignerOp {\n const offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.readUint32(this.bb_pos + offset) : SignerOp.GetPubkey;\n}\n\npayload(): ByteString|null\npayload(optionalEncoding:flatbuffers.Encoding): ByteString|Uint8Array|null\npayload(optionalEncoding?:any): ByteString|Uint8Array|null {\n const offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__stringByteString(this.bb_pos + offset, optionalEncoding) : null;\n}\n\npubkey(): ByteString|null\npubkey(optionalEncoding:flatbuffers.Encoding): ByteString|Uint8Array|null\npubkey(optionalEncoding?:any): ByteString|Uint8Array|null {\n const offset = this.bb!.__offset(this.bb_pos, 10);\n return offset ? this.bb!.__stringByteString(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nsenderPubkey(): ByteString|null\nsenderPubkey(optionalEncoding:flatbuffers.Encoding): ByteString|Uint8Array|null\nsenderPubkey(optionalEncoding?:any): ByteString|Uint8Array|null {\n const offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.__stringByteString(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nrecipientPubkey(): ByteString|null\nrecipientPubkey(optionalEncoding:flatbuffers.Encoding): ByteString|Uint8Array|null\nrecipientPubkey(optionalEncoding?:any): ByteString|Uint8Array|null {\n const offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__stringByteString(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nstatic startSignerRequest(builder:flatbuffers.Builder) {\n builder.startObject(6);\n}\n\nstatic addRequestId(builder:flatbuffers.Builder, requestId:bigint) {\n builder.addFieldInt64(0, requestId, BigInt('0'));\n}\n\nstatic addOp(builder:flatbuffers.Builder, op:SignerOp) {\n builder.addFieldInt32(1, op, SignerOp.GetPubkey);\n}\n\nstatic addPayload(builder:flatbuffers.Builder, payloadOffset:flatbuffers.Offset) {\n builder.addFieldOffset(2, payloadOffset, 0);\n}\n\nstatic addPubkey(builder:flatbuffers.Builder, pubkeyOffset:flatbuffers.Offset) {\n builder.addFieldOffset(3, pubkeyOffset, 0);\n}\n\nstatic addSenderPubkey(builder:flatbuffers.Builder, senderPubkeyOffset:flatbuffers.Offset) {\n builder.addFieldOffset(4, senderPubkeyOffset, 0);\n}\n\nstatic addRecipientPubkey(builder:flatbuffers.Builder, recipientPubkeyOffset:flatbuffers.Offset) {\n builder.addFieldOffset(5, recipientPubkeyOffset, 0);\n}\n\nstatic endSignerRequest(builder:flatbuffers.Builder):flatbuffers.Offset {\n const offset = builder.endObject();\n return offset;\n}\n\nstatic createSignerRequest(builder:flatbuffers.Builder, requestId:bigint, op:SignerOp, payloadOffset:flatbuffers.Offset, pubkeyOffset:flatbuffers.Offset, senderPubkeyOffset:flatbuffers.Offset, recipientPubkeyOffset:flatbuffers.Offset):flatbuffers.Offset {\n SignerRequest.startSignerRequest(builder);\n SignerRequest.addRequestId(builder, requestId);\n SignerRequest.addOp(builder, op);\n SignerRequest.addPayload(builder, payloadOffset);\n SignerRequest.addPubkey(builder, pubkeyOffset);\n SignerRequest.addSenderPubkey(builder, senderPubkeyOffset);\n SignerRequest.addRecipientPubkey(builder, recipientPubkeyOffset);\n return SignerRequest.endSignerRequest(builder);\n}\n\nunpack(): SignerRequestT {\n return new SignerRequestT(\n this.requestId(),\n this.op(),\n this.payload(),\n this.pubkey(),\n this.senderPubkey(),\n this.recipientPubkey()\n );\n}\n\n\nunpackTo(_o: SignerRequestT): void {\n _o.requestId = this.requestId();\n _o.op = this.op();\n _o.payload = this.payload();\n _o.pubkey = this.pubkey();\n _o.senderPubkey = this.senderPubkey();\n _o.recipientPubkey = this.recipientPubkey();\n}\n}\n\nexport class SignerRequestT implements flatbuffers.IGeneratedObject {\nconstructor(\n public requestId: bigint = BigInt('0'),\n public op: SignerOp = SignerOp.GetPubkey,\n public payload: ByteString|Uint8Array|null = null,\n public pubkey: ByteString|Uint8Array|null = null,\n public senderPubkey: ByteString|Uint8Array|null = null,\n public recipientPubkey: ByteString|Uint8Array|null = null\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n const payload = (this.payload !== null ? builder.createString(this.payload!) : 0);\n const pubkey = (this.pubkey !== null ? builder.createString(this.pubkey!) : 0);\n const senderPubkey = (this.senderPubkey !== null ? builder.createString(this.senderPubkey!) : 0);\n const recipientPubkey = (this.recipientPubkey !== null ? builder.createString(this.recipientPubkey!) : 0);\n\n return SignerRequest.createSignerRequest(builder,\n this.requestId,\n this.op,\n payload,\n pubkey,\n senderPubkey,\n recipientPubkey\n );\n}\n}\n","import { ByteString } from \"src/lib/ByteString\";\n// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class SignerResponse implements flatbuffers.IUnpackableObject<SignerResponseT> {\n bb: flatbuffers.ByteBuffer|null = null;\n bb_pos = 0;\n __init(i:number, bb:flatbuffers.ByteBuffer):SignerResponse {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n}\n\nstatic getRootAsSignerResponse(bb:flatbuffers.ByteBuffer, obj?:SignerResponse):SignerResponse {\n return (obj || new SignerResponse()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsSignerResponse(bb:flatbuffers.ByteBuffer, obj?:SignerResponse):SignerResponse {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new SignerResponse()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nrequestId():bigint {\n const offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nresult(): ByteString|null\nresult(optionalEncoding:flatbuffers.Encoding): ByteString|Uint8Array|null\nresult(optionalEncoding?:any): ByteString|Uint8Array|null {\n const offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__stringByteString(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nerror(): ByteString|null\nerror(optionalEncoding:flatbuffers.Encoding): ByteString|Uint8Array|null\nerror(optionalEncoding?:any): ByteString|Uint8Array|null {\n const offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__stringByteString(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nstatic startSignerResponse(builder:flatbuffers.Builder) {\n builder.startObject(3);\n}\n\nstatic addRequestId(builder:flatbuffers.Builder, requestId:bigint) {\n builder.addFieldInt64(0, requestId, BigInt('0'));\n}\n\nstatic addResult(builder:flatbuffers.Builder, resultOffset:flatbuffers.Offset) {\n builder.addFieldOffset(1, resultOffset, 0);\n}\n\nstatic addError(builder:flatbuffers.Builder, errorOffset:flatbuffers.Offset) {\n builder.addFieldOffset(2, errorOffset, 0);\n}\n\nstatic endSignerResponse(builder:flatbuffers.Builder):flatbuffers.Offset {\n const offset = builder.endObject();\n return offset;\n}\n\nstatic createSignerResponse(builder:flatbuffers.Builder, requestId:bigint, resultOffset:flatbuffers.Offset, errorOffset:flatbuffers.Offset):flatbuffers.Offset {\n SignerResponse.startSignerResponse(builder);\n SignerResponse.addRequestId(builder, requestId);\n SignerResponse.addResult(builder, resultOffset);\n SignerResponse.addError(builder, errorOffset);\n return SignerResponse.endSignerResponse(builder);\n}\n\nunpack(): SignerResponseT {\n return new SignerResponseT(\n this.requestId(),\n this.result(),\n this.error()\n );\n}\n\n\nunpackTo(_o: SignerResponseT): void {\n _o.requestId = this.requestId();\n _o.result = this.result();\n _o.error = this.error();\n}\n}\n\nexport class SignerResponseT implements flatbuffers.IGeneratedObject {\nconstructor(\n public requestId: bigint = BigInt('0'),\n public result: ByteString|Uint8Array|null = null,\n public error: ByteString|Uint8Array|null = null\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n const result = (this.result !== null ? builder.createString(this.result!) : 0);\n const error = (this.error !== null ? builder.createString(this.error!) : 0);\n\n return SignerResponse.createSignerResponse(builder,\n this.requestId,\n result,\n error\n );\n}\n}\n"],"names":["ByteBuffer","offset","length","start","slice","ByteString","UTF8_DECODER","HEX_TABLE","t","i","byteArrayToString","bytes","view","h","v","out","other","a","b","SignerOp","SignerRequest","bb","obj","flatbuffers","optionalEncoding","builder","requestId","op","payloadOffset","pubkeyOffset","senderPubkeyOffset","recipientPubkeyOffset","SignerRequestT","_o","payload","pubkey","senderPubkey","recipientPubkey","SignerResponse","resultOffset","errorOffset","SignerResponseT","result","error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signer-response.js","sources":["../src/generated/nostr/fb/signer-op.ts","../src/generated/nostr/fb/signer-request.ts","../src/generated/nostr/fb/signer-response.ts"],"sourcesContent":["// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nexport enum SignerOp {\n GetPubkey = 0,\n SignEvent = 1,\n Nip04Encrypt = 2,\n Nip04Decrypt = 3,\n Nip44Encrypt = 4,\n Nip44Decrypt = 5,\n Nip04DecryptBetween = 6,\n Nip44DecryptBetween = 7,\n VerifyProof = 8,\n AuthEvent = 9\n}\n","// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\nimport { SignerOp } from '../../nostr/fb/signer-op.js';\n\n\nexport class SignerRequest implements flatbuffers.IUnpackableObject<SignerRequestT> {\n bb: flatbuffers.ByteBuffer|null = null;\n bb_pos = 0;\n __init(i:number, bb:flatbuffers.ByteBuffer):SignerRequest {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n}\n\nstatic getRootAsSignerRequest(bb:flatbuffers.ByteBuffer, obj?:SignerRequest):SignerRequest {\n return (obj || new SignerRequest()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsSignerRequest(bb:flatbuffers.ByteBuffer, obj?:SignerRequest):SignerRequest {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new SignerRequest()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nrequestId():bigint {\n const offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nop():SignerOp {\n const offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.readUint32(this.bb_pos + offset) : SignerOp.GetPubkey;\n}\n\npayload():string|null\npayload(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\npayload(optionalEncoding?:any):string|Uint8Array|null {\n const offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\npubkey():string|null\npubkey(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\npubkey(optionalEncoding?:any):string|Uint8Array|null {\n const offset = this.bb!.__offset(this.bb_pos, 10);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nsenderPubkey():string|null\nsenderPubkey(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\nsenderPubkey(optionalEncoding?:any):string|Uint8Array|null {\n const offset = this.bb!.__offset(this.bb_pos, 12);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nrecipientPubkey():string|null\nrecipientPubkey(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\nrecipientPubkey(optionalEncoding?:any):string|Uint8Array|null {\n const offset = this.bb!.__offset(this.bb_pos, 14);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nstatic startSignerRequest(builder:flatbuffers.Builder) {\n builder.startObject(6);\n}\n\nstatic addRequestId(builder:flatbuffers.Builder, requestId:bigint) {\n builder.addFieldInt64(0, requestId, BigInt('0'));\n}\n\nstatic addOp(builder:flatbuffers.Builder, op:SignerOp) {\n builder.addFieldInt32(1, op, SignerOp.GetPubkey);\n}\n\nstatic addPayload(builder:flatbuffers.Builder, payloadOffset:flatbuffers.Offset) {\n builder.addFieldOffset(2, payloadOffset, 0);\n}\n\nstatic addPubkey(builder:flatbuffers.Builder, pubkeyOffset:flatbuffers.Offset) {\n builder.addFieldOffset(3, pubkeyOffset, 0);\n}\n\nstatic addSenderPubkey(builder:flatbuffers.Builder, senderPubkeyOffset:flatbuffers.Offset) {\n builder.addFieldOffset(4, senderPubkeyOffset, 0);\n}\n\nstatic addRecipientPubkey(builder:flatbuffers.Builder, recipientPubkeyOffset:flatbuffers.Offset) {\n builder.addFieldOffset(5, recipientPubkeyOffset, 0);\n}\n\nstatic endSignerRequest(builder:flatbuffers.Builder):flatbuffers.Offset {\n const offset = builder.endObject();\n return offset;\n}\n\nstatic createSignerRequest(builder:flatbuffers.Builder, requestId:bigint, op:SignerOp, payloadOffset:flatbuffers.Offset, pubkeyOffset:flatbuffers.Offset, senderPubkeyOffset:flatbuffers.Offset, recipientPubkeyOffset:flatbuffers.Offset):flatbuffers.Offset {\n SignerRequest.startSignerRequest(builder);\n SignerRequest.addRequestId(builder, requestId);\n SignerRequest.addOp(builder, op);\n SignerRequest.addPayload(builder, payloadOffset);\n SignerRequest.addPubkey(builder, pubkeyOffset);\n SignerRequest.addSenderPubkey(builder, senderPubkeyOffset);\n SignerRequest.addRecipientPubkey(builder, recipientPubkeyOffset);\n return SignerRequest.endSignerRequest(builder);\n}\n\nunpack(): SignerRequestT {\n return new SignerRequestT(\n this.requestId(),\n this.op(),\n this.payload(),\n this.pubkey(),\n this.senderPubkey(),\n this.recipientPubkey()\n );\n}\n\n\nunpackTo(_o: SignerRequestT): void {\n _o.requestId = this.requestId();\n _o.op = this.op();\n _o.payload = this.payload();\n _o.pubkey = this.pubkey();\n _o.senderPubkey = this.senderPubkey();\n _o.recipientPubkey = this.recipientPubkey();\n}\n}\n\nexport class SignerRequestT implements flatbuffers.IGeneratedObject {\nconstructor(\n public requestId: bigint = BigInt('0'),\n public op: SignerOp = SignerOp.GetPubkey,\n public payload: string|Uint8Array|null = null,\n public pubkey: string|Uint8Array|null = null,\n public senderPubkey: string|Uint8Array|null = null,\n public recipientPubkey: string|Uint8Array|null = null\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n const payload = (this.payload !== null ? builder.createString(this.payload!) : 0);\n const pubkey = (this.pubkey !== null ? builder.createString(this.pubkey!) : 0);\n const senderPubkey = (this.senderPubkey !== null ? builder.createString(this.senderPubkey!) : 0);\n const recipientPubkey = (this.recipientPubkey !== null ? builder.createString(this.recipientPubkey!) : 0);\n\n return SignerRequest.createSignerRequest(builder,\n this.requestId,\n this.op,\n payload,\n pubkey,\n senderPubkey,\n recipientPubkey\n );\n}\n}\n","// automatically generated by the FlatBuffers compiler, do not modify\n\n/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any, @typescript-eslint/no-non-null-assertion */\n\nimport * as flatbuffers from 'flatbuffers';\n\n\n\nexport class SignerResponse implements flatbuffers.IUnpackableObject<SignerResponseT> {\n bb: flatbuffers.ByteBuffer|null = null;\n bb_pos = 0;\n __init(i:number, bb:flatbuffers.ByteBuffer):SignerResponse {\n this.bb_pos = i;\n this.bb = bb;\n return this;\n}\n\nstatic getRootAsSignerResponse(bb:flatbuffers.ByteBuffer, obj?:SignerResponse):SignerResponse {\n return (obj || new SignerResponse()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nstatic getSizePrefixedRootAsSignerResponse(bb:flatbuffers.ByteBuffer, obj?:SignerResponse):SignerResponse {\n bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);\n return (obj || new SignerResponse()).__init(bb.readInt32(bb.position()) + bb.position(), bb);\n}\n\nrequestId():bigint {\n const offset = this.bb!.__offset(this.bb_pos, 4);\n return offset ? this.bb!.readUint64(this.bb_pos + offset) : BigInt('0');\n}\n\nresult():string|null\nresult(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\nresult(optionalEncoding?:any):string|Uint8Array|null {\n const offset = this.bb!.__offset(this.bb_pos, 6);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nerror():string|null\nerror(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null\nerror(optionalEncoding?:any):string|Uint8Array|null {\n const offset = this.bb!.__offset(this.bb_pos, 8);\n return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;\n}\n\nstatic startSignerResponse(builder:flatbuffers.Builder) {\n builder.startObject(3);\n}\n\nstatic addRequestId(builder:flatbuffers.Builder, requestId:bigint) {\n builder.addFieldInt64(0, requestId, BigInt('0'));\n}\n\nstatic addResult(builder:flatbuffers.Builder, resultOffset:flatbuffers.Offset) {\n builder.addFieldOffset(1, resultOffset, 0);\n}\n\nstatic addError(builder:flatbuffers.Builder, errorOffset:flatbuffers.Offset) {\n builder.addFieldOffset(2, errorOffset, 0);\n}\n\nstatic endSignerResponse(builder:flatbuffers.Builder):flatbuffers.Offset {\n const offset = builder.endObject();\n return offset;\n}\n\nstatic createSignerResponse(builder:flatbuffers.Builder, requestId:bigint, resultOffset:flatbuffers.Offset, errorOffset:flatbuffers.Offset):flatbuffers.Offset {\n SignerResponse.startSignerResponse(builder);\n SignerResponse.addRequestId(builder, requestId);\n SignerResponse.addResult(builder, resultOffset);\n SignerResponse.addError(builder, errorOffset);\n return SignerResponse.endSignerResponse(builder);\n}\n\nunpack(): SignerResponseT {\n return new SignerResponseT(\n this.requestId(),\n this.result(),\n this.error()\n );\n}\n\n\nunpackTo(_o: SignerResponseT): void {\n _o.requestId = this.requestId();\n _o.result = this.result();\n _o.error = this.error();\n}\n}\n\nexport class SignerResponseT implements flatbuffers.IGeneratedObject {\nconstructor(\n public requestId: bigint = BigInt('0'),\n public result: string|Uint8Array|null = null,\n public error: string|Uint8Array|null = null\n){}\n\n\npack(builder:flatbuffers.Builder): flatbuffers.Offset {\n const result = (this.result !== null ? builder.createString(this.result!) : 0);\n const error = (this.error !== null ? builder.createString(this.error!) : 0);\n\n return SignerResponse.createSignerResponse(builder,\n this.requestId,\n result,\n error\n );\n}\n}\n"],"names":["SignerOp","SignerRequest","i","bb","obj","flatbuffers","offset","optionalEncoding","builder","requestId","op","payloadOffset","pubkeyOffset","senderPubkeyOffset","recipientPubkeyOffset","SignerRequestT","_o","payload","pubkey","senderPubkey","recipientPubkey","SignerResponse","resultOffset","errorOffset","SignerResponseT","result","error"],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AAEnC;;GAEG;AACH,KAAK,cAAc,CAAC,CAAC,IAAI;KACvB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK;CAC3D,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,EACxD,GAAG,EAAE,CAAC,EACN,SAAS,EAAE,CAAC,GACV,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAoBtE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,EACrD,GAAG,EAAE,CAAC,EACN,SAAS,EAAE,CAAC,GACV,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAYnE;AAGD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBA6BxE"}
|
package/dist/utils.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{nip19 as
|
|
2
|
-
`);let p=null,
|
|
3
|
-
`);w.push(new h(a.encode("mediaGrid"),a.encode(p),c.MediaGroupData,new $(
|
|
4
|
-
`);w.push(new h(a.encode("mediaGrid"),a.encode(s),c.MediaGroupData,new $(e)))}else w.push(u[0]);return w}function
|
|
1
|
+
import{nip19 as T,generateSecretKey as R,getPublicKey as I}from"nostr-tools";import{g as V}from"./index2.js";import{b as E}from"./NarrowTypes.js";import{l as j,Y as z,W as B,f as G,j as Z,g as H,X as _,Z as F,p as O,r as Q,F as U,H as W,D as q,B as J,J as X,t as Y,v as ee,x as se,z as ae,L as ne,N as te,P as oe,R as re,T as ie,a1 as de,$ as ce,V as le,a0 as ue,e as pe,d as ge,n as he,_ as fe,k as ye,h as me,c as we,o as Ke,q as ke,E as Se,G as ve,C as be,A as xe,I as Ce,s as De,u as Ae,w as Me,y as Re,K as Ie,M as Ee,O as $e,Q as Ne,S as Pe,U as Le,a as Te,i as Ve,m as je}from"./NarrowTypes.js";import{f as h,b as c,g as K,I as A,h as M,i as $,j as ze,k as Be,H as Ge,L as Ze,l as He}from"./worker-message.js";class _e{constructor(){this.knownRelays=new Map,this.incomingCount=0,this.resolvedCount=0}handleMessage(r){const i=E(r);if(!i)return;const l=i.relayUrl();l&&!this.knownRelays.has(l)&&(this.incomingCount++,this.knownRelays.set(l,i)),this.isResolved(i)&&this.resolvedCount++}isResolved(r){return r.status()?.toString()==="EOSE"}get totalIncoming(){return this.incomingCount}get totalResolved(){return this.resolvedCount}get resolutionRate(){return this.incomingCount===0?0:this.resolvedCount/this.incomingCount}}const a=new TextEncoder;async function Fe(d){const r=[],i=e=>new h(a.encode("text"),a.encode(e),c.NONE,null),l=e=>new h(a.encode("image"),a.encode(e),c.ImageData,new A(a.encode(e),null)),f=e=>new h(a.encode("video"),a.encode(e),c.VideoData,new M(a.encode(e),null)),m=(e,s)=>{const n=e.indexOf(`
|
|
2
|
+
`);let p=null,t=e;if(n!==-1){const g=e.slice(0,n).trim(),b=e.slice(n+1);g&&/^[a-zA-Z0-9+#\.\-_]+$/.test(g)&&(p=g,t=b)}return new h(a.encode("code"),a.encode(s),c.CodeData,new ze(a.encode(p||""),a.encode(t)))},y=e=>new h(a.encode("cashu"),a.encode(e),c.CashuData,new Be(a.encode(e))),k=e=>new h(a.encode("hashtag"),a.encode(`#${e}`),c.HashtagData,new Ge(a.encode(e))),S=e=>new h(a.encode("link"),a.encode(e),c.LinkPreviewData,new Ze(a.encode(e),null,null,null)),N=(e,s)=>{try{const n=T.decode(e),p=n.type;let t=null,g=[],b=null,D=BigInt(0);const o=n.data;switch(p){case"npub":t=o;break;case"nprofile":t=o.pubkey,g=Array.isArray(o.relays)?o.relays:[];break;case"note":t=o;break;case"nevent":t=o.id,g=Array.isArray(o.relays)?o.relays:[],b=typeof o.author=="string"?o.author:null,typeof o.kind=="number"&&(D=BigInt(o.kind));break;case"naddr":t=`${o.kind}:${o.pubkey}:${o.identifier}`,g=Array.isArray(o.relays)?o.relays:[],typeof o.kind=="number"&&(D=BigInt(o.kind)),b=typeof o.pubkey=="string"?o.pubkey:null;break}return t||(t=e),new h(a.encode(p),a.encode(s),c.NostrData,new He(a.encode(t),a.encode(e),g,a.encode(b||""),D))}catch{return i(s)}},P=[{type:"code",regex:/```([\s\S]*?)```/g,processMatch:e=>m(e[1]||"",e[0])},{type:"cashu",regex:/(cashuA[A-Za-z0-9_-]+)/g,processMatch:e=>y(e[0])},{type:"hashtag",regex:/(?<![^\s"'(])(#[a-zA-Z0-9_]+)(?![a-zA-Z0-9_])/g,processMatch:e=>k(e[0].substring(1))},{type:"image",regex:/(https?:\/\/\S+\.(?:jpg|jpeg|png|gif|webp|svg|ico)(?:\?\S*)?)/gi,processMatch:e=>l(e[0])},{type:"video",regex:/(https?:\/\/\S+\.(?:mp4|mov|avi|mkv|webm|m4v)(?:\?\S*)?)/gi,processMatch:e=>f(e[0])},{type:"nostr",regex:/nostr:([a-z0-9]+)/gi,processMatch:e=>{const s=e[1];return N(s||"",e[0])}},{type:"link",regex:/(https?:\/\/\S+)(?![\)])/gi,processMatch:async e=>S(e[0])}],C=[];for(const e of P){let s;for(e.regex.lastIndex=0;(s=e.regex.exec(d))!==null;){const n=s.index,p=n+s[0].length,t=await e.processMatch(s);C.push({start:n,end:p,block:t})}}C.sort((e,s)=>e.start-s.start);const x=[];for(const e of C)x.some(s=>e.start>=s.start&&e.start<s.end||e.end>s.start&&e.end<=s.end||e.start<=s.start&&e.end>=s.end)||x.push(e);x.sort((e,s)=>e.start-s.start);let v=0;for(const{start:e,end:s,block:n}of x)e>v&&r.push(i(d.substring(v,e))),r.push(n),v=s;v<d.length&&r.push(i(d.substring(v)));const w=[];let u=[];const L=e=>/^\s+$/.test(e);for(let e=0;e<r.length;e++){const s=r[e];if(s?.type?.toString()==="image"||s?.type?.toString()==="video"){u.push(s);continue}if(!(s?.type?.toString()==="text"&&typeof s?.text?.toString()=="string"&&L(s.text?.toString())&&u.length>0&&e+1<r.length&&(r[e+1]?.type?.toString()==="image"||r[e+1]?.type?.toString()==="video"))){if(u.length>0){if(u.length>1){const n=u.map(t=>{if(t.dataType===c.ImageData){const g=t.data;return new K(new A(a.encode(g.url??t.text),null),null)}else if(t.dataType===c.VideoData){const g=t.data;return new K(null,new M(a.encode(g.url??t.text),null))}return new K(null,null)}),p=u.map(t=>String(t.text??"")).join(`
|
|
3
|
+
`);w.push(new h(a.encode("mediaGrid"),a.encode(p),c.MediaGroupData,new $(n)))}else w.push(u[0]);u=[]}w.push(s)}}if(u.length>0)if(u.length>1){const e=u.map(n=>{if(n.dataType===c.ImageData){const p=n.data;return new K(new A(a.encode(p.url??n.text),null),null)}else if(n.dataType===c.VideoData){const p=n.data;return new K(null,new M(a.encode(p.url??n.text),null))}return new K(null,null)}),s=u.map(n=>String(n.text??"")).join(`
|
|
4
|
+
`);w.push(new h(a.encode("mediaGrid"),a.encode(s),c.MediaGroupData,new $(e)))}else w.push(u[0]);return w}function Oe(d,r){const i=d[`${String(r)}Length`]();return{[Symbol.iterator](){let l=0;return{next(){for(;l<i;){const f=d[r](l);if(l++,f!=null)return{value:f,done:!1}}return{value:void 0,done:!0}}}}}}function Qe(d,r){if(!d)return[];const i=d[`${String(r)}Length`]?.bind(d);if(!i)return[];const l=i(),f=[];for(let m=0;m<l;m++){const y=d[r](m);y!=null&&f.push(y)}return f}async function Ue(d,r){const i=R(),l=I(i),f=Array.from(i).map(S=>S.toString(16).padStart(2,"0")).join(""),m=I(R()),y=new URLSearchParams;for(const S of r)y.append("relay",S);y.set("secret",m),y.set("name",d);const k=`nostrconnect://${l}?${y.toString()}`;return console.log("connect url:",k),V().setNip46QR(k,f),k}export{_e as ConnectionTracker,j as asBufferFull,z as asCashuData,B as asCodeData,G as asConnectionStatus,Z as asCountResponse,H as asEoce,_ as asHashtagData,F as asImageData,O as asKind0,Q as asKind1,U as asKind10002,W as asKind10019,q as asKind1311,J as asKind17,X as asKind17375,Y as asKind3,ee as asKind4,se as asKind6,ae as asKind7,ne as asKind7374,te as asKind7375,oe as asKind7376,re as asKind9321,ie as asKind9735,de as asLinkPreview,ce as asMediaGroupData,le as asNip51,ue as asNostrData,pe as asNostrEvent,ge as asParsedEvent,he as asValidProofs,fe as asVideoData,Ue as connectWithQRCode,Qe as fbArray,Oe as fbIterable,ye as isBufferFull,E as isConnectionStatus,me as isCountResponse,we as isEoce,Ke as isKind0,ke as isKind1,Se as isKind10002,ve as isKind10019,be as isKind1311,xe as isKind17,Ce as isKind17375,De as isKind3,Ae as isKind4,Me as isKind6,Re as isKind7,Ie as isKind7374,Ee as isKind7375,$e as isKind7376,Ne as isKind9321,Pe as isKind9735,Le as isNip51,Te as isNostrEvent,Ve as isParsedEvent,je as isValidProofs,Fe as parseContent};
|