smtp-server-as-promised
Version:
Promisify smtp-server module
139 lines • 5.13 kB
JavaScript
;
/// <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