This repository has been archived on 2022-01-02. You can view files and clone it, but cannot push or open issues or pull requests.
AriaNg/src/scripts/services/aria2RpcService.js

522 lines
21 KiB
JavaScript
Raw Normal View History

2016-05-13 18:09:12 +02:00
(function () {
'use strict';
2018-10-07 17:37:26 +02:00
angular.module('ariaNg').factory('aria2RpcService', ['$q', 'aria2RpcConstants', 'aria2RpcErrors', 'aria2AllOptions', 'ariaNgCommonService', 'ariaNgLocalizationService', 'ariaNgLogService', 'ariaNgSettingService', 'aria2HttpRpcService', 'aria2WebSocketRpcService', function ($q, aria2RpcConstants, aria2RpcErrors, aria2AllOptions, ariaNgCommonService, ariaNgLocalizationService, ariaNgLogService, ariaNgSettingService, aria2HttpRpcService, aria2WebSocketRpcService) {
2017-03-19 16:36:14 +01:00
var rpcImplementService = ariaNgSettingService.isCurrentRpcUseWebSocket() ? aria2WebSocketRpcService : aria2HttpRpcService;
var isConnected = false;
2017-03-19 16:36:14 +01:00
var secret = ariaNgSettingService.getCurrentRpcSecret();
var onFirstSuccessCallbacks = [];
2018-10-21 09:11:59 +02:00
var onOperationSuccessCallbacks = [];
var onOperationErrorCallbacks = [];
var onConnectionSuccessCallbacks = [];
var onConnectionFailedCallbacks = [];
2016-06-28 18:18:17 +02:00
var onDownloadStartCallbacks = [];
var onDownloadPauseCallbacks = [];
var onDownloadStopCallbacks = [];
var onDownloadCompleteCallbacks = [];
var onDownloadErrorCallbacks = [];
var onBtDownloadCompleteCallbacks = [];
2016-06-04 09:33:40 +02:00
var checkIsSystemMethod = function (methodName) {
2016-08-01 19:26:10 +02:00
return methodName.indexOf(aria2RpcConstants.rpcSystemServiceName + '.') === 0;
2016-06-04 09:33:40 +02:00
};
2016-05-30 19:26:41 +02:00
var getAria2MethodFullName = function (methodName) {
return aria2RpcConstants.rpcServiceName + '.' + methodName;
};
2016-06-28 18:18:17 +02:00
var getAria2EventFullName = function (eventName) {
return getAria2MethodFullName(eventName);
};
2016-07-03 12:07:07 +02:00
var invoke = function (requestContext, returnContextOnly) {
if (returnContextOnly) {
return requestContext;
}
2016-06-10 13:23:16 +02:00
var uniqueId = ariaNgCommonService.generateUniqueId();
2016-06-04 09:33:40 +02:00
2016-06-10 13:23:16 +02:00
var requestBody = {
2016-05-13 18:09:12 +02:00
jsonrpc: aria2RpcConstants.rpcServiceVersion,
2016-07-03 12:07:07 +02:00
method: requestContext.methodName,
2016-06-10 13:23:16 +02:00
id: uniqueId,
2016-07-03 12:07:07 +02:00
params: requestContext.params
2016-05-13 18:09:12 +02:00
};
2016-07-03 12:07:07 +02:00
var invokeContext = {
2016-06-10 13:23:16 +02:00
uniqueId: uniqueId,
requestBody: requestBody,
connectionSuccessCallback: requestContext.connectionSuccessCallback,
connectionFailedCallback: requestContext.connectionFailedCallback,
2016-07-03 12:07:07 +02:00
successCallback: requestContext.successCallback,
errorCallback: requestContext.errorCallback
2016-06-10 13:23:16 +02:00
};
2016-06-04 11:08:42 +02:00
2016-07-03 12:07:07 +02:00
return rpcImplementService.request(invokeContext);
2016-06-28 18:18:17 +02:00
};
var registerEvent = function (eventName, callbacks) {
var fullEventName = getAria2EventFullName(eventName);
rpcImplementService.on(fullEventName, function (context) {
if (!angular.isArray(callbacks) || callbacks.length < 1) {
return;
}
for (var i = 0; i < callbacks.length; i++) {
var callback = callbacks[i];
callback(context);
}
});
2016-05-13 18:09:12 +02:00
};
var fireCustomEvent = function (callbacks, context) {
2017-03-19 10:39:38 +01:00
if (!angular.isArray(callbacks) || callbacks.length < 1) {
return;
}
2017-03-19 10:39:38 +01:00
for (var i = 0; i < callbacks.length; i++) {
var callback = callbacks[i];
callback(context);
}
};
2016-06-10 13:23:16 +02:00
var invokeMulti = function (methodFunc, contexts, callback) {
2016-05-30 19:26:41 +02:00
var promises = [];
2016-06-10 13:23:16 +02:00
var hasSuccess = false;
var hasError = false;
var results = [];
2016-05-30 19:26:41 +02:00
for (var i = 0; i < contexts.length; i++) {
2016-06-10 13:23:16 +02:00
contexts[i].callback = function (response) {
results.push(response);
2019-08-02 20:28:22 +02:00
hasSuccess = hasSuccess || response.success;
hasError = hasError || !response.success;
2016-05-30 19:26:41 +02:00
};
promises.push(methodFunc(contexts[i]));
}
return $q.all(promises).finally(function () {
2016-05-30 19:26:41 +02:00
if (callback) {
2016-06-10 13:23:16 +02:00
callback({
hasSuccess: !!hasSuccess,
hasError: !!hasError,
results: results
});
2016-05-30 19:26:41 +02:00
}
});
};
2016-06-10 13:23:16 +02:00
var processError = function (error) {
if (!error || !error.message) {
return false;
}
2017-03-19 14:57:29 +01:00
ariaNgLogService.error('[aria2RpcService.processError] ' + error.message, error);
2016-06-26 13:44:49 +02:00
if (aria2RpcErrors[error.message] && aria2RpcErrors[error.message].tipTextKey) {
2018-08-12 14:26:26 +02:00
ariaNgLocalizationService.showError(aria2RpcErrors[error.message].tipTextKey);
2016-06-10 13:23:16 +02:00
return true;
} else {
2018-08-12 14:26:26 +02:00
ariaNgLocalizationService.showError(error.message);
2016-06-10 13:23:16 +02:00
return true;
}
};
2016-06-04 09:33:40 +02:00
var buildRequestContext = function () {
2016-06-10 13:23:16 +02:00
var methodName = arguments[0];
var isSystemMethod = checkIsSystemMethod(methodName);
var finalParams = [];
2016-06-04 09:33:40 +02:00
2016-06-10 13:23:16 +02:00
var context = {
methodName: (!isSystemMethod ? getAria2MethodFullName(methodName) : methodName)
};
2016-06-04 09:33:40 +02:00
context.connectionSuccessCallback = function () {
fireCustomEvent(onConnectionSuccessCallbacks);
};
context.connectionFailedCallback = function () {
fireCustomEvent(onConnectionFailedCallbacks);
};
2016-06-10 13:23:16 +02:00
if (secret && !isSystemMethod) {
finalParams.push(aria2RpcConstants.rpcTokenPrefix + secret);
2016-06-04 09:33:40 +02:00
}
if (arguments.length > 1) {
2016-07-03 12:07:07 +02:00
var innerContext = arguments[1];
2016-06-10 13:23:16 +02:00
context.successCallback = function (id, result) {
2016-07-03 12:07:07 +02:00
if (innerContext.callback) {
innerContext.callback({
2016-06-10 13:23:16 +02:00
id: id,
success: true,
data: result,
2016-07-03 12:07:07 +02:00
context: innerContext
2016-06-10 13:23:16 +02:00
});
}
2017-03-19 10:39:38 +01:00
2018-10-21 09:11:59 +02:00
fireCustomEvent(onOperationSuccessCallbacks);
2017-03-19 10:39:38 +01:00
if (!isConnected) {
isConnected = true;
var firstSuccessContext = {
rpcName: ariaNgSettingService.getCurrentRpcDisplayName()
};
fireCustomEvent(onFirstSuccessCallbacks, firstSuccessContext);
2017-03-19 10:39:38 +01:00
}
2016-06-10 13:23:16 +02:00
};
context.errorCallback = function (id, error) {
var errorProcessed = false;
2016-06-04 09:33:40 +02:00
2016-07-03 12:07:07 +02:00
if (!innerContext.silent) {
2016-06-10 13:23:16 +02:00
errorProcessed = processError(error);
}
2016-07-03 12:07:07 +02:00
if (innerContext.callback) {
innerContext.callback({
2016-06-10 13:23:16 +02:00
id: id,
success: false,
data: error,
errorProcessed: errorProcessed,
2016-07-03 12:07:07 +02:00
context: innerContext
2016-06-10 13:23:16 +02:00
});
}
2017-03-19 10:39:38 +01:00
2018-10-21 09:11:59 +02:00
fireCustomEvent(onOperationErrorCallbacks);
2016-06-10 13:23:16 +02:00
};
}
if (arguments.length > 2) {
for (var i = 2; i < arguments.length; i++) {
2016-08-01 19:26:10 +02:00
if (arguments[i] !== null && angular.isDefined(arguments[i])) {
2016-06-10 13:23:16 +02:00
finalParams.push(arguments[i]);
2016-06-04 09:33:40 +02:00
}
}
2016-06-10 13:23:16 +02:00
}
2016-06-04 09:33:40 +02:00
2016-06-10 13:23:16 +02:00
if (finalParams.length > 0) {
context.params = finalParams;
2016-06-04 09:33:40 +02:00
}
return context;
};
2018-10-07 17:37:26 +02:00
var buildRequestOptions = function (originalOptions, context) {
var options = angular.copy(originalOptions);
for (var optionName in options) {
if (!options.hasOwnProperty(optionName)) {
continue;
}
if (isOptionSubmitArray(options, optionName)) {
options[optionName] = buildArrayOption(options[optionName], aria2AllOptions[optionName]);
}
}
if (context && context.pauseOnAdded) {
options.pause = 'true';
}
return options;
};
var isOptionSubmitArray = function (options, optionName) {
if (!options[optionName] || !angular.isString(options[optionName])) {
return false;
}
if (!aria2AllOptions[optionName] || aria2AllOptions[optionName].submitFormat !== 'array') {
return false;
}
return true;
};
var buildArrayOption = function (option, optionSetting) {
var items = option.split(optionSetting.split);
var result = [];
for (var i = 0; i < items.length; i++) {
var item = items[i];
if (!item) {
continue;
}
item = item.replace('\r', '');
result.push(item);
}
return result;
};
2016-06-28 18:18:17 +02:00
(function () {
registerEvent('onDownloadStart', onDownloadStartCallbacks);
registerEvent('onDownloadPause', onDownloadPauseCallbacks);
registerEvent('onDownloadStop', onDownloadStopCallbacks);
registerEvent('onDownloadComplete', onDownloadCompleteCallbacks);
registerEvent('onDownloadError', onDownloadErrorCallbacks);
registerEvent('onBtDownloadComplete', onBtDownloadCompleteCallbacks);
})();
2016-05-13 18:09:12 +02:00
return {
2016-05-30 19:26:41 +02:00
getBasicTaskParams: function () {
return [
'gid',
'totalLength',
'completedLength',
'uploadSpeed',
'downloadSpeed',
'connections',
'numSeeders',
'seeder',
'status',
'errorCode',
'verifiedLength',
'verifyIntegrityPending'
2016-05-30 19:26:41 +02:00
];
},
getFullTaskParams: function () {
var requestParams = this.getBasicTaskParams();
requestParams.push('files');
requestParams.push('bittorrent');
2019-03-27 17:41:10 +01:00
requestParams.push('infoHash');
2016-05-30 19:26:41 +02:00
return requestParams;
},
2016-07-03 12:07:07 +02:00
addUri: function (context, returnContextOnly) {
2016-06-25 13:47:02 +02:00
var urls = context.task.urls;
2018-10-07 17:37:26 +02:00
var options = buildRequestOptions(context.task.options, context);
2016-06-25 13:47:02 +02:00
2016-07-03 12:07:07 +02:00
return invoke(buildRequestContext('addUri', context, urls, options), !!returnContextOnly);
2016-06-18 18:11:19 +02:00
},
addUriMulti: function (context) {
var contexts = [];
for (var i = 0; i < context.tasks.length; i++) {
2016-06-20 17:37:25 +02:00
var task = context.tasks[i];
2016-06-18 18:11:19 +02:00
contexts.push({
silent: !!context.silent,
2016-06-25 13:47:02 +02:00
task: task,
pauseOnAdded: context.pauseOnAdded
2016-06-18 18:11:19 +02:00
});
}
return invokeMulti(this.addUri, contexts, context.callback);
},
2016-07-03 12:07:07 +02:00
addTorrent: function (context, returnContextOnly) {
2016-06-23 18:39:18 +02:00
var content = context.task.content;
2018-10-07 17:37:26 +02:00
var options = buildRequestOptions(context.task.options, context);
2016-06-23 18:39:18 +02:00
2016-07-03 12:07:07 +02:00
return invoke(buildRequestContext('addTorrent', context, content, [], options), !!returnContextOnly);
2016-06-23 18:39:18 +02:00
},
2016-07-03 12:07:07 +02:00
addMetalink: function (context, returnContextOnly) {
2016-06-23 18:39:18 +02:00
var content = context.task.content;
2018-10-07 17:37:26 +02:00
var options = buildRequestOptions(context.task.options, context);
2016-06-23 18:39:18 +02:00
return invoke(buildRequestContext('addMetalink', context, content, options), !!returnContextOnly);
2016-06-23 18:39:18 +02:00
},
2016-07-03 12:07:07 +02:00
remove: function (context, returnContextOnly) {
return invoke(buildRequestContext('remove', context, context.gid), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
forceRemove: function (context, returnContextOnly) {
return invoke(buildRequestContext('forceRemove', context, context.gid), !!returnContextOnly);
2016-05-30 19:26:41 +02:00
},
forceRemoveMulti: function (context) {
var contexts = [];
for (var i = 0; i < context.gids.length; i++) {
contexts.push({
2016-06-10 13:23:16 +02:00
silent: !!context.silent,
2016-05-30 19:26:41 +02:00
gid: context.gids[i]
});
}
2016-06-10 13:23:16 +02:00
return invokeMulti(this.forceRemove, contexts, context.callback);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
pause: function (context, returnContextOnly) {
return invoke(buildRequestContext('pause', context, context.gid), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
pauseAll: function (context, returnContextOnly) {
return invoke(buildRequestContext('pauseAll', context), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
forcePause: function (context, returnContextOnly) {
return invoke(buildRequestContext('forcePause', context, context.gid), !!returnContextOnly);
2016-05-30 19:26:41 +02:00
},
forcePauseMulti: function (context) {
var contexts = [];
for (var i = 0; i < context.gids.length; i++) {
contexts.push({
2016-06-10 13:23:16 +02:00
silent: !!context.silent,
2016-05-30 19:26:41 +02:00
gid: context.gids[i]
});
}
2016-06-10 13:23:16 +02:00
return invokeMulti(this.forcePause, contexts, context.callback);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
forcePauseAll: function (context, returnContextOnly) {
return invoke(buildRequestContext('forcePauseAll', context), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
unpause: function (context, returnContextOnly) {
return invoke(buildRequestContext('unpause', context, context.gid), !!returnContextOnly);
2016-05-30 19:26:41 +02:00
},
unpauseMulti: function (context) {
var contexts = [];
for (var i = 0; i < context.gids.length; i++) {
contexts.push({
2016-06-10 13:23:16 +02:00
silent: !!context.silent,
2016-05-30 19:26:41 +02:00
gid: context.gids[i]
});
}
2016-06-10 13:23:16 +02:00
return invokeMulti(this.unpause, contexts, context.callback);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
unpauseAll: function (context, returnContextOnly) {
return invoke(buildRequestContext('unpauseAll', context), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
tellStatus: function (context, returnContextOnly) {
return invoke(buildRequestContext('tellStatus', context, context.gid), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
getUris: function (context, returnContextOnly) {
return invoke(buildRequestContext('getUris', context, context.gid), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
getFiles: function (context, returnContextOnly) {
return invoke(buildRequestContext('getFiles', context, context.gid), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
getPeers: function (context, returnContextOnly) {
return invoke(buildRequestContext('getPeers', context, context.gid), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
getServers: function (context, returnContextOnly) {
return invoke(buildRequestContext('getServers', context, context.gid), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
tellActive: function (context, returnContextOnly) {
2016-06-10 13:23:16 +02:00
return invoke(buildRequestContext('tellActive', context,
2016-06-26 08:21:20 +02:00
angular.isDefined(context.requestParams) ? context.requestParams: null
2016-07-03 12:07:07 +02:00
), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
tellWaiting: function (context, returnContextOnly) {
2016-06-10 13:23:16 +02:00
return invoke(buildRequestContext('tellWaiting', context,
2016-06-26 08:21:20 +02:00
angular.isDefined(context.offset) ? context.offset : 0,
angular.isDefined(context.num) ? context.num : 1000,
angular.isDefined(context.requestParams) ? context.requestParams : null
2016-07-03 12:07:07 +02:00
), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
tellStopped: function (context, returnContextOnly) {
2016-06-10 13:23:16 +02:00
return invoke(buildRequestContext('tellStopped', context,
angular.isDefined(context.offset) ? context.offset : -1,
2016-06-26 08:21:20 +02:00
angular.isDefined(context.num) ? context.num : 1000,
angular.isDefined(context.requestParams) ? context.requestParams: null
2016-07-03 12:07:07 +02:00
), !!returnContextOnly);
},
changePosition: function (context, returnContextOnly) {
return invoke(buildRequestContext('changePosition', context, context.gid, context.pos, context.how), !!returnContextOnly);
2016-05-30 19:26:41 +02:00
},
2016-07-03 12:07:07 +02:00
changeUri: function (context, returnContextOnly) {
return invoke(buildRequestContext('changeUri', context, context.gid, context.fileIndex, context.delUris, context.addUris), !!returnContextOnly);
},
2016-07-03 12:07:07 +02:00
getOption: function (context, returnContextOnly) {
return invoke(buildRequestContext('getOption', context, context.gid), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
changeOption: function (context, returnContextOnly) {
2018-10-07 17:37:26 +02:00
var options = buildRequestOptions(context.options, context);
return invoke(buildRequestContext('changeOption', context, context.gid, options), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
getGlobalOption: function (context, returnContextOnly) {
return invoke(buildRequestContext('getGlobalOption', context), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
changeGlobalOption: function (context, returnContextOnly) {
2018-10-07 17:37:26 +02:00
var options = buildRequestOptions(context.options, context);
return invoke(buildRequestContext('changeGlobalOption', context, options), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
getGlobalStat: function (context, returnContextOnly) {
return invoke(buildRequestContext('getGlobalStat', context), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
purgeDownloadResult: function (context, returnContextOnly) {
return invoke(buildRequestContext('purgeDownloadResult', context), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
removeDownloadResult: function (context, returnContextOnly) {
return invoke(buildRequestContext('removeDownloadResult', context, context.gid), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
removeDownloadResultMulti: function (context) {
var contexts = [];
for (var i = 0; i < context.gids.length; i++) {
contexts.push({
2016-06-10 13:23:16 +02:00
silent: !!context.silent,
gid: context.gids[i]
});
}
2016-06-10 13:23:16 +02:00
return invokeMulti(this.removeDownloadResult, contexts, context.callback);
},
2016-07-03 12:07:07 +02:00
getVersion: function (context, returnContextOnly) {
return invoke(buildRequestContext('getVersion', context), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
getSessionInfo: function (context, returnContextOnly) {
return invoke(buildRequestContext('getSessionInfo', context), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
shutdown: function (context, returnContextOnly) {
return invoke(buildRequestContext('shutdown', context), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
forceShutdown: function (context, returnContextOnly) {
return invoke(buildRequestContext('forceShutdown', context), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
2016-07-03 12:07:07 +02:00
saveSession: function (context, returnContextOnly) {
return invoke(buildRequestContext('saveSession', context), !!returnContextOnly);
2016-05-13 18:09:12 +02:00
},
multicall: function (context) {
2016-06-10 13:23:16 +02:00
return invoke(buildRequestContext('system.multicall', context, context.methods));
2016-05-13 18:09:12 +02:00
},
listMethods: function (context) {
2016-06-10 13:23:16 +02:00
return invoke(buildRequestContext('system.listMethods', context));
2016-06-28 18:18:17 +02:00
},
onFirstSuccess: function (context) {
onFirstSuccessCallbacks.push(context.callback);
},
2018-10-21 09:11:59 +02:00
onOperationSuccess: function (context) {
onOperationSuccessCallbacks.push(context.callback);
2017-03-19 10:39:38 +01:00
},
2018-10-21 09:11:59 +02:00
onOperationError: function (context) {
onOperationErrorCallbacks.push(context.callback);
2017-03-19 10:39:38 +01:00
},
onConnectionSuccess: function (context) {
onConnectionSuccessCallbacks.push(context.callback);
},
onConnectionFailed: function (context) {
onConnectionFailedCallbacks.push(context.callback);
},
2016-06-28 18:18:17 +02:00
onDownloadStart: function (context) {
onDownloadStartCallbacks.push(context.callback);
},
onDownloadPause: function (context) {
onDownloadPauseCallbacks.push(context.callback);
},
onDownloadStop: function (context) {
onDownloadStopCallbacks.push(context.callback);
},
onDownloadComplete: function (context) {
onDownloadCompleteCallbacks.push(context.callback);
},
onDownloadError: function (context) {
onDownloadErrorCallbacks.push(context.callback);
},
onBtDownloadComplete: function (context) {
onBtDownloadCompleteCallbacks.push(context.callback);
2016-05-13 18:09:12 +02:00
}
};
}]);
2016-08-01 16:49:16 +02:00
}());