konowebcodecs/src/worker-script/index.js

87 lines
2.0 KiB
JavaScript

require('regenerator-runtime/runtime');
const defaultArgs = require('./constants/defaultArgs');
const strList2ptr = require('./utils/strList2ptr');
const getTransferables = require('../utils/getTransferables');
let action = 'unknown';
let Module = null;
let adapter = null;
let ffmpeg = null;
const load = ({ workerId, payload: { options: { corePath } } }, res) => {
if (Module == null) {
const Core = adapter.getCore(corePath);
Core()
.then(async (_Module) => {
Module = _Module;
Module.setLogger((message, type) => {
res.progress({
workerId, action, type, message,
});
});
ffmpeg = Module.cwrap('ffmpeg', 'number', ['number', 'number']);
res.resolve({ message: 'Loaded ffmpeg-core' });
});
} else {
res.resolve({ message: 'Loaded ffmpeg-core' });
}
};
const FS = ({
payload: {
method,
args,
},
}, res) => {
res.resolve({
message: `Complete ${method}`,
data: Module.FS[method](...args),
});
};
const run = ({
payload: {
args: _args,
},
}, res) => {
const args = [...defaultArgs, ..._args.trim().split(' ')].filter((s) => s.length !== 0);
ffmpeg(args.length, strList2ptr(Module, args));
res.resolve({
message: `Complete ${args.join(' ')}`,
});
};
exports.dispatchHandlers = (packet, send) => {
const { workerId, jobId, action: act } = packet;
const res = (status, payload) => {
const pkt = {
workerId,
jobId,
action: act,
status,
payload,
};
send(pkt, getTransferables(pkt));
};
res.resolve = res.bind(this, 'resolve');
res.reject = res.bind(this, 'reject');
res.progress = res.bind(this, 'progress');
action = act;
try {
({
load,
FS,
run,
})[act](packet, res);
} catch (err) {
/** Prepare exception to travel through postMessage */
res.reject(err.toString());
}
action = 'unknown';
};
exports.setAdapter = (_adapter) => {
adapter = _adapter;
};