/**
* @file flash-transmuxer-worker.js
*/
import window from 'global/window';
import flv from 'mux.js/lib/flv';
/**
* Re-emits transmuxer events by converting them into messages to the
* world outside the worker.
*
* @param {Object} transmuxer the transmuxer to wire events on
* @private
*/
const wireTransmuxerEvents = function(transmuxer) {
transmuxer.on('data', function(segment) {
window.postMessage({
action: 'data',
segment
});
});
transmuxer.on('done', function(data) {
window.postMessage({ action: 'done' });
});
};
/**
* All incoming messages route through this hash. If no function exists
* to handle an incoming message, then we ignore the message.
*
* @class MessageHandlers
* @param {Object} options the options to initialize with
*/
class MessageHandlers {
constructor(options) {
this.options = options || {};
this.init();
}
/**
* initialize our web worker and wire all the events.
*/
init() {
if (this.transmuxer) {
this.transmuxer.dispose();
}
this.transmuxer = new flv.Transmuxer(this.options);
wireTransmuxerEvents(this.transmuxer);
}
/**
* Adds data (a ts segment) to the start of the transmuxer pipeline for
* processing.
*
* @param {ArrayBuffer} data data to push into the muxer
*/
push(data) {
// Cast array buffer to correct type for transmuxer
let segment = new Uint8Array(data.data, data.byteOffset, data.byteLength);
this.transmuxer.push(segment);
}
/**
* Recreate the transmuxer so that the next segment added via `push`
* start with a fresh transmuxer.
*/
reset() {
this.init();
}
/**
* Forces the pipeline to finish processing the last segment and emit its
* results.
*/
flush() {
this.transmuxer.flush();
}
resetCaptions() {
this.transmuxer.resetCaptions();
}
}
/**
* Our web wroker interface so that things can talk to mux.js
* that will be running in a web worker. The scope is passed to this by
* webworkify.
*
* @param {Object} self the scope for the web worker
*/
const FlashTransmuxerWorker = function(self) {
self.onmessage = function(event) {
if (event.data.action === 'init' && event.data.options) {
this.messageHandlers = new MessageHandlers(event.data.options);
return;
}
if (!this.messageHandlers) {
this.messageHandlers = new MessageHandlers();
}
if (event.data && event.data.action && event.data.action !== 'init') {
if (this.messageHandlers[event.data.action]) {
this.messageHandlers[event.data.action](event.data);
}
}
};
};
export default (self) => {
return new FlashTransmuxerWorker(self);
};