UNPKG

rokot-notification

Version:

Rokot - [Rocketmakers](http://www.rocketmakers.com/) TypeScript NodeJs Platform

112 lines (111 loc) 4.71 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const recipients_1 = require("../core/recipients"); const dispatchHandler_1 = require("../core/dispatchHandler"); const sgMail = require("@sendgrid/mail"); class SendgridNotificationDispatchHandler extends dispatchHandler_1.NotificationDispatchHandler { constructor(logger, transport) { super("sendgrid", logger, transport); } } exports.SendgridNotificationDispatchHandler = SendgridNotificationDispatchHandler; function sendgridInitializer(logger, config, recipientResolver) { return __awaiter(this, void 0, void 0, function* () { const transporter = yield new SendgridTransporter(logger, config).getTransporter(); const transport = new SendgridNotificationTransport(logger, transporter, recipientResolver || recipients_1.recipientTokenResolver, config.defaultFromAddress); return new SendgridNotificationDispatchHandler(logger, transport); }); } exports.sendgridInitializer = sendgridInitializer; class SendgridTransporter { constructor(logger, nodemailerConfig) { this.logger = logger; this.nodemailerConfig = nodemailerConfig; } getTransporter() { return __awaiter(this, void 0, void 0, function* () { this.validate(); return yield this.createTransport(); }); } validate() { this.logger.trace(`Validating Sendgrid Transporter config`); if (!this.nodemailerConfig || !this.nodemailerConfig.apiKey) { const msg = "Email credential cannot be null/undefined or contain empty api key"; this.logger.error("-- " + msg); throw new Error(msg); } this.logger.info("-- Passed"); } createSendgridTransport() { sgMail.setApiKey(this.nodemailerConfig.apiKey); const subs = this.nodemailerConfig.substitutionWrappers; if (subs) { sgMail.setSubstitutionWrappers(subs[0], subs[1]); } return sgMail; } createTransport() { return new Promise((res, rej) => { res(this.createSendgridTransport()); }); } } exports.SendgridTransporter = SendgridTransporter; class SendgridNotificationTransport { constructor(logger, native, recipientResolver, defaultFromAddress) { this.logger = logger; this.native = native; this.recipientResolver = recipientResolver; this.defaultFromAddress = defaultFromAddress; logger.trace("Created sendgrid Notification Transport"); } static create(logger, transporter, recipientResolver, defaultFromAddress) { return __awaiter(this, void 0, void 0, function* () { const t = yield transporter.getTransporter(); return new SendgridNotificationTransport(logger, t, recipientResolver, defaultFromAddress); }); } getFromAddress(notification) { return notification.fromAddress || this.defaultFromAddress; } shutdown() { } resolveTokens(recipients) { return this.recipientResolver.find(recipients, ["sendgrid", "email"], true); } send(recipients, from, builder) { return __awaiter(this, void 0, void 0, function* () { const to = yield this.resolveTokens(recipients); if (!to || !to.length) { return; } const outMessage = { to, from }; builder && builder(outMessage); return this.sendMessage(outMessage); }); } sendMessage(mail) { return __awaiter(this, void 0, void 0, function* () { try { const info = yield this.native.send(mail); const failed = []; const sent = []; return { transport: "sendgrid", sent, failed, native: info }; } catch (e) { this.logger.error(e, "sendgrid was unable to send mail"); return { transport: "sendgrid", error: e }; } }); } } exports.SendgridNotificationTransport = SendgridNotificationTransport;