4 Commits
2 changed files with 45 additions and 25 deletions

No files matched your search

+35 -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");
@@ -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;
}
}
}
+10
View File
@@ -4,6 +4,16 @@ use Negundo\Client\{ SoftwareConfig, Dump, Task, NegundoMiddleware };
use function DI\{ autowire, create, get, add };
if (! function_exists('getenvonce')) {
function getenvonce(string $name) : array|string|false
{
$value = getenv($name);
unset($_ENV[$name], $_SERVER[$name]);
putenv($name . "=");
return $value;
}
}
return [
SoftwareConfig::class => create(SoftwareConfig::class)->constructor(
serverUrl: getenvonce('NEGUNDO_SERVER'),