{"version":3,"file":"stream-handler.mjs","sources":["../../../../src/logger/handler/stream-handler.ts"],"sourcesContent":["import type { Writable } from 'node:stream'\nimport type { Handler, HandlerOptions, LogRecord } from '../../types/logger'\nimport { LogLevel } from '../../types/logger'\nimport { AbstractHandler } from './abstract-handler'\nimport { LineFormatter } from '../formatter'\n\nexport interface StreamHandlerOptions extends HandlerOptions {\n  stream: Writable\n}\n\n/**\n * Stream Handler\n *\n * Node.js stream handler for writing logs to streams.\n */\nexport class StreamHandler extends AbstractHandler implements Handler {\n  /**\n   * Stream for writing logs.\n   * @private\n   */\n  private stream: Writable\n\n  /**\n   * Creates a StreamHandler instance.\n   *\n   * @param {LogLevel} level - Minimum log level.\n   * @param options\n   *     - `stream: Writable` - Stream to write to (e.g., `process.stdout`, `process.stderr`, `fs.WriteStream`)\n   *     - `bubble?: boolean` - Determines whether the handler should bubble the record to the next handler.\n   */\n  constructor(\n    level: LogLevel = LogLevel.DEBUG,\n    options: StreamHandlerOptions\n  ) {\n    const opts = {\n      bubble: true,\n      ...options\n    }\n    super(level, opts.bubble)\n\n    this.stream = opts.stream\n    this.setFormatter(new LineFormatter())\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public override async handle(record: LogRecord): Promise<boolean> {\n    try {\n      const formatter = this.getFormatter()!\n      const message = formatter.format(record) + '\\n'\n      this.stream.write(message)\n    } catch (error) {\n      // If stream write fails, log to stderr\n      console.error(`StreamHandler write error: ${error}`)\n      return false\n    }\n\n    return true\n  }\n\n  /**\n   * Closes the stream (if supported).\n   *\n   * @returns {Promise<void>}\n   */\n  public async close(): Promise<void> {\n    if (typeof this.stream.end === 'function') {\n      return new Promise((resolve, reject) => {\n        this.stream.end((error?: Error | null) => {\n          if (error) reject(error)\n          else resolve()\n        })\n      })\n    }\n  }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAeO,MAAM,sBAAsB,eAAA,CAAmC;AAAA,EAftE;AAesE,IAAA,MAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5D,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUR,WAAA,CACE,KAAA,GAAkB,QAAA,CAAS,KAAA,EAC3B,OAAA,EACA;AACA,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,MAAA,EAAQ,IAAA;AAAA,MACR,GAAG;AAAA,KACL;AACA,IAAA,KAAA,CAAM,KAAA,EAAO,KAAK,MAAM,CAAA;AAExB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,YAAA,CAAa,IAAI,aAAA,EAAe,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAsB,OAAO,MAAA,EAAqC;AAChE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA,GAAI,IAAA;AAC3C,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,OAAO,CAAA;AAAA,IAC3B,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAA8B,KAAK,CAAA,CAAE,CAAA;AACnD,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,KAAA,GAAuB;AAClC,IAAA,IAAI,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,KAAQ,UAAA,EAAY;AACzC,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAyB;AACxC,UAAA,IAAI,KAAA,SAAc,KAAK,CAAA;AAAA,eAClB,OAAA,EAAQ;AAAA,QACf,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AACF;;;;"}