import {moment} from "duniter/app/lib/common-libs/moment"; import {Conf} from "./types/conf"; import {ConfMail} from './types/conf' import * as nodemailer from 'nodemailer' import * as os from 'os' // TODO: in confMail const QUEUE_PERIOD = 5000 const queue: EmailContent[] = [] let conf: ConfMail|undefined export function initConfMail(confMail: ConfMail) { conf = confMail ;(async () => { while (true) { await consumeQueue() await new Promise((res) => setTimeout(res, QUEUE_PERIOD)) } })() } export async function queueEmail(subject: string, html: string, cc?: string) { queue.push({ subject, body: html, cc }) } async function consumeQueue() { while (queue.length) { const mail = queue.shift() if (mail) { await sendEmail(mail.subject, mail.body, mail.cc) } } } async function sendEmail(subject: string, html: string, cc?: string) { if (!conf) { console.error(`Mail is not properly configured.`) return } console.log(`[mail] Subject: ${subject}`) console.log(`[mail] Body: ${html}`) if (!conf.enabled) { console.warn(`Mail is disabled.`) return } let transporter = nodemailer.createTransport({ host: conf.host, port: conf.port, secure: false, // true for 465, false for other ports auth: { user: conf.username, // generated ethereal user pass: conf.apikey // generated ethereal password }, authMethod: conf.auth, requireTLS: true, }); // send mail with defined transport object let info = await transporter.sendMail({ from: conf.from, to: conf.to, cc: (conf.cc ? [conf.cc] : []).concat(cc ? [cc] : []).join(','), subject, html }) } export const mail = { onEstablished: (target: string, message = `Connection established for ${target}`, getHtml: () => string = () => `
Connection from [${os.hostname}] to ${target} established on ${moment().format('DD-MM-YYYY HH:mm:ss')}.
`) => { return async (cc?: string) => { await queueEmail(`[dw] [${os.hostname}] ${message}`, getHtml(), cc) } }, onDisconnect: (target: string, message = `Connection closed for ${target}`, getErrorMessage: () => string = () => '', getHtml: (waitingDelay: number, recallDelay: number) => string = (waitingDelay: number, recallDelay: number) => `Connection from [${os.hostname}] to ${target} was lost on ${moment().format('dd-MM-YYYY HH:mm:ss')}.
Waiting ${(waitingDelay / 1000).toFixed(0)} seconds before trying to reconnect (${(recallDelay / 1000).toFixed(0)} seconds for recall).
${getErrorMessage()} `) => { return async (waitingDelay: number, recallDelay: number, cc?: string) => { console.log('Waiting %s seconds...', (waitingDelay / 1000).toFixed(0)) await queueEmail(`[dw] [${os.hostname}] ${message}`, getHtml(waitingDelay, recallDelay), cc) } }, onRestartSuccess: (target: string, message = `Connection recovered for ${target}`, getHtml: () => string = () => `Connection from [${os.hostname}] to ${target} was recovered on ${moment().format('dd-MM-YYYY HH:mm:ss')}.
`) => { return async (cc?: string) => { console.log(`${message}`) await queueEmail(`[dw] [${os.hostname}] ${message}`, getHtml(), cc) } }, } interface EmailContent { subject: string body: string cc?: string }