diff --git a/src/media/host.ts b/src/media/host.ts index 42f105d9c..28a45c086 100644 --- a/src/media/host.ts +++ b/src/media/host.ts @@ -42,9 +42,9 @@ export async function ensureMediaHosted( } if (needsServerStart && opts.startServer) { if (!mediaServer) { - mediaServer = await startMediaServer(port, TTL_MS, runtime); + mediaServer = await startMediaServer(port, TTL_MS, undefined, runtime); logInfo( - `🦞 Started temporary media host on http://localhost:${port}/media/:id (TTL ${TTL_MS / 1000}s)`, + `🦞 Started temporary media host on http://127.0.0.1:${port}/media/:id (TTL ${TTL_MS / 1000}s)`, runtime, ); mediaServer.unref?.(); diff --git a/src/media/server.test.ts b/src/media/server.test.ts index 34182c5f2..4adcc92d8 100644 --- a/src/media/server.test.ts +++ b/src/media/server.test.ts @@ -54,6 +54,13 @@ describe("media server", () => { await new Promise((r) => server.close(r)); }); + it("binds to loopback by default", async () => { + const server = await startMediaServer(0, 5_000); + const addr = server.address() as AddressInfo; + expect(["127.0.0.1", "::1"]).toContain(addr.address); + await new Promise((r) => server.close(r)); + }); + it("expires old media", async () => { const file = path.join(MEDIA_DIR, "old"); await fs.writeFile(file, "stale"); diff --git a/src/media/server.ts b/src/media/server.ts index 4791352d8..1b1430e32 100644 --- a/src/media/server.ts +++ b/src/media/server.ts @@ -83,12 +83,13 @@ export function attachMediaRoutes( export async function startMediaServer( port: number, ttlMs = DEFAULT_TTL_MS, + host = "127.0.0.1", runtime: RuntimeEnv = defaultRuntime, ): Promise { const app = express(); attachMediaRoutes(app, ttlMs, runtime); return await new Promise((resolve, reject) => { - const server = app.listen(port); + const server = app.listen(port, host); server.once("listening", () => resolve(server)); server.once("error", (err) => { runtime.error(danger(`Media server failed: ${String(err)}`));