rokot-notification
Version:
Rokot - [Rocketmakers](http://www.rocketmakers.com/) TypeScript NodeJs Platform
112 lines (111 loc) • 4.71 kB
JavaScript
;
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;