mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-01-13 03:29:46 +08:00
100 lines
3.2 KiB
JavaScript
100 lines
3.2 KiB
JavaScript
/**
|
|
* Errors may come from:
|
|
*
|
|
* 1. Underlying IMAP provider (Fastmail, Yahoo, etc)
|
|
* 2. Node IMAP
|
|
* 3. K2 code
|
|
*
|
|
* NodeIMAP puts a `source` attribute on `Error` objects to indicate where
|
|
* a particular error came from. See https://github.com/mscdex/node-imap/blob/master/lib/Connection.js
|
|
*
|
|
* These may have the following values:
|
|
*
|
|
* - "socket-timeout": Created by NodeIMAP when `config.socketTimeout`
|
|
* expires on the base Node `net.Socket` and socket.on('timeout') fires
|
|
* Message: 'Socket timed out while talking to server'
|
|
*
|
|
* - "timeout": Created by NodeIMAP when `config.connTimeout` has been
|
|
* reached when trying to connect the socket.
|
|
* Message: 'Timed out while connecting to server'
|
|
*
|
|
* - "socket": Created by Node's `net.Socket` on error. See:
|
|
* https://nodejs.org/api/net.html#net_event_error_1
|
|
* Message: Various from `net.Socket`
|
|
*
|
|
* - "protocol": Created by NodeIMAP when `bad` or `no` types come back
|
|
* from the IMAP protocol.
|
|
* Message: Various from underlying IMAP protocol
|
|
*
|
|
* - "authentication": Created by underlying IMAP connection or NodeIMAP
|
|
* in a few scenarios.
|
|
* Message: Various from underlying IMAP connection
|
|
* OR: No supported authentication method(s) available. Unable to login.
|
|
* OR: Logging in is disabled on this server
|
|
*
|
|
* - "timeout-auth": Created by NodeIMAP when `config.authTimeout` has
|
|
* been reached when trying to authenticate
|
|
* Message: 'Timed out while authenticating with server'
|
|
*
|
|
*/
|
|
function convertImapError(imapError) {
|
|
let error;
|
|
switch(imapError.source) {
|
|
case "socket-timeout":
|
|
error = new IMAPConnectionTimeoutError(imapError); break;
|
|
case "timeout":
|
|
error = new IMAPConnectionTimeoutError(imapError); break;
|
|
case "socket":
|
|
error = new IMAPSocketError(imapError); break;
|
|
case "protocol":
|
|
error = new IMAPProtocolError(imapError); break;
|
|
case "authentication":
|
|
error = new IMAPAuthenticationError(imapError); break;
|
|
case "timeout-auth":
|
|
error = new IMAPAuthenticationTimeoutError(imapError); break;
|
|
default:
|
|
return error
|
|
}
|
|
error.source = imapError.source
|
|
return error
|
|
}
|
|
|
|
/**
|
|
* An abstract base class that can be used to indicate errors that may fix
|
|
* themselves when retried
|
|
*/
|
|
class RetryableError extends Error { }
|
|
|
|
/**
|
|
* Errors that originate from NodeIMAP. See `convertImapError` for
|
|
* documentation on underlying causes
|
|
*/
|
|
class IMAPSocketError extends RetryableError { }
|
|
class IMAPConnectionTimeoutError extends RetryableError { }
|
|
class IMAPAuthenticationTimeoutError extends RetryableError { }
|
|
class IMAPProtocolError extends Error { }
|
|
class IMAPAuthenticationError extends Error { }
|
|
|
|
class IMAPConnectionNotReadyError extends RetryableError {
|
|
constructor(funcName) {
|
|
super(`${funcName} - You must call connect() first.`);
|
|
}
|
|
}
|
|
|
|
class IMAPConnectionEndedError extends Error {
|
|
constructor(msg = "The IMAP Connection was ended.") {
|
|
super(msg);
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
convertImapError,
|
|
RetryableError,
|
|
IMAPSocketError,
|
|
IMAPConnectionTimeoutError,
|
|
IMAPAuthenticationTimeoutError,
|
|
IMAPProtocolError,
|
|
IMAPAuthenticationError,
|
|
IMAPConnectionNotReadyError,
|
|
IMAPConnectionEndedError,
|
|
};
|