{"version":3,"file":"cli.cjs","names":["Command","value: string","previous: string[]","SSEWebSocketProxy"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander'\nimport { SSEWebSocketProxy } from './index.js'\n\nconst program = new Command()\n\nprogram\n  .name('sse-websocket-proxy')\n  .description('A proxy server that converts WebSocket connections to Server-Sent Events (SSE) for browsers with network restrictions')\n  .version('0.0.1')\n  .option('-p, --port <port>', 'Port to run the proxy server on', '3001')\n  .option('-k, --keepalive <ms>', 'Keepalive interval in milliseconds', '30000')\n  .option('-t, --timeout <ms>', 'Connection timeout in milliseconds', '60000')\n  .option('-v, --verbose', 'Enable verbose logging (same as SSE_WS_PROXY_VERBOSE=1)')\n  .option(\n    '--allow-host <url>',\n    'Allow connections to this host (can be used multiple times)',\n    (value: string, previous: string[]) => {\n      return previous ? [...previous, value] : [value]\n    },\n    [],\n  )\n  .option('--allow-any-localhost-port', 'Allow connections to any localhost/127.0.0.1 port')\n  .option('--dangerously-allow-any-host', 'DANGEROUS: Allow connections to any host (disables all security)')\n  .addHelpText(\n    'after',\n    `\nExamples:\n  $ npx @convex-dev/sse-websocket-proxy --allow-host https://api.example.com   # Allow only api.example.com\n  $ npx @convex-dev/sse-websocket-proxy --allow-any-localhost-port            # Allow any localhost port\n  $ npx @convex-dev/sse-websocket-proxy --allow-host wss://ws.example.com --allow-host https://api.other.com  # Multiple hosts\n  $ npx @convex-dev/sse-websocket-proxy --allow-any-localhost-port --verbose  # Localhost + verbose logging\n  $ npx @convex-dev/sse-websocket-proxy --dangerously-allow-any-host          # DANGEROUS: Allow any host\n\nUsage in client:\n  The client specifies the backend URL when connecting:\n  GET /sse?backend=ws://localhost:8080&sessionId=abc123\n\nEnvironment Variables:\n  SSE_WS_PROXY_VERBOSE=1        Enable verbose message logging (overrides --verbose)\n  SSE_WS_PROXY_HEALTH_SECRET    Secret required to access detailed health information\n\nAPI Endpoints:\n  GET  /sse?backend=<url>&sessionId=<id>   Server-Sent Events endpoint with backend URL\n  POST /messages                           Send messages to WebSocket backend  \n  GET  /health                             Health check and connection status\n  GET  /health?secret=<secret>             Detailed health info (requires SSE_WS_PROXY_HEALTH_SECRET)\n\nSecurity:\n  You must specify at least one allowed host or use --allow-any-localhost-port\n  By default, no destinations are allowed for security\n  Use --dangerously-allow-any-host only in development environments!\n`,\n  )\n\nprogram.parse(process.argv)\n\nconst options = program.opts()\n\nasync function main() {\n  console.log('This proxy is beta, not officially supported software. Run at your own risk.')\n  // Validate that at least one allowed destination is specified (unless dangerously allowing any host)\n  if (!options.dangerouslyAllowAnyHost && !options.allowAnyLocalhostPort && (!options.allowHost || options.allowHost.length === 0)) {\n    console.error(\n      'Error: You must specify at least one allowed host (--allow-host), use --allow-any-localhost-port, or --dangerously-allow-any-host',\n    )\n    console.error('Run with --help for usage examples')\n    process.exit(1)\n  }\n\n  // Set verbose mode if requested\n  if (options.verbose && !process.env.SSE_WS_PROXY_VERBOSE) {\n    process.env.SSE_WS_PROXY_VERBOSE = '1'\n  }\n\n  const proxy = new SSEWebSocketProxy({\n    port: parseInt(options.port),\n    allowedHosts: options.allowHost || [],\n    allowAnyLocalhostPort: !!options.allowAnyLocalhostPort,\n    dangerouslyAllowAnyHost: !!options.dangerouslyAllowAnyHost,\n    keepaliveInterval: parseInt(options.keepalive),\n    connectionTimeout: parseInt(options.timeout),\n  })\n\n  // Handle graceful shutdown\n  process.on('SIGINT', async () => {\n    console.log('\\nReceived SIGINT, shutting down gracefully...')\n    await proxy.stop()\n    process.exit(0)\n  })\n\n  process.on('SIGTERM', async () => {\n    console.log('Received SIGTERM, shutting down gracefully...')\n    await proxy.stop()\n    process.exit(0)\n  })\n\n  // Start the proxy server\n  try {\n    await proxy.start()\n  } catch (error) {\n    console.error('Failed to start proxy server:', error)\n    process.exit(1)\n  }\n}\n\nmain().catch(console.error)\n"],"mappings":";;;;;;;;AAKA,MAAM,UAAU,IAAIA;AAEpB,QACG,KAAK,sBAAsB,CAC3B,YAAY,wHAAwH,CACpI,QAAQ,QAAQ,CAChB,OAAO,qBAAqB,mCAAmC,OAAO,CACtE,OAAO,wBAAwB,sCAAsC,QAAQ,CAC7E,OAAO,sBAAsB,sCAAsC,QAAQ,CAC3E,OAAO,iBAAiB,0DAA0D,CAClF,OACC,sBACA,+DACA,CAACC,OAAeC,aAAuB;AACrC,QAAO,WAAW,CAAC,GAAG,UAAU,KAAM,IAAG,CAAC,KAAM;AACjD,GACD,CAAE,EACH,CACA,OAAO,8BAA8B,oDAAoD,CACzF,OAAO,gCAAgC,mEAAmE,CAC1G,YACC,UACC;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BF;AAEH,QAAQ,MAAM,QAAQ,KAAK;AAE3B,MAAM,UAAU,QAAQ,MAAM;AAE9B,eAAe,OAAO;AACpB,SAAQ,IAAI,+EAA+E;AAE3F,MAAK,QAAQ,4BAA4B,QAAQ,2BAA2B,QAAQ,aAAa,QAAQ,UAAU,WAAW,IAAI;AAChI,UAAQ,MACN,oIACD;AACD,UAAQ,MAAM,qCAAqC;AACnD,UAAQ,KAAK,EAAE;CAChB;AAGD,KAAI,QAAQ,YAAY,QAAQ,IAAI,qBAClC,SAAQ,IAAI,uBAAuB;CAGrC,MAAM,QAAQ,IAAIC,8BAAkB;EAClC,MAAM,SAAS,QAAQ,KAAK;EAC5B,cAAc,QAAQ,aAAa,CAAE;EACrC,yBAAyB,QAAQ;EACjC,2BAA2B,QAAQ;EACnC,mBAAmB,SAAS,QAAQ,UAAU;EAC9C,mBAAmB,SAAS,QAAQ,QAAQ;CAC7C;AAGD,SAAQ,GAAG,UAAU,YAAY;AAC/B,UAAQ,IAAI,iDAAiD;AAC7D,QAAM,MAAM,MAAM;AAClB,UAAQ,KAAK,EAAE;CAChB,EAAC;AAEF,SAAQ,GAAG,WAAW,YAAY;AAChC,UAAQ,IAAI,gDAAgD;AAC5D,QAAM,MAAM,MAAM;AAClB,UAAQ,KAAK,EAAE;CAChB,EAAC;AAGF,KAAI;AACF,QAAM,MAAM,OAAO;CACpB,SAAQ,OAAO;AACd,UAAQ,MAAM,iCAAiC,MAAM;AACrD,UAAQ,KAAK,EAAE;CAChB;AACF;AAED,MAAM,CAAC,MAAM,QAAQ,MAAM"}