@cute-dw/core
Version:
This TypeScript library is the main part of a more powerfull package designed for the fast WEB software development. The cornerstone of the library is the **DataStore** class, which might be useful when you need a full control of the data, but do not need
122 lines • 14.6 kB
JavaScript
import { Injectable, InjectionToken } from '@angular/core';
import { debounceTime, filter, Subject } from 'rxjs';
import { DateFormat } from '../util/i18n/text/DateFormat';
import { SimpleDateFormat } from '../util/i18n/text/SimpleDateFormat';
import * as i0 from "@angular/core";
export const LOGGER = new InjectionToken("logger");
export var LogLevel;
(function (LogLevel) {
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
LogLevel[LogLevel["INFO"] = 1] = "INFO";
LogLevel[LogLevel["LOG"] = 2] = "LOG";
LogLevel[LogLevel["WARN"] = 3] = "WARN";
LogLevel[LogLevel["ERROR"] = 4] = "ERROR";
LogLevel[LogLevel["FATAL"] = 5] = "FATAL";
})(LogLevel || (LogLevel = {}));
var LoggerEvents;
(function (LoggerEvents) {
LoggerEvents[LoggerEvents["Flush"] = 1] = "Flush";
})(LoggerEvents || (LoggerEvents = {}));
/**
* A logging service class that is able to send logs to the browser console and to the server URL address
*/
export class LogService {
constructor() {
this.logLevel = LogLevel.INFO;
this.serverLogLevel = LogLevel.WARN;
this.useServer = false;
this._buffer = [];
this._flush = new Subject();
this._dateFormat = new SimpleDateFormat(DateFormat.ISODATETIMETZ);
this._subscription = this._flush
.pipe(debounceTime(5000), filter((event) => event === LoggerEvents.Flush))
.subscribe(() => this.flushBuffer());
}
static getLogger(name) {
let logger = this._map.get(name);
if (!logger) {
logger = new LogService();
logger.name = name;
this._map.set(name, logger);
}
return logger;
}
flushBuffer() {
const data = this._buffer.splice(0);
if (data.length === 0) {
return;
}
const body = "["
+ data
.map((entry) => this.buildLogString(entry))
.reduce((json, entry) => (json += entry + ","), '')
+ "]";
const xobj = new XMLHttpRequest();
xobj.onerror = (err) => console.error(err);
xobj.open('POST', this.serverEndPoint, true);
xobj.send(body);
}
buildLogString(entry) {
return JSON.stringify(entry);
}
debug(message) {
this.logMessage(LogLevel.DEBUG, message);
}
log(message) {
this.logMessage(LogLevel.LOG, message);
}
info(message) {
this.logMessage(LogLevel.INFO, message);
}
warn(message) {
this.logMessage(LogLevel.WARN, message);
}
error(message) {
this.logMessage(LogLevel.ERROR, message);
}
fatal(message) {
this.logMessage(LogLevel.FATAL, message);
}
logMessage(level, message) {
const timestamp = this._dateFormat.format(Date.now());
if (this.useServer && this.serverEndPoint) {
if (level >= this.serverLogLevel) {
this._buffer.push({ timestamp, level, message });
this._flush.next(LoggerEvents.Flush);
}
}
else if (level >= this.logLevel) {
const msg = `${timestamp} ${this.name} ${LogLevel[level]}: ${message}`;
switch (level) {
case LogLevel.DEBUG:
console.debug(msg);
break;
case LogLevel.INFO:
console.info(msg);
break;
case LogLevel.WARN:
console.warn(msg);
break;
case LogLevel.ERROR:
case LogLevel.FATAL:
console.error(msg);
break;
default:
console.log(msg);
}
}
}
destroy() {
this._subscription.unsubscribe();
}
}
LogService._map = new Map();
LogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: LogService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
LogService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: LogService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: LogService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jdXRlLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9sb2cuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7QUFFdEUsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFhLFFBQVEsQ0FBQyxDQUFDO0FBRS9ELE1BQU0sQ0FBTixJQUFZLFFBT1g7QUFQRCxXQUFZLFFBQVE7SUFDbEIseUNBQUssQ0FBQTtJQUNMLHVDQUFJLENBQUE7SUFDSixxQ0FBRyxDQUFBO0lBQ0gsdUNBQUksQ0FBQTtJQUNKLHlDQUFLLENBQUE7SUFDTCx5Q0FBSyxDQUFBO0FBQ1AsQ0FBQyxFQVBXLFFBQVEsS0FBUixRQUFRLFFBT25CO0FBRUQsSUFBSyxZQUVKO0FBRkQsV0FBSyxZQUFZO0lBQ2YsaURBQVMsQ0FBQTtBQUNYLENBQUMsRUFGSSxZQUFZLEtBQVosWUFBWSxRQUVoQjtBQVNEOztHQUVHO0FBSUgsTUFBTSxPQUFPLFVBQVU7SUFpQnJCO1FBWkEsYUFBUSxHQUFhLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDbkMsbUJBQWMsR0FBYSxRQUFRLENBQUMsSUFBSSxDQUFDO1FBSXpDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFFbkIsWUFBTyxHQUFlLEVBQUUsQ0FBQztRQUN6QixXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQWdCLENBQUM7UUFDckMsZ0JBQVcsR0FBRyxJQUFJLGdCQUFn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YUFDcEI7U0FDRjtJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNuQyxDQUFDOztBQTFHYyxlQUFJLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7dUdBRnpDLFVBQVU7MkdBQVYsVUFBVSxjQUZULE1BQU07MkZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGF0ZUZvcm1hdCB9IGZyb20gJy4uL3V0aWwvaTE4bi90ZXh0L0RhdGVGb3JtYXQnO1xuaW1wb3J0IHsgU2ltcGxlRGF0ZUZvcm1hdCB9IGZyb20gJy4uL3V0aWwvaTE4bi90ZXh0L1NpbXBsZURhdGVGb3JtYXQnO1xuXG5leHBvcnQgY29uc3QgTE9HR0VSID0gbmV3IEluamVjdGlvblRva2VuPExvZ1NlcnZpY2U+KFwibG9nZ2VyXCIpO1xuXG5leHBvcnQgZW51bSBMb2dMZXZlbCB7XG4gIERFQlVHLFxuICBJTkZPLFxuICBMT0csXG4gIFdBUk4sXG4gIEVSUk9SLFxuICBGQVRBTFxufVxuXG5lbnVtIExvZ2dlckV2ZW50cyB7XG4gIEZsdXNoID0gMVxufVxuXG5pbnRlcmZhY2UgTG9nRW50cnkge1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgbGV2ZWw6IExvZ0xldmVsO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRhdGE/OiBhbnk7XG59XG5cbi8qKlxuICogQSBsb2dnaW5nIHNlcnZpY2UgY2xhc3MgdGhhdCBpcyBhYmxlIHRvIHNlbmQgbG9ncyB0byB0aGUgYnJvd3NlciBjb25zb2xlIGFuZCB0byB0aGUgc2VydmVyIFVSTCBhZGRyZXNzXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIExvZ1NlcnZpY2Uge1xuXG4gIHByaXZhdGUgc3RhdGljIF9tYXAgPSBuZXcgTWFwPHN0cmluZywgTG9nU2VydmljZT4oKTtcblxuXG4gIGxvZ0xldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLklORk87XG4gIHNlcnZlckxvZ0xldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLldBUk47XG4gIHNlcnZlckVuZFBvaW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgbmFtZT86IHN0cmluZztcbiAgdXNlU2VydmVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfYnVmZmVyOiBMb2dFbnRyeVtdID0gW107XG4gIHByaXZhdGUgX2ZsdXNoID0gbmV3IFN1YmplY3Q8TG9nZ2VyRXZlbnRzPigpO1xuICBwcml2YXRlIF9kYXRlRm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoRGF0ZUZvcm1hdC5JU09EQVRFVElNRVRaKTtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gdGhpcy5fZmx1c2hcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoNTAwMCksXG4gICAgICAgIGZpbHRlcigoZXZlbnQpID0+IGV2ZW50ID09PSBMb2dnZXJFdmVudHMuRmx1c2gpKVxuICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgKCkgPT4gdGhpcy5mbHVzaEJ1ZmZlcigpXG4gICAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldExvZ2dlcihuYW1lOiBzdHJpbmcpOiBMb2dTZXJ2aWNlIHtcbiAgICBsZXQgbG9nZ2VyOiBMb2dTZXJ2aWNlIHwgdW5kZWZpbmVkID0gdGhpcy5fbWFwLmdldChuYW1lKTtcbiAgICBpZiAoIWxvZ2dlcikge1xuICAgICAgbG9nZ2VyID0gbmV3IExvZ1NlcnZpY2UoKTtcbiAgICAgIGxvZ2dlci5uYW1lID0gbmFtZTtcbiAgICAgIHRoaXMuX21hcC5zZXQobmFtZSwgbG9nZ2VyKTtcbiAgICB9XG4gICAgcmV0dXJuIGxvZ2dlcjtcbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hCdWZmZXIoKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuX2J1ZmZlci5zcGxpY2UoMCk7XG5cbiAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gXCJbXCJcbiAgICAgICAgICAgICAgICAgICsgZGF0YVxuICAgICAgICAgICAgICAgICAgICAubWFwKChlbnRyeSkgPT4gdGhpcy5idWlsZExvZ1N0cmluZyhlbnRyeSkpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGpzb24sIGVudHJ5KSA9PiAoanNvbiArPSBlbnRyeSArIFwiLFwiKSwgJycpXG4gICAgICAgICAgICAgICAgICArIFwiXVwiO1xuXG4gICAgY29uc3QgeG9iaiA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhvYmoub25lcnJvciA9IChlcnIpID0+IGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB4b2JqLm9wZW4oJ1BPU1QnLCB0aGlzLnNlcnZlckVuZFBvaW50ISwgdHJ1ZSk7XG4gICAgeG9iai5zZW5kKGJvZHkpO1xuXG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRMb2dTdHJpbmcoZW50cnk6IExvZ0VudHJ5KTogc3RyaW5nIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZW50cnkpO1xuICB9XG5cbiAgZGVidWcobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2dNZXNzYWdlKExvZ0xldmVsLkRFQlVHLCBtZXNzYWdlKTtcbiAgfVxuXG4gIGxvZyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmxvZ01lc3NhZ2UoTG9nTGV2ZWwuTE9HLCBtZXNzYWdlKTtcbiAgfVxuXG4gIGluZm8obWVzc2FnZTogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2dNZXNzYWdlKExvZ0xldmVsLklORk8sIG1lc3NhZ2UpO1xuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmxvZ01lc3NhZ2UoTG9nTGV2ZWwuV0FSTiwgbWVzc2FnZSk7XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmxvZ01lc3NhZ2UoTG9nTGV2ZWwuRVJST1IsIG1lc3NhZ2UpO1xuICB9XG5cbiAgZmF0YWwobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgdGhpcy5sb2dNZXNzYWdlKExvZ0xldmVsLkZBVEFMLCBtZXNzYWdlKTtcbiAgfVxuXG4gIGxvZ01lc3NhZ2UobGV2ZWw6IExvZ0xldmVsLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSB0aGlzLl9kYXRlRm9ybWF0LmZvcm1hdChEYXRlLm5vdygpKTtcbiAgICBpZiAodGhpcy51c2VTZXJ2ZXIgJiYgdGhpcy5zZXJ2ZXJFbmRQb2ludCkge1xuICAgICAgaWYgKGxldmVsID49IHRoaXMuc2VydmVyTG9nTGV2ZWwpIHtcbiAgICAgICAgdGhpcy5fYnVmZmVyLnB1c2goeyB0aW1lc3RhbXAsIGxldmVsLCBtZXNzYWdlIH0pO1xuICAgICAgICB0aGlzLl9mbHVzaC5uZXh0KExvZ2dlckV2ZW50cy5GbHVzaCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChsZXZlbCA+PSB0aGlzLmxvZ0xldmVsKSB7XG4gICAgICBjb25zdCBtc2cgPSBgJHt0aW1lc3RhbXB9ICR7dGhpcy5uYW1lfSAke0xvZ0xldmVsW2xldmVsXX06ICR7bWVzc2FnZX1gO1xuICAgICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgICBjYXNlIExvZ0xldmVsLkRFQlVHOiAgY29uc29sZS5kZWJ1Zyhtc2cpOyBicmVhaztcbiAgICAgICAgY2FzZSBMb2dMZXZlbC5JTkZPOiAgIGNvbnNvbGUuaW5mbyhtc2cpOyAgYnJlYWs7XG4gICAgICAgIGNhc2UgTG9nTGV2ZWwuV0FSTjogICBjb25zb2xlLndhcm4obXNnKTsgIGJyZWFrO1xuICAgICAgICBjYXNlIExvZ0xldmVsLkVSUk9SOlxuICAgICAgICBjYXNlIExvZ0xldmVsLkZBVEFMOiAgY29uc29sZS5lcnJvcihtc2cpOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxufVxuIl19