11import { clocksNow , generateUUID } from '@datadog/browser-core'
22import type { StartRumResult } from '../..'
3- import type { WeightAverageMetric } from './metric'
3+ import { createLastMetric , createWeightAverageMetric } from './metric'
44import { createTimer } from './timer'
55
66export interface API {
77 addEvent : AddEvent
88}
99
10- export type AddEvent = StartRumResult [ 'addEvent' ]
11-
1210interface Meta {
1311 duration ?: number
1412 format ?: string
1513 resolution ?: string
1614}
1715
18- interface Metrics {
19- bitrate : WeightAverageMetric
20- fps : WeightAverageMetric
21- timestamp : number
22- watchTime : number
23- }
16+ export type AddEvent = StartRumResult [ 'addEvent' ]
2417
2518type Transition = 'end' | 'error' | 'pause' | 'play' | 'preload' | 'quit' | 'rebuff' | 'seek' | 'start'
2619
2720export function createStream ( api : API ) {
2821 const id = generateUUID ( )
2922 const origin = clocksNow ( )
3023 const timer = createTimer ( )
24+ const meta : Meta = { }
25+ const metrics = {
26+ bitrate : createWeightAverageMetric ( ) ,
27+ fps : createWeightAverageMetric ( ) ,
28+ timestamp : createLastMetric ( ) ,
29+ watchTime : createLastMetric ( ) ,
30+ }
31+
32+ function sendStreamEvent ( ) {
33+ const now = clocksNow ( )
34+
35+ api . addEvent (
36+ now . relative ,
37+ {
38+ date : now . timeStamp ,
39+ type : 'stream' ,
40+ stream : {
41+ id,
42+ bitrate : metrics . bitrate . value ,
43+ duration : meta . duration ,
44+ format : meta . format ,
45+ fps : metrics . fps . value ,
46+ resolution : meta . resolution ,
47+ timestamp : metrics . timestamp . value ,
48+ watch_time : metrics . watchTime . value ,
49+ } ,
50+ } ,
51+ { }
52+ )
53+ }
3154
3255 return {
33- interaction ( id : string ) : void { } ,
56+ interaction ( id : string ) : void {
57+ console . log ( '>>>' , 'interaction' , id )
58+ } ,
59+ set < K extends keyof Meta > ( key : K , value : Meta [ K ] ) : void {
60+ if ( meta [ key ] !== undefined ) {
61+ return
62+ }
63+
64+ meta [ key ] = value
65+
66+ sendStreamEvent ( )
67+ } ,
3468 transition ( state : Transition , context : any ) : void {
3569 if ( state === 'play' ) {
3670 timer . start ( )
@@ -53,20 +87,10 @@ export function createStream(api: API) {
5387 context
5488 )
5589 } ,
56- update ( key : string , value : any ) : void {
57- const now = clocksNow ( )
90+ update ( key : keyof typeof metrics , value : number ) : void {
91+ metrics [ key ] . update ( timer . value , value )
5892
59- api . addEvent (
60- now . relative ,
61- {
62- date : now . timeStamp ,
63- type : 'stream' ,
64- stream : {
65- id : generateUUID ( ) ,
66- } ,
67- } ,
68- { }
69- )
93+ sendStreamEvent ( )
7094 } ,
7195 }
7296}
0 commit comments