{"version":3,"file":"telegram-handler.mjs","sources":["../../../../src/logger/handler/telegram-handler.ts"],"sourcesContent":["import type { Handler, HandlerOptions, LogRecord } from '../../types/logger'\nimport { LogLevel } from '../../types/logger'\nimport { AbstractHandler } from './abstract-handler'\nimport { TelegramFormatter } from '../formatter'\nimport { Environment, getEnvironment } from '../../tools/environment'\n\nexport interface TelegramHandlerOptions extends HandlerOptions {\n  botToken: string\n  chatId: string | number\n  parseMode?: 'HTML' | 'Markdown' | 'MarkdownV2'\n  disableNotification?: boolean\n  disableWebPagePreview?: boolean\n  useStyles?: boolean\n  warnInBrowser?: boolean\n}\n\n/**\n * Telegram Handler\n *\n * Sends logs to Telegram chat.\n * The browser displays a warning in the console.\n * In Node.js, sends a message via the Telegram Bot API.\n */\nexport class TelegramHandler extends AbstractHandler implements Handler {\n  protected botToken: string\n  protected chatId: string | number\n  protected parseMode: 'HTML' | 'Markdown' | 'MarkdownV2'\n  protected disableNotification: boolean\n  protected disableWebPagePreview: boolean\n  protected readonly environment: Environment\n  protected warnInBrowser: boolean\n\n  constructor(\n    level: LogLevel = LogLevel.ERROR,\n    options: TelegramHandlerOptions\n  ) {\n    super(level, options.bubble)\n\n    if (!options.botToken) {\n      throw new Error('botToken is required for TelegramHandler')\n    }\n\n    if (!options.chatId) {\n      throw new Error('chatId is required for TelegramHandler')\n    }\n\n    this.botToken = options.botToken\n    this.chatId = options.chatId\n    this.parseMode = options.parseMode || 'HTML'\n    this.disableNotification = options.disableNotification || false\n    this.disableWebPagePreview = options.disableWebPagePreview || true\n    this.environment = getEnvironment()\n    this.warnInBrowser = options.warnInBrowser !== false // By default, we warn you in the browser\n\n    // Set the default formatter\n    this.setFormatter(new TelegramFormatter(this.parseMode === 'HTML'))\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public override async handle(record: LogRecord): Promise<boolean> {\n    const formatter = this.getFormatter()\n    if (!formatter) {\n      console.error('TelegramHandler: No formatter set')\n      return false\n    }\n\n    const message = formatter.format(record)\n\n    // Depending on the environment, we process it differently.\n    if (this.environment === Environment.BROWSE) {\n      return this._handleInBrowser(message, record)\n    } else if (this.environment === Environment.NODE) {\n      return this._handleInNode(message, record)\n    }\n\n    console.warn('TelegramHandler: Unknown environment, using fallback')\n    return this._handleFallback(message)\n  }\n\n  /**\n   * Processing in the browser\n   */\n  protected async _handleInBrowser(_message: string, record: LogRecord): Promise<boolean> {\n    if (this.warnInBrowser) {\n      const warningMessage\n        = `⚠️ TelegramHandler: Cannot send logs to Telegram from browser environment.\\n`\n          + `This would expose your bot token. Consider disabling this handler in browser.\\n`\n          + `Log message: ${record.message}\\n`\n          + `If you need to send logs from browser, use a proxy server.`\n\n      console.warn(warningMessage)\n\n      // We also display a styled message for the developer\n      const style = 'color: #FF9800; background: #FFF3E0; padding: 8px; border: 1px solid #FFB74D; border-radius: 4px;'\n      console.log('%cTelegram Handler Warning', style, warningMessage)\n    }\n\n    // In the browser, we always return false, since the message was not sent.\n    return false\n  }\n\n  /**\n   * Processing in Node.js\n   */\n  protected async _handleInNode(message: string, _record: LogRecord): Promise<boolean> {\n    try {\n      const url = `https://api.telegram.org/bot${this.botToken}/sendMessage`\n      const config = JSON.stringify({\n        chat_id: this.chatId,\n        text: message,\n        parse_mode: this.parseMode,\n        disable_notification: this.disableNotification,\n        disable_web_page_preview: this.disableWebPagePreview\n      })\n      const response = await fetch(url, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json'\n        },\n        body: config\n      })\n\n      const result = await response.json()\n\n      if (!result.ok) {\n        console.error('TelegramHandler: Failed to send message', result)\n        return false\n      }\n\n      return true\n    } catch (error) {\n      console.error('TelegramHandler: Error sending message', error)\n      return false\n    }\n  }\n\n  /**\n   * Fallback processing for unknown environments\n   */\n  protected async _handleFallback(message: string): Promise<boolean> {\n    console.log('TelegramHandler (fallback):', message)\n    return false\n  }\n\n  public updateSettings(options: Partial<TelegramHandlerOptions>): this {\n    if (options.botToken) this.botToken = options.botToken\n    if (options.chatId) this.chatId = options.chatId\n    if (options.parseMode) this.parseMode = options.parseMode\n    if (options.disableNotification !== undefined) {\n      this.disableNotification = options.disableNotification\n    }\n    if (options.disableWebPagePreview !== undefined) {\n      this.disableWebPagePreview = options.disableWebPagePreview\n    }\n    if (options.warnInBrowser !== undefined) {\n      this.warnInBrowser = options.warnInBrowser\n    }\n    return this\n  }\n\n  /**\n   * Get current environment\n   */\n  public getEnvironment(): Environment {\n    return this.environment\n  }\n\n  /**\n   * Check if the Telegram API is available\n   */\n  public async testConnection(): Promise<boolean> {\n    if (this.environment === 'browser') {\n      console.warn('TelegramHandler: Cannot test connection in browser environment')\n      return false\n    }\n\n    try {\n      const url = `https://api.telegram.org/bot${this.botToken}/getMe`\n      const response = await fetch(url)\n      const result = await response.json()\n      return result.ok === true\n    } catch (error) {\n      console.error('TelegramHandler: Test connection failed', error)\n      return false\n    }\n  }\n}\n"],"names":[],"mappings":"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"}