fix: harden node bridge keepalive

This commit is contained in:
Peter Steinberger
2026-01-09 15:45:09 +01:00
parent 6177c2d575
commit f5cc6bb283
5 changed files with 97 additions and 56 deletions

View File

@@ -3,10 +3,10 @@ import net from "node:net";
import os from "node:os";
import path from "node:path";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
import { approveNodePairing, listNodePairing } from "../node-pairing.js";
import { startNodeBridgeServer } from "./server.js";
import { configureNodeBridgeSocket, startNodeBridgeServer } from "./server.js";
function createLineReader(socket: net.Socket) {
let buffer = "";
@@ -70,6 +70,16 @@ describe("node bridge server", () => {
delete process.env.CLAWDBOT_ENABLE_BRIDGE_IN_TESTS;
});
it("enables keepalive on sockets", () => {
const socket = {
setNoDelay: vi.fn(),
setKeepAlive: vi.fn(),
};
configureNodeBridgeSocket(socket);
expect(socket.setNoDelay).toHaveBeenCalledWith(true);
expect(socket.setKeepAlive).toHaveBeenCalledWith(true, 15_000);
});
it("rejects hello when not paired", async () => {
const server = await startNodeBridgeServer({
host: "127.0.0.1",

View File

@@ -160,6 +160,14 @@ function isTestEnv() {
return process.env.NODE_ENV === "test" || Boolean(process.env.VITEST);
}
export function configureNodeBridgeSocket(socket: {
setNoDelay: (noDelay?: boolean) => void;
setKeepAlive: (enable?: boolean, initialDelay?: number) => void;
}) {
socket.setNoDelay(true);
socket.setKeepAlive(true, 15_000);
}
function encodeLine(frame: AnyBridgeFrame) {
return `${JSON.stringify(frame)}\n`;
}
@@ -228,7 +236,7 @@ export async function startNodeBridgeServer(
const loopbackHost = "127.0.0.1";
const onConnection = (socket: net.Socket) => {
socket.setNoDelay(true);
configureNodeBridgeSocket(socket);
let buffer = "";
let isAuthenticated = false;