@browserless/screencast
Version:
Capture website interactions frame-by-frame to create videos and GIFs. Perfect for demos, tutorials, and automated testing.
39 lines (33 loc) • 1.11 kB
JavaScript
module.exports = (page, opts) => {
const cdp = page._client()
let onFrame
let hasFrameListener = false
const onScreencastFrame = ({ data, metadata, sessionId }) => {
cdp.send('Page.screencastFrameAck', { sessionId }).catch(() => {})
if (metadata.timestamp && onFrame) onFrame(data, metadata)
}
const attachFrameListener = () => {
if (hasFrameListener) return
cdp.on('Page.screencastFrame', onScreencastFrame)
hasFrameListener = true
}
const detachFrameListener = () => {
if (!hasFrameListener) return
cdp.off('Page.screencastFrame', onScreencastFrame)
hasFrameListener = false
}
return {
// https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-startScreencast
start: () => {
if (!onFrame) throw new Error('onFrame callback must be registered before calling start()')
attachFrameListener()
return cdp.send('Page.startScreencast', opts)
},
onFrame: fn => (onFrame = fn),
stop: () => {
detachFrameListener()
return cdp.send('Page.stopScreencast').catch(() => {})
}
}
}