       false
 
   open: ->
-    return if @isState("open", "connecting")
-    @webSocket = new WebSocket(@consumer.url)
-    @installEventHandlers()
+    if @isOpen()
+      throw new Error("Must close existing connection before opening")
+    else
+      @webSocket = new WebSocket(@consumer.url)
+      @installEventHandlers()
 
   close: ->
-    return if @isState("closed", "closing")
     @webSocket?.close()
 
   reopen: ->
-    if @isOpen()
-      @closeSilently => @open()
-    else
-      @open()
+    @close()
+    @open()
 
   isOpen: ->
     @isState("open")

    return state.toLowerCase() for state, value of WebSocket when value is @webSocket?.readyState
    null

  closeSilently: (callback = ->) ->
    @uninstallEventHandlers()
    @installEventHandler("close", callback)
    @installEventHandler("error", callback)
    try
      @webSocket.close()
    finally
      @uninstallEventHandlers()

  installEventHandlers: ->
    for eventName of @events
      @installEventHandler(eventName)

  installEventHandler: (eventName, handler) ->
    handler ?= @events[eventName].bind(this)
    @webSocket.addEventListener(eventName, handler)

  uninstallEventHandlers: ->
    for eventName of @events
      @webSocket.removeEventListener(eventName)

  events:
    message: (event) ->


    error: ->
      @consumer.subscriptions.notifyAll("disconnected")

  toJSON: ->
    state: @getState()
