websocket.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. 'use strict';
  2. const WebSocket = require('ws');
  3. let wsClient = null;
  4. let sendQueue = [];
  5. let fireSendQueue = function () {
  6. while (sendQueue.length && wsClient && wsClient.readyState === WebSocket.OPEN) {
  7. const request = sendQueue.shift();
  8. wsClient.send(request.data);
  9. request.deferred.resolve();
  10. }
  11. };
  12. let clearSendQueue = function () {
  13. for (let i = sendQueue.length - 1; i >= 0; i--) {
  14. sendQueue[i].deferred.reject();
  15. sendQueue.splice(i, 1);
  16. }
  17. };
  18. let init = function () {
  19. if (sendQueue.length) {
  20. clearSendQueue();
  21. }
  22. if (wsClient) {
  23. wsClient.onopen = null;
  24. wsClient.onclose = null;
  25. wsClient.onmessage = null;
  26. wsClient.onerror = null;
  27. wsClient.terminate();
  28. wsClient = null;
  29. }
  30. };
  31. let connect = function (rpcUrl, options, onOpenCallback, onCloseCallback, onMessageCallback) {
  32. init();
  33. wsClient = new WebSocket(rpcUrl);
  34. wsClient.onopen = function () {
  35. onOpenCallback({
  36. client: wsClient,
  37. url: rpcUrl
  38. });
  39. fireSendQueue();
  40. };
  41. wsClient.onclose = function () {
  42. onCloseCallback({
  43. client: wsClient,
  44. url: rpcUrl
  45. });
  46. };
  47. wsClient.onmessage = function (event) {
  48. let message = null;
  49. if (event) {
  50. message = event.data;
  51. }
  52. onMessageCallback({
  53. client: wsClient,
  54. url: rpcUrl,
  55. success: true,
  56. message: message
  57. });
  58. };
  59. wsClient.onerror = function (event) {
  60. // Do Nothing
  61. };
  62. };
  63. let reconnect = function (rpcUrl, options) {
  64. if (!wsClient) {
  65. return;
  66. }
  67. const onOpenFn = wsClient.onopen;
  68. const onCloseFn = wsClient.onclose;
  69. const onMessageFn = wsClient.onmessage;
  70. const onErrorFn = wsClient.onerror;
  71. init();
  72. wsClient = new WebSocket(rpcUrl);
  73. wsClient.onopen = onOpenFn;
  74. wsClient.onclose = onCloseFn;
  75. wsClient.onmessage = onMessageFn;
  76. wsClient.onerror = onErrorFn;
  77. };
  78. let send = function (requestContext) {
  79. const deferred = {};
  80. deferred.promise = new Promise(function (resolve, reject) {
  81. deferred.resolve = resolve
  82. deferred.reject = reject
  83. });
  84. sendQueue.push({
  85. url: requestContext.url,
  86. data: requestContext.data,
  87. deferred: deferred
  88. });
  89. if (wsClient && wsClient.readyState === WebSocket.OPEN) {
  90. fireSendQueue();
  91. }
  92. return deferred.promise;
  93. };
  94. let getReadyState = function () {
  95. if (!wsClient) {
  96. return null;
  97. }
  98. return wsClient.readyState;
  99. };
  100. module.exports = {
  101. init: init,
  102. connect: connect,
  103. reconnect: reconnect,
  104. send: send,
  105. getReadyState: getReadyState
  106. };