UNPKG

@xnstream/player-sdk

Version:

XStream Player SDK - A powerful video player SDK for streaming content

129 lines 4.63 kB
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