aria2WebSocketRpcService.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. (function () {
  2. 'use strict';
  3. angular.module('ariaNg').factory('aria2WebSocketRpcService', ['$q', '$websocket', 'ariaNgConstants', 'ariaNgSettingService', 'ariaNgLogService', function ($q, $websocket, ariaNgConstants, ariaNgSettingService, ariaNgLogService) {
  4. var rpcUrl = ariaNgSettingService.getCurrentRpcUrl();
  5. var socketClient = null;
  6. var sendIdStates = {};
  7. var eventCallbacks = {};
  8. var processMethodCallback = function (content) {
  9. var uniqueId = content.id;
  10. if (!uniqueId) {
  11. return;
  12. }
  13. var state = sendIdStates[uniqueId];
  14. if (!state) {
  15. return;
  16. }
  17. var context = state.context;
  18. state.deferred.resolve({
  19. success: true,
  20. context: context
  21. });
  22. if (content.result && context.connectionSuccessCallback) {
  23. context.connectionSuccessCallback({
  24. rpcUrl: rpcUrl
  25. });
  26. }
  27. if (content.result && context.successCallback) {
  28. ariaNgLogService.debug('[aria2WebSocketRpcService.request] ' + (context && context.requestBody && context.requestBody.method ? context.requestBody.method + ' ' : '') + 'response success', content);
  29. context.successCallback(context.id, content.result);
  30. }
  31. if (content.error && context.errorCallback) {
  32. ariaNgLogService.debug('[aria2WebSocketRpcService.request] ' + (context && context.requestBody && context.requestBody.method ? context.requestBody.method + ' ' : '') + 'response error', content);
  33. context.errorCallback(context.id, content.error);
  34. }
  35. delete sendIdStates[uniqueId];
  36. };
  37. var processEventCallback = function (content) {
  38. var method = content.method;
  39. if (!method) {
  40. return;
  41. }
  42. var callbacks = eventCallbacks[method];
  43. if (!angular.isArray(callbacks) || callbacks.length < 1) {
  44. return;
  45. }
  46. for (var i = 0; i < callbacks.length; i++) {
  47. var callback = callbacks[i];
  48. var context = (angular.isArray(content.params) && content.params.length > 0 ? content.params[0] : null);
  49. callback(context);
  50. }
  51. };
  52. var getSocketClient = function (context) {
  53. if (socketClient === null) {
  54. try {
  55. socketClient = $websocket(rpcUrl, {
  56. reconnectIfNotNormalClose: ariaNgConstants.websocketAutoReconnect
  57. });
  58. socketClient.onMessage(function (message) {
  59. if (!message || !message.data) {
  60. return;
  61. }
  62. var content = angular.fromJson(message.data);
  63. if (!content) {
  64. return;
  65. }
  66. if (content.id) {
  67. processMethodCallback(content);
  68. } else if (content.method) {
  69. processEventCallback(content);
  70. }
  71. });
  72. socketClient.onOpen(function (e) {
  73. ariaNgLogService.debug('[aria2WebSocketRpcService.onOpen] websocket is opened', e);
  74. if (context && context.connectionSuccessCallback) {
  75. context.connectionSuccessCallback({
  76. rpcUrl: rpcUrl
  77. });
  78. }
  79. });
  80. socketClient.onClose(function (e) {
  81. ariaNgLogService.warn('[aria2WebSocketRpcService.onClose] websocket is closed', e);
  82. if (context && context.connectionFailedCallback) {
  83. context.connectionFailedCallback({
  84. rpcUrl: rpcUrl
  85. });
  86. }
  87. });
  88. } catch (ex) {
  89. return {
  90. success: false,
  91. error: 'Cannot initialize WebSocket!',
  92. exception: ex
  93. }
  94. }
  95. }
  96. return {
  97. success: true,
  98. instance: socketClient
  99. };
  100. };
  101. return {
  102. request: function (context) {
  103. if (!context) {
  104. return;
  105. }
  106. var client = getSocketClient({
  107. connectionFailedCallback: context.connectionFailedCallback
  108. });
  109. var uniqueId = context.uniqueId;
  110. var requestBody = angular.toJson(context.requestBody);
  111. ariaNgLogService.debug('[aria2WebSocketRpcService.request] ' + (context && context.requestBody && context.requestBody.method ? context.requestBody.method + ' ' : '') + 'request start', context);
  112. var deferred = $q.defer();
  113. sendIdStates[uniqueId] = {
  114. context: context,
  115. deferred: deferred
  116. };
  117. if (client.instance) {
  118. client.instance.send(requestBody);
  119. } else {
  120. deferred.reject({
  121. success: false,
  122. context: context
  123. });
  124. ariaNgLogService.debug('[aria2WebSocketRpcService.request] client error', client);
  125. context.errorCallback(context.id, { message: client.error });
  126. }
  127. return deferred.promise;
  128. },
  129. on: function (eventName, callback) {
  130. var callbacks = eventCallbacks[eventName];
  131. if (!angular.isArray(callbacks)) {
  132. callbacks = eventCallbacks[eventName] = [];
  133. }
  134. callbacks.push(callback);
  135. }
  136. };
  137. }]);
  138. }());