Skip to content

Instantly share code, notes, and snippets.

@aj0strow
Last active December 3, 2015 01:05
Show Gist options
  • Save aj0strow/203e9836554d1502fa54 to your computer and use it in GitHub Desktop.
Save aj0strow/203e9836554d1502fa54 to your computer and use it in GitHub Desktop.
Auto-reconnecting websockets without changing any code
{EventEmitter} = require "events"
backoff = require "backoff"
WebSocket = require "ws"
class EverSocket extends EventEmitter
constructor: (url, options) ->
@connected = false
@reconnect = true
@backoff = backoff.fibonacci()
connect = =>
return if @connected
return unless @reconnect
@emit "reconnect"
@socket = new WebSocket(url, options)
onError = (err) =>
@socket.removeListener "error", onError
@emit "error", err
unless @connected
onClose err
onClose = (err) =>
connected = @connected
@connected = false
@socket.removeListener "close", onClose
if connected
@emit "close"
if @reconnect
try
@backoff.backoff()
catch err
# ignore error
@socket.on "message", (message) =>
@emit "message", message
@socket.on "error", onError
@socket.on "close", onClose
@socket.once "open", =>
@backoff.reset()
@connected = true
@emit "open"
@backoff.on "fail", (err) =>
@reconnect = false
@emit "error", err
@backoff.on "ready", connect
connect()
send: ->
@socket.send.apply(@socket, arguments)
close: ->
@reconnect = false
if @socket
@socket.close()
module.exports = EverSocket
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment