import { describe, expect, it, vi } from "vitest"; import { createGatewayBroadcaster } from "./server-broadcast.js"; import type { GatewayWsClient } from "./server/ws-types.js"; type TestSocket = { bufferedAmount: number; send: (payload: string) => void; close: (code: number, reason: string) => void; }; describe("gateway broadcaster", () => { it("filters approval and pairing events by scope", () => { const approvalsSocket: TestSocket = { bufferedAmount: 0, send: vi.fn(), close: vi.fn(), }; const pairingSocket: TestSocket = { bufferedAmount: 0, send: vi.fn(), close: vi.fn(), }; const readSocket: TestSocket = { bufferedAmount: 0, send: vi.fn(), close: vi.fn(), }; const clients = new Set([ { socket: approvalsSocket as unknown as GatewayWsClient["socket"], connect: { role: "operator", scopes: ["operator.approvals"] } as GatewayWsClient["connect"], connId: "c-approvals", }, { socket: pairingSocket as unknown as GatewayWsClient["socket"], connect: { role: "operator", scopes: ["operator.pairing"] } as GatewayWsClient["connect"], connId: "c-pairing", }, { socket: readSocket as unknown as GatewayWsClient["socket"], connect: { role: "operator", scopes: ["operator.read"] } as GatewayWsClient["connect"], connId: "c-read", }, ]); const { broadcast } = createGatewayBroadcaster({ clients }); broadcast("exec.approval.requested", { id: "1" }); broadcast("device.pair.requested", { requestId: "r1" }); expect(approvalsSocket.send).toHaveBeenCalledTimes(1); expect(pairingSocket.send).toHaveBeenCalledTimes(1); expect(readSocket.send).toHaveBeenCalledTimes(0); }); });