-
Notifications
You must be signed in to change notification settings - Fork 190
Expand file tree
/
Copy pathrecord.ts
More file actions
108 lines (98 loc) · 3.64 KB
/
Copy pathrecord.ts
File metadata and controls
108 lines (98 loc) · 3.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { Observable, sendToExtension } from '@datadog/browser-core'
import type { LifeCycle, RumConfiguration, ViewHistory } from '@datadog/browser-rum-core'
import * as replayStats from '../replayStats'
import type { BrowserRecord } from '../../types'
import type { Tracker } from './trackers'
import {
trackFocus,
trackInput,
trackMediaInteraction,
trackMouseInteraction,
trackMove,
trackMutation,
trackScroll,
trackStyleSheet,
trackViewEnd,
trackViewportResize,
trackVisualViewportResize,
trackCanvas2DMutations,
} from './trackers'
import { createElementsScrollPositions } from './elementsScrollPositions'
import type { ShadowRootsController } from './shadowRootsController'
import { initShadowRootsController } from './shadowRootsController'
import { startFullSnapshots } from './startFullSnapshots'
import type { EmitRecordCallback, EmitStatsCallback } from './record.types'
import { createRecordingScope } from './recordingScope'
import { createCanvasManager } from './canvas/canvasManager'
import type { CapturedCanvasImage } from './canvas/canvasCapture'
import { startCanvasCapture } from './canvas/canvasCapture'
export interface RecordOptions {
emitRecord: EmitRecordCallback
emitStats: EmitStatsCallback
configuration: RumConfiguration
lifeCycle: LifeCycle
viewHistory: ViewHistory
}
export interface RecordAPI {
canvasImageObservable: Observable<CapturedCanvasImage>
stop: () => void
flushMutations: () => void
shadowRootsController: ShadowRootsController
}
export function record(options: RecordOptions): RecordAPI {
const { emitRecord, emitStats, configuration, lifeCycle } = options
const canvasImageObservable = new Observable<CapturedCanvasImage>()
// runtime checks for user options
if (!emitRecord || !emitStats) {
throw new Error('emit functions are required')
}
const processRecord: EmitRecordCallback = (record: BrowserRecord) => {
emitRecord(record)
sendToExtension('record', { record })
const view = options.viewHistory.findView()!
replayStats.addRecord(view.id)
}
const shadowRootsController = initShadowRootsController(processRecord, emitStats)
const scope = createRecordingScope(configuration, createElementsScrollPositions(), shadowRootsController)
const { stop: stopFullSnapshots } = startFullSnapshots(lifeCycle, processRecord, emitStats, flushMutations, scope)
function flushMutations() {
shadowRootsController.flush()
mutationTracker.flush()
}
const mutationTracker = trackMutation(document, processRecord, emitStats, scope)
const trackers: Tracker[] = [
mutationTracker,
trackMove(processRecord, scope),
trackMouseInteraction(processRecord, scope),
trackScroll(document, processRecord, scope),
trackViewportResize(processRecord),
trackInput(document, processRecord, scope),
trackMediaInteraction(processRecord, scope),
trackStyleSheet(processRecord, scope),
trackFocus(processRecord),
trackVisualViewportResize(processRecord),
trackViewEnd(lifeCycle, processRecord, flushMutations),
]
if (
configuration.enableSessionReplayCanvasRecording &&
configuration.enableSessionReplayCanvasRecording.maxFramesPerSecond > 0
) {
const canvasManager = createCanvasManager()
trackers.push(
trackCanvas2DMutations(canvasManager.markCanvasDirty),
startCanvasCapture(canvasManager, configuration.canvasMaxFramesPerSecond, (image) =>
canvasImageObservable.notify(image)
)
)
}
return {
canvasImageObservable,
stop: () => {
shadowRootsController.stop()
trackers.forEach((tracker) => tracker.stop())
stopFullSnapshots()
},
flushMutations,
shadowRootsController,
}
}