UNPKG

websocket-async

Version:

An async/await WebSocket client for browsers

2 lines (1 loc) 2.19 kB
function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var c=t[n];c.enumerable=c.enumerable||!1,c.configurable=!0,"value"in c&&(c.writable=!0),Object.defineProperty(e,c.key,c)}}return function(t,n,c){return n&&e(t.prototype,n),c&&e(t,c),t}}(),WebSocketClient=function(){function e(){_classCallCheck(this,e),this._reset()}return _createClass(e,[{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(c,r){var s={resolve:function(e){n._receiveCallbacksQueue.push(s)},reject:c};n._receiveCallbacksQueue.push(s),n._socket.close(e,t)}):Promise.resolve(this._closeEvent)}},{key:"_setupListenersOnConnect",value:function(){var e=this,t=this._socket;return new Promise(function(n,c){var r=function(t){var n=t;0===e._receiveCallbacksQueue.length?e._receiveDataQueue.push(n.data):e._receiveCallbacksQueue.shift().resolve(n.data)};t.addEventListener("error",c),t.addEventListener("open",function(c){t.addEventListener("message",r),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}}]),e}();export default WebSocketClient;