@gibraltarsoftware/loupe-angular
Version:
Loupe Agent for Angular
83 lines • 10 kB
JavaScript
import { HttpErrorResponse } from '@angular/common/http';
import { ErrorHandler, Injectable } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./loupe-angular.service";
// error handler to automatically log uncaught errors to Loupe
export class LoupeErrorHandler extends ErrorHandler {
constructor(loupe) {
super();
this.loupe = loupe;
}
handleError(error) {
super.handleError(error);
// different error types have different properties
if (error instanceof HttpErrorResponse) {
this.recordHttpError(error);
}
else if (error instanceof ErrorEvent) {
this.recordErrorEvent(error);
}
else {
this.recordError(error);
}
}
recordHttpError(error) {
const details = {
name: error.name,
status: error.status,
statusText: error.statusText,
url: error.url,
error: error.error
};
// The http error response doesn't gve us a stack, so create one
const err = new Error(error.message);
const ex = {
name: error.name,
caption: error.name,
description: error.message,
message: err.stack
};
this.loupe.recordException(ex, details, error.name);
}
recordError(error) {
// check to see if there's a stack
const errorSource = error.stack || error.message;
const parts = errorSource.split('\n');
let url = "";
if (parts.length > 2) {
// see if we have a url
const firstStackLine = parts[2];
const httpStart = firstStackLine.indexOf('http');
if (httpStart > -1) {
const httpLength = firstStackLine.length - httpStart - 1;
url = firstStackLine.substr(httpStart, httpLength);
}
}
const ex = {
name: error.name,
caption: parts[1],
description: parts[0],
url: url,
message: errorSource
};
const details = null;
this.loupe.recordException(ex, details, 'Angular.Exception');
}
recordErrorEvent(error) {
const details = {
line: error.lineno,
column: error.colno,
url: error.filename
};
this.loupe.recordException(error, details, 'Angular.Exception.Event');
}
}
LoupeErrorHandler.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.9", ngImport: i0, type: LoupeErrorHandler, deps: [{ token: i1.LoupeService }], target: i0.ɵɵFactoryTarget.Injectable });
LoupeErrorHandler.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.9", ngImport: i0, type: LoupeErrorHandler, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.9", ngImport: i0, type: LoupeErrorHandler, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i1.LoupeService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG91cGUtZXJyb3ItaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2xvdXBlLWFuZ3VsYXIvc3JjL2xpYi9sb3VwZS1lcnJvci1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFHekQsOERBQThEO0FBSzlELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxZQUFZO0lBRS9DLFlBQ3FCLEtBQW1CO1FBRXBDLEtBQUssRUFBRSxDQUFDO1FBRlMsVUFBSyxHQUFMLEtBQUssQ0FBYztJQUd4QyxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVU7UUFDbEIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV6QixrREFBa0Q7UUFDbEQsSUFBSSxLQUFLLFlBQVksaUJBQWlCLEVBQUU7WUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMvQjthQUFNLElBQUksS0FBSyxZQUFZLFVBQVUsRUFBRTtZQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDaEM7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBRU8sZUFBZSxDQUFDLEtBQXdCO1FBQzVDLE1BQU0sT0FBTyxHQUFHO1lBQ1osSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7WUFDNUIsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1NBQ3JCLENBQUM7UUFFRixnRUFBZ0U7UUFDaEUsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sRUFBRSxHQUFHO1lBQ1AsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNuQixXQUFXLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDMUIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1NBQ3JCLENBQUM7UUFFRixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQVk7UUFDNUIsa0NBQWtDO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksR0FBRyxHQUFXLEVBQUUsQ0FBQztRQUVyQixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2xCLHVCQUF1QjtZQUN2QixNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVqRCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDaEIsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLE1BQU0sR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUN6RCxHQUFHLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDdEQ7U0FDSjtRQUVELE1BQU0sRUFBRSxHQUFHO1lBQ1AsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLEdBQUcsRUFBRSxHQUFHO1lBQ1IsT0FBTyxFQUFFLFdBQVc7U0FDdkIsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQztRQUVyQixJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEtBQWlCO1FBQ3RDLE1BQU0sT0FBTyxHQUFHO1lBQ1osSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ2xCLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSztZQUNuQixHQUFHLEVBQUUsS0FBSyxDQUFDLFFBQVE7U0FDdEIsQ0FBQztRQUVGLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUMxRSxDQUFDOzs4R0FqRlEsaUJBQWlCO2tIQUFqQixpQkFBaUIsY0FGZCxNQUFNOzJGQUVULGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEVycm9ySGFuZGxlciwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTG91cGVTZXJ2aWNlIH0gZnJvbSAnLi9sb3VwZS1hbmd1bGFyLnNlcnZpY2UnO1xuXG4vLyBlcnJvciBoYW5kbGVyIHRvIGF1dG9tYXRpY2FsbHkgbG9nIHVuY2F1Z2h0IGVycm9ycyB0byBMb3VwZVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBMb3VwZUVycm9ySGFuZGxlciBleHRlbmRzIEVycm9ySGFuZGxlciB7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBsb3VwZTogTG91cGVTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3I6IGFueSkge1xuICAgICAgICBzdXBlci5oYW5kbGVFcnJvcihlcnJvcik7XG5cbiAgICAgICAgLy8gZGlmZmVyZW50IGVycm9yIHR5cGVzIGhhdmUgZGlmZmVyZW50IHByb3BlcnRpZXNcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkSHR0cEVycm9yKGVycm9yKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVjb3JkRXJyb3JFdmVudChlcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlY29yZEVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVjb3JkSHR0cEVycm9yKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgICAgIHN0YXR1czogZXJyb3Iuc3RhdHVzLFxuICAgICAgICAgICAgc3RhdHVzVGV4dDogZXJyb3Iuc3RhdHVzVGV4dCxcbiAgICAgICAgICAgIHVybDogZXJyb3IudXJsLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLmVycm9yXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVGhlIGh0dHAgZXJyb3IgcmVzcG9uc2UgZG9lc24ndCBndmUgdXMgYSBzdGFjaywgc28gY3JlYXRlIG9uZVxuICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIGNvbnN0IGV4ID0ge1xuICAgICAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgICAgIGNhcHRpb246IGVycm9yLm5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5zdGFja1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubG91cGUucmVjb3JkRXhjZXB0aW9uKGV4LCBkZXRhaWxzLCBlcnJvci5uYW1lKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlY29yZEVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhlcmUncyBhIHN0YWNrXG4gICAgICAgIGNvbnN0IGVycm9yU291cmNlID0gZXJyb3Iuc3RhY2sgfHwgZXJyb3IubWVzc2FnZTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBlcnJvclNvdXJjZS5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgbGV0IHVybDogc3RyaW5nID0gXCJcIjtcblxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGhhdmUgYSB1cmxcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0U3RhY2tMaW5lID0gcGFydHNbMl07XG4gICAgICAgICAgICBjb25zdCBodHRwU3RhcnQgPSBmaXJzdFN0YWNrTGluZS5pbmRleE9mKCdodHRwJyk7XG5cbiAgICAgICAgICAgIGlmIChodHRwU3RhcnQgPiAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGh0dHBMZW5ndGggPSBmaXJzdFN0YWNrTGluZS5sZW5ndGggLSBodHRwU3RhcnQgLSAxO1xuICAgICAgICAgICAgICAgIHVybCA9IGZpcnN0U3RhY2tMaW5lLnN1YnN0cihodHRwU3RhcnQsIGh0dHBMZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXggPSB7XG4gICAgICAgICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgICAgICAgY2FwdGlvbjogcGFydHNbMV0sXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcGFydHNbMF0sXG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yU291cmNlXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGV0YWlscyA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5sb3VwZS5yZWNvcmRFeGNlcHRpb24oZXgsIGRldGFpbHMsICdBbmd1bGFyLkV4Y2VwdGlvbicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVjb3JkRXJyb3JFdmVudChlcnJvcjogRXJyb3JFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkZXRhaWxzID0ge1xuICAgICAgICAgICAgbGluZTogZXJyb3IubGluZW5vLFxuICAgICAgICAgICAgY29sdW1uOiBlcnJvci5jb2xubyxcbiAgICAgICAgICAgIHVybDogZXJyb3IuZmlsZW5hbWVcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmxvdXBlLnJlY29yZEV4Y2VwdGlvbihlcnJvciwgZGV0YWlscywgJ0FuZ3VsYXIuRXhjZXB0aW9uLkV2ZW50Jyk7XG4gICAgfVxufVxuXG4iXX0=