From 8ff02b6661507ed743bf7cf8e8d585ae3aee8705 Mon Sep 17 00:00:00 2001 From: kitsuyui Date: Fri, 17 Jul 2026 01:50:38 +0900 Subject: [PATCH] fix: pass CLI timeout through to renderer The CLI request already accepts timeout, but renderToStream dropped it before calling the renderer. Propagate the value and cover the handoff with a focused unit test so CLI timeout flags affect navigation as intended. --- src/cli/index.ts | 1 + src/cli/timeout.spec.ts | 66 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/cli/timeout.spec.ts diff --git a/src/cli/index.ts b/src/cli/index.ts index 4ffc950b..3039341f 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -42,6 +42,7 @@ export async function renderToStream( url: url_, waitUntil: request.waitUntil, evaluates: request.evaluates, + timeout: request.timeout, }) await writeToStream(writable, result.body) }) diff --git a/src/cli/timeout.spec.ts b/src/cli/timeout.spec.ts new file mode 100644 index 00000000..8b5b870b --- /dev/null +++ b/src/cli/timeout.spec.ts @@ -0,0 +1,66 @@ +import { Writable } from 'node:stream' +import { beforeEach, describe, expect, it, vi } from 'vitest' + +const { close, getBrowser, getRenderedContent } = vi.hoisted(() => { + const close = vi.fn(async () => {}) + const getBrowser = vi.fn(async () => ({ close })) + const getRenderedContent = vi.fn(async () => ({ + status: 200, + headers: {}, + body: Buffer.from('rendered body'), + evaluateResults: [], + })) + return { close, getBrowser, getRenderedContent } +}) + +vi.mock('../browser', () => ({ + getBrowser, +})) + +vi.mock('../render', () => ({ + getRenderedContent, +})) + +import { renderToStream } from './index' + +describe('renderToStream timeout propagation', () => { + beforeEach(() => { + close.mockClear() + getBrowser.mockClear() + getRenderedContent.mockClear() + }) + + it('passes timeout to the renderer request', async () => { + const chunks: string[] = [] + const writable = new Writable({ + write(chunk, _encoding, callback) { + chunks.push(chunk.toString()) + callback(null) + }, + }) + + await renderToStream( + { + name: 'chromium', + url: 'example.com', + waitUntil: 'networkidle', + evaluates: ['document.title'], + timeout: 1234, + }, + writable, + ) + + expect(getBrowser).toHaveBeenCalledWith({ name: 'chromium' }) + expect(getRenderedContent).toHaveBeenCalledWith( + { close }, + { + url: 'https://example.com', + waitUntil: 'networkidle', + evaluates: ['document.title'], + timeout: 1234, + }, + ) + expect(chunks).toStrictEqual(['rendered body']) + expect(close).toHaveBeenCalledTimes(1) + }) +})