@candypoets/nipworker 0.91.0 → 0.91.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/NarrowTypes.js +279 -1
  2. package/dist/cache/index.js +431 -2
  3. package/dist/cache/pkg/cache.d.ts +3 -3
  4. package/dist/cache/pkg/cache_bg.wasm.d.ts +3 -3
  5. package/dist/connections/index.js +442 -2
  6. package/dist/connections/pkg/connections.d.ts +3 -3
  7. package/dist/connections/pkg/connections_bg.wasm.d.ts +3 -3
  8. package/dist/connections/proxy.js +2 -1
  9. package/dist/connections/proxy.js.map +7 -1
  10. package/dist/connections/types.d.ts +12 -0
  11. package/dist/connections/types.d.ts.map +1 -1
  12. package/dist/crypto/index.js +785 -2
  13. package/dist/hooks.js +94 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +231 -1
  16. package/dist/index2.js +2614 -1
  17. package/dist/parser/index.js +565 -2
  18. package/dist/proxy/relayProxyServer.d.ts +4 -0
  19. package/dist/proxy/relayProxyServer.d.ts.map +1 -1
  20. package/dist/proxy/server.js +7 -1
  21. package/dist/proxy/vite.d.ts.map +1 -1
  22. package/dist/proxy/vite.js +43 -2
  23. package/dist/relayProxyServer.js +518 -1
  24. package/dist/types/index.d.ts +2 -0
  25. package/dist/types/index.d.ts.map +1 -1
  26. package/dist/utils.js +357 -4
  27. package/dist/worker-message.js +6866 -1
  28. package/package.json +3 -1
  29. package/dist/NarrowTypes.js.map +0 -1
  30. package/dist/cache/index.js.map +0 -1
  31. package/dist/connections/index.js.map +0 -1
  32. package/dist/crypto/index.js.map +0 -1
  33. package/dist/hooks.js.map +0 -1
  34. package/dist/index.js.map +0 -1
  35. package/dist/index2.js.map +0 -1
  36. package/dist/parser/index.js.map +0 -1
  37. package/dist/proxy/index.js.map +0 -1
  38. package/dist/proxy/server.js.map +0 -1
  39. package/dist/proxy/vite.js.map +0 -1
  40. package/dist/relayProxyServer.js.map +0 -1
  41. package/dist/signer-response.js +0 -1
  42. package/dist/signer-response.js.map +0 -1
  43. package/dist/utils.js.map +0 -1
  44. package/dist/worker-message.js.map +0 -1
@@ -9,6 +9,8 @@ export type RelayProxyServerOptions = {
9
9
  port?: number;
10
10
  path?: string;
11
11
  logger?: RelayProxyServerLogger;
12
+ /** SOCKS proxy URL for connecting to .onion relays (e.g., 'socks5h://127.0.0.1:9050') */
13
+ torSocksProxy?: string;
12
14
  };
