3 Commits
+34 -24
View File
@@ -1,4 +1,7 @@
class ErrorHandler { class ErrorHandler {
#unhandledRection = false
constructor(options) { constructor(options) {
if (!options) throw new Error("Options not provided"); if (!options) throw new Error("Options not provided");
if (!options.url) throw new Error("URL is required"); if (!options.url) throw new Error("URL is required");
@@ -37,34 +40,43 @@ class ErrorHandler {
}; };
window.addEventListener('unhandledrejection', event => { window.addEventListener('unhandledrejection', event => {
this.reportError(event.reason.toString(), document.location.href, 0, 0, event.reason.stack, 'Promise Rejection'); if (! this.#unhandledRection) {
this.#unhandledRection = true;
this.reportError(event.reason.toString(), document.location.href, 0, 0, event.reason.stack, 'Promise Rejection');
}
}); });
this.createErrorAgain();
} }
async reportError(message, url, line, column, stack, type = 'JavaScript Error') { async reportError(message, url, line, column, stack, type = 'JavaScript Error') {
await new Promise(r => setTimeout(r, 2000)); await new Promise(r => setTimeout(r, 2000));
fetch(this.url ? `${this.url}/${this.apikey}` : window.location.href, { try {
method: "POST", const response = await fetch(this.url ? `${this.url}/${this.apikey}` : window.location.href, {
headers: { method: "PUT",
'Accept': "application/json", headers: {
'Content-Type': "application/json" 'Accept': "application/json",
}, 'Content-Type': "application/json"
body: JSON.stringify({ },
type, body: JSON.stringify({
message, type,
url, message,
line, url,
code: column, line,
backtrace: stack ? stack.split("\n").filter((e) => !!e).map((e) => this.parseErrorLine(e)) : [], code: column,
file: window.location.href, backtrace: stack ? stack.split("\n").filter((e) => !!e).map((e) => this.parseErrorLine(e)) : [],
source: await this.getSourceCode(url, line), file: window.location.href,
}) source: await this.getSourceCode(url, line),
}).then(response => response.json()).then(console.info); })
});
if (response.ok) {
this.#unhandledRection = false;
return await response.json()
}
} catch (error) {
console.error('CORS or network error:', error.message);
}
} }
async getSourceCode(url, errorLineNumber) { async getSourceCode(url, errorLineNumber) {
@@ -95,8 +107,6 @@ class ErrorHandler {
obj.file = match[2]; obj.file = match[2];
obj.line = match[3]; obj.line = match[3];
// column would be match[4] if needed // column would be match[4] if needed
console.log(match);
} }
// Remove undefined/empty values // Remove undefined/empty values