fosrl.pangolin/server/routers/newt/peers.ts

115 lines
2.5 KiB
TypeScript
Raw Normal View History

import { db } from "@server/db";
import { newts, sites } from "@server/db";
2025-04-20 16:49:48 -04:00
import { eq } from "drizzle-orm";
import { sendToClient } from "../ws";
import logger from "@server/logger";
2025-02-21 10:55:38 -05:00
2025-04-20 16:49:48 -04:00
export async function addPeer(
siteId: number,
peer: {
publicKey: string;
allowedIps: string[];
endpoint: string;
}
) {
const [site] = await db
.select()
.from(sites)
.where(eq(sites.siteId, siteId))
.limit(1);
2025-02-21 10:55:38 -05:00
if (!site) {
throw new Error(`Exit node with ID ${siteId} not found`);
}
// get the newt on the site
2025-04-20 16:49:48 -04:00
const [newt] = await db
.select()
.from(newts)
.where(eq(newts.siteId, siteId))
.limit(1);
2025-02-21 10:55:38 -05:00
if (!newt) {
2025-04-13 21:28:11 -04:00
throw new Error(`Site found for site ${siteId}`);
2025-02-21 10:55:38 -05:00
}
sendToClient(newt.newtId, {
2025-04-20 16:49:48 -04:00
type: "newt/wg/peer/add",
2025-02-21 10:55:38 -05:00
data: peer
});
2025-02-23 16:49:41 -05:00
logger.info(`Added peer ${peer.publicKey} to newt ${newt.newtId}`);
2025-05-11 12:29:58 -04:00
return site;
2025-02-21 10:55:38 -05:00
}
export async function deletePeer(siteId: number, publicKey: string) {
2025-04-20 16:49:48 -04:00
const [site] = await db
.select()
.from(sites)
.where(eq(sites.siteId, siteId))
.limit(1);
2025-02-21 10:55:38 -05:00
if (!site) {
2025-04-13 21:28:11 -04:00
throw new Error(`Site with ID ${siteId} not found`);
2025-02-21 10:55:38 -05:00
}
// get the newt on the site
2025-04-20 16:49:48 -04:00
const [newt] = await db
.select()
.from(newts)
.where(eq(newts.siteId, siteId))
.limit(1);
2025-02-21 10:55:38 -05:00
if (!newt) {
throw new Error(`Newt not found for site ${siteId}`);
}
sendToClient(newt.newtId, {
2025-04-20 16:49:48 -04:00
type: "newt/wg/peer/remove",
2025-02-21 10:55:38 -05:00
data: {
publicKey
}
});
2025-02-23 16:49:41 -05:00
logger.info(`Deleted peer ${publicKey} from newt ${newt.newtId}`);
2025-05-11 12:29:58 -04:00
return site;
2025-03-31 15:45:51 -04:00
}
2025-04-20 16:49:48 -04:00
export async function updatePeer(
siteId: number,
publicKey: string,
peer: {
allowedIps?: string[];
endpoint?: string;
}
) {
const [site] = await db
.select()
.from(sites)
.where(eq(sites.siteId, siteId))
.limit(1);
2025-03-31 15:45:51 -04:00
if (!site) {
2025-04-13 21:28:11 -04:00
throw new Error(`Site with ID ${siteId} not found`);
2025-03-31 15:45:51 -04:00
}
// get the newt on the site
2025-04-20 16:49:48 -04:00
const [newt] = await db
.select()
.from(newts)
.where(eq(newts.siteId, siteId))
.limit(1);
2025-03-31 15:45:51 -04:00
if (!newt) {
throw new Error(`Newt not found for site ${siteId}`);
}
sendToClient(newt.newtId, {
2025-04-20 16:49:48 -04:00
type: "newt/wg/peer/update",
2025-03-31 15:45:51 -04:00
data: {
publicKey,
...peer
}
});
logger.info(`Updated peer ${publicKey} on newt ${newt.newtId}`);
2025-05-11 12:29:58 -04:00
return site;
2025-04-20 16:49:48 -04:00
}