import { Http } from "./http"; import { navigator } from "./browser-utils"; /** * Responsible for sending log requests to the back-end with * error information. * * @export * @abstract * @class Logger */ export abstract class Logger { /** * Log an error to the server. * * @static * @param {Error} err * @memberof Logger */ public static async log(err: Error) { if (!window._RecSys.Bundle.Properties.logger.supressErrors) { throw err; } await Http.post( `${window._RecSys.Bundle.Properties.event.url}/${window._RecSys.Bundle.Configuration.store.slug}/${window._RecSys.Bundle.Properties.event.endpoint.log}`, { url: window.location.href, message: this.buildMessage(err), err: err.message, }, ); } /** * Build a error message with more information, including * user's browser and error stack trace. * * @private * @static * @param {Error} err Error to get stack and message from. * @return {string} * @memberof Logger */ private static buildMessage(err: Error): string { const browser = navigator()?.userAgent || "unknown"; const message = ` URL: ${window.location.href} Message: ${err.message} Browser: ${browser} ${err.stack} `; // Remove trailing whitespace from each line. return message .split("\n") .map((s) => s.trim()) .join("\n"); } }