var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import nodemailer from "nodemailer"; import config from "config"; import nunjucks from 'nunjucks'; import * as util from "util"; import { WrappingError } from "./Utils"; import mjml2html from "mjml"; import * as querystring from "querystring"; import Logger from "./Logger"; export function mailRoute(template) { return `/mail/${template}`; } export default class Mail { constructor(template, data = {}) { this.options = {}; this.template = template; this.data = data; this.options.subject = this.template.getSubject(data); this.verifyData(); } static getTransporter() { if (!this.transporter) throw new MailError('Mail system was not prepared.'); return this.transporter; } static prepare() { return __awaiter(this, void 0, void 0, function* () { const transporter = nodemailer.createTransport({ host: config.get('mail.host'), port: config.get('mail.port'), secure: config.get('mail.secure'), auth: { user: config.get('mail.username'), pass: config.get('mail.password'), }, tls: { rejectUnauthorized: !config.get('mail.allow_invalid_tls') } }); try { yield util.promisify(transporter.verify)(); this.transporter = transporter; } catch (e) { throw new MailError('Connection to mail service unsuccessful.', e); } Logger.info(`Mail ready to be distributed via ${config.get('mail.host')}:${config.get('mail.port')}`); }); } static end() { this.transporter.close(); } static parse(template, data, textOnly) { data.text = textOnly; const nunjucksResult = nunjucks.render(template, data); if (textOnly) return nunjucksResult; const mjmlResult = mjml2html(nunjucksResult, {}); if (mjmlResult.errors.length > 0) { throw new MailError(`Error while parsing mail template ${template}: ${JSON.stringify(mjmlResult.errors, null, 4)}`); } return mjmlResult.html; } verifyData() { for (const forbiddenField of [ 'to', ]) { if (this.data[forbiddenField] !== undefined) { throw new MailError(`Can't use reserved data.${forbiddenField}.`); } } } send(...to) { return __awaiter(this, void 0, void 0, function* () { const results = []; for (const destEmail of to) { // Reset options this.options.html = this.options.text = undefined; // Set options this.options.to = destEmail; // Set data this.data.mail_subject = this.options.subject; this.data.mail_to = this.options.to; this.data.mail_link = `${config.get('public_url')}${mailRoute(this.template.template)}?${querystring.stringify(this.data)}`; // Log Logger.dev('Send mail', this.options); // Render email this.options.html = Mail.parse('mails/' + this.template.template + '.mjml.njk', this.data, false); this.options.text = Mail.parse('mails/' + this.template.template + '.mjml.njk', this.data, true); // Send email results.push(yield Mail.getTransporter().sendMail(this.options)); } return results; }); } } export class MailTemplate { constructor(template, subject) { this._template = template; this.subject = subject; } get template() { return this._template; } getSubject(data) { return 'Watch My Stream - ' + this.subject(data); } } class MailError extends WrappingError { constructor(message = 'An error occurred while sending mail.', cause) { super(message, cause); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFpbC5qcyIsInNvdXJjZVJvb3QiOiIuLyIsInNvdXJjZXMiOlsiTWFpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLFVBQTBDLE1BQU0sWUFBWSxDQUFDO0FBQ3BFLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLFNBQVMsTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLFdBQVcsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBRTlCLE1BQU0sVUFBVSxTQUFTLENBQUMsUUFBZ0I7SUFDdEMsT0FBTyxTQUFTLFFBQVEsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLElBQUk7SUFzRHJCLFlBQVksUUFBc0IsRUFBRSxPQUE2QixFQUFFO1FBSGxELFlBQU8sR0FBWSxFQUFFLENBQUM7UUFJbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUF6RE8sTUFBTSxDQUFDLGNBQWM7UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRU0sTUFBTSxDQUFPLE9BQU87O1lBQ3ZCLE1BQU0sV0FB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QyxJQUFTO1FBQ3ZCLE9BQU8sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0NBQ0o7QUFFRCxNQUFNLFNBQVUsU0FBUSxhQUFhO0lBQ2pDLFlBQVksVUFBa0IsdUNBQXVDLEVBQUUsS0FBYTtRQUNoRixLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBub2RlbWFpbGVyLCB7U2VudE1lc3NhZ2VJbmZvLCBUcmFuc3BvcnRlcn0gZnJvbSBcIm5vZGVtYWlsZXJcIjtcbmltcG9ydCBjb25maWcgZnJvbSBcImNvbmZpZ1wiO1xuaW1wb3J0IHtPcHRpb25zfSBmcm9tIFwibm9kZW1haWxlci9saWIvbWFpbGVyXCI7XG5pbXBvcnQgbnVuanVja3MgZnJvbSAnbnVuanVja3MnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tIFwidXRpbFwiO1xuaW1wb3J0IHtXcmFwcGluZ0Vycm9yfSBmcm9tIFwiLi9VdGlsc1wiO1xuaW1wb3J0IG1qbWwyaHRtbCBmcm9tIFwibWptbFwiO1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSBcInF1ZXJ5c3RyaW5nXCI7XG5pbXBvcnQgTG9nZ2VyIGZyb20gXCIuL0xvZ2dlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFpbFJvdXRlKHRlbXBsYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgL21haWwvJHt0ZW1wbGF0ZX1gO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYWlsIHtcbiAgICBwcml2YXRlIHN0YXRpYyB0cmFuc3BvcnRlcjogVHJhbnNwb3J0ZXI7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUcmFuc3BvcnRlcigpOiBUcmFuc3BvcnRlciB7XG4gICAgICAgIGlmICghdGhpcy50cmFuc3BvcnRlcikgdGhyb3cgbmV3IE1haWxFcnJvcignTWFpbCBzeXN0ZW0gd2FzIG5vdCBwcmVwYXJlZC4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhc3luYyBwcmVwYXJlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0cmFuc3BvcnRlciA9IG5vZGVtYWlsZXIuY3JlYXRlVHJhbnNwb3J0KHtcbiAgICAgICAgICAgIGhvc3Q6IGNvbmZpZy5nZXQoJ21haWwuaG9zdCcpLFxuICAgICAgICAgICAgcG9ydDogY29uZmlnLmdldCgnbWFpbC5wb3J0JyksXG4gICAgICAgICAgICBzZWN1cmU6IGNvbmZpZy5nZXQoJ21haWwuc2VjdXJlJyksXG4gICAgICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgICAgICAgdXNlcjogY29uZmlnLmdldCgnbWFpbC51c2VybmFtZScpLFxuICAgICAgICAgICAgICAgIHBhc3M6IGNvbmZpZy5nZXQoJ21haWwucGFzc3dvcmQnKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0bHM6IHtcbiAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6ICFjb25maWcuZ2V0KCdtYWlsLmFsbG93X2ludmFsaWRfdGxzJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHV0aWwucHJvbWlzaWZ5KHRyYW5zcG9ydGVyLnZlcmlmeSkoKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ZXIgPSB0cmFuc3BvcnRlcjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE1haWxFcnJvcignQ29ubmVjdGlvbiB0byBtYWlsIHNlcnZpY2UgdW5zdWNjZXNzZnVsLicsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgTG9nZ2VyLmluZm8oYE1haWwgcmVhZHkgdG8gYmUgZGlzdHJpYnV0ZWQgdmlhICR7Y29uZmlnLmdldCgnbWFpbC5ob3N0Jyl9OiR7Y29uZmlnLmdldCgnbWFpbC5wb3J0Jyl9YCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbmQoKSB7XG4gICAgICAgIHRoaXMudHJhbnNwb3J0ZXIuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlKHRlbXBsYXRlOiBzdHJpbmcsIGRhdGE6IGFueSwgdGV4dE9ubHk6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgICAgICBkYXRhLnRleHQgPSB0ZXh0T25seTtcbiAgICAgICAgY29uc3QgbnVuanVja3NSZXN1bHQgPSBudW5qdWNrcy5yZW5kZXIodGVtcGxhdGUsIGRhdGEpO1xuICAgICAgICBpZiAodGV4dE9ubHkpIHJldHVybiBudW5qdWNrc1Jlc3VsdDtcblxuICAgICAgICBjb25zdCBtam1sUmVzdWx0ID0gbWptbDJodG1sKG51bmp1Y2tzUmVzdWx0LCB7fSk7XG5cbiAgICAgICAgaWYgKG1qbWxSZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNYWlsRXJyb3IoYEVycm9yIHdoaWxlIHBhcnNpbmcgbWFpbCB0ZW1wbGF0ZSAke3RlbXBsYXRlfTogJHtKU09OLnN0cmluZ2lmeShtam1sUmVzdWx0LmVycm9ycywgbnVsbCwgNCl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWptbFJlc3VsdC5odG1sO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVtcGxhdGU6IE1haWxUZW1wbGF0ZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE9wdGlvbnMgPSB7fTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGE6IHsgW3A6IHN0cmluZ106IGFueSB9O1xuXG4gICAgY29uc3RydWN0b3IodGVtcGxhdGU6IE1haWxUZW1wbGF0ZSwgZGF0YTogeyBbcDogc3RyaW5nXTogYW55IH0gPSB7fSkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zdWJqZWN0ID0gdGhpcy50ZW1wbGF0ZS5nZXRTdWJqZWN0KGRhdGEpO1xuXG4gICAgICAgIHRoaXMudmVyaWZ5RGF0YSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmVyaWZ5RGF0YSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBmb3JiaWRkZW5GaWVsZCBvZiBbXG4gICAgICAgICAgICAndG8nLFxuICAgICAgICBdKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhW2ZvcmJpZGRlbkZpZWxkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1haWxFcnJvcihgQ2FuJ3QgdXNlIHJlc2VydmVkIGRhdGEuJHtmb3JiaWRkZW5GaWVsZH0uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VuZCguLi50bzogc3RyaW5nW10pOiBQcm9taXNlPFNlbnRNZXNzYWdlSW5mb1tdPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGRlc3RFbWFpbCBvZiB0bykge1xuICAgICAgICAgICAgLy8gUmVzZXQgb3B0aW9uc1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmh0bWwgPSB0aGlzLm9wdGlvbnMudGV4dCA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgLy8gU2V0IG9wdGlvbnNcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50byA9IGRlc3RFbWFpbDtcblxuICAgICAgICAgICAgLy8gU2V0IGRhdGFcbiAgICAgICAgICAgIHRoaXMuZGF0YS5tYWlsX3N1YmplY3QgPSB0aGlzLm9wdGlvbnMuc3ViamVjdDtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5tYWlsX3RvID0gdGhpcy5vcHRpb25zLnRvO1xuICAgICAgICAgICAgdGhpcy5kYXRhLm1haWxfbGluayA9IGAke2NvbmZpZy5nZXQ8c3RyaW5nPigncHVibGljX3VybCcpfSR7bWFpbFJvdXRlKHRoaXMudGVtcGxhdGUudGVtcGxhdGUpfT8ke3F1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh0aGlzLmRhdGEpfWA7XG5cbiAgICAgICAgICAgIC8vIExvZ1xuICAgICAgICAgICAgTG9nZ2VyLmRldignU2VuZCBtYWlsJywgdGhpcy5vcHRpb25zKTtcblxuICAgICAgICAgICAgLy8gUmVuZGVyIGVtYWlsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuaHRtbCA9IE1haWwucGFyc2UoJ21haWxzLycgKyB0aGlzLnRlbXBsYXRlLnRlbXBsYXRlICsgJy5tam1sLm5qaycsIHRoaXMuZGF0YSwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRleHQgPSBNYWlsLnBhcnNlKCdtYWlscy8nICsgdGhpcy50ZW1wbGF0ZS50ZW1wbGF0ZSArICcubWptbC5uamsnLCB0aGlzLmRhdGEsIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBTZW5kIGVtYWlsXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goYXdhaXQgTWFpbC5nZXRUcmFuc3BvcnRlcigpLnNlbmRNYWlsKHRoaXMub3B0aW9ucykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFpbFRlbXBsYXRlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZW1wbGF0ZTogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3ViamVjdDogKGRhdGE6IGFueSkgPT4gc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IodGVtcGxhdGU6IHN0cmluZywgc3ViamVjdDogKGRhdGE6IGFueSkgPT4gc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgICAgIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN1YmplY3QoZGF0YTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICdXYXRjaCBNeSBTdHJlYW0gLSAnICsgdGhpcy5zdWJqZWN0KGRhdGEpO1xuICAgIH1cbn1cblxuY2xhc3MgTWFpbEVycm9yIGV4dGVuZHMgV3JhcHBpbmdFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNlbmRpbmcgbWFpbC4nLCBjYXVzZT86IEVycm9yKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTtcbiAgICB9XG59Il19