Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
419d9d55df | ||
|
|
abd530d146 | ||
|
|
7d5272816d |
+35
-25
@@ -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");
|
||||
@@ -37,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) {
|
||||
@@ -95,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
|
||||
@@ -106,4 +116,4 @@ class ErrorHandler {
|
||||
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user