UNPKG

smtp-server-as-promised

Version:
139 lines 5.13 kB
"use strict"; /// <reference types="node" /> /// <reference types="nodemailer" /> Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const is_stream_ended_1 = tslib_1.__importDefault(require("is-stream-ended")); const null_writable_1 = tslib_1.__importDefault(require("null-writable")); const stream_finished_1 = tslib_1.__importDefault(require("stream.finished")); const smtp_server_1 = require("smtp-server"); tslib_1.__exportStar(require("smtp-server"), exports); class SMTPServerAsPromised { constructor(options = {}) { this.closed = false; const newOptions = {}; newOptions.onConnect = (session, callback) => this.onConnect(session) .then(() => callback()) .catch((err) => callback(err)); newOptions.onAuth = (auth, session, callback) => this.onAuth(auth, session) .then((response) => callback(null, response)) .catch((err) => callback(err)); newOptions.onMailFrom = (address, session, callback) => this.onMailFrom(address, session) .then(() => callback()) .catch((err) => callback(err)); newOptions.onRcptTo = (address, session, callback) => this.onRcptTo(address, session) .then(() => callback()) .catch((err) => callback(err)); newOptions.onData = (stream, session, callback) => { const promiseStream = new Promise((resolve, reject) => { if (is_stream_ended_1.default(stream)) { return resolve(); } stream_finished_1.default(stream, err => { if (err) reject(err); else resolve(); }); }); if (is_stream_ended_1.default(stream)) { return callback(new Error("SMTP data stream is already ended")); } return this.onData(stream, session) .then(() => promiseStream) .then(() => callback()) .catch((err) => { stream.pipe(new null_writable_1.default()); callback(err); }); }; newOptions.onClose = (session) => this.onClose(session); this.server = new smtp_server_1.SMTPServer(Object.assign(Object.assign({}, options), newOptions)); this.server.on("error", (err) => this.onError(err)); } listen(options = {}) { return new Promise((resolve, reject) => { const netServer = this.server.server; const listeningHandler = () => { netServer.removeListener("error", errorHandler); const address = netServer.address(); resolve(address); }; const errorHandler = (err) => { netServer.removeListener("listening", listeningHandler); reject(err); }; netServer.once("listening", listeningHandler); netServer.once("error", errorHandler); this.server.listen(options); }); } close() { return new Promise((resolve, reject) => { this.server.close((err) => { this.closed = true; if (this.errorHandler) { this.server.removeListener("error", this.errorHandler); this.errorHandler = undefined; } if (err) { return reject(err); } else { resolve(); } }); }); } updateSecureContext(options) { this.server.updateSecureContext(options); } destroy() { if (!this.closed) { return this.close(); } else { return Promise.resolve(); } } /** This method can be overriden in subclass */ // prettier-ignore // @ts-ignore onAuth(auth, session) { return Promise.reject(new Error('onAuth method not overriden in subclass')); } /** This method can be overriden in subclass */ // @ts-ignore onClose(session) { return Promise.resolve(); } /** This method can be overriden in subclass */ // @ts-ignore onConnect(session) { return Promise.resolve(); } /** This method can be overriden in subclass */ // @ts-ignore onData(stream, session) { stream.pipe(new null_writable_1.default()); return Promise.resolve(); } /** This method can be overriden in subclass */ // @ts-ignore onMailFrom(address, session) { return Promise.resolve(); } /** This method can be overriden in subclass */ // @ts-ignore onRcptTo(address, session) { return Promise.resolve(); } /** This method can be overriden in subclass */ // @ts-ignore onError(error) { return Promise.resolve(); } } exports.SMTPServerAsPromised = SMTPServerAsPromised; exports.default = SMTPServerAsPromised; //# sourceMappingURL=smtp-server-as-promised.js.map