rx-player
Version:
Canal+ HTML5 Video Player
123 lines (122 loc) • 3.79 kB
JavaScript
import log from "../../log";
import { CancellationError } from "../../utils/task_canceller";
/**
* Implementation of an `ITextDisplayerInterface` for the Core, that can run in
* a WebWorker (so, in a different thread than the `ITextDisplayer`).
*
* @class CoreTextDisplayerInterface
*/
export default class CoreTextDisplayerInterface {
/**
* @param {string} contentId
* @param {Object} messageSender
*/
constructor(contentId, messageSender) {
this._contentId = contentId;
this._messageSender = messageSender;
this._queues = { pushTextData: [], remove: [] };
}
/**
* @see ITextDisplayerInterface
*/
pushTextData(infos) {
return new Promise((resolve, reject) => {
this._queues.pushTextData.push({ resolve, reject });
this._messageSender({
type: "push-text-data" /* CoreMessageType.PushTextData */,
contentId: this._contentId,
value: infos,
});
});
}
/**
* @see ITextDisplayerInterface
*/
remove(start, end) {
return new Promise((resolve, reject) => {
this._queues.remove.push({ resolve, reject });
this._messageSender({
type: "remove-text-data" /* CoreMessageType.RemoveTextData */,
contentId: this._contentId,
value: { start, end },
});
});
}
/**
* @see ITextDisplayerInterface
*/
reset() {
this._messageSender({
type: "reset-text-displayer" /* CoreMessageType.ResetTextDisplayer */,
contentId: this._contentId,
value: null,
});
this._resetCurrentQueue("WorkerTextDisplayerInterface reset");
}
/**
* @see ITextDisplayerInterface
*/
stop(reason) {
this._messageSender({
type: "stop-text-displayer" /* CoreMessageType.StopTextDisplayer */,
contentId: this._contentId,
value: null,
});
this._resetCurrentQueue(reason);
}
_resetCurrentQueue(reason) {
const error = new CancellationError("WorkerTextDisplayerInterface queue", reason !== null && reason !== void 0 ? reason : "reset");
this._queues.pushTextData.forEach((elt) => {
elt.reject(error);
});
this._queues.pushTextData.length = 0;
this._queues.remove.forEach((elt) => {
elt.reject(error);
});
this._queues.remove.length = 0;
}
/**
* @param {Array.<Object>} ranges
*/
onPushedTrackSuccess(ranges) {
const element = this._queues.pushTextData.shift();
if (element === undefined) {
log.error("text", "pushTextData success for inexistant operation");
return;
}
element.resolve(ranges);
}
/**
* @param {unknown} err
*/
onPushedTrackError(err) {
const element = this._queues.pushTextData.shift();
if (element === undefined) {
log.error("text", "pushTextData error for inexistant operation");
return;
}
element.reject(err);
}
/**
* @param {Array.<Object>} ranges
*/
onRemoveSuccess(ranges) {
const element = this._queues.remove.shift();
if (element === undefined) {
log.error("text", "remove success for inexistant operation");
return;
}
element.resolve(ranges);
}
/**
* @param {unknown} err
*/
onRemoveError(err) {
const element = this._queues.remove.shift();
if (element === undefined) {
log.error("text", "remove error for inexistant operation");
return;
}
element.reject(err);
}
}