From 82a0aa881d3a657bda8a2a22302f043cb56d5ede Mon Sep 17 00:00:00 2001 From: Rajesh Renato Date: Tue, 26 Nov 2019 19:00:20 +0530 Subject: [PATCH 1/2] removed 'imap.removeListeners' from the imapOnReady method, so the same events can be used in other prototype methods --- lib/client.js | 31 +------------------------------ 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/lib/client.js b/lib/client.js index 62379f3..037360d 100644 --- a/lib/client.js +++ b/lib/client.js @@ -160,34 +160,8 @@ ImapSimple.prototype.search = function (searchCriteria, fetchOptions, callback) return new Promise(function (resolve, reject) { - function imapOnError(err) { - if (err.source === 'timeout-auth') { - err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' - } - - self.imap.removeListener('close', imapOnClose); - self.imap.removeListener('end', imapOnEnd); - reject(err); - } - - function imapOnEnd() { - self.imap.removeListener('error', imapOnError); - self.imap.removeListener('close', imapOnClose); - reject(new Error('Connection ended unexpectedly')); - } - - function imapOnClose() { - self.imap.removeListener('error', imapOnError); - self.imap.removeListener('end', imapOnEnd); - reject(new Error('Connection closed unexpectedly')); - } - - self.imap.once('error', imapOnError); - self.imap.once('close', imapOnClose); - self.imap.once('end', imapOnEnd); - self.imap.search(searchCriteria, function (err, uids) { - + if (err) { reject(err); return; @@ -586,9 +560,6 @@ function connect(options, callback) { var imap = new Imap(options.imap); function imapOnReady() { - imap.removeListener('error', imapOnError); - imap.removeListener('close', imapOnClose); - imap.removeListener('end', imapOnEnd); resolve(new ImapSimple(imap)); } From dd202403adbb55d75f5cce23590d54fe01c9960f Mon Sep 17 00:00:00 2001 From: Rajesh Renato Date: Tue, 26 Nov 2019 19:34:53 +0530 Subject: [PATCH 2/2] added 'imap.events' to handle errors in all the prototype methods --- lib/client.js | 317 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 316 insertions(+), 1 deletion(-) diff --git a/lib/client.js b/lib/client.js index 037360d..4cd6cca 100644 --- a/lib/client.js +++ b/lib/client.js @@ -80,6 +80,31 @@ ImapSimple.prototype.openBox = function (boxName, callback) { } return new Promise(function (resolve, reject) { + function imapOnError(err) { + if (err.source === 'timeout-auth') { + err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' + } + + self.imap.removeListener('close', imapOnClose); + self.imap.removeListener('end', imapOnEnd); + reject(err); + } + + function imapOnEnd() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('close', imapOnClose); + reject(new Error('Connection ended unexpectedly')); + } + + function imapOnClose() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('end', imapOnEnd); + reject(new Error('Connection closed unexpectedly')); + } + + self.imap.once('error', imapOnError); + self.imap.once('close', imapOnClose); + self.imap.once('end', imapOnEnd); self.imap.openBox(boxName, function (err, result) { @@ -115,6 +140,32 @@ ImapSimple.prototype.closeBox = function (autoExpunge = true, callback) { return new Promise(function (resolve, reject) { + function imapOnError(err) { + if (err.source === 'timeout-auth') { + err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' + } + + self.imap.removeListener('close', imapOnClose); + self.imap.removeListener('end', imapOnEnd); + reject(err); + } + + function imapOnEnd() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('close', imapOnClose); + reject(new Error('Connection ended unexpectedly')); + } + + function imapOnClose() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('end', imapOnEnd); + reject(new Error('Connection closed unexpectedly')); + } + + self.imap.once('error', imapOnError); + self.imap.once('close', imapOnClose); + self.imap.once('end', imapOnEnd); + self.imap.closeBox(autoExpunge, function (err, result) { if (err) { @@ -160,8 +211,34 @@ ImapSimple.prototype.search = function (searchCriteria, fetchOptions, callback) return new Promise(function (resolve, reject) { + function imapOnError(err) { + if (err.source === 'timeout-auth') { + err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' + } + + self.imap.removeListener('close', imapOnClose); + self.imap.removeListener('end', imapOnEnd); + reject(err); + } + + function imapOnEnd() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('close', imapOnClose); + reject(new Error('Connection ended unexpectedly')); + } + + function imapOnClose() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('end', imapOnEnd); + reject(new Error('Connection closed unexpectedly')); + } + + self.imap.once('error', imapOnError); + self.imap.once('close', imapOnClose); + self.imap.once('end', imapOnEnd); + self.imap.search(searchCriteria, function (err, uids) { - + if (err) { reject(err); return; @@ -229,6 +306,33 @@ ImapSimple.prototype.getPartData = function (message, part, callback) { } return new Promise(function (resolve, reject) { + + function imapOnError(err) { + if (err.source === 'timeout-auth') { + err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' + } + + self.imap.removeListener('close', imapOnClose); + self.imap.removeListener('end', imapOnEnd); + reject(err); + } + + function imapOnEnd() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('close', imapOnClose); + reject(new Error('Connection ended unexpectedly')); + } + + function imapOnClose() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('end', imapOnEnd); + reject(new Error('Connection closed unexpectedly')); + } + + self.imap.once('error', imapOnError); + self.imap.once('close', imapOnClose); + self.imap.once('end', imapOnEnd); + var fetch = self.imap.fetch(message.attributes.uid, { bodies: [part.partID], struct: true @@ -318,6 +422,32 @@ ImapSimple.prototype.moveMessage = function (source, boxName, callback) { } return new Promise(function (resolve, reject) { + function imapOnError(err) { + if (err.source === 'timeout-auth') { + err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' + } + + self.imap.removeListener('close', imapOnClose); + self.imap.removeListener('end', imapOnEnd); + reject(err); + } + + function imapOnEnd() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('close', imapOnClose); + reject(new Error('Connection ended unexpectedly')); + } + + function imapOnClose() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('end', imapOnEnd); + reject(new Error('Connection closed unexpectedly')); + } + + self.imap.once('error', imapOnError); + self.imap.once('close', imapOnClose); + self.imap.once('end', imapOnEnd); + self.imap.move(source, boxName, function (err) { if (err) { reject(err); @@ -349,6 +479,32 @@ ImapSimple.prototype.addMessageLabel = function (source, labels, callback) { } return new Promise(function (resolve, reject) { + function imapOnError(err) { + if (err.source === 'timeout-auth') { + err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' + } + + self.imap.removeListener('close', imapOnClose); + self.imap.removeListener('end', imapOnEnd); + reject(err); + } + + function imapOnEnd() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('close', imapOnClose); + reject(new Error('Connection ended unexpectedly')); + } + + function imapOnClose() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('end', imapOnEnd); + reject(new Error('Connection closed unexpectedly')); + } + + self.imap.once('error', imapOnError); + self.imap.once('close', imapOnClose); + self.imap.once('end', imapOnEnd); + self.imap.addLabels(source, labels, function (err) { if (err) { reject(err); @@ -378,6 +534,32 @@ ImapSimple.prototype.addFlags = function (uid, flags, callback) { } return new Promise(function (resolve, reject) { + function imapOnError(err) { + if (err.source === 'timeout-auth') { + err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' + } + + self.imap.removeListener('close', imapOnClose); + self.imap.removeListener('end', imapOnEnd); + reject(err); + } + + function imapOnEnd() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('close', imapOnClose); + reject(new Error('Connection ended unexpectedly')); + } + + function imapOnClose() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('end', imapOnEnd); + reject(new Error('Connection closed unexpectedly')); + } + + self.imap.once('error', imapOnError); + self.imap.once('close', imapOnClose); + self.imap.once('end', imapOnEnd); + self.imap.addFlags(uid, flags, function (err) { if (err) { reject(err); @@ -407,6 +589,32 @@ ImapSimple.prototype.delFlags = function (uid, flags, callback) { } return new Promise(function (resolve, reject) { + function imapOnError(err) { + if (err.source === 'timeout-auth') { + err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' + } + + self.imap.removeListener('close', imapOnClose); + self.imap.removeListener('end', imapOnEnd); + reject(err); + } + + function imapOnEnd() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('close', imapOnClose); + reject(new Error('Connection ended unexpectedly')); + } + + function imapOnClose() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('end', imapOnEnd); + reject(new Error('Connection closed unexpectedly')); + } + + self.imap.once('error', imapOnError); + self.imap.once('close', imapOnClose); + self.imap.once('end', imapOnEnd); + self.imap.delFlags(uid, flags, function (err) { if (err) { reject(err); @@ -440,6 +648,32 @@ ImapSimple.prototype.append = function (message, options, callback) { } return new Promise(function (resolve, reject) { + function imapOnError(err) { + if (err.source === 'timeout-auth') { + err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' + } + + self.imap.removeListener('close', imapOnClose); + self.imap.removeListener('end', imapOnEnd); + reject(err); + } + + function imapOnEnd() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('close', imapOnClose); + reject(new Error('Connection ended unexpectedly')); + } + + function imapOnClose() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('end', imapOnEnd); + reject(new Error('Connection closed unexpectedly')); + } + + self.imap.once('error', imapOnError); + self.imap.once('close', imapOnClose); + self.imap.once('end', imapOnEnd); + self.imap.append(message, options, function (err) { if (err) { reject(err); @@ -467,6 +701,32 @@ ImapSimple.prototype.getBoxes = function (callback) { } return new Promise(function (resolve, reject) { + function imapOnError(err) { + if (err.source === 'timeout-auth') { + err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' + } + + self.imap.removeListener('close', imapOnClose); + self.imap.removeListener('end', imapOnEnd); + reject(err); + } + + function imapOnEnd() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('close', imapOnClose); + reject(new Error('Connection ended unexpectedly')); + } + + function imapOnClose() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('end', imapOnEnd); + reject(new Error('Connection closed unexpectedly')); + } + + self.imap.once('error', imapOnError); + self.imap.once('close', imapOnClose); + self.imap.once('end', imapOnEnd); + self.imap.getBoxes(function (err, boxes) { if (err) { reject(err); @@ -495,6 +755,32 @@ ImapSimple.prototype.addBox = function (boxName, callback) { return new Promise(function (resolve, reject) { + function imapOnError(err) { + if (err.source === 'timeout-auth') { + err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' + } + + self.imap.removeListener('close', imapOnClose); + self.imap.removeListener('end', imapOnEnd); + reject(err); + } + + function imapOnEnd() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('close', imapOnClose); + reject(new Error('Connection ended unexpectedly')); + } + + function imapOnClose() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('end', imapOnEnd); + reject(new Error('Connection closed unexpectedly')); + } + + self.imap.once('error', imapOnError); + self.imap.once('close', imapOnClose); + self.imap.once('end', imapOnEnd); + self.imap.addBox(boxName, function (err) { if (err) { @@ -524,6 +810,32 @@ ImapSimple.prototype.delBox = function (boxName, callback) { return new Promise(function (resolve, reject) { + function imapOnError(err) { + if (err.source === 'timeout-auth') { + err = new errors.ConnectionTimeoutError(25000); // Temporary, need to take authTimeout from 'options' + } + + self.imap.removeListener('close', imapOnClose); + self.imap.removeListener('end', imapOnEnd); + reject(err); + } + + function imapOnEnd() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('close', imapOnClose); + reject(new Error('Connection ended unexpectedly')); + } + + function imapOnClose() { + self.imap.removeListener('error', imapOnError); + self.imap.removeListener('end', imapOnEnd); + reject(new Error('Connection closed unexpectedly')); + } + + self.imap.once('error', imapOnError); + self.imap.once('close', imapOnClose); + self.imap.once('end', imapOnEnd); + self.imap.delBox(boxName, function (err) { if (err) { @@ -560,6 +872,9 @@ function connect(options, callback) { var imap = new Imap(options.imap); function imapOnReady() { + imap.removeListener('error', imapOnError); + imap.removeListener('close', imapOnClose); + imap.removeListener('end', imapOnEnd); resolve(new ImapSimple(imap)); }