UNPKG

rx-player

Version:
109 lines (108 loc) 4.05 kB
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, }, }); } }