refactor: extract recording code into separate modules with proper types
- Create extension/src/offscreen-types.ts with Chrome tabCapture constraint types - Create extension/src/recording.ts extracting recording functions from background.ts - Create playwriter/src/recording-relay.ts extracting recording logic from cdp-relay.ts - Remove 'as any' usages by adding proper MediaStream constraint types - Add typesafe message types for offscreen document communication - Remove duplicate OUR_EXTENSION_IDS constant (uses EXTENSION_IDS from utils.ts)
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
/**
|
||||
* Types for communication between background.ts and offscreen.ts.
|
||||
* These are Chrome extension internal messages, separate from the WS protocol types.
|
||||
*/
|
||||
|
||||
// Chrome-specific MediaStreamConstraints that TypeScript doesn't know about.
|
||||
// These use Chrome's proprietary tabCapture API constraints.
|
||||
// See: https://developer.chrome.com/docs/extensions/reference/tabCapture/
|
||||
export interface ChromeTabCaptureAudioConstraints {
|
||||
mandatory: {
|
||||
chromeMediaSource: 'tab'
|
||||
chromeMediaSourceId: string
|
||||
}
|
||||
}
|
||||
|
||||
export interface ChromeTabCaptureVideoConstraints {
|
||||
mandatory: {
|
||||
chromeMediaSource: 'tab'
|
||||
chromeMediaSourceId: string
|
||||
minFrameRate?: number
|
||||
maxFrameRate?: number
|
||||
}
|
||||
}
|
||||
|
||||
// Offscreen document message types
|
||||
export interface OffscreenStartRecordingMessage {
|
||||
action: 'startRecording'
|
||||
tabId: number
|
||||
streamId: string
|
||||
frameRate?: number
|
||||
videoBitsPerSecond?: number
|
||||
audioBitsPerSecond?: number
|
||||
audio?: boolean
|
||||
}
|
||||
|
||||
export interface OffscreenStopRecordingMessage {
|
||||
action: 'stopRecording'
|
||||
tabId: number
|
||||
}
|
||||
|
||||
export interface OffscreenIsRecordingMessage {
|
||||
action: 'isRecording'
|
||||
tabId: number
|
||||
}
|
||||
|
||||
export interface OffscreenCancelRecordingMessage {
|
||||
action: 'cancelRecording'
|
||||
tabId: number
|
||||
}
|
||||
|
||||
export type OffscreenMessage =
|
||||
| OffscreenStartRecordingMessage
|
||||
| OffscreenStopRecordingMessage
|
||||
| OffscreenIsRecordingMessage
|
||||
| OffscreenCancelRecordingMessage
|
||||
|
||||
// Offscreen document response types
|
||||
export type OffscreenStartRecordingResult = {
|
||||
success: true
|
||||
tabId: number
|
||||
startedAt: number
|
||||
mimeType: string
|
||||
} | {
|
||||
success: false
|
||||
error: string
|
||||
}
|
||||
|
||||
export type OffscreenStopRecordingResult = {
|
||||
success: true
|
||||
tabId: number
|
||||
duration: number
|
||||
} | {
|
||||
success: false
|
||||
error: string
|
||||
}
|
||||
|
||||
export interface OffscreenIsRecordingResult {
|
||||
isRecording: boolean
|
||||
tabId: number
|
||||
startedAt?: number
|
||||
}
|
||||
|
||||
export type OffscreenCancelRecordingResult = {
|
||||
success: true
|
||||
tabId: number
|
||||
} | {
|
||||
success: false
|
||||
error: string
|
||||
}
|
||||
|
||||
// Messages sent FROM offscreen TO background
|
||||
export interface OffscreenRecordingChunkMessage {
|
||||
action: 'recordingChunk'
|
||||
tabId: number
|
||||
data?: number[] // Array from Uint8Array for message passing
|
||||
final?: boolean
|
||||
}
|
||||
|
||||
export interface OffscreenRecordingCancelledMessage {
|
||||
action: 'recordingCancelled'
|
||||
tabId: number
|
||||
}
|
||||
|
||||
export type OffscreenOutgoingMessage =
|
||||
| OffscreenRecordingChunkMessage
|
||||
| OffscreenRecordingCancelledMessage
|
||||
Reference in New Issue
Block a user