all files / collab/ ClientConnection.js

0% Statements 0/30
0% Branches 0/4
0% Functions 0/12
0% Lines 0/30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99                                                                                                                                                                                                     
import { EventEmitter, SubstanceError as Err } from '../util'
 
/**
  ClientConnection abstraction. Uses websockets internally
*/
class ClientConnection extends EventEmitter {
  constructor(config) {
    super()
 
    this.config = config
    this._onMessage = this._onMessage.bind(this)
    this._onConnectionOpen = this._onConnectionOpen.bind(this)
    this._onConnectionClose = this._onConnectionClose.bind(this)
 
    // Establish websocket connection
    this._connect()
  }
 
  _createWebSocket() {
    throw Err('AbstractMethodError')
  }
 
  /*
    Initializes a new websocket connection
  */
  _connect() {
    this.ws = this._createWebSocket()
    this.ws.addEventListener('open', this._onConnectionOpen)
    this.ws.addEventListener('close', this._onConnectionClose)
    this.ws.addEventListener('message', this._onMessage)
  }
 
  /*
    Disposes the current websocket connection
  */
  _disconnect() {
    this.ws.removeEventListener('message', this._onMessage)
    this.ws.removeEventListener('open', this._onConnectionOpen)
    this.ws.removeEventListener('close', this._onConnectionClose)
    this.ws = null
  }
 
  /*
    Emits open event when connection has been established
  */
  _onConnectionOpen() {
    this.emit('open')
  }
 
  /*
    Trigger reconnect on connection close
  */
  _onConnectionClose() {
    this._disconnect()
    this.emit('close')
    console.info('websocket connection closed. Attempting to reconnect in 5s.')
    setTimeout(function() {
      this._connect()
    }.bind(this), 5000)
  }
 
  /*
    Delegate incoming websocket messages
  */
  _onMessage(msg) {
    msg = this.deserializeMessage(msg.data)
    this.emit('message', msg)
  }
 
  /*
    Send message via websocket channel
  */
  send(msg) {
    if (!this.isOpen()) {
      console.warn('Message could not be sent. Connection is not open.', msg)
      return
    }
    this.ws.send(this.serializeMessage(msg))
  }
 
  /*
    Returns true if websocket connection is open
  */
  isOpen() {
    return this.ws && this.ws.readyState === 1
  }
 
  serializeMessage(msg) {
    return JSON.stringify(msg)
  }
 
  deserializeMessage(msg) {
    return JSON.parse(msg)
  }
 
}
 
export default ClientConnection