@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
text/typescript
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;
}
}