Sha256: fab481ccfcaf75cab907ea579a24fe2c282fa2eede4327c034c9c54b1b9cc85a

Contents?: true

Size: 1.23 KB

Versions: 3

Compression:

Stored size: 1.23 KB

Contents

Faye::WebSocket.load_adapter('thin')

module Grenache
  class WebsocketServer
    def initialize(port, &block)
      @port = port
      @callback = block
    end

    def start_server
      @server = Thin::Server.start('0.0.0.0', @port, method(:app), {signals: false})
    end

    def app(env)
      ws = Faye::WebSocket.new(env)
      ws.on :message, -> (ev) { @callback.call(ws, ev) }
      ws.rack_response
    end

    def send(payload)
      @server.send(payload)
    end
  end

  class WebsocketClient
    def initialize(uri, &cb)
      @uri = uri.sub("tcp://","ws://")
      @uri.prepend("ws://") unless @uri.start_with?("ws://")
      @callback = cb
    end

    def send payload
      ws_connect unless @connected
      @ws.send(payload)
    end

    private
    def ws_connect
      @ws = Faye::WebSocket::Client.new(@uri)
      @ws.on(:open, method(:on_open))
      @ws.on(:message, method(:on_message))
      @ws.on(:close, method(:on_close))
    end

    def on_open(ev)
      @connected = true
    end

    def on_message(ev)
      msg = Oj.load(ev.data)
      disconnect
      @callback.call(msg) if @callback
    end

    def disconnect
      @ws.close
      @ws = nil
    end

    def on_close(ev)
      @connected = false
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
grenache-ruby-ws-0.0.5 lib/grenache/websocket.rb
grenache-ruby-ws-0.0.4 lib/grenache/websocket.rb
grenache-ruby-ws-0.0.3 lib/grenache/websocket.rb