From 0a8429cf2c13c139d4c02e92bf8616d6d7c85ec0 Mon Sep 17 00:00:00 2001 From: MaysWind Date: Sun, 3 Jul 2016 18:07:07 +0800 Subject: [PATCH] reduce request in task detail page --- src/scripts/controllers/task-detail.js | 36 ++--- src/scripts/services/aria2RpcService.js | 168 ++++++++++++----------- src/scripts/services/aria2TaskService.js | 81 ++++++++--- 3 files changed, 159 insertions(+), 126 deletions(-) diff --git a/src/scripts/controllers/task-detail.js b/src/scripts/controllers/task-detail.js index 8ee9ca8..dbcc879 100644 --- a/src/scripts/controllers/task-detail.js +++ b/src/scripts/controllers/task-detail.js @@ -16,28 +16,12 @@ return aria2SettingService.getSpecifiedOptions(keys); }; - var refreshBtPeers = function (task, silent) { - return aria2TaskService.getBtTaskPeers(task, function (response) { - if (!response.success) { - return; - } - - var peers = response.data; - - if (!ariaNgCommonService.extendArray(peers, $scope.context.btPeers, 'peerId')) { - $scope.context.btPeers = peers; - } - - $scope.context.healthPercent = aria2TaskService.estimateHealthPercentFromPeers(task, $scope.context.btPeers); - }, silent, true); - }; - var refreshDownloadTask = function (silent) { if (pauseDownloadTaskRefresh) { return; } - return aria2TaskService.getTaskStatus($routeParams.gid, function (response) { + return aria2TaskService.getTaskStatusAndBtPeers($routeParams.gid, function (response) { if (!response.success) { if (response.data.message == aria2RpcErrors.Unauthorized.message) { $interval.cancel(downloadTaskRefreshPromise); @@ -46,11 +30,9 @@ return; } - var task = response.data; + var task = response.task; - if (task.status == 'active' && task.bittorrent) { - refreshBtPeers(task, true); - } else { + if (!task.bittorrent) { if (tabOrders.indexOf('btpeers') >= 0) { tabOrders.splice(tabOrders.indexOf('btpeers'), 1); } @@ -62,12 +44,22 @@ $scope.task = ariaNgCommonService.copyObjectTo(task, $scope.task); + if (response.peers) { + var peers = response.peers; + + if (!ariaNgCommonService.extendArray(peers, $scope.context.btPeers, 'peerId')) { + $scope.context.btPeers = peers; + } + + $scope.context.healthPercent = aria2TaskService.estimateHealthPercentFromPeers(task, $scope.context.btPeers); + } + $rootScope.taskContext.list = [$scope.task]; $rootScope.taskContext.selected = {}; $rootScope.taskContext.selected[$scope.task.gid] = true; ariaNgMonitorService.recordStat(task.gid, task); - }, silent); + }, silent, true); }; var setSelectFiles = function (silent) { diff --git a/src/scripts/services/aria2RpcService.js b/src/scripts/services/aria2RpcService.js index 4773a5c..4da1738 100644 --- a/src/scripts/services/aria2RpcService.js +++ b/src/scripts/services/aria2RpcService.js @@ -24,24 +24,28 @@ return getAria2MethodFullName(eventName); }; - var invoke = function (context) { + var invoke = function (requestContext, returnContextOnly) { + if (returnContextOnly) { + return requestContext; + } + var uniqueId = ariaNgCommonService.generateUniqueId(); var requestBody = { jsonrpc: aria2RpcConstants.rpcServiceVersion, - method: context.methodName, + method: requestContext.methodName, id: uniqueId, - params: context.params + params: requestContext.params }; - var requestContext = { + var invokeContext = { uniqueId: uniqueId, requestBody: requestBody, - successCallback: context.successCallback, - errorCallback: context.errorCallback + successCallback: requestContext.successCallback, + errorCallback: requestContext.errorCallback }; - return rpcImplementService.request(requestContext); + return rpcImplementService.request(invokeContext); }; var registerEvent = function (eventName, callbacks) { @@ -116,15 +120,15 @@ } if (arguments.length > 1) { - var invokeContext = arguments[1]; + var innerContext = arguments[1]; context.successCallback = function (id, result) { - if (invokeContext.callback) { - invokeContext.callback({ + if (innerContext.callback) { + innerContext.callback({ id: id, success: true, data: result, - context: invokeContext + context: innerContext }); } }; @@ -132,17 +136,17 @@ context.errorCallback = function (id, error) { var errorProcessed = false; - if (!invokeContext.silent) { + if (!innerContext.silent) { errorProcessed = processError(error); } - if (invokeContext.callback) { - invokeContext.callback({ + if (innerContext.callback) { + innerContext.callback({ id: id, success: false, data: error, errorProcessed: errorProcessed, - context: invokeContext + context: innerContext }); } }; @@ -194,7 +198,7 @@ return requestParams; }, - addUri: function (context) { + addUri: function (context, returnContextOnly) { var urls = context.task.urls; var options = angular.copy(context.task.options); @@ -202,7 +206,7 @@ options.pause = 'true'; } - return invoke(buildRequestContext('addUri', context, urls, options)); + return invoke(buildRequestContext('addUri', context, urls, options), !!returnContextOnly); }, addUriMulti: function (context) { var contexts = []; @@ -219,7 +223,7 @@ return invokeMulti(this.addUri, contexts, context.callback); }, - addTorrent: function (context) { + addTorrent: function (context, returnContextOnly) { var content = context.task.content; var options = angular.copy(context.task.options); @@ -227,9 +231,9 @@ options.pause = 'true'; } - return invoke(buildRequestContext('addTorrent', context, content, [], options)); + return invoke(buildRequestContext('addTorrent', context, content, [], options), !!returnContextOnly); }, - addMetalink: function (context) { + addMetalink: function (context, returnContextOnly) { var content = context.task.content; var options = angular.copy(context.task.options); @@ -237,13 +241,13 @@ options.pause = 'true'; } - return invoke(buildRequestContext('addMetalink', context, content, [], options)); + return invoke(buildRequestContext('addMetalink', context, content, [], options), !!returnContextOnly); }, - remove: function (context) { - return invoke(buildRequestContext('remove', context, context.gid)); + remove: function (context, returnContextOnly) { + return invoke(buildRequestContext('remove', context, context.gid), !!returnContextOnly); }, - forceRemove: function (context) { - return invoke(buildRequestContext('forceRemove', context, context.gid)); + forceRemove: function (context, returnContextOnly) { + return invoke(buildRequestContext('forceRemove', context, context.gid), !!returnContextOnly); }, forceRemoveMulti: function (context) { var contexts = []; @@ -257,14 +261,14 @@ return invokeMulti(this.forceRemove, contexts, context.callback); }, - pause: function (context) { - return invoke(buildRequestContext('pause', context, context.gid)); + pause: function (context, returnContextOnly) { + return invoke(buildRequestContext('pause', context, context.gid), !!returnContextOnly); }, - pauseAll: function (context) { - return invoke(buildRequestContext('pauseAll', context)); + pauseAll: function (context, returnContextOnly) { + return invoke(buildRequestContext('pauseAll', context), !!returnContextOnly); }, - forcePause: function (context) { - return invoke(buildRequestContext('forcePause', context, context.gid)); + forcePause: function (context, returnContextOnly) { + return invoke(buildRequestContext('forcePause', context, context.gid), !!returnContextOnly); }, forcePauseMulti: function (context) { var contexts = []; @@ -278,11 +282,11 @@ return invokeMulti(this.forcePause, contexts, context.callback); }, - forcePauseAll: function (context) { - return invoke(buildRequestContext('forcePauseAll', context)); + forcePauseAll: function (context, returnContextOnly) { + return invoke(buildRequestContext('forcePauseAll', context), !!returnContextOnly); }, - unpause: function (context) { - return invoke(buildRequestContext('unpause', context, context.gid)); + unpause: function (context, returnContextOnly) { + return invoke(buildRequestContext('unpause', context, context.gid), !!returnContextOnly); }, unpauseMulti: function (context) { var contexts = []; @@ -296,69 +300,69 @@ return invokeMulti(this.unpause, contexts, context.callback); }, - unpauseAll: function (context) { - return invoke(buildRequestContext('unpauseAll', context)); + unpauseAll: function (context, returnContextOnly) { + return invoke(buildRequestContext('unpauseAll', context), !!returnContextOnly); }, - tellStatus: function (context) { - return invoke(buildRequestContext('tellStatus', context, context.gid)); + tellStatus: function (context, returnContextOnly) { + return invoke(buildRequestContext('tellStatus', context, context.gid), !!returnContextOnly); }, - getUris: function (context) { - return invoke(buildRequestContext('getUris', context, context.gid)); + getUris: function (context, returnContextOnly) { + return invoke(buildRequestContext('getUris', context, context.gid), !!returnContextOnly); }, - getFiles: function (context) { - return invoke(buildRequestContext('getFiles', context, context.gid)); + getFiles: function (context, returnContextOnly) { + return invoke(buildRequestContext('getFiles', context, context.gid), !!returnContextOnly); }, - getPeers: function (context) { - return invoke(buildRequestContext('getPeers', context, context.gid)); + getPeers: function (context, returnContextOnly) { + return invoke(buildRequestContext('getPeers', context, context.gid), !!returnContextOnly); }, - getServers: function (context) { - return invoke(buildRequestContext('getServers', context, context.gid)); + getServers: function (context, returnContextOnly) { + return invoke(buildRequestContext('getServers', context, context.gid), !!returnContextOnly); }, - tellActive: function (context) { + tellActive: function (context, returnContextOnly) { return invoke(buildRequestContext('tellActive', context, angular.isDefined(context.requestParams) ? context.requestParams: null - )); + ), !!returnContextOnly); }, - tellWaiting: function (context) { + tellWaiting: function (context, returnContextOnly) { return invoke(buildRequestContext('tellWaiting', context, angular.isDefined(context.offset) ? context.offset : 0, angular.isDefined(context.num) ? context.num : 1000, angular.isDefined(context.requestParams) ? context.requestParams : null - )); + ), !!returnContextOnly); }, - tellStopped: function (context) { + tellStopped: function (context, returnContextOnly) { return invoke(buildRequestContext('tellStopped', context, angular.isDefined(context.offset) ? context.offset : 0, angular.isDefined(context.num) ? context.num : 1000, angular.isDefined(context.requestParams) ? context.requestParams: null - )); + ), !!returnContextOnly); }, - changePosition: function (context) { - return invoke(buildRequestContext('changePosition', context, context.gid, context.pos, context.how)); + changePosition: function (context, returnContextOnly) { + return invoke(buildRequestContext('changePosition', context, context.gid, context.pos, context.how), !!returnContextOnly); }, - // changeUri: function (context) { - // return invoke('changeUri', context); - // }, - getOption: function (context) { - return invoke(buildRequestContext('getOption', context, context.gid)); + changeUri: function (context, returnContextOnly) { + return invoke(buildRequestContext('changeUri', context, context.gid, context.fileIndex, context.delUris, context.addUris), !!returnContextOnly); }, - changeOption: function (context) { - return invoke(buildRequestContext('changeOption', context, context.gid, context.options)); + getOption: function (context, returnContextOnly) { + return invoke(buildRequestContext('getOption', context, context.gid), !!returnContextOnly); }, - getGlobalOption: function (context) { - return invoke(buildRequestContext('getGlobalOption', context)); + changeOption: function (context, returnContextOnly) { + return invoke(buildRequestContext('changeOption', context, context.gid, context.options), !!returnContextOnly); }, - changeGlobalOption: function (context) { - return invoke(buildRequestContext('changeGlobalOption', context, context.options)); + getGlobalOption: function (context, returnContextOnly) { + return invoke(buildRequestContext('getGlobalOption', context), !!returnContextOnly); }, - getGlobalStat: function (context) { - return invoke(buildRequestContext('getGlobalStat', context)); + changeGlobalOption: function (context, returnContextOnly) { + return invoke(buildRequestContext('changeGlobalOption', context, context.options), !!returnContextOnly); }, - purgeDownloadResult: function (context) { - return invoke(buildRequestContext('purgeDownloadResult', context)); + getGlobalStat: function (context, returnContextOnly) { + return invoke(buildRequestContext('getGlobalStat', context), !!returnContextOnly); }, - removeDownloadResult: function (context) { - return invoke(buildRequestContext('removeDownloadResult', context, context.gid)); + purgeDownloadResult: function (context, returnContextOnly) { + return invoke(buildRequestContext('purgeDownloadResult', context), !!returnContextOnly); + }, + removeDownloadResult: function (context, returnContextOnly) { + return invoke(buildRequestContext('removeDownloadResult', context, context.gid), !!returnContextOnly); }, removeDownloadResultMulti: function (context) { var contexts = []; @@ -372,20 +376,20 @@ return invokeMulti(this.removeDownloadResult, contexts, context.callback); }, - getVersion: function (context) { - return invoke(buildRequestContext('getVersion', context)); + getVersion: function (context, returnContextOnly) { + return invoke(buildRequestContext('getVersion', context), !!returnContextOnly); }, - getSessionInfo: function (context) { - return invoke(buildRequestContext('getSessionInfo', context)); + getSessionInfo: function (context, returnContextOnly) { + return invoke(buildRequestContext('getSessionInfo', context), !!returnContextOnly); }, - shutdown: function (context) { - return invoke(buildRequestContext('shutdown', context)); + shutdown: function (context, returnContextOnly) { + return invoke(buildRequestContext('shutdown', context), !!returnContextOnly); }, - forceShutdown: function (context) { - return invoke(buildRequestContext('forceShutdown', context)); + forceShutdown: function (context, returnContextOnly) { + return invoke(buildRequestContext('forceShutdown', context), !!returnContextOnly); }, - saveSession: function (context) { - return invoke(buildRequestContext('saveSession', context)); + saveSession: function (context, returnContextOnly) { + return invoke(buildRequestContext('saveSession', context), !!returnContextOnly); }, multicall: function (context) { return invoke(buildRequestContext('system.multicall', context, context.methods)); diff --git a/src/scripts/services/aria2TaskService.js b/src/scripts/services/aria2TaskService.js index 74389b6..e248dbe 100644 --- a/src/scripts/services/aria2TaskService.js +++ b/src/scripts/services/aria2TaskService.js @@ -96,6 +96,39 @@ return task; }; + var processBtPeers = function (peers, task, includeLocalPeer) { + if (!peers) { + return peers; + } + + var localTaskCompletedPieces = getPieceStatus(task.bitfield, task.numPieces); + var localTaskCompletedPieceCount = ariaNgCommonService.countArray(localTaskCompletedPieces, true); + var localTaskCompletedPercent = task.completePercent; + + for (var i = 0; i < peers.length; i++) { + var peer = peers[i]; + var upstreamToSpeed = peer.uploadSpeed; + var downstreamFromSpeed = peer.downloadSpeed; + var completedPieces = getPieceStatus(peer.bitfield, task.numPieces); + var completedPieceCount = ariaNgCommonService.countArray(completedPieces, true); + + peer.name = peer.ip + ':' + peer.port; + peer.completePercent = completedPieceCount / task.numPieces * 100; + peer.downloadSpeed = upstreamToSpeed; + peer.uploadSpeed = downstreamFromSpeed; + + if (completedPieceCount == localTaskCompletedPieceCount && peer.completePercent != localTaskCompletedPercent) { + peer.completePercent = localTaskCompletedPercent; + } + } + + if (includeLocalPeer) { + peers.push(createLocalPeerFromTask(task)); + } + + return peers; + }; + var getPieceStatus = function (bitField, pieceCount) { var pieces = []; @@ -249,7 +282,7 @@ return this.setTaskOption(gid, 'select-file', selectedFileIndex, callback, silent); }, - getBtTaskPeers: function (task, callback, silent, includeLocal) { + getBtTaskPeers: function (task, callback, silent, includeLocalPeer) { return aria2RpcService.getPeers({ gid: task.gid, silent: !!silent, @@ -259,31 +292,35 @@ } if (response.success) { - var peers = response.data; - var localTaskCompletedPieces = getPieceStatus(task.bitfield, task.numPieces); - var localTaskCompletedPieceCount = ariaNgCommonService.countArray(localTaskCompletedPieces, true); - var localTaskCompletedPercent = task.completePercent; + processBtPeers(response.data, task, includeLocalPeer); + } - for (var i = 0; i < peers.length; i++) { - var peer = peers[i]; - var upstreamToSpeed = peer.uploadSpeed; - var downstreamFromSpeed = peer.downloadSpeed; - var completedPieces = getPieceStatus(peer.bitfield, task.numPieces); - var completedPieceCount = ariaNgCommonService.countArray(completedPieces, true); + callback(response); + } + }); + }, + getTaskStatusAndBtPeers: function (gid, callback, silent, includeLocalPeer) { + return aria2RpcService.multicall({ + methods: [ + aria2RpcService.tellStatus({ gid: gid }, true), + aria2RpcService.getPeers({ gid: gid }, true) + ], + silent: !!silent, + callback: function (response) { + if (!callback) { + return; + } - peer.name = peer.ip + ':' + peer.port; - peer.completePercent = completedPieceCount / task.numPieces * 100; - peer.downloadSpeed = upstreamToSpeed; - peer.uploadSpeed = downstreamFromSpeed; + response.task = {}; - if (completedPieceCount == localTaskCompletedPieceCount && peer.completePercent != localTaskCompletedPercent) { - peer.completePercent = localTaskCompletedPercent; - } - } + if (response.success) { + response.task = response.data[0][0]; + processDownloadTask(response.task); + } - if (includeLocal) { - peers.push(createLocalPeerFromTask(task)); - } + if (response.success && response.task.bittorrent) { + response.peers = response.data[1][0]; + processBtPeers(response.peers, response.task, includeLocalPeer); } callback(response);