mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-23 10:45:33 -04:00
52 lines
1.4 KiB
TypeScript
52 lines
1.4 KiB
TypeScript
import type { CDPSession, Page } from "@playwright/test"
|
|
import type { CapturedFrame } from "./model"
|
|
|
|
export type VisualCapture = {
|
|
session: CDPSession
|
|
frames: CapturedFrame[]
|
|
startedAtEpoch: number
|
|
running: boolean
|
|
capture: Promise<void>
|
|
}
|
|
|
|
export async function startVisualCapture(page: Page, startedAtEpoch: number) {
|
|
if (process.env.OPENCODE_STABILITY_CAPTURE !== "1") return
|
|
const session = await page.context().newCDPSession(page)
|
|
await session.send("Page.enable")
|
|
const recording: VisualCapture = {
|
|
session,
|
|
frames: [],
|
|
startedAtEpoch,
|
|
running: true,
|
|
capture: Promise.resolve(),
|
|
}
|
|
recording.capture = (async () => {
|
|
try {
|
|
while (recording.running && recording.frames.length < 900) {
|
|
const frame = await session.send("Page.captureScreenshot", {
|
|
format: "jpeg",
|
|
quality: 80,
|
|
captureBeyondViewport: false,
|
|
optimizeForSpeed: true,
|
|
})
|
|
recording.frames.push({ at: Date.now() - recording.startedAtEpoch, data: frame.data })
|
|
await new Promise((resolve) => setTimeout(resolve, 50))
|
|
}
|
|
} catch {
|
|
recording.running = false
|
|
}
|
|
})()
|
|
return recording
|
|
}
|
|
|
|
export async function stopVisualCapture(recording: VisualCapture | undefined) {
|
|
if (!recording) return []
|
|
recording.running = false
|
|
try {
|
|
await recording.capture
|
|
} finally {
|
|
await recording.session.detach().catch(() => undefined)
|
|
}
|
|
return recording.frames
|
|
}
|