Improved codec error handling

This commit is contained in:
WolverinDEV 2019-02-16 11:35:59 +01:00
parent e1a1e72c51
commit fa30d3d055
2 changed files with 60 additions and 18 deletions

View file

@ -21,19 +21,23 @@ class CodecPool {
private _supported: boolean = true;
initialize(cached: number) {
for(let i = 0; i < cached; i++)
this.ownCodec(i + 1).then(codec => {
console.log(tr("Release again! (%o)"), codec);
this.releaseCodec(i + 1);
}).catch(error => {
/* test if we're able to use this codec */
const dummy_client_id = 0xFFEF;
this.ownCodec(dummy_client_id).then(codec => {
console.log(tr("Release again! (%o)"), codec);
this.releaseCodec(dummy_client_id);
}).catch(error => {
if(this._supported) {
console.warn(tr("Disabling codec support for "), this.name);
if(this._supported) {
createErrorModal(tr("Could not load codec driver"), tr("Could not load or initialize codec ") + this.name + "<br>" +
"Error: <code>" + JSON.stringify(error) + "</code>").open();
}
this._supported = false;
console.error(error);
});
createErrorModal(tr("Could not load codec driver"), tr("Could not load or initialize codec ") + this.name + "<br>" +
"Error: <code>" + JSON.stringify(error) + "</code>").open();
console.error(tr("Failed to initialize the opus codec. Error: %o"), error);
} else {
console.debug(tr("Failed to initialize already disabled codec. Error: %o"), error);
}
this._supported = false;
});
}
supported() { return this._supported; }
@ -56,7 +60,7 @@ class CodecPool {
this.ownCodec(clientId, false).then(resolve).catch(reject);
}).catch(error => {
console.error(tr("Could not initialize codec!\nError: %o"), error);
reject(tr("Could not initialize codec!"));
reject(typeof(error) === 'string' ? error : tr("Could not initialize codec!"));
});
}
return;

View file

@ -1,6 +1,11 @@
/// <reference path="CodecWorker.ts" />
this["Module"] = typeof this["Module"] !== "undefined" ? this["Module"] : {};
const WASM_ERROR_MESSAGES = [
'no native wasm support detected'
];
this["Module"] = this["Module"] || {};
let initialized = false;
Module['onRuntimeInitialized'] = function() {
initialized = true;
@ -12,11 +17,43 @@ Module['onRuntimeInitialized'] = function() {
success: true
})
};
Module['onAbort'] = message => {
let abort_message: string = undefined;
let last_error_message: string;
Module['print'] = function() {
if(arguments.length == 1 && arguments[0] == abort_message)
return; /* we don't need to reprint the abort message! */
console.log(...arguments);
};
Module['printErr'] = function() {
if(arguments.length == 1 && arguments[0] == abort_message)
return; /* we don't need to reprint the abort message! */
last_error_message = arguments[0];
for(const suppress of WASM_ERROR_MESSAGES)
if((arguments[0] as string).indexOf(suppress) != -1)
return;
console.error(...arguments);
};
Module['onAbort'] = (message: string | DOMException) => {
/* no native wasm support detected */
Module['onAbort'] = undefined;
if(message instanceof DOMException)
message = "DOMException (" + message.name + "): " + message.code + " => " + message.message;
else {
abort_message = message;
if(message.indexOf("no binaryen method succeeded") != -1)
for(const error of WASM_ERROR_MESSAGES)
if(last_error_message.indexOf(error) != -1) {
message = "no native wasm support detected, but its required";
break;
}
}
sendMessage({
token: workerCallbackToken,
@ -31,10 +68,11 @@ try {
Module['locateFile'] = file => "../../wasm/" + file;
importScripts("../../wasm/TeaWeb-Worker-Codec-Opus.js");
} catch (e) {
console.log(e);
Module['onAbort']("Cloud not load native script!");
if(typeof(Module['onAbort']) === "function") {
console.log(e);
Module['onAbort']("Failed to load native scripts");
} /* else the error had been already handled because its a WASM error */
}
//let Module = typeof Module !== 'undefined' ? Module : {};
enum OpusType {
VOIP = 2048,