@xnstream/player-sdk
Version:
XStream Player SDK - A powerful video player SDK for streaming content
129 lines • 4.63 kB
JavaScript
import Hls from 'hls.js';
export class DeliveryCollector {
constructor(streamCode, hls, resource, edge_id, context) {
this.events = [];
this.context = context || {};
this.streamCode = streamCode;
this.hlsPlayer = hls;
this.resource = resource;
this.edge_id = edge_id;
this.setupHlsEventListeners();
}
setupHlsEventListeners() {
this.hlsPlayer.on(Hls.Events.ERROR, (_eventType, details) => {
this.recordEvent(DeliveryCollector.EVENT_TYPES.HLS_ERROR, details);
});
this.hlsPlayer.on(Hls.Events.MANIFEST_LOADED, () => {
this.recordEvent(DeliveryCollector.EVENT_TYPES.HLS_MANIFEST_LOADED, {});
});
this.hlsPlayer.on(Hls.Events.FRAG_LOADED, (_eventType, data) => {
this.recordEvent(DeliveryCollector.EVENT_TYPES.FRAGMENT_LOADED, data);
});
}
recordEvent(eventType, details) {
let event = undefined;
switch (eventType) {
case DeliveryCollector.EVENT_TYPES.HLS_MANIFEST_LOADED:
event = {
name: 'watchtime',
timestamp: Date.now(),
data: this.onManifestParsed(),
};
break;
case DeliveryCollector.EVENT_TYPES.HLS_ERROR:
event = {
name: 'error',
timestamp: Date.now(),
data: this.onError(details),
};
break;
case DeliveryCollector.EVENT_TYPES.FRAGMENT_LOADED:
event = {
name: 'bandwidth',
timestamp: Date.now(),
data: this.onFragmentLoaded(details),
};
break;
default:
break;
}
if (event) {
this.events.push(event);
}
}
onManifestParsed() {
const event = {
action: 'start',
duration: 0,
content_type: this.resource.type,
content_id: this.streamCode,
content_title: this.getContentTitle(),
edge_id: this.edge_id,
};
return this.context.user_id ? { ...event, user_id: this.context.user_id } : event;
}
onError(details) {
var _a, _b;
const event = {
error_type: details.type,
error_code: details.details,
level: details.fatal ? 'fatal' : 'non-fatal',
content_type: this.resource.type,
content_id: this.streamCode,
content_title: this.getContentTitle(),
edge_id: this.edge_id,
description: JSON.stringify({
url: details.url,
response: details.response,
reason: details.reason,
level: details.level,
}),
stack_trace: (_b = (_a = details.error) === null || _a === void 0 ? void 0 : _a.stack) !== null && _b !== void 0 ? _b : '',
};
return this.context.user_id ? { ...event, user_id: this.context.user_id } : event;
}
onFragmentLoaded(data) {
var _a, _b, _c;
const frag = data.frag;
const event = {
content_type: this.resource.type,
content_id: this.streamCode,
content_title: this.getContentTitle(),
bytes_size: Math.round((_a = frag.byteLength) !== null && _a !== void 0 ? _a : 0),
edge_id: this.edge_id,
fragment_duration: Math.round((_b = frag.duration) !== null && _b !== void 0 ? _b : 0),
est_bandwidth: Math.round((_c = frag.stats.bwEstimate) !== null && _c !== void 0 ? _c : 0),
fragment_url: frag.url,
fragment_level: frag.level.toString(),
fragment_sn: frag.sn,
};
return this.context.user_id ? { ...event, user_id: this.context.user_id } : event;
}
getContentTitle() {
if (this.resource.type === 'live') {
return this.resource.resource.name;
}
else {
return this.resource.resource.title || this.streamCode;
}
}
flush() {
const events = [...this.events];
this.events = [];
return events;
}
destroy() {
// Cleanup if needed
}
}
DeliveryCollector.eventsToTrack = [
'hlsManifestLoaded',
'hlsError',
'fragmentLoaded',
];
DeliveryCollector.EVENT_TYPES = {
HLS_MANIFEST_LOADED: 'hlsManifestLoaded',
HLS_ERROR: 'hlsError',
FRAGMENT_LOADED: 'fragmentLoaded',
};
//# sourceMappingURL=DeliveryCollector.js.map