{"version":3,"sources":["../../src/Mailer.mts"],"sourcesContent":["import type { Mailable } from \"Mailable.mjs\";\nimport type { MailerProvider } from \"MailerProvider.mjs\";\nimport { type EventEmittor, EventManager } from \"@devbro/neko-helper\";\n\n/** Available mailer events */\nexport const MailerEvents = [\"sent\", \"failed\"];\n/** Type representing mailer events */\nexport type MailerEvent = (typeof MailerEvents)[number];\n\n/**\n * Main mailer class for sending emails with event support.\n * Provides a unified interface for sending emails through various providers\n * with event notifications for sent and failed emails.\n */\nexport class Mailer implements EventEmittor<[\"sent\", \"failed\"]> {\n  private eventManager = new EventManager<MailerEvent[]>();\n\n  /**\n   * Creates a new Mailer instance.\n   * @param provider - The mailer provider to use for sending emails\n   */\n  constructor(private provider: MailerProvider) {}\n\n  /**\n   * Registers an event listener.\n   * @param event - The event to listen for ('sent' or 'failed')\n   * @param listener - The callback function to execute when the event occurs\n   * @returns This mailer instance for chaining\n   */\n  on(event: MailerEvent, listener: (...args: any[]) => void): this {\n    this.eventManager.on(event, listener);\n    return this;\n  }\n\n  /**\n   * Removes an event listener.\n   * @param event - The event to stop listening for\n   * @param listener - The callback function to remove\n   * @returns This mailer instance for chaining\n   */\n  off(event: MailerEvent, listener: (...args: any[]) => void): this {\n    this.eventManager.off(event, listener);\n    return this;\n  }\n\n  /**\n   * Emits an event to all registered listeners.\n   * @param event - The event to emit\n   * @param args - Arguments to pass to the listeners\n   * @returns True if the event was emitted successfully\n   */\n  async emit(event: MailerEvent, ...args: any[]): Promise<boolean> {\n    return await this.eventManager.emit(event, ...args);\n  }\n\n  /**\n   * Sends an email message.\n   * Emits 'sent' event on success or 'failed' event on error.\n   * @param mail - The email message to send\n   * @throws The error from the provider if sending fails\n   */\n  async send(mail: Mailable): Promise<void> {\n    try {\n      await this.provider.sendMail(mail);\n      await this.eventManager.emit(\"sent\", { mail });\n    } catch (error) {\n      await this.eventManager.emit(\"failed\", { mail, error });\n      throw error;\n    }\n  }\n}\n"],"mappings":";;AAEA,SAA4B,oBAAoB;AAGzC,MAAM,eAAe,CAAC,QAAQ,QAAQ;AAStC,MAAM,OAAmD;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9D,YAAoB,UAA0B;AAA1B;AAAA,EAA2B;AAAA,EArBjD,OAcgE;AAAA;AAAA;AAAA,EACtD,eAAe,IAAI,aAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcvD,GAAG,OAAoB,UAA0C;AAC/D,SAAK,aAAa,GAAG,OAAO,QAAQ;AACpC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,OAAoB,UAA0C;AAChE,SAAK,aAAa,IAAI,OAAO,QAAQ;AACrC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,UAAuB,MAA+B;AAC/D,WAAO,MAAM,KAAK,aAAa,KAAK,OAAO,GAAG,IAAI;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,MAA+B;AACxC,QAAI;AACF,YAAM,KAAK,SAAS,SAAS,IAAI;AACjC,YAAM,KAAK,aAAa,KAAK,QAAQ,EAAE,KAAK,CAAC;AAAA,IAC/C,SAAS,OAAO;AACd,YAAM,KAAK,aAAa,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AACF;","names":[]}