1 Commits
Author SHA1 Message Date
mcndave 419d9d55df - WIP on negundo's JS client 2026-10-19 19:16:49 +00:00
+21 -10
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");
@@ -6,7 +9,8 @@ class ErrorHandler {
this.url = options.url; this.url = options.url;
this.apikey = options.apikey; this.apikey = options.apikey;
this.catchError();
}
getErrorPosition(script) { getErrorPosition(script) {
let totalLines = 0; let totalLines = 0;
@@ -36,19 +40,19 @@ class ErrorHandler {
}; };
window.addEventListener('unhandledrejection', event => { window.addEventListener('unhandledrejection', event => {
if (! this.#unhandledRection) {
this.#unhandledRection = true;
this.reportError(event.reason.toString(), document.location.href, 0, 0, event.reason.stack, 'Promise Rejection'); 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, {
method: "PUT",
headers: { headers: {
'Accept': "application/json", 'Accept': "application/json",
'Content-Type': "application/json" 'Content-Type': "application/json"
@@ -63,7 +67,16 @@ class ErrorHandler {
file: window.location.href, file: window.location.href,
source: await this.getSourceCode(url, line), 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) {
@@ -94,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