src/voice/voiceBrowserStreamPublish.test.ts

import { test } from "bun:test"; import assert from "node:assert/strict"; import { buildStreamKey } from "../selfbot/streamDiscovery.ts"; import { createStreamPublishState } from "./voiceStreamPublish.ts"; import { startBrowserSessionStreamPublish, stopBrowserSessionStreamPublish } from "./voiceBrowserStreamPublish.ts";

test("startBrowserSessionStreamPublish forwards browser frames into clankvox and stops cleanly", async () => { const calls: Array<Record<string, string | number>> = []; let resolveFirstFrame!: () => void; const firstFramePromise = new Promise((resolve) => { resolveFirstFrame = resolve; });

const session = { id: "session-1", guildId: "guild-1", textChannelId: "text-1", voiceChannelId: "voice-1", ending: false, cleanupHandlers: [] as Array<() => void>, streamPublish: { ...createStreamPublishState(), active: true, paused: false, streamKey: buildStreamKey("guild-1", "voice-1", "self-user"), guildId: "guild-1", channelId: "voice-1", sourceKind: "music" as const, visualizerMode: "cqt" as const, sourceKey: "https://youtube.com/watch?v=abc123", sourceUrl: "https://youtube.com/watch?v=abc123", sourceLabel: "https://youtube.com/watch?v=abc123", lastVoiceSessionId: "voice-session-1", transportStatus: "ready", transportConnectedAt: 1 }, voxClient: { streamPublishBrowserStart(mimeType?: string) { calls.push({ type: "browser_start", mimeType: String(mimeType || "") }); }, streamPublishBrowserFrame(payload: { mimeType?: string; frameBase64: string; capturedAtMs?: number; }) { calls.push({ type: "browser_frame", mimeType: String(payload.mimeType || ""), capturedAtMs: Math.max(0, Math.round(Number(payload.capturedAtMs) || 0)) }); resolveFirstFrame(); }, streamPublishStop() { calls.push({ type: "stop" }); }, streamPublishDisconnect(reason?: string | null) { calls.push({ type: "disconnect", reason: String(reason || "") }); } } };

const manager = { browserManager: { async screenshot() { return data:image/png;base64,${Buffer.from(frame-${Date.now()}).toString("base64")}; }, async currentUrl() { return "https://example.com/demo"; } }, subAgentSessions: { get(sessionId: string) { if (sessionId !== "browser:1") return null; return { ownerUserId: "user-1", getBrowserSessionKey() { return "session:browser:1"; } }; } }, sessions: new Map([[session.guildId, session]]), client: { user: { id: "self-user" }, ws: { _ws: { send() { return undefined; } }, shards: { first() { return { id: 0 }; } } } }, store: { getSettings() { return null; }, logAction() { return undefined; } } };

const startResult = await startBrowserSessionStreamPublish(manager, { guildId: "guild-1", browserSessionId: "browser:1", requesterUserId: "user-1", source: "voice_realtime_tool_share_browser_session" }); assert.equal(startResult.ok, true); assert.equal(startResult.started, true);

await firstFramePromise;

const stopResult = await stopBrowserSessionStreamPublish(manager, { guildId: "guild-1", reason: "test_complete" }); assert.equal(stopResult.ok, true);

assert.equal(calls.some((entry) => entry.type === "browser_start"), true); assert.equal(calls.some((entry) => entry.type === "browser_frame"), true); assert.equal(calls.some((entry) => entry.type === "stop"), true); assert.equal( calls.some((entry) => entry.type === "disconnect" && entry.reason === "test_complete"), true ); assert.equal(session.streamPublish?.sourceKind, null); });