Files
httptoolkit/scripts/ws-check.js
T
shihaam 6768b0a5b2
Build & Release binary / build (push) Successful in 26m20s
build works now
2026-08-22 16:14:56 +05:00

57 lines
2.3 KiB
JavaScript

/*
* Exercises the admin-server WebSocket path that the UI uses, which the plain
* HTTP smoke test never touches.
*
* mockttp's admin server wraps each admin client's connection with
* Ws.createWebSocketStream(). Under bun's built-in `ws` shim that throws
* "Not supported yet in Bun" and kills the whole server the moment the UI opens a
* session - so a binary can pass every HTTP check and still die on first real use.
*
* Run with node (this is a *client*; the binary under test is the server).
* Usage: node ws-check.js [adminServerUrl]
*/
const mockttp = require('mockttp');
const adminServerUrl = process.argv[2] || 'http://127.0.0.1:45456';
// The admin server runs corsOptions.strict, so it requires an Origin from
// MOCKTTP_ALLOWED_ORIGINS - the same one the browser UI sends.
const origin = process.argv[3] || 'http://localhost:8099';
(async () => {
const server = mockttp.getRemote({
adminServerUrl,
client: { headers: { origin } }
});
// start() opens the admin WebSocket + subscription stream. This is the call
// that used to crash the server process.
await server.start();
console.log(` admin session started, mock server on port ${server.port}`);
await server.forGet('/ws-check').thenReply(200, 'ws-check-ok');
const res = await fetch(`http://127.0.0.1:${server.port}/ws-check`);
const body = await res.text();
if (body !== 'ws-check-ok') {
throw new Error(`unexpected proxied response: ${JSON.stringify(body)}`);
}
console.log(' proxied request through the mock server OK');
// Confirm the subscription stream is live, not just connected. Subscribing is
// async on a remote client, so settle before generating traffic or we race it.
const seen = new Promise((resolve) => server.on('request', (r) => resolve(r.path)));
await new Promise((r) => setTimeout(r, 1000));
await fetch(`http://127.0.0.1:${server.port}/ws-check`);
const path = await Promise.race([
seen,
new Promise((_, rej) => setTimeout(() => rej(new Error('no event over subscription stream')), 10000))
]);
console.log(` received '${path}' event over the subscription stream`);
await server.stop();
console.log(' admin session stopped cleanly');
})().catch((e) => {
console.error('!! ws-check FAILED:', e.message);
process.exit(1);
});