UNPKG

websocket-async

Version:

An async/await WebSocket client for browsers

2 lines (1 loc) 2.29 kB
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.WebSocketClient=t()}(this,function(){"use strict";function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var t=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();return function(){function n(){e(this,n),this._reset()}return t(n,[{key:"connect",value:function(e,t){var n=this;return this.disconnect().then(function(){return n._reset(),n._socket=new WebSocket(e,t),n._socket.binaryType="arraybuffer",n._setupListenersOnConnect()})}},{key:"send",value:function(e){if(!this.connected)throw this._closeEvent||new Error("Not connected.");this._socket.send(e)}},{key:"receive",value:function(){var e=this;return 0!==this._receiveDataQueue.length?Promise.resolve(this._receiveDataQueue.shift()):this.connected?new Promise(function(t,n){e._receiveCallbacksQueue.push({resolve:t,reject:n})}):Promise.reject(this._closeEvent||new Error("Not connected."))}},{key:"disconnect",value:function(e,t){var n=this;return this.connected?new Promise(function(r,c){var i={resolve:function(e){n._receiveCallbacksQueue.push(i)},reject:r};n._receiveCallbacksQueue.push(i),n._socket.close(e,t)}):Promise.resolve(this._closeEvent)}},{key:"_setupListenersOnConnect",value:function(){var e=this,t=this._socket;return new Promise(function(n,r){var c=function(t){var n=t;0===e._receiveCallbacksQueue.length?e._receiveDataQueue.push(n.data):e._receiveCallbacksQueue.shift().resolve(n.data)};t.addEventListener("error",r),t.addEventListener("open",function(r){t.addEventListener("message",c),t.addEventListener("close",function(t){for(e._closeEvent=t;0!==e._receiveCallbacksQueue.length;)e._receiveCallbacksQueue.shift().reject(e._closeEvent)}),n()})})}},{key:"_reset",value:function(){this._receiveDataQueue=[],this._receiveCallbacksQueue=[],this._closeEvent=null}},{key:"connected",get:function(){return null!=this._socket&&this._socket.readyState===WebSocket.OPEN}},{key:"dataAvailable",get:function(){return this._receiveDataQueue.length}}]),n}()});