13
15
  export type RelayProxyServer = {
14
16
  port: number;
@@ -20,6 +22,8 @@ export type AttachRelayProxyOptions = {
20
22
  /** The path to mount the WebSocket endpoint on (e.g., '/ws-proxy') */
21
23
  path?: string;
22
24
  logger?: RelayProxyServerLogger;
25
+ /** SOCKS proxy URL for connecting to .onion relays (e.g., 'socks5h://127.0.0.1:9050') */
26
+ torSocksProxy?: string;
23
27
  };
24
28
  export type AttachedRelayProxy = {
25
29
  /** Stop accepting new connections and close all existing sessions */
@@ -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;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"}
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;AAYhD,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;IAChC,yFAAyF;IACzF,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,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;IAChC,yFAAyF;IACzF,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,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;AA2CF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,gBAAgB,CA+E9F;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,CAoFrB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,uBAAuB,GAAG,kBAAkB,CAqD7F;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,CAsF9E"}
@@ -1 +1,7 @@
1
- import{attachRelayProxyToServer as e,createExpressRelayProxyMiddleware as r,createRelayProxyServer as a,createRelayProxyWebSocketServer as y}from"../relayProxyServer.js";export{e as attachRelayProxyToServer,r as createExpressRelayProxyMiddleware,a as createRelayProxyServer,y as createRelayProxyWebSocketServer};
1
+ import { attachRelayProxyToServer as a, createExpressRelayProxyMiddleware as o, createRelayProxyServer as y, createRelayProxyWebSocketServer as t } from "../relayProxyServer.js";
2
+ export {
3
+ a as attachRelayProxyToServer,
4
+ o as createExpressRelayProxyMiddleware,
5
+ y as createRelayProxyServer,
6
+ t as createRelayProxyWebSocketServer
7
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../../src/proxy/vite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAgC,MAAM,MAAM,CAAC;AAGjE,MAAM,MAAM,gCAAgC,GAAG;IAC9C;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAqCF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,yBAAyB,CACxC,OAAO,GAAE,gCAAqC,GAC5C,MAAM,CAeR"}
1
+ {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../../src/proxy/vite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAgC,MAAM,MAAM,CAAC;AAGjE,MAAM,MAAM,gCAAgC,GAAG;IAC9C;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAqCF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,yBAAyB,CACxC,OAAO,GAAE,gCAAqC,GAC5C,MAAM,CAyBR"}
@@ -1,2 +1,43 @@
1
- let i,p=(async()=>{const a=[];process.on("SIGINT",async()=>{await Promise.all(a.map(e=>e.close())),process.exit(0)}),process.on("SIGTERM",async()=>{await Promise.all(a.map(e=>e.close())),process.exit(0)});async function t(e,o,r){const{createRelayProxyServer:s}=await import("../relayProxyServer.js"),n=o??"127.0.0.1",c=s({port:e,host:n,path:"/"});a.push(c),console.log(`
2
- \u{1F680} nipworker relay proxy at ws://${n}:${c.port}/`),console.log(` (${r})`)}i=function(e={}){const o=e.port??7777,r=e.host;return{name:"nipworker-relay-proxy",configureServer:async s=>{await t(o,r,"Vite dev")},configurePreviewServer:async s=>{await t(o,r,"Vite preview")}}}})();export{p as __tla,i as nipworkerRelayProxyPlugin};
1
+ let i;
2
+ let __tla = (async () => {
3
+ const s = [];
4
+ process.on("SIGINT", async () => {
5
+ await Promise.all(s.map((r) => r.close())), process.exit(0);
6
+ });
7
+ process.on("SIGTERM", async () => {
8
+ await Promise.all(s.map((r) => r.close())), process.exit(0);
9
+ });
10
+ async function c(r, o, t) {
11
+ const { createRelayProxyServer: a } = await import("../relayProxyServer.js"), e = o ?? "127.0.0.1", n = a({
12
+ port: r,
13
+ host: e,
14
+ path: "/"
15
+ });
16
+ s.push(n), console.log(`
17
+ \u{1F680} nipworker relay proxy at ws://${e}:${n.port}/`), console.log(` (${t})`);
18
+ }
19
+ i = function(r = {}) {
20
+ const o = r.port ?? 7777, t = r.host;
21
+ return {
22
+ name: "nipworker-relay-proxy",
23
+ configureServer: async (a) => {
24
+ try {
25
+ await c(o, t, "Vite dev");
26
+ } catch (e) {
27
+ throw console.error("[nipworker-relay-proxy] Failed to start in dev mode:", e), e;
28
+ }
29
+ },
30
+ configurePreviewServer: async (a) => {
31
+ try {
32
+ await c(o, t, "Vite preview");
33
+ } catch (e) {
34
+ throw console.error("[nipworker-relay-proxy] Failed to start in preview mode:", e), e;
35
+ }
36
+ }
37
+ };
38
+ };
39
+ })();
40
+ export {
41
+ __tla,
42
+ i as nipworkerRelayProxyPlugin
43
+ };
@@ -1 +1,518 @@
1
- import*as B from"flatbuffers";import{WebSocketServer as w,WebSocket as S}from"ws";import{R as C,W as I,M as v,G as A,N as O,C as P,S as R}from"./worker-message.js";function T(e={}){const n=e.host??"127.0.0.1",s=e.port??7777,o=e.path??"/",t=e.logger??console;let r;try{r=new w({host:n,port:s,path:o})}catch(c){throw t.error(`[relay-proxy] failed to create WebSocketServer: ${String(c)}`),c}let i=s;const a=r.address();return a&&typeof a=="object"&&(i=a.port),r.on("error",c=>{t.error(`[relay-proxy] WebSocketServer error: ${String(c)}`)}),r.on("connection",c=>{const u={relaySockets:new Map,pendingFrames:new Map,dedupBySubId:new Map,lastSubIdByRelay:new Map};c.on("message",(f,l)=>{if(l){const p=k(f);if(!p)return;E(u,c,p,t);return}const g=b(f);g&&m(u,g,t)}),c.on("close",()=>{y(u)}),c.on("error",()=>{y(u)})}),t.info(`[relay-proxy] listening on ws://${n}:${i}${o}`),{port:i,close:()=>new Promise((c,u)=>{r.close(f=>{if(f){u(f);return}c()})})}}function U(e){const n=e.path??"/",s=e.logger??console,o=new w({noServer:!0}),t=new Map;return o.on("connection",r=>{const i={relaySockets:new Map,pendingFrames:new Map,dedupBySubId:new Map,lastSubIdByRelay:new Map};t.set(r,i),r.on("message",(a,c)=>{const u=t.get(r);if(!u)return;if(c){const l=k(a);if(!l)return;E(u,r,l,s);return}const f=b(a);f&&m(u,f,s)}),r.on("close",()=>{const a=t.get(r);a&&(y(a),t.delete(r))}),r.on("error",()=>{const a=t.get(r);a&&(y(a),t.delete(r))})}),{wss:o,close:()=>new Promise((r,i)=>{t.forEach(a=>y(a)),t.clear(),o.close(a=>{if(a){i(a);return}r()})}),handleUpgrade:(r,i,a)=>{(r.url??"").startsWith(n)&&o.handleUpgrade(r,i,a,c=>{o.emit("connection",c,r)})}}}function W(e){const{server:n,path:s="/",logger:o=console}=e,t=new w({server:n,path:s});return t.on("connection",r=>{const i={relaySockets:new Map,pendingFrames:new Map,dedupBySubId:new Map,lastSubIdByRelay:new Map};r.on("message",(a,c)=>{if(c){const f=k(a);if(!f)return;E(i,r,f,o);return}const u=b(a);u&&m(i,u,o)}),r.on("close",()=>{y(i)}),r.on("error",()=>{y(i)})}),o.info(`[relay-proxy] attached to server at path: ${s}`),{close:()=>new Promise((r,i)=>{t.close(a=>{if(a){i(a);return}r()})})}}function _(e,n){const s=n.path??"/ws-proxy",o=n.logger??console;let t=null;const r=new Map,i=e.listen.bind(e);return e.listen=(...a)=>{const c=i(...a);return t=new w({server:c,path:s}),t.on("connection",u=>{const f={relaySockets:new Map,pendingFrames:new Map,dedupBySubId:new Map,lastSubIdByRelay:new Map};r.set(u,f),u.on("message",(l,g)=>{const p=r.get(u);if(!p)return;if(g){const N=k(l);if(!N)return;E(p,u,N,o);return}const d=b(l);d&&m(p,d,o)}),u.on("close",()=>{const l=r.get(u);l&&(y(l),r.delete(u))}),u.on("error",()=>{const l=r.get(u);l&&(y(l),r.delete(u))})}),o.info(`[relay-proxy] attached to Express server at path: ${s}`),c},{close:()=>new Promise((a,c)=>{if(!t){a();return}r.forEach(u=>y(u)),r.clear(),t.close(u=>{if(u){c(u);return}a()})})}}function m(e,n,s){let o;try{o=JSON.parse(n)}catch{return}if(Q(o)){const t=JSON.stringify(["AUTH",o.event]);x(e,o.relay,t,s);return}if(G(o)){e.dedupBySubId.delete(o.subscription_id);for(const[t,r]of e.relaySockets.entries())r.readyState===S.OPEN&&r.send(JSON.stringify(["CLOSE",o.subscription_id])),e.lastSubIdByRelay.set(t,o.subscription_id)}}function E(e,n,s,o){const t=s.frames.map(r=>({frame:r,state:J(r)}));for(const r of s.relays){$(e,n,r,o);for(const i of t){D(e,r,i.state);const a=i.frame;x(e,r,a,o)}}}function $(e,n,s,o){const t=e.relaySockets.get(s);if(t&&t.readyState!==S.CLOSED)return;const r=new S(s);e.relaySockets.set(s,r),e.pendingFrames.set(s,[]),r.on("open",()=>{const i=e.pendingFrames.get(s);if(i){for(const a of i)r.send(a);e.pendingFrames.set(s,[])}}),r.on("message",i=>{const a=b(i);if(!a||n.readyState!==S.OPEN)return;const c=e.lastSubIdByRelay.get(s),u=L(e,s,a,c);u&&n.send(u,{binary:!0})}),r.on("close",()=>{e.pendingFrames.delete(s)}),r.on("error",i=>{if(!e.pendingFrames.has(s))return;const a=String(i);!a.includes("ECONNREFUSED")&&!a.includes("ENOTFOUND")&&o.warn(`[relay-proxy] relay socket error for ${s}: ${a.slice(0,100)}`),e.pendingFrames.delete(s)})}function D(e,n,s){if(s){if(e.lastSubIdByRelay.set(n,s.subId),s.type==="REQ"){const o=s.subId;e.dedupBySubId.has(o)||e.dedupBySubId.set(o,new Set);return}e.dedupBySubId.delete(s.subId)}}function J(e){const n=F(e);if(!n)return null;const s=n[0];if(s!=="REQ"&&s!=="CLOSE")return null;const o=typeof n[1]=="string"?n[1]:null;return o?{type:s,subId:o}:null}function x(e,n,s,o){const t=e.relaySockets.get(n);if(t){if(t.readyState===S.OPEN){t.send(s);return}if(t.readyState===S.CONNECTING){const r=e.pendingFrames.get(n)??[];r.push(s),e.pendingFrames.set(n,r);return}o.warn(`[relay-proxy] dropping frame for closed relay socket ${n}`)}}function L(e,n,s,o){const t=F(s);if(!t||t.length<1||typeof t[0]!="string")return M(o??"",n,s);const r=t[0];if(r==="EVENT"){const i=typeof t[1]=="string"?t[1]:"",a=V(t[2]);if(!i||!a)return M(i,n,s);const c=e.dedupBySubId.get(i);return c&&c.has(a.id)?null:(c&&c.add(a.id),j(i,n,a))}if(r==="NOTICE"){const i=t[1]===void 0?null:String(t[1]);return h("",n,"NOTICE",i)}if(r==="AUTH"){const i=t[1]===void 0?null:String(t[1]);return h(o??"",n,"AUTH",i)}if(r==="CLOSED"){const i=typeof t[1]=="string"?t[1]:"",a=t[2]===void 0?null:String(t[2]);return h(i,n,"CLOSED",a)}if(r==="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 h(i,n,a,c)}if(r==="EOSE"){const i=typeof t[1]=="string"?t[1]:"";return h(i,n,"EOSE",null)}return M(o??"",n,s)}function j(e,n,s){const o=new B.Builder(1024),t=e?o.createString(e):0,r=o.createString(n),i=o.createString(s.id),a=o.createString(s.pubkey),c=o.createString(s.content),u=o.createString(s.sig),f=new Array(s.tags.length);for(let d=0;d<s.tags.length;d++)f[d]=H(o,s.tags[d]);const l=O.createTagsVector(o,f),g=O.createNostrEvent(o,i,a,s.kind,c,l,s.created_at,u),p=I.createWorkerMessage(o,t,r,v.NostrEvent,A.NostrEvent,g);return o.finish(p),o.asUint8Array()}function h(e,n,s,o){const t=new B.Builder(256),r=e?t.createString(e):0,i=t.createString(n),a=t.createString(s),c=o===null?0:t.createString(o),u=P.createConnectionStatus(t,i,a,c),f=I.createWorkerMessage(t,r,i,v.ConnectionStatus,A.ConnectionStatus,u);return t.finish(f),t.asUint8Array()}function M(e,n,s){const o=new B.Builder(256),t=e?o.createString(e):0,r=o.createString(n),i=o.createString(s),a=C.createRaw(o,i),c=I.createWorkerMessage(o,t,r,v.Raw,A.Raw,a);return o.finish(c),o.asUint8Array()}function V(e){if(!e||typeof e!="object")return null;const n=e;if(typeof n.id!="string"||typeof n.pubkey!="string"||typeof n.kind!="number"||typeof n.content!="string"||typeof n.created_at!="number"||typeof n.sig!="string"||!Array.isArray(n.tags))return null;const s=n.tags;let o=!1;for(const r of s){if(!Array.isArray(r)||r.length===0){o=!0;continue}for(const i of r)if(typeof i!="string"){o=!0;break}}let t;if(!o)t=s;else{t=[];for(const r of s){if(!Array.isArray(r))continue;const i=[];for(const a of r)typeof a=="string"&&i.push(a);i.length>0&&t.push(i)}}return{id:n.id,pubkey:n.pubkey,kind:n.kind,content:n.content,created_at:n.created_at,sig:n.sig,tags:t}}function H(e,n){const s=new Array(n.length);for(let t=0;t<n.length;t++)s[t]=e.createString(n[t]);const o=R.createItemsVector(e,s);return R.createStringVec(e,o)}function F(e){try{const n=JSON.parse(e);return Array.isArray(n)?n:null}catch{return null}}function k(e){const n=b(e);if(!n)return null;try{const s=JSON.parse(n);if(!Array.isArray(s.relays)||!Array.isArray(s.frames))return null;const o=s.relays.filter(r=>typeof r=="string"),t=s.frames.filter(r=>typeof r=="string");return o.length===0||t.length===0?null:{relays:o,frames:t}}catch{return null}}function b(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(n=>Buffer.isBuffer(n))).toString("utf8"):""}function Q(e){if(!e||typeof e!="object")return!1;const n=e;return n.type==="auth_response"&&typeof n.relay=="string"&&n.event!==void 0}function G(e){if(!e||typeof e!="object")return!1;const n=e;return n.type==="close_sub"&&typeof n.subscription_id=="string"}function y(e){e.dedupBySubId.clear(),e.lastSubIdByRelay.clear();for(const n of e.relaySockets.values())try{n.close()}catch{}e.relaySockets.clear(),e.pendingFrames.clear()}export{W as attachRelayProxyToServer,_ as createExpressRelayProxyMiddleware,T as createRelayProxyServer,U as createRelayProxyWebSocketServer};
1
+ import * as A from "flatbuffers";
2
+ import { WebSocketServer as w, WebSocket as m } from "ws";
3
+ import { SocksProxyAgent as v } from "socks-proxy-agent";
4
+ import { C as T, W as E, M as k, G as M, R as F, N as C, S as N } from "./worker-message.js";
5
+ function q(t = {}) {
6
+ const r = t.host ?? "127.0.0.1", n = t.port ?? 7777, e = t.path ?? "/", s = t.logger ?? console, o = t.torSocksProxy;
7
+ let f;
8
+ try {
9
+ f = new w({
10
+ host: r,
11
+ port: n,
12
+ path: e
13
+ });
14
+ } catch (i) {
15
+ throw s.error(`[relay-proxy] failed to create WebSocketServer: ${String(i)}`), i;
16
+ }
17
+ let a = n;
18
+ const c = f.address();
19
+ return c && typeof c == "object" && (a = c.port), f.on("error", (i) => {
20
+ s.error(`[relay-proxy] WebSocketServer error: ${String(i)}`);
21
+ }), f.on("connection", (i) => {
22
+ const u = {
23
+ relaySockets: /* @__PURE__ */ new Map(),
24
+ pendingFrames: /* @__PURE__ */ new Map(),
25
+ dedupBySubId: /* @__PURE__ */ new Map(),
26
+ lastSubIdByRelay: /* @__PURE__ */ new Map(),
27
+ torSocksProxy: o,
28
+ lastAuthChallenge: /* @__PURE__ */ new Map()
29
+ };
30
+ i.on("message", (y, p) => {
31
+ if (p) {
32
+ const d = $(y);
33
+ if (!d) return;
34
+ x(u, i, d, s);
35
+ return;
36
+ }
37
+ const l = h(y);
38
+ l && b(u, l, s);
39
+ }), i.on("close", () => {
40
+ g(u, s);
41
+ }), i.on("error", () => {
42
+ g(u, s);
43
+ });
44
+ }), s.info(`[relay-proxy] listening on ws://${r}:${a}${e}`), {
45
+ port: a,
46
+ close: () => new Promise((i, u) => {
47
+ f.close((y) => {
48
+ if (y) {
49
+ u(y);
50
+ return;
51
+ }
52
+ i();
53
+ });
54
+ })
55
+ };
56
+ }
57
+ function X(t) {
58
+ const r = t.path ?? "/", n = t.logger ?? console, e = t.torSocksProxy, s = new w({
59
+ noServer: true
60
+ }), o = /* @__PURE__ */ new Map();
61
+ return s.on("connection", (a) => {
62
+ const c = {
63
+ relaySockets: /* @__PURE__ */ new Map(),
64
+ pendingFrames: /* @__PURE__ */ new Map(),
65
+ dedupBySubId: /* @__PURE__ */ new Map(),
66
+ lastSubIdByRelay: /* @__PURE__ */ new Map(),
67
+ torSocksProxy: e
68
+ };
69
+ o.set(a, c), a.on("message", (i, u) => {
70
+ const y = o.get(a);
71
+ if (!y) return;
72
+ if (u) {
73
+ const l = $(i);
74
+ if (!l) return;
75
+ x(y, a, l, n);
76
+ return;
77
+ }
78
+ const p = h(i);
79
+ p && b(y, p, n);
80
+ }), a.on("close", () => {
81
+ const i = o.get(a);
82
+ i && (g(i, n), o.delete(a));
83
+ }), a.on("error", () => {
84
+ const i = o.get(a);
85
+ i && (g(i, n), o.delete(a));
86
+ });
87
+ }), {
88
+ wss: s,
89
+ close: () => new Promise((a, c) => {
90
+ o.forEach((i) => g(i, n)), o.clear(), s.close((i) => {
91
+ if (i) {
92
+ c(i);
93
+ return;
94
+ }
95
+ a();
96
+ });
97
+ }),
98
+ handleUpgrade: (a, c, i) => {
99
+ (a.url ?? "").startsWith(r) && s.handleUpgrade(a, c, i, (y) => {
100
+ s.emit("connection", y, a);
101
+ });
102
+ }
103
+ };
104
+ }
105
+ function Y(t) {
106
+ const { server: r, path: n = "/", logger: e = console, torSocksProxy: s } = t, o = new w({
107
+ server: r,
108
+ path: n
109
+ });
110
+ return o.on("connection", (f) => {
111
+ const a = {
112
+ relaySockets: /* @__PURE__ */ new Map(),
113
+ pendingFrames: /* @__PURE__ */ new Map(),
114
+ dedupBySubId: /* @__PURE__ */ new Map(),
115
+ lastSubIdByRelay: /* @__PURE__ */ new Map(),
116
+ torSocksProxy: s
117
+ };
118
+ f.on("message", (c, i) => {
119
+ if (i) {
120
+ const y = $(c);
121
+ if (!y) return;
122
+ x(a, f, y, e);
123
+ return;
124
+ }
125
+ const u = h(c);
126
+ u && b(a, u, e);
127
+ }), f.on("close", () => {
128
+ g(a, e);
129
+ }), f.on("error", () => {
130
+ g(a, e);
131
+ });
132
+ }), e.info(`[relay-proxy] attached to server at path: ${n}`), {
133
+ close: () => new Promise((f, a) => {
134
+ o.close((c) => {
135
+ if (c) {
136
+ a(c);
137
+ return;
138
+ }
139
+ f();
140
+ });
141
+ })
142
+ };
143
+ }
144
+ function Z(t, r) {
145
+ const n = r.path ?? "/ws-proxy", e = r.logger ?? console, s = r.torSocksProxy;
146
+ let o = null;
147
+ const f = /* @__PURE__ */ new Map(), a = t.listen.bind(t);
148
+ return t.listen = (...c) => {
149
+ const i = a(...c);
150
+ return o = new w({
151
+ server: i,
152
+ path: n
153
+ }), o.on("connection", (u) => {
154
+ const y = {
155
+ relaySockets: /* @__PURE__ */ new Map(),
156
+ pendingFrames: /* @__PURE__ */ new Map(),
157
+ dedupBySubId: /* @__PURE__ */ new Map(),
158
+ lastSubIdByRelay: /* @__PURE__ */ new Map(),
159
+ torSocksProxy: s
160
+ };
161
+ f.set(u, y), u.on("message", (p, l) => {
162
+ const d = f.get(u);
163
+ if (!d) return;
164
+ if (l) {
165
+ const B = $(p);
166
+ if (!B) return;
167
+ x(d, u, B, e);
168
+ return;
169
+ }
170
+ const I = h(p);
171
+ I && b(d, I, e);
172
+ }), u.on("close", () => {
173
+ const p = f.get(u);
174
+ p && (g(p, e), f.delete(u));
175
+ }), u.on("error", () => {
176
+ const p = f.get(u);
177
+ p && (g(p, e), f.delete(u));
178
+ });
179
+ }), e.info(`[relay-proxy] attached to Express server at path: ${n}`), i;
180
+ }, {
181
+ close: () => new Promise((c, i) => {
182
+ if (!o) {
183
+ c();
184
+ return;
185
+ }
186
+ f.forEach((u) => g(u, e)), f.clear(), o.close((u) => {
187
+ if (u) {
188
+ i(u);
189
+ return;
190
+ }
191
+ c();
192
+ });
193
+ })
194
+ };
195
+ }
196
+ function b(t, r, n) {
197
+ n.info(`[relay-proxy] handleClientCommand: ${r.slice(0, 200)}`);
198
+ let e;
199
+ try {
200
+ e = JSON.parse(r);
201
+ } catch (s) {
202
+ n.warn(`[relay-proxy] failed to parse command JSON: ${s}`);
203
+ return;
204
+ }
205
+ if (j(e)) {
206
+ n.info(`[relay-proxy] received auth_response for relay: ${e.relay}`);
207
+ const s = JSON.stringify(["AUTH", e.event]);
208
+ n.info(`[relay-proxy] sending AUTH frame to relay: ${e.relay}`), P(t, e.relay, s, n);
209
+ return;
210
+ }
211
+ if (G(e)) {
212
+ t.dedupBySubId.delete(e.subscription_id);
213
+ for (const [s, o] of t.relaySockets.entries())
214
+ o.readyState === m.OPEN && o.send(JSON.stringify(["CLOSE", e.subscription_id])), t.lastSubIdByRelay.set(s, e.subscription_id);
215
+ }
216
+ }
217
+ function x(t, r, n, e) {
218
+ e.info(`[relay-proxy] handleEnvelope: ${n.relays.length} relays, ${n.frames.length} frames`), e.info(`[relay-proxy] relays: ${n.relays.join(", ")}`);
219
+ const s = n.frames.map((o) => ({
220
+ frame: o,
221
+ state: L(o)
222
+ }));
223
+ e.info(`[relay-proxy] tracked ${s.length} frames`);
224
+ for (const o of n.relays) {
225
+ e.info(`[relay-proxy] processing relay: ${o}`), W(t, r, o, e);
226
+ for (const f of s) {
227
+ _(t, o, f.state);
228
+ const a = f.frame;
229
+ e.info(`[relay-proxy] sending frame to ${o}: ${a.slice(0, 100)}`), P(t, o, a, e);
230
+ }
231
+ }
232
+ }
233
+ function W(t, r, n, e) {
234
+ const s = t.relaySockets.get(n);
235
+ if (s && s.readyState !== m.CLOSED) {
236
+ e.info(`[relay-proxy] reusing existing connection to ${n}`);
237
+ return;
238
+ }
239
+ e.info(`[relay-proxy] creating new WebSocket connection to ${n}`);
240
+ const o = new URL(n), f = `${o.protocol}//${o.host}`, a = o.hostname.endsWith(".onion"), c = {
241
+ headers: {
242
+ Origin: f,
243
+ "User-Agent": "nipworker/0.91.0"
244
+ }
245
+ };
246
+ a && t.torSocksProxy && (e.info(`[relay-proxy] using Tor SOCKS proxy ${t.torSocksProxy} for ${n}`), c.agent = new v(t.torSocksProxy));
247
+ const i = new m(n, c);
248
+ t.relaySockets.set(n, i), t.pendingFrames.set(n, []);
249
+ const u = Date.now();
250
+ i.on("open", () => {
251
+ e.info(`[relay-proxy] connected to ${n}`);
252
+ const y = t.pendingFrames.get(n);
253
+ if (y) {
254
+ e.info(`[relay-proxy] sending ${y.length} pending frames to ${n}`);
255
+ for (const p of y)
256
+ i.send(p);
257
+ t.pendingFrames.set(n, []);
258
+ }
259
+ }), i.on("message", (y) => {
260
+ const p = h(y);
261
+ if (e.info(`[relay-proxy] received from ${n}: ${p == null ? void 0 : p.slice(0, 100)}`), !p || r.readyState !== m.OPEN) {
262
+ e.warn(`[relay-proxy] cannot forward message: raw=${!!p}, clientOpen=${r.readyState === m.OPEN}`);
263
+ return;
264
+ }
265
+ const l = t.lastSubIdByRelay.get(n), d = H(t, n, p, l, e);
266
+ if (!d) {
267
+ e.warn("[relay-proxy] failed to convert relay frame to worker message");
268
+ return;
269
+ }
270
+ e.info(`[relay-proxy] forwarding ${d.length} bytes to client`), r.send(d, { binary: true });
271
+ }), i.on("close", (y, p) => {
272
+ var _a, _b;
273
+ if (e.info(`[relay-proxy] connection closed to ${n} (code: ${y}, reason: ${p})`), t.pendingFrames.has(n) && ((_a = t.pendingFrames.get(n)) == null ? void 0 : _a.length) > 0) {
274
+ const l = ((_b = t.pendingFrames.get(n)) == null ? void 0 : _b.length) ?? 0;
275
+ if (e.warn(`[relay-proxy] connection to ${n} closed with ${l} pending frames - subscription may fail`), r.readyState === m.OPEN) {
276
+ const d = S(
277
+ t.lastSubIdByRelay.get(n) ?? "",
278
+ n,
279
+ "failed",
280
+ `Connection failed: ${y} ${p}`
281
+ );
282
+ r.send(d, { binary: true });
283
+ }
284
+ }
285
+ t.pendingFrames.delete(n);
286
+ }), i.on("error", (y) => {
287
+ if (!t.pendingFrames.has(n)) return;
288
+ const p = String(y), l = Date.now() - u;
289
+ e.warn(`[relay-proxy] relay socket error for ${n} after ${l}ms: ${p}`), p.includes("403") && e.warn(`[relay-proxy] 403 Forbidden from ${n} - relay may require NIP-42 auth or block this connection`), t.pendingFrames.delete(n);
290
+ });
291
+ }
292
+ function _(t, r, n) {
293
+ if (n) {
294
+ if (t.lastSubIdByRelay.set(r, n.subId), n.type === "REQ") {
295
+ const e = n.subId;
296
+ t.dedupBySubId.has(e) || t.dedupBySubId.set(e, /* @__PURE__ */ new Set());
297
+ return;
298
+ }
299
+ t.dedupBySubId.delete(n.subId);
300
+ }
301
+ }
302
+ function L(t) {
303
+ const r = R(t);
304
+ if (!r) return null;
305
+ const n = r[0];
306
+ if (n !== "REQ" && n !== "CLOSE") return null;
307
+ const e = typeof r[1] == "string" ? r[1] : null;
308
+ return e ? { type: n, subId: e } : null;
309
+ }
310
+ function P(t, r, n, e) {
311
+ const s = t.relaySockets.get(r);
312
+ if (!s) {
313
+ e.warn(`[relay-proxy] no relay socket for ${r}`);
314
+ return;
315
+ }
316
+ if (s.readyState === m.OPEN) {
317
+ e.info(`[relay-proxy] sending frame to ${r} (OPEN): ${n.slice(0, 100)}`), s.send(n);
318
+ return;
319
+ }
320
+ if (s.readyState === m.CONNECTING) {
321
+ e.info(`[relay-proxy] queueing frame for ${r} (CONNECTING)`);
322
+ const o = t.pendingFrames.get(r) ?? [];
323
+ o.push(n), t.pendingFrames.set(r, o);
324
+ return;
325
+ }
326
+ e.warn(`[relay-proxy] dropping frame for closed relay socket ${r} (state: ${s.readyState})`);
327
+ }
328
+ function H(t, r, n, e, s) {
329
+ const o = R(n);
330
+ if (!o || o.length < 1 || typeof o[0] != "string")
331
+ return O(e ?? "", r, n);
332
+ const f = o[0];
333
+ if (f === "EVENT") {
334
+ const a = typeof o[1] == "string" ? o[1] : "", c = J(o[2]);
335
+ if (!a || !c)
336
+ return O(a, r, n);
337
+ const i = t.dedupBySubId.get(a);
338
+ return i && i.has(c.id) ? null : (i && i.add(c.id), D(a, r, c));
339
+ }
340
+ if (f === "NOTICE") {
341
+ const a = o[1] === void 0 ? null : String(o[1]);
342
+ return S("", r, "NOTICE", a);
343
+ }
344
+ if (f === "AUTH") {
345
+ const a = o[1] === void 0 ? null : String(o[1]), c = Date.now(), i = t.lastAuthChallenge.get(r);
346
+ if (i) {
347
+ const y = c - i.timestamp;
348
+ if (i.challenge === a && y < 5e3)
349
+ return s == null ? void 0 : s.info(`[relay-proxy] dropping duplicate AUTH from ${r} (${y}ms ago)`), null;
350
+ if (y < 1e3)
351
+ return s == null ? void 0 : s.info(`[relay-proxy] rate limiting AUTH from ${r} (${y}ms since last)`), null;
352
+ }
353
+ t.lastAuthChallenge.set(r, { challenge: a, timestamp: c }), s == null ? void 0 : s.info(`[relay-proxy] received AUTH challenge from ${r}: ${a}`);
354
+ const u = S(e ?? "", r, "AUTH", a);
355
+ return s == null ? void 0 : s.info(`[relay-proxy] built AUTH worker message (${u.length} bytes)`), u;
356
+ }
357
+ if (f === "CLOSED") {
358
+ const a = typeof o[1] == "string" ? o[1] : "", c = o[2] === void 0 ? null : String(o[2]);
359
+ return S(a, r, "CLOSED", c);
360
+ }
361
+ if (f === "OK") {
362
+ const a = typeof o[1] == "string" ? o[1] : "", c = o[2] === void 0 ? "false" : String(o[2]), i = o[3] === void 0 ? null : String(o[3]);
363
+ return S(a, r, c, i);
364
+ }
365
+ if (f === "EOSE") {
366
+ const a = typeof o[1] == "string" ? o[1] : "";
367
+ return S(a, r, "EOSE", null);
368
+ }
369
+ return O(e ?? "", r, n);
370
+ }
371
+ function D(t, r, n) {
372
+ const e = new A.Builder(1024), s = t ? e.createString(t) : 0, o = e.createString(r), f = e.createString(n.id), a = e.createString(n.pubkey), c = e.createString(n.content), i = e.createString(n.sig), u = new Array(n.tags.length);
373
+ for (let d = 0; d < n.tags.length; d++)
374
+ u[d] = V(e, n.tags[d]);
375
+ const y = C.createTagsVector(e, u), p = C.createNostrEvent(
376
+ e,
377
+ f,
378
+ a,
379
+ n.kind,
380
+ c,
381
+ y,
382
+ n.created_at,
383
+ i
384
+ ), l = E.createWorkerMessage(
385
+ e,
386
+ s,
387
+ o,
388
+ k.NostrEvent,
389
+ M.NostrEvent,
390
+ p
391
+ );
392
+ return e.finish(l), e.asUint8Array();
393
+ }
394
+ function S(t, r, n, e) {
395
+ const s = new A.Builder(256), o = t ? s.createString(t) : 0, f = s.createString(r), a = s.createString(n), c = e === null ? 0 : s.createString(e), i = T.createConnectionStatus(
396
+ s,
397
+ f,
398
+ a,
399
+ c
400
+ ), u = E.createWorkerMessage(
401
+ s,
402
+ o,
403
+ f,
404
+ k.ConnectionStatus,
405
+ M.ConnectionStatus,
406
+ i
407
+ );
408
+ return s.finish(u), s.asUint8Array();
409
+ }
410
+ function O(t, r, n) {
411
+ const e = new A.Builder(256), s = t ? e.createString(t) : 0, o = e.createString(r), f = e.createString(n), a = F.createRaw(e, f), c = E.createWorkerMessage(
412
+ e,
413
+ s,
414
+ o,
415
+ k.Raw,
416
+ M.Raw,
417
+ a
418
+ );
419
+ return e.finish(c), e.asUint8Array();
420
+ }
421
+ function J(t) {
422
+ if (!t || typeof t != "object") return null;
423
+ const r = t;
424
+ 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))
425
+ return null;
426
+ const n = r.tags;
427
+ let e = false;
428
+ for (const o of n) {
429
+ if (!Array.isArray(o) || o.length === 0) {
430
+ e = true;
431
+ continue;
432
+ }
433
+ for (const f of o)
434
+ if (typeof f != "string") {
435
+ e = true;
436
+ break;
437
+ }
438
+ }
439
+ let s;
440
+ if (!e)
441
+ s = n;
442
+ else {
443
+ s = [];
444
+ for (const o of n) {
445
+ if (!Array.isArray(o)) continue;
446
+ const f = [];
447
+ for (const a of o)
448
+ typeof a == "string" && f.push(a);
449
+ f.length > 0 && s.push(f);
450
+ }
451
+ }
452
+ return {
453
+ id: r.id,
454
+ pubkey: r.pubkey,
455
+ kind: r.kind,
456
+ content: r.content,
457
+ created_at: r.created_at,
458
+ sig: r.sig,
459
+ tags: s
460
+ };
461
+ }
462
+ function V(t, r) {
463
+ const n = new Array(r.length);
464
+ for (let s = 0; s < r.length; s++)
465
+ n[s] = t.createString(r[s]);
466
+ const e = N.createItemsVector(t, n);
467
+ return N.createStringVec(t, e);
468
+ }
469
+ function R(t) {
470
+ try {
471
+ const r = JSON.parse(t);
472
+ return Array.isArray(r) ? r : null;
473
+ } catch {
474
+ return null;
475
+ }
476
+ }
477
+ function $(t, r) {
478
+ const n = h(t);
479
+ if (!n)
480
+ return null;
481
+ try {
482
+ const e = JSON.parse(n);
483
+ if (!Array.isArray(e.relays) || !Array.isArray(e.frames))
484
+ return r == null ? void 0 : r.warn(`[relay-proxy] parseEnvelope: invalid structure (relays: ${Array.isArray(e.relays)}, frames: ${Array.isArray(e.frames)})`), null;
485
+ const s = e.relays.filter((f) => typeof f == "string"), o = e.frames.filter((f) => typeof f == "string");
486
+ return r == null ? void 0 : r.info(`[relay-proxy] parseEnvelope: ${s.length} relays, ${o.length} frames`), s.length === 0 || o.length === 0 ? (r == null ? void 0 : r.warn("[relay-proxy] parseEnvelope: empty relays or frames after filter"), null) : { relays: s, frames: o };
487
+ } catch {
488
+ return null;
489
+ }
490
+ }
491
+ function h(t) {
492
+ return typeof t == "string" ? t : t instanceof ArrayBuffer ? Buffer.from(t).toString("utf8") : Buffer.isBuffer(t) ? t.toString("utf8") : t instanceof Uint8Array ? Buffer.from(t).toString("utf8") : Array.isArray(t) ? Buffer.concat(t.filter((r) => Buffer.isBuffer(r))).toString("utf8") : "";
493
+ }
494
+ function j(t) {
495
+ if (!t || typeof t != "object") return false;
496
+ const r = t;
497
+ return r.type === "auth_response" && typeof r.relay == "string" && r.event !== void 0;
498
+ }
499
+ function G(t) {
500
+ if (!t || typeof t != "object") return false;
501
+ const r = t;
502
+ return r.type === "close_sub" && typeof r.subscription_id == "string";
503
+ }
504
+ function g(t, r) {
505
+ r == null ? void 0 : r.info("[relay-proxy] closing session"), t.dedupBySubId.clear(), t.lastSubIdByRelay.clear();
506
+ for (const [n, e] of t.relaySockets.entries())
507
+ try {
508
+ r == null ? void 0 : r.info(`[relay-proxy] closing socket to ${n}`), e.close();
509
+ } catch {
510
+ }
511
+ t.relaySockets.clear(), t.pendingFrames.clear();
512
+ }
513
+ export {
514
+ Y as attachRelayProxyToServer,
515
+ Z as createExpressRelayProxyMiddleware,
516
+ q as createRelayProxyServer,
517
+ X as createRelayProxyWebSocketServer
518
+ };
@@ -42,6 +42,8 @@ export type SubscriptionConfig = {
42
42
  };
43
43
  export type ProxyConfig = {
44
44
  url: string;
45
+ /** SOCKS proxy URL for connecting to .onion relays (e.g., 'socks5h://127.0.0.1:9050') */
46
+ torSocksProxy?: string;
45
47
  };
46
48
  export type NostrManagerConfig = {
47
49
  proxy?: ProxyConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAcN,KAAK,EAKL,MAAM,uBAAuB,CAAC;AAE/B,cAAc,uBAAuB,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG;IAC3B,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAOF,MAAM,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,KAAK,CAAC,EAAE,WAAW,CAAC;CACpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAcN,KAAK,EAKL,MAAM,uBAAuB,CAAC;AAE/B,cAAc,uBAAuB,CAAC;AAEtC,MAAM,MAAM,aAAa,GAAG;IAC3B,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAOF,MAAM,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,yFAAyF;IACzF,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,KAAK,CAAC,EAAE,WAAW,CAAC;CACpB,CAAC"}