mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-23 10:45:33 -04:00
9e0d3976e1
Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: Brendan Allan <git@brendonovich.dev> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Jack <jack@anoma.ly> Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: James Long <longster@gmail.com> Co-authored-by: Dustin Deus <deusdustin@gmail.com> Co-authored-by: starptech <starptech@starptechs-MBP.fritz.box> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> Co-authored-by: Dax <mail@thdxr.com> Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com> Co-authored-by: Jay <53023+jayair@users.noreply.github.com> Co-authored-by: runvip <164729189+runvip@users.noreply.github.com> Co-authored-by: opencode <opencode@sst.dev> Co-authored-by: Julian Coy <julian@ex-machina.co> Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com> Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com> Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: Simon Klee <hello@simonklee.dk> Co-authored-by: Jay <air@live.ca> Co-authored-by: David Hill <1879069+iamdavidhill@users.noreply.github.com>
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
|
|
}
|