snappymail/dev/Promises/AbstractAjax.js

224 lines
5.4 KiB
JavaScript
Raw Normal View History

2016-06-30 08:02:45 +08:00
var
$ = require('$'),
_ = require('_'),
Promise = require('Promise'),
2016-06-30 08:02:45 +08:00
Consts = require('Common/Consts'),
Enums = require('Common/Enums'),
Globals = require('Common/Globals'),
Utils = require('Common/Utils'),
Links = require('Common/Links'),
Plugins = require('Common/Plugins'),
2016-06-30 08:02:45 +08:00
Settings = require('Storage/Settings'),
2016-06-30 08:02:45 +08:00
AbstractBasicPromises = require('Promises/AbstractBasic');
2016-06-30 08:02:45 +08:00
/**
* @constructor
*/
function AbstractAjaxPromises()
{
AbstractBasicPromises.call(this);
2016-06-30 08:02:45 +08:00
this.clear();
}
2016-06-30 08:02:45 +08:00
_.extend(AbstractAjaxPromises.prototype, AbstractBasicPromises.prototype);
2016-06-30 08:02:45 +08:00
AbstractAjaxPromises.prototype.oRequests = {};
2016-06-30 08:02:45 +08:00
AbstractAjaxPromises.prototype.clear = function()
{
this.oRequests = {};
};
2016-06-30 08:02:45 +08:00
AbstractAjaxPromises.prototype.abort = function(sAction, bClearOnly)
{
if (this.oRequests[sAction])
{
2016-06-30 08:02:45 +08:00
if (!bClearOnly && this.oRequests[sAction].abort)
{
2016-06-30 08:02:45 +08:00
this.oRequests[sAction].__aborted__ = true;
this.oRequests[sAction].abort();
}
2016-06-30 08:02:45 +08:00
this.oRequests[sAction] = null;
delete this.oRequests[sAction];
}
2016-06-30 08:02:45 +08:00
return this;
};
2016-06-30 08:02:45 +08:00
AbstractAjaxPromises.prototype.ajaxRequest = function(sAction, bPost, iTimeOut, oParameters, sAdditionalGetString, fTrigger)
{
var self = this;
return new Promise(function(resolve, reject) {
2015-04-29 04:51:20 +08:00
2016-08-10 03:52:30 +08:00
var iStart = Utils.microtime();
2016-06-30 08:02:45 +08:00
iTimeOut = Utils.isNormal(iTimeOut) ? iTimeOut : Consts.DEFAULT_AJAX_TIMEOUT;
sAdditionalGetString = Utils.isUnd(sAdditionalGetString) ? '' : Utils.pString(sAdditionalGetString);
2016-06-30 08:02:45 +08:00
if (bPost)
{
oParameters.XToken = Settings.appSettingsGet('token');
}
2015-04-29 04:51:20 +08:00
2016-06-30 08:02:45 +08:00
Plugins.runHook('ajax-default-request', [sAction, oParameters, sAdditionalGetString]);
2015-04-29 04:51:20 +08:00
2016-06-30 08:02:45 +08:00
self.setTrigger(fTrigger, true);
2016-05-24 01:33:01 +08:00
2016-08-10 03:52:30 +08:00
var oH = $.ajax({
2016-06-30 08:02:45 +08:00
type: bPost ? 'POST' : 'GET',
url: Links.ajax(sAdditionalGetString),
async: true,
dataType: 'json',
data: bPost ? (oParameters || {}) : {},
timeout: iTimeOut,
global: true
}).always(function(oData, sTextStatus) {
2016-08-10 03:52:30 +08:00
2016-07-16 05:29:42 +08:00
var
bCached = false,
2016-08-10 03:52:30 +08:00
oErrorData = null;
2016-05-24 01:33:01 +08:00
2016-06-30 08:02:45 +08:00
if (oData && oData.Time)
{
bCached = Utils.pInt(oData.Time) > Utils.microtime() - iStart;
}
2016-05-24 01:33:01 +08:00
2016-06-30 08:02:45 +08:00
// backward capability
var sType = '';
2016-06-30 08:02:45 +08:00
switch (true)
{
case 'success' === sTextStatus && oData && oData.Result && sAction === oData.Action:
sType = Enums.StorageResultType.Success;
break;
case 'abort' === sTextStatus && (!oData || !oData.__aborted__):
sType = Enums.StorageResultType.Abort;
break;
2016-08-10 03:52:30 +08:00
default:
sType = Enums.StorageResultType.Error;
break;
2016-06-30 08:02:45 +08:00
}
Plugins.runHook('ajax-default-response', [sAction,
Enums.StorageResultType.Success === sType ? oData : null, sType, bCached, oParameters]);
2016-05-24 01:33:01 +08:00
2016-06-30 08:02:45 +08:00
if ('success' === sTextStatus)
{
if (oData && oData.Result && sAction === oData.Action)
2016-05-24 01:33:01 +08:00
{
2016-06-30 08:02:45 +08:00
oData.__cached__ = bCached;
resolve(oData);
2016-05-24 01:33:01 +08:00
}
2016-06-30 08:02:45 +08:00
else if (oData && oData.Action)
{
2015-05-06 00:41:15 +08:00
oErrorData = oData;
2016-06-30 08:02:45 +08:00
reject(oData.ErrorCode ? oData.ErrorCode : Enums.Notification.AjaxFalse);
}
2016-05-24 01:33:01 +08:00
else
2015-05-06 00:41:15 +08:00
{
2016-05-24 01:33:01 +08:00
oErrorData = oData;
reject(Enums.Notification.AjaxParse);
2015-05-06 00:41:15 +08:00
}
2016-06-30 08:02:45 +08:00
}
else if ('timeout' === sTextStatus)
{
oErrorData = oData;
reject(Enums.Notification.AjaxTimeout);
}
else if ('abort' === sTextStatus)
{
if (!oData || !oData.__aborted__)
2015-05-06 00:41:15 +08:00
{
2016-06-30 08:02:45 +08:00
reject(Enums.Notification.AjaxAbort);
2015-05-06 00:41:15 +08:00
}
2016-06-30 08:02:45 +08:00
}
else
{
oErrorData = oData;
reject(Enums.Notification.AjaxParse);
}
2015-05-06 00:41:15 +08:00
2016-06-30 08:02:45 +08:00
if (self.oRequests[sAction])
{
self.oRequests[sAction] = null;
delete self.oRequests[sAction];
}
2016-05-24 01:33:01 +08:00
2016-06-30 08:02:45 +08:00
self.setTrigger(fTrigger, false);
if (oErrorData)
{
if (-1 < Utils.inArray(oErrorData.ErrorCode, [
Enums.Notification.AuthError, Enums.Notification.AccessError,
Enums.Notification.ConnectionError, Enums.Notification.DomainNotAllowed, Enums.Notification.AccountNotAllowed,
Enums.Notification.MailServerError, Enums.Notification.UnknownNotification, Enums.Notification.UnknownError
]))
2015-05-06 00:41:15 +08:00
{
2016-06-30 08:02:45 +08:00
Globals.data.iAjaxErrorCount += 1;
}
2015-05-06 00:41:15 +08:00
2016-06-30 08:02:45 +08:00
if (Enums.Notification.InvalidToken === oErrorData.ErrorCode)
{
Globals.data.iTokenErrorCount += 1;
}
if (Consts.TOKEN_ERROR_LIMIT < Globals.data.iTokenErrorCount)
{
if (Globals.data.__APP__ && Globals.data.__APP__.loginAndLogoutReload)
2015-05-06 00:41:15 +08:00
{
2016-06-30 08:02:45 +08:00
Globals.data.__APP__.loginAndLogoutReload(false, true);
2015-05-06 00:41:15 +08:00
}
2016-06-30 08:02:45 +08:00
}
2015-05-06 00:41:15 +08:00
2016-06-30 08:02:45 +08:00
if (oErrorData.ClearAuth || oErrorData.Logout || Consts.AJAX_ERROR_LIMIT < Globals.data.iAjaxErrorCount)
{
if (Globals.data.__APP__ && Globals.data.__APP__.clearClientSideToken)
2015-05-06 00:41:15 +08:00
{
2016-06-30 08:02:45 +08:00
Globals.data.__APP__.clearClientSideToken();
2016-05-24 01:33:01 +08:00
}
2016-06-30 08:02:45 +08:00
if (Globals.data.__APP__ && !oErrorData.ClearAuth && Globals.data.__APP__.loginAndLogoutReload)
2016-05-24 01:33:01 +08:00
{
2016-06-30 08:02:45 +08:00
Globals.data.__APP__.loginAndLogoutReload(false, true);
2015-05-06 00:41:15 +08:00
}
}
2016-06-30 08:02:45 +08:00
}
2015-05-06 00:41:15 +08:00
2016-06-30 08:02:45 +08:00
});
2016-06-30 08:02:45 +08:00
if (oH)
{
if (self.oRequests[sAction])
{
2016-06-30 08:02:45 +08:00
self.oRequests[sAction] = null;
delete self.oRequests[sAction];
2016-05-24 01:33:01 +08:00
}
2016-06-30 08:02:45 +08:00
self.oRequests[sAction] = oH;
}
});
};
2016-06-30 08:02:45 +08:00
AbstractAjaxPromises.prototype.getRequest = function(sAction, fTrigger, sAdditionalGetString, iTimeOut)
{
sAdditionalGetString = Utils.isUnd(sAdditionalGetString) ? '' : Utils.pString(sAdditionalGetString);
sAdditionalGetString = sAction + '/' + sAdditionalGetString;
2016-06-30 08:02:45 +08:00
return this.ajaxRequest(sAction, false, iTimeOut, null, sAdditionalGetString, fTrigger);
};
2016-06-30 08:02:45 +08:00
AbstractAjaxPromises.prototype.postRequest = function(action, fTrigger, params, timeOut)
{
params = params || {};
params.Action = action;
2016-06-30 08:02:45 +08:00
return this.ajaxRequest(action, true, timeOut, params, '', fTrigger);
};
2016-06-30 08:02:45 +08:00
module.exports = AbstractAjaxPromises;