Move exit node comms to new file

This commit is contained in:
Owen
2025-08-14 15:39:05 -07:00
parent 6600de7320
commit 04ecf41c5a
5 changed files with 295 additions and 197 deletions

View File

@@ -1,6 +1,3 @@
import next from "next";
import express from "express";
import { parse } from "url";
import logger from "@server/logger";
import config from "@server/lib/config";
import { createWebSocketClient } from "./routers/ws/client";
@@ -9,6 +6,7 @@ import { db, exitNodes } from "./db";
import { TraefikConfigManager } from "./lib/remoteTraefikConfig";
import { tokenManager } from "./lib/tokenManager";
import { APP_VERSION } from "./lib/consts";
import axios from "axios";
export async function createHybridClientServer() {
logger.info("Starting hybrid client server...");
@@ -34,7 +32,7 @@ export async function createHybridClientServer() {
);
// Register message handlers
client.registerHandler("remote/peers/add", async (message) => {
client.registerHandler("remoteExitNode/peers/add", async (message) => {
const { pubKey, allowedIps } = message.data;
// TODO: we are getting the exit node twice here
@@ -46,7 +44,7 @@ export async function createHybridClientServer() {
});
});
client.registerHandler("remote/peers/remove", async (message) => {
client.registerHandler("remoteExitNode/peers/remove", async (message) => {
const { pubKey } = message.data;
// TODO: we are getting the exit node twice here
@@ -55,7 +53,69 @@ export async function createHybridClientServer() {
await deletePeer(exitNode.exitNodeId, pubKey);
});
client.registerHandler("remote/traefik/reload", async (message) => {
// /update-proxy-mapping
client.registerHandler("remoteExitNode/update-proxy-mapping", async (message) => {
try {
const [exitNode] = await db.select().from(exitNodes).limit(1);
if (!exitNode) {
logger.error("No exit node found for proxy mapping update");
return;
}
const response = await axios.post(`${exitNode.endpoint}/update-proxy-mapping`, message.data);
logger.info(`Successfully updated proxy mapping: ${response.status}`);
} catch (error) {
// Extract useful information from axios error without circular references
if (error && typeof error === 'object' && 'response' in error) {
const axiosError = error as any;
logger.error("Failed to update proxy mapping:", {
status: axiosError.response?.status,
statusText: axiosError.response?.statusText,
data: axiosError.response?.data,
message: axiosError.message,
url: axiosError.config?.url
});
} else {
logger.error("Failed to update proxy mapping:", {
message: error instanceof Error ? error.message : String(error),
stack: error instanceof Error ? error.stack : undefined
});
}
}
});
// /update-destinations
client.registerHandler("remoteExitNode/update-destinations", async (message) => {
try {
const [exitNode] = await db.select().from(exitNodes).limit(1);
if (!exitNode) {
logger.error("No exit node found for destinations update");
return;
}
const response = await axios.post(`${exitNode.endpoint}/update-destinations`, message.data);
logger.info(`Successfully updated destinations: ${response.status}`);
} catch (error) {
// Extract useful information from axios error without circular references
if (error && typeof error === 'object' && 'response' in error) {
const axiosError = error as any;
logger.error("Failed to update destinations:", {
status: axiosError.response?.status,
statusText: axiosError.response?.statusText,
data: axiosError.response?.data,
message: axiosError.message,
url: axiosError.config?.url
});
} else {
logger.error("Failed to update proxy mapping:", {
message: error instanceof Error ? error.message : String(error),
stack: error instanceof Error ? error.stack : undefined
});
}
}
});
client.registerHandler("remoteExitNode/traefik/reload", async (message) => {
await monitor.HandleTraefikConfig();
});
@@ -72,7 +132,9 @@ export async function createHybridClientServer() {
});
client.on("message", (message) => {
logger.info(`Received message: ${message.type} ${JSON.stringify(message.data)}`);
logger.info(
`Received message: ${message.type} ${JSON.stringify(message.data)}`
);
});
// Connect to the server