rx-player
Version:
Canal+ HTML5 Video Player
109 lines (108 loc) • 4.05 kB
JavaScript
import { addFeatures } from "./features";
import initializeWorker from "./initialize_worker";
import logger from "./log";
import globalScope from "./utils/global_scope";
let isInitialized = false;
export default class RxPlayerWorker {
/**
* Add feature(s) to the RxPlayer.
* @param {Array.<Object>} featureList - Features wanted.
*/
static addFeatures(featureList) {
addFeatures(featureList);
}
constructor() {
if (isInitialized) {
throw new Error("You can create only one RxPlayerWorker at most");
}
this._representationFiltersMap = new Map();
this._segmentLoadersMap = new Map();
this._manifestLoadersMap = new Map();
isInitialized = true;
this._messageListeners = new Map();
globalScope.addEventListener("message", (evt) => {
if (evt.data.type === "app-defined" /* MainThreadMessageType.AppDefined */) {
const { name, payload } = evt.data.value;
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
const listeners = this._messageListeners.get(name);
if (listeners === undefined) {
return;
}
for (const listener of listeners.slice()) {
try {
listener(payload);
}
catch (err) {
logger.error("Core", "A message listener failed with an error:", err instanceof Error ? err : "Unknown Error");
}
}
}
});
initializeWorker({
representationFilters: this._representationFiltersMap,
segmentLoaders: this._segmentLoadersMap,
manifestLoaders: this._manifestLoadersMap,
});
}
registerRepresentationFilter(identifier, implem) {
if (implem === null) {
this._representationFiltersMap.delete(identifier);
return;
}
this._representationFiltersMap.set(identifier, implem);
}
registerSegmentLoader(identifier, implem) {
if (implem === null) {
this._segmentLoadersMap.delete(identifier);
return;
}
this._segmentLoadersMap.set(identifier, implem);
}
registerManifestLoader(identifier, implem) {
if (implem === null) {
this._manifestLoadersMap.delete(identifier);
return;
}
this._manifestLoadersMap.set(identifier, implem);
}
addMessageListener(messageName, callback) {
const prev = this._messageListeners.get(messageName);
/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument */
// FIXME: I am not 100% certain why TypeScript is complaining here.
if (prev === undefined) {
this._messageListeners.set(messageName, [callback]);
}
else {
this._messageListeners.set(messageName, [...prev, callback]);
}
/* eslint-enable @typescript-eslint/no-explicit-any */
}
removeMessageListener(messageName, callback) {
const prev = this._messageListeners.get(messageName);
if (prev === undefined) {
return;
}
while (true) {
// FIXME: I am not 100% certain why TypeScript is complaining here.
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
const indexOf = prev.indexOf(callback);
if (indexOf < 0) {
return;
}
prev.splice(indexOf, 1);
if (prev.length === 0) {
this._messageListeners.delete(messageName);
return;
}
}
}
sendMessage(messageName, payload) {
globalScope.postMessage({
type: "app-defined" /* CoreMessageType.AppDefined */,
value: {
name: messageName,
payload,
},
});
}
}