import { createDeviceEdgeRelayRuntime } from "./runtime.mjs"; const runtime = createDeviceEdgeRelayRuntime({ ingressEnabled: parseBoolean( process.env.DEVICE_EDGE_RELAY_INGRESS_ENABLED, false, ), healthHost: process.env.DEVICE_EDGE_RELAY_HEALTH_HOST || "127.0.0.1", healthPort: parsePort(process.env.DEVICE_EDGE_RELAY_HEALTH_PORT, 18221), tcpHost: process.env.DEVICE_EDGE_RELAY_TCP_HOST, tcpPort: parsePort(process.env.DEVICE_EDGE_RELAY_TCP_PORT, 9921), upstreamHost: process.env.DEVICE_EDGE_RELAY_UPSTREAM_HOST, upstreamPort: parsePort( process.env.DEVICE_EDGE_RELAY_UPSTREAM_PORT, undefined, ), maxConcurrentSessions: parsePositiveInt( process.env.DEVICE_EDGE_RELAY_MAX_SESSIONS, 100, ), maxSessionsPerAddress: parsePositiveInt( process.env.DEVICE_EDGE_RELAY_MAX_SESSIONS_PER_ADDRESS, 10, ), maxConnectionsPerMinutePerAddress: parsePositiveInt( process.env.DEVICE_EDGE_RELAY_MAX_CONNECTIONS_PER_MINUTE_PER_ADDRESS, 30, ), maxTrackedSourceAddresses: parsePositiveInt( process.env.DEVICE_EDGE_RELAY_MAX_TRACKED_SOURCE_ADDRESSES, 2048, ), maxBytesPerDirection: parsePositiveInt( process.env.DEVICE_EDGE_RELAY_MAX_BYTES_PER_DIRECTION, 262_144, ), sourcePolicy: process.env.DEVICE_EDGE_RELAY_SOURCE_POLICY, sessionTimeoutMs: parsePositiveInt( process.env.DEVICE_EDGE_RELAY_SESSION_TIMEOUT_MS, 10000, ), }); const addresses = await runtime.start(); console.log(JSON.stringify({ event: "device_edge_relay_started", health: addresses.healthAddress, tcp: addresses.tcpAddress, ingress: runtime.status().ingress, protocolInspection: "disabled", commandTransport: "disabled", })); process.on("SIGTERM", shutdown); process.on("SIGINT", shutdown); async function shutdown() { await runtime.stop(); process.exit(0); } function parsePort(value, fallback) { if (value === undefined && fallback === undefined) return undefined; const parsed = Number(value ?? fallback); if (!Number.isSafeInteger(parsed) || parsed < 1 || parsed > 65535) { throw new Error("device_edge_relay_port_invalid"); } return parsed; } function parsePositiveInt(value, fallback) { const parsed = Number(value || fallback); if (!Number.isSafeInteger(parsed) || parsed < 1) { throw new Error("device_edge_relay_positive_integer_invalid"); } return parsed; } function parseBoolean(value, fallback) { if (value === undefined || value === null || value === "") return fallback; const normalized = String(value).trim().toLowerCase(); if (["1", "true", "yes", "on"].includes(normalized)) return true; if (["0", "false", "no", "off"].includes(normalized)) return false; throw new Error("device_edge_relay_boolean_invalid"); }