@remotion/media-parser
Version:
A pure JavaScript library for parsing video files
76 lines (75 loc) • 3.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.mediaParserController = void 0;
const errors_1 = require("../errors");
const emitter_1 = require("./emitter");
const pause_signal_1 = require("./pause-signal");
const performed_seeks_stats_1 = require("./performed-seeks-stats");
const seek_signal_1 = require("./seek-signal");
const mediaParserController = () => {
const abortController = new AbortController();
const emitter = new emitter_1.MediaParserEmitter();
const pauseSignal = (0, pause_signal_1.makePauseSignal)(emitter);
const seekSignal = (0, seek_signal_1.makeSeekSignal)(emitter);
const performedSeeksSignal = (0, performed_seeks_stats_1.performedSeeksStats)();
const checkForAbortAndPause = async () => {
if (abortController.signal.aborted) {
const err = new errors_1.MediaParserAbortError('Aborted');
if (abortController.signal.reason) {
err.cause = abortController.signal.reason;
}
throw err;
}
await pauseSignal.waitUntilResume();
};
let seekingHintResolution = null;
let simulateSeekResolution = null;
const getSeekingHints = () => {
if (!seekingHintResolution) {
throw new Error('The mediaParserController() was not yet used in a parseMedia() call');
}
return seekingHintResolution();
};
const simulateSeek = (seekInSeconds) => {
if (!simulateSeekResolution) {
throw new Error('The mediaParserController() was not yet used in a parseMedia() call');
}
return simulateSeekResolution(seekInSeconds);
};
const attachSeekingHintResolution = (callback) => {
if (seekingHintResolution) {
throw new Error('The mediaParserController() was used in multiple parseMedia() calls. Create a separate controller for each call.');
}
seekingHintResolution = callback;
};
const attachSimulateSeekResolution = (callback) => {
if (simulateSeekResolution) {
throw new Error('The mediaParserController() was used in multiple parseMedia() calls. Create a separate controller for each call.');
}
simulateSeekResolution = callback;
};
return {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
abort: (reason) => {
abortController.abort(reason);
emitter.dispatchAbort(reason);
},
seek: seekSignal.seek,
simulateSeek,
pause: pauseSignal.pause,
resume: pauseSignal.resume,
addEventListener: emitter.addEventListener,
removeEventListener: emitter.removeEventListener,
getSeekingHints,
_internals: {
signal: abortController.signal,
checkForAbortAndPause,
seekSignal,
markAsReadyToEmitEvents: emitter.markAsReady,
performedSeeksSignal,
attachSeekingHintResolution,
attachSimulateSeekResolution,
},
};
};
exports.mediaParserController = mediaParserController;