import WebSocket from "ws" import { MSG } from "./server" export async function linkProxyServer(server: string, proxy: string) { console.log("Running in proxy mode", proxy) return new Promise((resolve, reject) => { const serverListener = new WebSocket(`ws://${server}`, { headers: { "role": "PROXY" } }) let proxyUserId: string | undefined = undefined const controlConnector = new WebSocket(`ws://${proxy}`) let transferConnector: WebSocket | undefined = undefined; serverListener.on('open', () => { console.log('Proxy attached to server', server) resolve() }) serverListener.on('message', (data) => { transferConnector?.send(data) }) serverListener.on('error', (error) => { console.log(error) transferConnector?.close() controlConnector?.close() reject(error) }) controlConnector.on('open', () => { console.log('Connected to proxy', proxy) }) controlConnector.on('message', (data) => { const msg = JSON.parse(data as string) as MSG const payload = msg.payload if (msg.cmd === "SetUserId") { proxyUserId = payload.userId const nextPort = payload.port const transferAddr = proxy.replace(/:[0-9]*/, "") + ":" + nextPort console.log("Get proxy UserId", proxyUserId, "addr", transferAddr) transferConnector = new WebSocket("ws://" + transferAddr) } }) controlConnector.on('error', (error) => { console.log(error) transferConnector?.close() controlConnector?.close() reject(error) }) }) }