UNPKG

@playkit-js/kwebcast-ended-message

Version:

Allows administrators to configure a message that will will be displayed at the end of a kWebcast event.

104 lines (83 loc) 3.21 kB
import { KWebcastMetadataLoader } from '../providers/kwebcast'; import { SchedulingData } from '../types/scheduling-data'; type KalturaMetadata = { id: number; xml: string | null; objectId: string; }; type KalturaMetadataListResponse = { objects: KalturaMetadata[]; totalCount: number; }; export class KWebcastHelper { private player: KalturaPlayerTypes.Player; private entryId: string; private initPromise?; private metadata: KalturaMetadataListResponse | null = null; constructor(player: KalturaPlayerTypes.Player) { this.player = player; this.entryId = this.player.config.sources.id ?? ''; this.initPromise = this.init(); } private async init(): Promise<void> { if (this.entryId) { const response: Map<string, any> = await this.player.provider.doRequest([ { loader: KWebcastMetadataLoader, params: { entryId: this.entryId } } ]); if (response.has(KWebcastMetadataLoader.id) && response.get(KWebcastMetadataLoader.id)) { const data = response.get(KWebcastMetadataLoader.id).response[0].data ?? null; if (this.isMetadataResponse(data)) { this.metadata = data; } } } } private isMetadataResponse(data: unknown): data is KalturaMetadataListResponse | null { return data === null || (data !== null && typeof data === 'object' && 'objectType' in data && data.objectType === 'KalturaMetadataListResponse'); } public async isKWebcastEntry(): Promise<boolean> { await this.initPromise; if (!this.metadata) { return false; } const metadataXml = this.getMetadataXmlByRegExpression(this.metadata, [/<IsKwebcastEntry>/]); if (metadataXml === null) { return false; } const xmlParser = new DOMParser(); const doc = xmlParser.parseFromString(metadataXml, 'application/xml'); return doc.querySelector('IsKwebcastEntry')?.firstChild?.textContent === '1'; } public async getSchedulingData(): Promise<SchedulingData | null> { await this.initPromise; if (!this.metadata) { return null; } const metadataXml = this.getMetadataXmlByRegExpression(this.metadata, [/<StartTime>/, /<EndTime>/, /<Timezone>/]); if (!metadataXml) { return null; } const xmlParser = new DOMParser(); const xml = xmlParser.parseFromString(metadataXml, 'application/xml'); return { startTime: Number(xml.querySelector('StartTime')?.firstChild?.textContent), endTime: Number(xml.querySelector('EndTime')?.firstChild?.textContent), timezone: xml.querySelector('Timezone')?.firstChild?.textContent ?? 'UTC' }; } private getMetadataXmlByRegExpression(metadataListResponse: KalturaMetadataListResponse, regex: RegExp[]): string | null { let matchingMetadataObjectXml = null; metadataListResponse.objects.forEach((metadataObject: KalturaMetadata) => { let matches = true; if (typeof metadataObject.xml === 'string') { regex.forEach((regex) => { matches = matches && regex.test(metadataObject.xml ?? ''); }); } if (matches) { matchingMetadataObjectXml = metadataObject.xml; } }); return matchingMetadataObjectXml; } }