Files
v10/dist/dev/dom/hls-js/errors.js
T

58 lines
1.9 KiB
JavaScript

import { MediaError } from "../../core/media-error.js";
import Hls from "hls.js";
//#region src/dom/hls-js/errors.ts
const hlsErrorTypeToCode = {
[Hls.ErrorTypes.NETWORK_ERROR]: MediaError.MEDIA_ERR_NETWORK,
[Hls.ErrorTypes.MEDIA_ERROR]: MediaError.MEDIA_ERR_DECODE,
[Hls.ErrorTypes.KEY_SYSTEM_ERROR]: MediaError.MEDIA_ERR_ENCRYPTED,
[Hls.ErrorTypes.MUX_ERROR]: MediaError.MEDIA_ERR_DECODE,
[Hls.ErrorTypes.OTHER_ERROR]: MediaError.MEDIA_ERR_CUSTOM
};
function HlsJsMediaErrorsMixin(BaseClass) {
class HlsJsMediaErrors extends BaseClass {
#disconnect = null;
#error = null;
constructor(...args) {
super(...args);
this.engine?.on(Hls.Events.MANIFEST_LOADING, () => this.#init());
this.engine?.on(Hls.Events.MEDIA_ATTACHED, () => this.#init());
this.engine?.on(Hls.Events.MEDIA_DETACHED, () => this.#destroy());
this.engine?.on(Hls.Events.DESTROYING, () => this.#destroy());
}
get error() {
return this.#error;
}
#destroy() {
this.#disconnect?.abort();
this.#disconnect = null;
}
#init() {
this.#disconnect?.abort();
this.#disconnect = new AbortController();
const { engine, target } = this;
if (!engine || !target) return;
const onError = (_event, data) => {
if (!data.fatal) return;
const code = hlsErrorTypeToCode[data.type] ?? MediaError.MEDIA_ERR_CUSTOM;
const error = new MediaError(data.error?.message, code, true, data.details);
error.data = data;
this.#error = error;
const event = new ErrorEvent("error", {
error,
message: error.message
});
this.dispatchEvent(event);
};
engine.on(Hls.Events.ERROR, onError);
this.#disconnect.signal.addEventListener("abort", () => {
engine.off(Hls.Events.ERROR, onError);
this.#error = null;
}, { once: true });
}
}
return HlsJsMediaErrors;
}
//#endregion
export { HlsJsMediaErrorsMixin };
//# sourceMappingURL=errors.js.map