@candypoets/nipworker 0.91.0 → 0.91.1

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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"vite.js","sources":["../../src/proxy/vite.ts"],"sourcesContent":["import type { Plugin, ViteDevServer, PreviewServer } from 'vite';\nimport type { RelayProxyServer } from './relayProxyServer';\n\nexport type NipworkerRelayProxyPluginOptions = {\n\t/**\n\t * The port to use for the standalone relay proxy server.\n\t * Defaults to 7777.\n\t */\n\tport?: number;\n\t/**\n\t * The host to bind the relay proxy server to.\n\t * Use '127.0.0.1' for local-only access (default).\n\t * Use '0.0.0.0' to allow remote connections.\n\t */\n\thost?: string;\n};\n\n// Store servers for cleanup on process exit\nconst servers: RelayProxyServer[] = [];\n\nprocess.on('SIGINT', async () => {\n\tawait Promise.all(servers.map(s => s.close()));\n\tprocess.exit(0);\n});\n\nprocess.on('SIGTERM', async () => {\n\tawait Promise.all(servers.map(s => s.close()));\n\tprocess.exit(0);\n});\n\nasync function startRelayProxy(\n\tportOption: number | undefined,\n\thostOption: string | undefined,\n\tserverName: string\n): Promise<void> {\n\tconst { createRelayProxyServer } = await import('./relayProxyServer.js');\n\n\tconst host = hostOption ?? '127.0.0.1';\n\tconst relayProxy: RelayProxyServer = createRelayProxyServer({\n\t\tport: portOption,\n\t\thost,\n\t\tpath: '/'\n\t});\n\n\tservers.push(relayProxy);\n\n\t// eslint-disable-next-line no-console\n\tconsole.log(`\\nšŸš€ nipworker relay proxy at ws://${host}:${relayProxy.port}/`);\n\t// eslint-disable-next-line no-console\n\tconsole.log(` (${serverName})`);\n}\n\n/**\n * Vite plugin that attaches the nipworker relay proxy to the server.\n *\n * IMPORTANT: Due to Vite 5's WebSocket handling (HMR), the relay proxy runs on a\n * separate port from the main Vite dev server. The plugin will log the actual\n * WebSocket URL to use.\n *\n * Works in both development (`vite dev`) and production preview (`vite preview`) modes.\n *\n * @example\n * // vite.config.ts\n * import { defineConfig } from 'vite';\n * import { sveltekit } from '@sveltejs/kit/vite';\n * import { nipworkerRelayProxyPlugin } from '@candypoets/nipworker/proxy/vite';\n *\n * export default defineConfig({\n * plugins: [\n * sveltekit(),\n * nipworkerRelayProxyPlugin({ port: 7777, host: '0.0.0.0' })\n * ]\n * });\n *\n * // Then in your client, use the URL logged by the plugin:\n * import { createNostrManager } from '@candypoets/nipworker';\n * const manager = createNostrManager({\n * proxy: { url: 'ws://localhost:7777/' }\n * });\n */\nexport function nipworkerRelayProxyPlugin(\n\toptions: NipworkerRelayProxyPluginOptions = {}\n): Plugin {\n\tconst port = options.port ?? 7777;\n\tconst host = options.host;\n\n\treturn {\n\t\tname: 'nipworker-relay-proxy',\n\n\t\tconfigureServer: async (_server: ViteDevServer) => {\n\t\t\tawait startRelayProxy(port, host, 'Vite dev');\n\t\t},\n\n\t\tconfigurePreviewServer: async (_server: PreviewServer) => {\n\t\t\tawait startRelayProxy(port, host, 'Vite preview');\n\t\t}\n\t};\n}\n"],"names":["servers","s","startRelayProxy","portOption","hostOption","serverName","createRelayProxyServer","host","relayProxy","nipworkerRelayProxyPlugin","options","port","_server"],"mappings":"AAkBA,MAAMA,IAA8B,CAAA;AAEpC,QAAQ,GAAG,UAAU,YAAY;AAChC,QAAM,QAAQ,IAAIA,EAAQ,IAAI,OAAKC,EAAE,MAAA,CAAO,CAAC,GAC7C,QAAQ,KAAK,CAAC;AACf,CAAC;AAED,QAAQ,GAAG,WAAW,YAAY;AACjC,QAAM,QAAQ,IAAID,EAAQ,IAAI,OAAKC,EAAE,MAAA,CAAO,CAAC,GAC7C,QAAQ,KAAK,CAAC;AACf,CAAC;AAED,eAAeC,EACdC,GACAC,GACAC,GACgB;AAChB,QAAM,EAAE,wBAAAC,EAAA,IAA2B,MAAM,OAAO,wBAAuB,GAEjEC,IAAOH,KAAc,aACrBI,IAA+BF,EAAuB;AAAA,IAC3D,MAAMH;AAAA,IACN,MAAAI;AAAA,IACA,MAAM;AAAA,EAAA,CACN;AAED,EAAAP,EAAQ,KAAKQ,CAAU,GAGvB,QAAQ,IAAI;AAAA,mCAAsCD,CAAI,IAAIC,EAAW,IAAI,GAAG,GAE5E,QAAQ,IAAI,OAAOH,CAAU,GAAG;AACjC;AA8BO,SAASI,EACfC,IAA4C,IACnC;AACT,QAAMC,IAAOD,EAAQ,QAAQ,MACvBH,IAAOG,EAAQ;AAErB,SAAO;AAAA,IACN,MAAM;AAAA,IAEN,iBAAiB,OAAOE,MAA2B;AAClD,YAAMV,EAAgBS,GAAMJ,GAAM,UAAU;AAAA,IAC7C;AAAA,IAEA,wBAAwB,OAAOK,MAA2B;AACzD,YAAMV,EAAgBS,GAAMJ,GAAM,cAAc;AAAA,IACjD;AAAA,EAAA;AAEF;"}
@@ -1 +0,0 @@
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","createRelayProxyWebSocketServer","sessions","request","socket","head","ws","attachRelayProxyToServer","server","createExpressRelayProxyMiddleware","app","originalListen","args","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"],"mappings":"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"}
@@ -1 +0,0 @@
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 +0,0 @@
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.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sources":["../src/lib/ConnectionTracker.ts","../src/lib/ParseContent.ts","../src/utils.ts"],"sourcesContent":["import { ConnectionStatus, WorkerMessage } from 'src/generated/nostr/fb';\nimport { isConnectionStatus } from './NarrowTypes';\n\nexport class ConnectionTracker {\n\tprivate knownRelays: Map<number, ConnectionStatus> = new Map();\n\tprivate incomingCount = 0;\n\tprivate resolvedCount = 0;\n\n\t/**\n\t * Feed a new message into the tracker\n\t */\n\thandleMessage(msg: WorkerMessage) {\n\t\tconst status = isConnectionStatus(msg);\n\t\tif (!status) return; // not a connection status, ignore\n\n\t\tconst id = status.relayUrl();\n\t\tif (id && !this.knownRelays.has(id)) {\n\t\t\tthis.incomingCount++;\n\t\t\tthis.knownRelays.set(id, status);\n\t\t}\n\t\tif (this.isResolved(status)) {\n\t\t\tthis.resolvedCount++;\n\t\t}\n\t}\n\n\t/**\n\t * Define what counts as a \"resolved\" connection.\n\t * Adjust based on your real ConnectionStatus enum/shape.\n\t */\n\tprivate isResolved(status: ConnectionStatus): boolean {\n\t\treturn status.status()?.toString() === 'EOSE';\n\t}\n\n\t/** Total connection attempts processed */\n\tget totalIncoming(): number {\n\t\treturn this.incomingCount;\n\t}\n\n\t/** How many actually resolved */\n\tget totalResolved(): number {\n\t\treturn this.resolvedCount;\n\t}\n\n\t/** Quick ratio (0...1) of resolved vs incoming */\n\tget resolutionRate(): number {\n\t\treturn this.incomingCount === 0 ? 0 : this.resolvedCount / this.incomingCount;\n\t}\n}\n","import { nip19 } from 'nostr-tools';\n\nimport { ContentBlockT } from 'src/generated/nostr/fb/content-block';\nimport { ContentData } from 'src/generated/nostr/fb/content-data';\nimport { CodeDataT } from 'src/generated/nostr/fb/code-data';\nimport { CashuDataT } from 'src/generated/nostr/fb/cashu-data';\nimport { HashtagDataT } from 'src/generated/nostr/fb/hashtag-data';\nimport { ImageDataT } from 'src/generated/nostr/fb/image-data';\nimport { VideoDataT } from 'src/generated/nostr/fb/video-data';\nimport { MediaGroupDataT } from 'src/generated/nostr/fb/media-group-data';\nimport { MediaItemT } from 'src/generated/nostr/fb/media-item';\nimport { LinkPreviewDataT } from 'src/generated/nostr/fb/link-preview-data';\nimport { NostrDataT } from 'src/generated/nostr/fb/nostr-data';\n\ntype MatchProcessor = (match: RegExpExecArray) => ContentBlockT | Promise<ContentBlockT>;\n\nconst textEncoder = new TextEncoder();\n\nexport async function parseContent(content: string): Promise<ContentBlockT[]> {\n\tconst blocks: ContentBlockT[] = [];\n\n\t// Helpers\n\tconst textBlock = (text: string): ContentBlockT =>\n\t\tnew ContentBlockT(textEncoder.encode('text'), textEncoder.encode(text), ContentData.NONE, null);\n\n\tconst imageBlock = (url: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('image'),\n\t\t\ttextEncoder.encode(url),\n\t\t\tContentData.ImageData,\n\t\t\tnew ImageDataT(textEncoder.encode(url), null)\n\t\t);\n\n\tconst videoBlock = (url: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('video'),\n\t\t\ttextEncoder.encode(url),\n\t\t\tContentData.VideoData,\n\t\t\tnew VideoDataT(textEncoder.encode(url), null)\n\t\t);\n\n\tconst codeBlock = (raw: string, full: string): ContentBlockT => {\n\t\t// Try to extract optional language from first line of fenced code\n\t\t// Supports patterns like ```lang\\ncode\\n```\n\t\tconst nl = raw.indexOf('\\n');\n\t\tlet language: string | null = null;\n\t\tlet code = raw;\n\t\tif (nl !== -1) {\n\t\t\tconst firstLine = raw.slice(0, nl).trim();\n\t\t\tconst rest = raw.slice(nl + 1);\n\t\t\tif (firstLine && /^[a-zA-Z0-9+#\\.\\-_]+$/.test(firstLine)) {\n\t\t\t\tlanguage = firstLine;\n\t\t\t\tcode = rest;\n\t\t\t}\n\t\t}\n\n\t\treturn new ContentBlockT(\n\t\t\ttextEncoder.encode('code'),\n\t\t\ttextEncoder.encode(full),\n\t\t\tContentData.CodeData,\n\t\t\tnew CodeDataT(textEncoder.encode(language || ''), textEncoder.encode(code))\n\t\t);\n\t};\n\n\tconst cashuBlock = (token: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('cashu'),\n\t\t\ttextEncoder.encode(token),\n\t\t\tContentData.CashuData,\n\t\t\tnew CashuDataT(textEncoder.encode(token))\n\t\t);\n\n\tconst hashtagBlock = (tag: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('hashtag'),\n\t\t\ttextEncoder.encode(`#${tag}`),\n\t\t\tContentData.HashtagData,\n\t\t\tnew HashtagDataT(textEncoder.encode(tag))\n\t\t);\n\n\tconst linkBlock = (url: string): ContentBlockT =>\n\t\tnew ContentBlockT(\n\t\t\ttextEncoder.encode('link'),\n\t\t\ttextEncoder.encode(url),\n\t\t\tContentData.LinkPreviewData,\n\t\t\tnew LinkPreviewDataT(textEncoder.encode(url), null, null, null)\n\t\t);\n\n\tconst nostrBlock = (bech32: string, fullText: string): ContentBlockT => {\n\t\ttry {\n\t\t\tconst decoded = nip19.decode(bech32);\n\t\t\tconst type = decoded.type as 'npub' | 'nprofile' | 'note' | 'nevent' | 'naddr';\n\n\t\t\tlet id: string | null = null;\n\t\t\tlet relays: string[] = [];\n\t\t\tlet author: string | null = null;\n\t\t\tlet kind: bigint = BigInt(0);\n\n\t\t\tconst d = decoded.data as any;\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'npub':\n\t\t\t\t\t// data: hex pubkey\n\t\t\t\t\tid = d as string;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'nprofile':\n\t\t\t\t\t// data: { pubkey, relays? }\n\t\t\t\t\tid = d.pubkey;\n\t\t\t\t\trelays = Array.isArray(d.relays) ? d.relays : [];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'note':\n\t\t\t\t\t// data: hex event id\n\t\t\t\t\tid = d as string;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'nevent':\n\t\t\t\t\t// data: { id, relays?, author?, kind? }\n\t\t\t\t\tid = d.id;\n\t\t\t\t\trelays = Array.isArray(d.relays) ? d.relays : [];\n\t\t\t\t\tauthor = typeof d.author === 'string' ? d.author : null;\n\t\t\t\t\tif (typeof d.kind === 'number') kind = BigInt(d.kind);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'naddr':\n\t\t\t\t\t// data: { identifier, pubkey, kind, relays? }\n\t\t\t\t\t// Build a stable id\n\t\t\t\t\tid = `${d.kind}:${d.pubkey}:${d.identifier}`;\n\t\t\t\t\trelays = Array.isArray(d.relays) ? d.relays : [];\n\t\t\t\t\tif (typeof d.kind === 'number') kind = BigInt(d.kind);\n\t\t\t\t\tauthor = typeof d.pubkey === 'string' ? d.pubkey : null;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Ensure required fields for NostrDataT: id and entity are required\n\t\t\tif (!id) {\n\t\t\t\tid = bech32;\n\t\t\t}\n\n\t\t\treturn new ContentBlockT(\n\t\t\t\ttextEncoder.encode(type),\n\t\t\t\ttextEncoder.encode(fullText),\n\t\t\t\tContentData.NostrData,\n\t\t\t\tnew NostrDataT(\n\t\t\t\t\ttextEncoder.encode(id),\n\t\t\t\t\ttextEncoder.encode(bech32),\n\t\t\t\t\trelays,\n\t\t\t\t\ttextEncoder.encode(author || ''),\n\t\t\t\t\tkind\n\t\t\t\t)\n\t\t\t);\n\t\t} catch {\n\t\t\t// Fallback to plain text block when decode fails\n\t\t\treturn textBlock(fullText);\n\t\t}\n\t};\n\n\t// Define all the patterns we want to match\n\tconst patterns: Array<{\n\t\ttype: string;\n\t\tregex: RegExp;\n\t\tprocessMatch: MatchProcessor;\n\t}> = [\n\t\t{\n\t\t\ttype: 'code',\n\t\t\tregex: /```([\\s\\S]*?)```/g,\n\t\t\tprocessMatch: (match) => codeBlock(match[1] || '', match[0])\n\t\t},\n\t\t{\n\t\t\ttype: 'cashu',\n\t\t\tregex: /(cashuA[A-Za-z0-9_-]+)/g,\n\t\t\tprocessMatch: (match) => cashuBlock(match[0])\n\t\t},\n\t\t{\n\t\t\ttype: 'hashtag',\n\t\t\t// Match hashtags that are not part of a URL\n\t\t\tregex: /(?<![^\\s\"'(])(#[a-zA-Z0-9_]+)(?![a-zA-Z0-9_])/g,\n\t\t\tprocessMatch: (match) => hashtagBlock(match[0].substring(1))\n\t\t},\n\t\t{\n\t\t\ttype: 'image',\n\t\t\tregex: /(https?:\\/\\/\\S+\\.(?:jpg|jpeg|png|gif|webp|svg|ico)(?:\\?\\S*)?)/gi,\n\t\t\tprocessMatch: (match) => imageBlock(match[0])\n\t\t},\n\t\t{\n\t\t\ttype: 'video',\n\t\t\tregex: /(https?:\\/\\/\\S+\\.(?:mp4|mov|avi|mkv|webm|m4v)(?:\\?\\S*)?)/gi,\n\t\t\tprocessMatch: (match) => videoBlock(match[0])\n\t\t},\n\t\t{\n\t\t\ttype: 'nostr',\n\t\t\tregex: /nostr:([a-z0-9]+)/gi,\n\t\t\tprocessMatch: (match) => {\n\t\t\t\tconst bech32 = match[1];\n\t\t\t\treturn nostrBlock(bech32 || '', match[0]);\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\ttype: 'link',\n\t\t\tregex: /(https?:\\/\\/\\S+)(?![\\)])/gi,\n\t\t\tprocessMatch: async (match) => linkBlock(match[0])\n\t\t}\n\t];\n\n\t// Find all matches with their positions\n\tconst allMatches: Array<{\n\t\tstart: number;\n\t\tend: number;\n\t\tblock: ContentBlockT;\n\t}> = [];\n\n\t// First, find all matches for all patterns\n\tfor (const pattern of patterns) {\n\t\tlet match: RegExpExecArray | null;\n\t\tpattern.regex.lastIndex = 0;\n\n\t\twhile ((match = pattern.regex.exec(content)) !== null) {\n\t\t\tconst start = match.index;\n\t\t\tconst end = start + match[0].length;\n\t\t\tconst block = await pattern.processMatch(match);\n\n\t\t\tallMatches.push({ start, end, block });\n\t\t}\n\t}\n\n\t// Sort matches by start position\n\tallMatches.sort((a, b) => a.start - b.start);\n\n\t// Remove overlapping matches (prioritize earlier patterns in the array)\n\tconst filteredMatches: typeof allMatches = [];\n\n\tfor (const match of allMatches) {\n\t\tconst overlaps = filteredMatches.some(\n\t\t\t(existing) =>\n\t\t\t\t(match.start >= existing.start && match.start < existing.end) ||\n\t\t\t\t(match.end > existing.start && match.end <= existing.end) ||\n\t\t\t\t(match.start <= existing.start && match.end >= existing.end)\n\t\t);\n\n\t\tif (!overlaps) {\n\t\t\tfilteredMatches.push(match);\n\t\t}\n\t}\n\n\t// Re-sort filtered matches\n\tfilteredMatches.sort((a, b) => a.start - b.start);\n\n\t// Build the final result, including text between matches\n\tlet lastIndex = 0;\n\n\tfor (const { start, end, block } of filteredMatches) {\n\t\t// Add text before this match\n\t\tif (start > lastIndex) {\n\t\t\tblocks.push(textBlock(content.substring(lastIndex, start)));\n\t\t}\n\n\t\t// Add the match\n\t\tblocks.push(block);\n\n\t\tlastIndex = end;\n\t}\n\n\t// Add any remaining text after the last match\n\tif (lastIndex < content.length) {\n\t\tblocks.push(textBlock(content.substring(lastIndex)));\n\t}\n\n\t// Post-processing: group consecutive media into grids\n\tconst processedBlocks: ContentBlockT[] = [];\n\tlet mediaGroup: ContentBlockT[] = [];\n\n\tconst isWhitespace = (s: string) => /^\\s+$/.test(s);\n\n\tfor (let i = 0; i < blocks.length; i++) {\n\t\tconst block = blocks[i];\n\n\t\t// If this is an image or video\n\t\tif (block?.type?.toString() === 'image' || block?.type?.toString() === 'video') {\n\t\t\tmediaGroup.push(block);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// If this is whitespace or newlines between media, check what follows\n\t\tif (\n\t\t\tblock?.type?.toString() === 'text' &&\n\t\t\ttypeof block?.text?.toString() === 'string' &&\n\t\t\tisWhitespace(block.text?.toString())\n\t\t) {\n\t\t\tif (\n\t\t\t\tmediaGroup.length > 0 &&\n\t\t\t\ti + 1 < blocks.length &&\n\t\t\t\t(blocks[i + 1]?.type?.toString() === 'image' || blocks[i + 1]?.type?.toString() === 'video')\n\t\t\t) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// If we have collected media and the current block breaks the sequence\n\t\tif (mediaGroup.length > 0) {\n\t\t\t// Add media group if it contains more than one item\n\t\t\tif (mediaGroup.length > 1) {\n\t\t\t\tconst items: MediaItemT[] = mediaGroup.map((m) => {\n\t\t\t\t\tif (m.dataType === ContentData.ImageData) {\n\t\t\t\t\t\tconst d = m.data as ImageDataT;\n\t\t\t\t\t\treturn new MediaItemT(\n\t\t\t\t\t\t\tnew ImageDataT(textEncoder.encode(d.url ?? (m.text as string)), null),\n\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if (m.dataType === ContentData.VideoData) {\n\t\t\t\t\t\tconst d = m.data as VideoDataT;\n\t\t\t\t\t\treturn new MediaItemT(\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t\tnew VideoDataT(textEncoder.encode(d.url ?? (m.text as string)), null)\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Fallback — shouldn't occur because we only collect image/video\n\t\t\t\t\treturn new MediaItemT(null, null);\n\t\t\t\t});\n\n\t\t\t\tconst text = mediaGroup.map((m) => String(m.text ?? '')).join('\\n');\n\t\t\t\tprocessedBlocks.push(\n\t\t\t\t\tnew ContentBlockT(\n\t\t\t\t\t\ttextEncoder.encode('mediaGrid'),\n\t\t\t\t\t\ttextEncoder.encode(text),\n\t\t\t\t\t\tContentData.MediaGroupData,\n\t\t\t\t\t\tnew MediaGroupDataT(items)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\t// Just add the single media item\n\t\t\t\tprocessedBlocks.push(mediaGroup[0]);\n\t\t\t}\n\t\t\tmediaGroup = [];\n\t\t}\n\n\t\t// Add the current non-media block\n\t\tprocessedBlocks.push(block);\n\t}\n\n\t// Don't forget any remaining media\n\tif (mediaGroup.length > 0) {\n\t\tif (mediaGroup.length > 1) {\n\t\t\tconst items: MediaItemT[] = mediaGroup.map((m) => {\n\t\t\t\tif (m.dataType === ContentData.ImageData) {\n\t\t\t\t\tconst d = m.data as ImageDataT;\n\t\t\t\t\treturn new MediaItemT(\n\t\t\t\t\t\tnew ImageDataT(textEncoder.encode(d.url ?? (m.text as string)), null),\n\t\t\t\t\t\tnull\n\t\t\t\t\t);\n\t\t\t\t} else if (m.dataType === ContentData.VideoData) {\n\t\t\t\t\tconst d = m.data as VideoDataT;\n\t\t\t\t\treturn new MediaItemT(\n\t\t\t\t\t\tnull,\n\t\t\t\t\t\tnew VideoDataT(textEncoder.encode(d.url ?? (m.text as string)), null)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn new MediaItemT(null, null);\n\t\t\t});\n\n\t\t\tconst text = mediaGroup.map((m) => String(m.text ?? '')).join('\\n');\n\t\t\tprocessedBlocks.push(\n\t\t\t\tnew ContentBlockT(\n\t\t\t\t\ttextEncoder.encode('mediaGrid'),\n\t\t\t\t\ttextEncoder.encode(text),\n\t\t\t\t\tContentData.MediaGroupData,\n\t\t\t\t\tnew MediaGroupDataT(items)\n\t\t\t\t)\n\t\t\t);\n\t\t} else {\n\t\t\tprocessedBlocks.push(mediaGroup[0]);\n\t\t}\n\t}\n\n\treturn processedBlocks;\n}\n","import { generateSecretKey, getPublicKey } from 'nostr-tools';\nimport { getManager } from '.';\n\nexport { ConnectionTracker } from './lib/ConnectionTracker';\n\nexport * from './lib/NarrowTypes';\nexport * from './lib/ParseContent';\n\n/**\n * Extracts keys from T where the value is a `function(i: number): any`\n */\ntype FlatBufferKeys<T> = {\n\t[K in keyof T]: T[K] extends (i: number) => any ? K : never;\n}[keyof T];\n\n/**\n * Non-nullable version: Filters out null results\n */\nexport function fbIterable<T, K extends FlatBufferKeys<T>>(\n\tobj: T,\n\tfieldName: K\n): Iterable<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> {\n\tconst length = (obj as any)[`${String(fieldName)}Length`]();\n\treturn {\n\t\t[Symbol.iterator](): Iterator<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> {\n\t\t\tlet i = 0;\n\t\t\treturn {\n\t\t\t\tnext(): IteratorResult<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> {\n\t\t\t\t\twhile (i < length) {\n\t\t\t\t\t\tconst value = (obj as any)[fieldName](i);\n\t\t\t\t\t\ti++;\n\t\t\t\t\t\tif (value != null) {\n\t\t\t\t\t\t\treturn { value, done: false };\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// if null → skip this index\n\t\t\t\t\t}\n\t\t\t\t\treturn { value: undefined as any, done: true };\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t};\n}\n\n/**\n * Eager array version (non-null)\n */\nexport function fbArray<T, K extends FlatBufferKeys<T>>(\n\tobj: T,\n\tfieldName: K\n): Array<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> {\n\tif (!obj) return [];\n\tconst lengthGetter = (obj as any)[`${String(fieldName)}Length`]?.bind(obj);\n\tif (!lengthGetter) return [];\n\tconst length = lengthGetter();\n\n\tconst result: Array<NonNullable<ReturnType<Extract<T[K], (i: number) => any>>>> = [];\n\tfor (let i = 0; i < length; i++) {\n\t\tconst v = (obj as any)[fieldName](i);\n\t\tif (v != null) result.push(v);\n\t}\n\treturn result;\n}\n\n// In your frontend application\nexport async function connectWithQRCode(appName: string, relays: string[]) {\n\t// Generate a client keypair\n\tconst clientKeys = generateSecretKey();\n\tconst clientPubkey = getPublicKey(clientKeys);\n\tconst clientSecretHex = Array.from(clientKeys)\n\t\t.map((b) => b.toString(16).padStart(2, '0'))\n\t\t.join('');\n\n\t// Generate a random secret\n\tconst secret = getPublicKey(generateSecretKey());\n\n\tconst params = new URLSearchParams();\n\n\tfor (const relay of relays) {\n\t\tparams.append('relay', relay);\n\t}\n\n\tparams.set('secret', secret);\n\tparams.set('name', appName);\n\n\tconst nostrconnectUrl = `nostrconnect://${clientPubkey}?${params.toString()}`;\n\n\tconsole.log('connect url:', nostrconnectUrl);\n\n\t// Set up the NIP-46 signer with the client's pubkey and relays\n\t// Note: We don't know the remote signer's pubkey yet - that's what we're discovering\n\tgetManager().setNip46QR(nostrconnectUrl, clientSecretHex);\n\n\treturn nostrconnectUrl;\n}\n"],"names":["ConnectionTracker","msg","status","isConnectionStatus","id","textEncoder","parseContent","content","blocks","textBlock","text","ContentBlockT","ContentData","imageBlock","url","ImageDataT","videoBlock","VideoDataT","codeBlock","raw","full","nl","language","code","firstLine","rest","CodeDataT","cashuBlock","token","CashuDataT","hashtagBlock","tag","HashtagDataT","linkBlock","LinkPreviewDataT","nostrBlock","bech32","fullText","decoded","nip19","type","relays","author","kind","d","NostrDataT","patterns","match","allMatches","pattern","start","end","block","a","b","filteredMatches","existing","lastIndex","processedBlocks","mediaGroup","isWhitespace","s","i","items","m","MediaItemT","MediaGroupDataT","fbIterable","obj","fieldName","length","value","fbArray","lengthGetter","result","v","connectWithQRCode","appName","clientKeys","generateSecretKey","clientPubkey","getPublicKey","clientSecretHex","secret","params","relay","nostrconnectUrl","getManager"],"mappings":"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"}