51 lines
1.8 KiB
TypeScript
51 lines
1.8 KiB
TypeScript
|
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<void>((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)
|
||
|
})
|
||
|
})
|
||
|
|
||
|
}
|