76 lines
2.9 KiB
JavaScript
76 lines
2.9 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { createServer } from "node:http";
|
|
import { test } from "node:test";
|
|
import plugin from "./dist/index.js";
|
|
|
|
async function listen(server) {
|
|
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
return `http://127.0.0.1:${server.address().port}`;
|
|
}
|
|
|
|
test("browser session signs a short-lived token and proxies the SDP offer", async () => {
|
|
let upstreamCalls = 0;
|
|
const upstream = createServer(async (req, res) => {
|
|
upstreamCalls += 1;
|
|
assert.equal(req.method, "POST");
|
|
assert.match(req.headers.authorization, /^Bearer [^.]+\.[^.]+$/);
|
|
assert.equal(await new Response(req).text(), "offer-sdp");
|
|
res.writeHead(200, { "Content-Type": "application/sdp" }).end("answer-sdp");
|
|
});
|
|
const upstreamBase = await listen(upstream);
|
|
let provider;
|
|
const routes = [];
|
|
plugin.register({
|
|
registerRealtimeTranscriptionProvider: () => {},
|
|
registerRealtimeVoiceProvider: (value) => { provider = value; },
|
|
registerHttpRoute: (value) => { routes.push(value); },
|
|
runtime: { config: { current: () => ({ talk: { realtime: { providers: {
|
|
"athena-talk": { realtimeUpstreamUrl: `${upstreamBase}/v1/realtime/calls` },
|
|
} } } }) } },
|
|
});
|
|
const route = routes.find((value) => value.path.endsWith("/calls"));
|
|
const keyRoute = routes.find((value) => value.path.endsWith("/public-key"));
|
|
assert.equal(route.path, "/plugins/athena-talk/realtime/calls");
|
|
const browser = await provider.createBrowserSession({
|
|
providerConfig: { realtimeUpstreamUrl: `${upstreamBase}/v1/realtime/calls` },
|
|
model: "athena-local",
|
|
});
|
|
assert.equal(browser.transport, "webrtc");
|
|
assert.ok(browser.expiresAt > Date.now());
|
|
|
|
const proxy = createServer((req, res) => {
|
|
if (req.url === keyRoute.path) return keyRoute.handler(req, res);
|
|
return route.handler(req, res);
|
|
});
|
|
const proxyBase = await listen(proxy);
|
|
try {
|
|
const response = await fetch(`${proxyBase}${browser.offerUrl}`, {
|
|
method: "POST",
|
|
headers: { Authorization: `Bearer ${browser.clientSecret}`, "Content-Type": "application/sdp" },
|
|
body: "offer-sdp",
|
|
});
|
|
assert.equal(response.status, 200);
|
|
assert.equal(await response.text(), "answer-sdp");
|
|
assert.equal(upstreamCalls, 1);
|
|
|
|
const key = await fetch(`${proxyBase}${keyRoute.path}`);
|
|
assert.equal(key.status, 200);
|
|
assert.match(await key.text(), /BEGIN PUBLIC KEY/);
|
|
|
|
const invalid = await fetch(`${proxyBase}${browser.offerUrl}`, {
|
|
method: "POST",
|
|
headers: { Authorization: `Bearer ${browser.clientSecret}x` },
|
|
body: "offer-sdp",
|
|
});
|
|
assert.equal(invalid.status, 401);
|
|
assert.equal(upstreamCalls, 1);
|
|
} finally {
|
|
proxy.closeAllConnections();
|
|
upstream.closeAllConnections();
|
|
await Promise.all([
|
|
new Promise((resolve) => proxy.close(resolve)),
|
|
new Promise((resolve) => upstream.close(resolve)),
|
|
]);
|
|
}
|
|
});
|