UNPKG

ng-error-tracker

Version:

Angular library for securely capturing and sending logs.

1 lines 33.7 kB
{"version":3,"file":"ng-error-tracker.mjs","sources":["../../../projects/ng-error-tracker/src/lib/sanitizer.ts","../../../projects/ng-error-tracker/src/lib/logger-config.ts","../../../projects/ng-error-tracker/src/lib/user-action-tracker.service.ts","../../../projects/ng-error-tracker/src/lib/build-id.service.ts","../../../projects/ng-error-tracker/src/lib/error-logger.service.ts","../../../projects/ng-error-tracker/src/lib/error-interceptor.service.ts","../../../projects/ng-error-tracker/src/lib/error-logging.module.ts","../../../projects/ng-error-tracker/src/ng-error-tracker.ts"],"sourcesContent":["export function sanitizeLog(text: string): string {\n if (!text) return text;\n\n return text\n .replace(\n /[\\w.-]+@[\\w.-]+\\.\\w+/gi,\n '[email-protected]'\n )\n .replace(\n /\\b(?:\\+\\d{1,3}[-.\\s]?)?(?:\\(?\\d{2,4}\\)?[-.\\s]?)?\\d{3,5}[-.\\s]?\\d{3,5}[-.\\s]?\\d{0,5}\\b/g,\n '[phone-protected]'\n )\n .replace(\n /\\b\\d{8}[A-Za-z]\\b/g,\n '[dni-protected]'\n )\n .replace(\n /\\b[XYZxyz]\\d{7}[A-Za-z]\\b/g,\n '[nie-protected]'\n );\n}\n","import {InjectionToken} from '@angular/core';\n\nexport interface LoggerConfig {\n enableLogging: boolean;\n apiUrl: string;\n apiKey?: string;\n publicKey?: string;\n publicKeyUrl?: string;\n appName: string;\n appEnv: string;\n appBuildId?: string;\n}\n\nexport const LOGGER_CONFIG = new InjectionToken<LoggerConfig>('LOGGER_CONFIG');\n","import { Injectable } from '@angular/core';\nimport { Router, NavigationEnd, ActivatedRoute } from '@angular/router';\n\n@Injectable({ providedIn: 'root' })\nexport class UserActionTrackerService {\n private actions: string[] = [];\n private readonly maxActions = 20;\n private currentRoute: string = 'Unknown';\n\n constructor(private router: Router, private activatedRoute: ActivatedRoute) {\n this.trackRouteChanges();\n this.trackUserEvents();\n }\n\n private trackRouteChanges() {\n this.router.events.subscribe((event) => {\n if (event instanceof NavigationEnd) {\n let route = this.activatedRoute;\n while (route.firstChild) {\n route = route.firstChild;\n }\n route.data.subscribe((data) => {\n this.currentRoute = data['title'] || event.urlAfterRedirects;\n });\n }\n });\n }\n\n private trackUserEvents() {\n document.addEventListener('click', this.trackEvent.bind(this));\n document.addEventListener('touchstart', this.trackEvent.bind(this), { passive: true });\n }\n\n private trackEvent(event: Event) {\n const targetElement = event.target as HTMLElement;\n if (!targetElement) return;\n\n const tagName = targetElement.tagName.toLowerCase();\n const name = targetElement.getAttribute('name') ?? '';\n const id = targetElement.getAttribute('id') ?? '';\n const classAttr = targetElement.getAttribute('class') || '';\n const classes = classAttr ? `.${classAttr.replace(/\\s+/g, '.')}` : '';\n const text = (targetElement.textContent || '').trim().slice(0, 30);\n\n let message = `[${this.currentRoute}] ${tagName}${id ? `#${id}` : ''}${classes}`;\n if (name) message += ` [name=\"${name}\"]`;\n if (text) message += ` (text=\"${text}\")`;\n\n this.logAction(`Interaction: ${message}`);\n }\n\n private logAction(action: string) {\n if (this.actions.length >= this.maxActions) {\n this.actions.shift();\n }\n this.actions.push(`${new Date().toISOString()}: ${action}`);\n }\n\n getUserActions(): string[] {\n return [...this.actions];\n }\n}\n","import {Injectable} from '@angular/core';\n\n@Injectable({providedIn: 'root'})\nexport class BuildIdService {\n\n public async getAppBuildId() {\n const scripts = Array.from(document.getElementsByTagName('script'));\n const mainScript = scripts.find(({src}) => /main(?:([-.])[a-zA-Z0-9]+)?\\.js(?:\\?.*)?$/.test(src));\n\n if (mainScript) {\n const response = await fetch(mainScript.src);\n if (response.ok) {\n return await this.processMainJsStream(response.body!.getReader());\n }\n }\n\n console.warn('⚠️ Failed to fetch application main file.');\n return 'unknown-build-id';\n }\n\n private async processMainJsStream(streamReader: ReadableStreamDefaultReader<Uint8Array>) {\n const CHUNK_SIZE = 512;\n let collectedChunks: Uint8Array[] = [];\n let totalBytes = 0;\n\n while (totalBytes < CHUNK_SIZE) {\n const {done, value} = await streamReader.read();\n if (done) break;\n if (value) {\n collectedChunks.push(value);\n totalBytes += value.length;\n }\n }\n\n const combinedBuffer = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of collectedChunks) {\n combinedBuffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n return this.generateHashFromBuffer(combinedBuffer);\n }\n\n private async generateHashFromBuffer(buffer: Uint8Array): Promise<string> {\n return await window.crypto.subtle.digest('SHA-256', buffer).then(hashBuffer => {\n return Array.from(new Uint8Array(hashBuffer))\n .map(byte => byte.toString(16).padStart(2, '0'))\n .join('');\n });\n }\n}\n","import {Injectable, Inject, ErrorHandler, Injector} from '@angular/core';\nimport {HttpBackend, HttpClient, HttpHeaders} from '@angular/common/http';\nimport {catchError, map, tap} from 'rxjs/operators';\nimport {EMPTY, timer} from 'rxjs';\nimport {UserActionTrackerService} from './user-action-tracker.service';\nimport {BuildIdService} from './build-id.service';\nimport {sanitizeLog} from './sanitizer';\nimport {LOGGER_CONFIG, LoggerConfig} from \"./logger-config\";\nimport {NavigationEnd, Router} from '@angular/router';\n\ninterface HybridPayload {\n iv: string;\n cipher: string;\n aesKey: string;\n}\n\n@Injectable({providedIn: 'root'})\nexport class ErrorLoggerService implements ErrorHandler {\n private http: HttpClient;\n private publicKey: CryptoKey | null = null;\n private errorSet: Set<string> = new Set<string>();\n private logQueue: any[] = [];\n private maxStoredLogs: number = 20;\n private canFlush: boolean = true;\n\n private appBuildId: string = 'unknown-build-id';\n\n private STORAGE_LOGS_KEY: string = 'ng-error-tracker';\n\n constructor(\n private injector: Injector,\n handler: HttpBackend,\n private userActionsTracker: UserActionTrackerService,\n private buildIdService: BuildIdService,\n @Inject(LOGGER_CONFIG) private config: LoggerConfig,\n @Inject(Router) private router: Router\n ) {\n this.http = new HttpClient(handler);\n\n if (this.config.enableLogging) {\n this.initService();\n }\n }\n\n private async initService() {\n this.appBuildId = !this.config.appBuildId ? await this.buildIdService.getAppBuildId() : this.config.appBuildId;\n\n console.log(\"✅ Signing logs with App Build ID:\", this.appBuildId);\n\n this.loadStoredLogs();\n\n if (this.config.publicKeyUrl) {\n this.loadPublicKey();\n } else if (this.config.publicKey) {\n const binaryDer = this.base64ToArrayBuffer(this.config.publicKey);\n await this.importPublicKey(binaryDer);\n }\n\n this.router.events.subscribe((event: any) => {\n if (event instanceof NavigationEnd) {\n this.scheduleFlush(10000);\n }\n });\n\n this.scheduleFlush(10000);\n }\n\n private loadPublicKey() {\n if (!this.config.publicKeyUrl) return;\n\n this.http.get(this.config.publicKeyUrl, {responseType: 'text'}).pipe(\n catchError(() => {\n console.warn('⚠️ Could not retrieve the public key.');\n return EMPTY;\n })\n ).subscribe(async (base64Der) => {\n const binaryDer = this.base64ToArrayBuffer(base64Der);\n await this.importPublicKey(binaryDer);\n });\n }\n\n private async importPublicKey(binaryDer: ArrayBuffer) {\n try {\n this.publicKey = await window.crypto.subtle.importKey(\n \"spki\",\n binaryDer,\n {name: \"RSA-OAEP\", hash: \"SHA-256\"},\n true,\n [\"encrypt\"]\n );\n console.log(\"✅ Public key imported successfully.\");\n } catch (error) {\n console.error(\"❌ Error importing public key:\", error);\n }\n }\n\n private base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n }\n\n async handleError(error: any) {\n console.warn(\"⚠️ Error captured by ErrorLoggerService:\", error);\n\n if (!this.config.enableLogging) {\n const defaultErrorHandler = this.injector.get<ErrorHandler>(ErrorHandler, undefined);\n\n if (defaultErrorHandler && defaultErrorHandler !== this) {\n defaultErrorHandler.handleError(error);\n }\n\n return;\n }\n\n const logData = {\n severity: 'error',\n message: sanitizeLog(error.message || 'Unknown error'),\n stack: sanitizeLog(error.stack || ''),\n appName: this.config.appName,\n appEnv: this.config.appEnv,\n appBuildId: this.appBuildId,\n timestamp: new Date().toISOString(),\n userActions: this.userActionsTracker.getUserActions(),\n hash: ''\n };\n\n logData['hash'] = await this.generateHash(logData);\n\n if (this.errorSet.has(logData['hash'])) {\n console.warn(`⚠️ Duplicate error detected: ${logData['hash']}, ignoring...`);\n\n const defaultErrorHandler = this.injector.get<ErrorHandler>(ErrorHandler, undefined);\n\n if (defaultErrorHandler && defaultErrorHandler !== this) {\n defaultErrorHandler.handleError(error);\n }\n\n return;\n }\n\n this.errorSet.add(logData['hash']);\n this.logQueue.push(logData);\n this.storeLogs([logData]);\n\n this.scheduleFlush(30000);\n\n const defaultErrorHandler = this.injector.get<ErrorHandler>(ErrorHandler, undefined);\n\n if (defaultErrorHandler && defaultErrorHandler !== this) {\n defaultErrorHandler.handleError(error);\n }\n\n return;\n }\n\n private scheduleFlush(time: number): void {\n if (!this.canFlush) return;\n this.canFlush = false;\n timer(time).subscribe(() => {\n this.canFlush = true;\n this.flushLogs();\n });\n }\n\n private async flushLogs() {\n if (!this.config.enableLogging || this.logQueue.length === 0 || !this.canFlush) return;\n if (!this.publicKey) {\n console.warn('⚠️ No public key loaded yet. Logs remain queued.');\n return;\n }\n\n const logsToSend = [...this.logQueue];\n if (logsToSend.length === 0) return;\n const logsJson = JSON.stringify(logsToSend);\n\n try {\n const aesKey = await this.generateAESKey();\n const {iv, cipher} = await this.encryptAES(logsJson, aesKey);\n const encryptedAESKey = await this.encryptAESKey(aesKey);\n if (!encryptedAESKey) {\n console.warn('⚠️ Could not encrypt AES key with RSA');\n return;\n }\n\n const payload: HybridPayload = {\n iv: this.arrayBufferToBase64(iv),\n cipher: this.arrayBufferToBase64(cipher),\n aesKey: encryptedAESKey\n };\n\n let headers = new HttpHeaders({'Content-Type': 'application/json'});\n if (this.config.apiKey) {\n headers = headers.set('Authorization', `Bearer ${this.config.apiKey}`);\n }\n\n this.http.post(this.config.apiUrl, payload, {headers, responseType: 'text', observe: 'response'}).pipe(\n map(response => response.body || ''),\n catchError((err) => {\n console.warn('⚠️ Could not send the log. They will remain stored until the next attempt.', err?.message);\n return EMPTY;\n })\n ).subscribe((responseBody) => {\n console.log('✅ Logs sent successfully (AES-256-GCM + RSA-OAEP-SHA-256).');\n if (responseBody.trim() === '') {\n console.log('📥 Server response is empty.');\n } else {\n console.log('📥 Server response:', responseBody);\n }\n this.removeStoredLogs(logsToSend);\n });\n } catch (err) {\n console.warn('⚠️ Could not send the log. They will remain stored until the next attempt.', err);\n }\n }\n\n private async generateAESKey(): Promise<CryptoKey> {\n return window.crypto.subtle.generateKey(\n {name: 'AES-GCM', length: 256},\n true,\n ['encrypt', 'decrypt']\n );\n }\n\n private async encryptAES(plaintext: string, key: CryptoKey): Promise<{ iv: ArrayBuffer; cipher: ArrayBuffer }> {\n const encoder = new TextEncoder();\n const data = encoder.encode(plaintext);\n const iv = window.crypto.getRandomValues(new Uint8Array(12));\n const cipher = await window.crypto.subtle.encrypt(\n {name: 'AES-GCM', iv},\n key,\n data\n );\n return {iv, cipher};\n }\n\n private async encryptAESKey(aesKey: CryptoKey): Promise<string | false> {\n const rawKey = await window.crypto.subtle.exportKey('raw', aesKey);\n if (!this.publicKey) return false;\n const encryptedKey = await window.crypto.subtle.encrypt(\n {name: \"RSA-OAEP\"},\n this.publicKey,\n rawKey\n );\n return this.arrayBufferToBase64(encryptedKey);\n }\n\n private arrayBufferToBase64(buffer: ArrayBuffer): string {\n return btoa(String.fromCharCode(...new Uint8Array(buffer)));\n }\n\n private loadStoredLogs(): void {\n let storedLogs = JSON.parse(localStorage.getItem(this.STORAGE_LOGS_KEY) || '[]');\n\n if (storedLogs.length > 0) {\n storedLogs = [...storedLogs].slice(-this.maxStoredLogs);\n\n this.logQueue = [];\n this.errorSet = new Set<string>();\n\n storedLogs.forEach((log: any) => {\n if (!this.errorSet.has(log['hash'])) {\n this.errorSet.add(log['hash']);\n this.logQueue.push(log);\n }\n });\n } else {\n this.logQueue = [];\n this.errorSet = new Set<string>();\n }\n }\n\n private storeLogs(logs: any[]): void {\n const storedLogs = JSON.parse(localStorage.getItem(this.STORAGE_LOGS_KEY) || '[]');\n const merged = [...storedLogs, ...logs]\n .slice(-this.maxStoredLogs)\n .filter((log, index, self) =>\n self.findIndex(l => l.hash === log.hash) === index\n );\n\n localStorage.setItem(this.STORAGE_LOGS_KEY, JSON.stringify(merged));\n\n this.logQueue = merged;\n this.errorSet = new Set<string>();\n\n merged.forEach((log: any) => {\n this.errorSet.add(log['hash']);\n });\n }\n\n private removeStoredLogs(logsSent: any[]): void {\n const storedLogs = JSON.parse(localStorage.getItem(this.STORAGE_LOGS_KEY) || '[]');\n const remaining = storedLogs.filter((storedLog: any) =>\n !logsSent.some((sentLog: any) =>\n sentLog.hash === storedLog.hash\n )\n );\n\n localStorage.setItem(this.STORAGE_LOGS_KEY, JSON.stringify(remaining));\n\n this.logQueue = remaining;\n this.errorSet = new Set<string>();\n\n remaining.forEach((log: any) => {\n this.errorSet.add(log['hash']);\n });\n }\n\n private async generateHash(logData: any): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(\n `${logData.appName}-${logData.appEnv}-${logData.appBuildId}-${logData.message || 'Unknown error'}-${logData.stack || ''}`\n );\n const hashBuffer = await window.crypto.subtle.digest('SHA-256', data);\n return this.arrayBufferToHex(hashBuffer);\n }\n\n private arrayBufferToHex(buffer: ArrayBuffer): string {\n return Array.from(new Uint8Array(buffer))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n}\n","import {Injectable, Inject} from '@angular/core';\nimport {HttpInterceptor, HttpRequest, HttpHandler, HttpErrorResponse} from '@angular/common/http';\nimport {Observable, catchError, throwError} from 'rxjs';\nimport {ErrorLoggerService} from './error-logger.service';\nimport {LOGGER_CONFIG, LoggerConfig} from \"./logger-config\";\n\n@Injectable()\nexport class ErrorLoggerInterceptor implements HttpInterceptor {\n constructor(@Inject(LOGGER_CONFIG) private config: LoggerConfig, private errorLogger: ErrorLoggerService) {\n console.log('✅ Logger interceptor loaded.')\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<any> {\n if (!this.config.enableLogging) {\n return next.handle(req)\n } else {\n return next.handle(req).pipe(\n catchError((error: HttpErrorResponse) => {\n if (!req.url.includes(this.config.apiUrl)) {\n if (error instanceof HttpErrorResponse) {\n const standardError = new Error(`HTTP ${error.status}: ${error.message}`);\n standardError.stack = error.error?.stack || error.message;\n this.errorLogger.handleError(standardError);\n }\n }\n\n return throwError(() => error);\n })\n );\n }\n }\n}\n","import {ErrorHandler, Provider} from '@angular/core';\nimport {ErrorLoggerService} from './error-logger.service';\nimport {LOGGER_CONFIG, LoggerConfig} from \"./logger-config\";\n\nexport function provideErrorTracker(config: LoggerConfig): Provider[] {\n return [\n {provide: LOGGER_CONFIG, useValue: config},\n {provide: ErrorLoggerService, useClass: ErrorLoggerService},\n {provide: ErrorHandler, useExisting: ErrorLoggerService},\n ];\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2.UserActionTrackerService","i3.BuildIdService","catchError","i1.ErrorLoggerService"],"mappings":"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"}