{"version":3,"file":"logger.mjs","sources":["../../../src/logger/logger.ts"],"sourcesContent":["import type { Handler, Processor, LogRecord, LogLevelName, LoggerInterface } from '../types/logger'\nimport { LogLevel } from '../types/logger'\nimport { AbstractLogger } from './abstract-logger'\n\n/**\n * A logger created according to the principles of `Monolog`\n *\n * @link https://github.com/Seldaek/monolog\n */\nexport class Logger extends AbstractLogger implements LoggerInterface {\n  private readonly channel: string\n  private handlers: Handler[] = []\n  private processors: Processor[] = []\n\n  constructor(channel: string) {\n    super()\n    this.channel = channel\n  }\n\n  // region static methods for creation ////\n  static create(channel: string): Logger {\n    return new Logger(channel)\n  }\n  // endregion ////\n\n  // region config ////\n  public pushHandler(handler: Handler): this {\n    this.handlers.push(handler)\n    return this\n  }\n\n  public popHandler(): Handler | null {\n    return this.handlers.pop() || null\n  }\n\n  public setHandlers(handlers: Handler[]): this {\n    this.handlers = handlers\n    return this\n  }\n\n  public pushProcessor(processor: Processor): this {\n    this.processors.push(processor)\n    return this\n  }\n  // endregion ////\n\n  /**\n   * @inheritDoc\n   */\n  public async log(level: LogLevel, message: string, context?: Record<string, any>): Promise<void> {\n    const record: LogRecord = {\n      channel: this.channel,\n      level,\n      levelName: LogLevel[level] as LogLevelName,\n      message,\n      context: context ?? {},\n      extra: {},\n      timestamp: new Date()\n    }\n\n    // Using processors\n    let processedRecord = record\n    for (const processor of this.processors) {\n      processedRecord = processor(processedRecord)\n    }\n\n    // Pass the record to the handlers\n    for (const handler of this.handlers) {\n      if (handler.isHandling(level)) {\n        // The handler returns a boolean indicating whether it was processed successfully.\n        const handled = await handler.handle(processedRecord)\n\n        // If the handler has processed the record and should NOT proceed further (bubble: false)\n        // break the chain of handlers\n        if (handled && !handler.shouldBubble()) {\n          break\n        }\n      }\n    }\n  }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AASO,MAAM,eAAe,cAAA,CAA0C;AAAA,EATtE;AASsE,IAAA,MAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AAAA;AAAA,EACnD,OAAA;AAAA,EACT,WAAsB,EAAC;AAAA,EACvB,aAA0B,EAAC;AAAA,EAEnC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA,EAGA,OAAO,OAAO,OAAA,EAAyB;AACrC,IAAA,OAAO,IAAI,OAAO,OAAO,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA,EAIO,YAAY,OAAA,EAAwB;AACzC,IAAA,IAAA,CAAK,QAAA,CAAS,KAAK,OAAO,CAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEO,UAAA,GAA6B;AAClC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,EAAI,IAAK,IAAA;AAAA,EAChC;AAAA,EAEO,YAAY,QAAA,EAA2B;AAC5C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEO,cAAc,SAAA,EAA4B;AAC/C,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,SAAS,CAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,GAAA,CAAI,KAAA,EAAiB,OAAA,EAAiB,OAAA,EAA8C;AAC/F,IAAA,MAAM,MAAA,GAAoB;AAAA,MACxB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAA;AAAA,MACA,SAAA,EAAW,SAAS,KAAK,CAAA;AAAA,MACzB,OAAA;AAAA,MACA,OAAA,EAAS,WAAW,EAAC;AAAA,MACrB,OAAO,EAAC;AAAA,MACR,SAAA,sBAAe,IAAA;AAAK,KACtB;AAGA,IAAA,IAAI,eAAA,GAAkB,MAAA;AACtB,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACvC,MAAA,eAAA,GAAkB,UAAU,eAAe,CAAA;AAAA,IAC7C;AAGA,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,KAAK,CAAA,EAAG;AAE7B,QAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,eAAe,CAAA;AAIpD,QAAA,IAAI,OAAA,IAAW,CAAC,OAAA,CAAQ,YAAA,EAAa,EAAG;AACtC,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;;"}