1 Commits
Author SHA1 Message Date
mcndave 419d9d55df - WIP on negundo's JS client 2026-10-19 19:16:49 +00:00
+36 -25
View File
@@ -1,4 +1,7 @@
class ErrorHandler {
#unhandledRection = false
constructor(options) {
if (!options) throw new Error("Options not provided");
if (!options.url) throw new Error("URL is required");
@@ -6,7 +9,8 @@ class ErrorHandler {
this.url = options.url;
this.apikey = options.apikey;
this.catchError();
}
getErrorPosition(script) {
let totalLines = 0;
@@ -36,34 +40,43 @@ class ErrorHandler {
};
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') {
await new Promise(r => setTimeout(r, 2000));
fetch(this.url ? `${this.url}/${this.apikey}` : window.location.href, {
method: "POST",
headers: {
'Accept': "application/json",
'Content-Type': "application/json"
},
body: JSON.stringify({
type,
message,
url,
line,
code: column,
backtrace: stack ? stack.split("\n").filter((e) => !!e).map((e) => this.parseErrorLine(e)) : [],
file: window.location.href,
source: await this.getSourceCode(url, line),
})
}).then(response => response.json()).then(console.info);
try {
const response = await fetch(this.url ? `${this.url}/${this.apikey}` : window.location.href, {
method: "PUT",
headers: {
'Accept': "application/json",
'Content-Type': "application/json"
},
body: JSON.stringify({
type,
message,
url,
line,
code: column,
backtrace: stack ? stack.split("\n").filter((e) => !!e).map((e) => this.parseErrorLine(e)) : [],
file: window.location.href,
source: await this.getSourceCode(url, line),
})
});
if (response.ok) {
this.#unhandledRection = false;
return await response.json()
}
} catch (error) {
console.error('CORS or network error:', error.message);
}
}
async getSourceCode(url, errorLineNumber) {
@@ -94,8 +107,6 @@ class ErrorHandler {
obj.file = match[2];
obj.line = match[3];
// column would be match[4] if needed
console.log(match);
}
// Remove undefined/empty values