import { db, exitNodes } from "@server/db"; import config from "@server/lib/config"; import { findNextAvailableCidr } from "@server/lib/ip"; export async function getNextAvailableSubnet(): Promise { // Get all existing subnets from routes table const existingAddresses = await db .select({ address: exitNodes.address }) .from(exitNodes); const addresses = existingAddresses.map((a) => a.address); let subnet = findNextAvailableCidr( addresses, config.getRawConfig().gerbil.block_size, config.getRawConfig().gerbil.subnet_group ); if (!subnet) { throw new Error("No available subnets remaining in space"); } // replace the last octet with 1 subnet = subnet.split(".").slice(0, 3).join(".") + ".1" + "/" + subnet.split("/")[1]; return subnet; }