class Adsf::Live::WebSocketServer

Public Class Methods

new(host:, port:) click to toggle source
# File lib/adsf/live/web_socket_server.rb, line 6
def initialize(host:, port:)
  @host = host
  @port = port

  @thread = start
  @sockets = []

  @stopped_waiter = SizedQueue.new(1)
end

Public Instance Methods

reload(paths) click to toggle source
# File lib/adsf/live/web_socket_server.rb, line 21
def reload(paths)
  paths.each do |path|
    data =
      JSON.dump(
        command: 'reload',
        path: "#{Dir.pwd}#{path}",
      )

    @sockets.each { |ws| ws.send(data) }
  end
end
stop() click to toggle source
# File lib/adsf/live/web_socket_server.rb, line 16
def stop
  EventMachine.stop
  @stopped_waiter.pop
end

Private Instance Methods

on_socket_connected(socket) click to toggle source
# File lib/adsf/live/web_socket_server.rb, line 61
def on_socket_connected(socket)
  socket.send(
    JSON.dump(
      command: 'hello',
      protocols: ['http://livereload.com/protocols/official-7'],
      serverName: 'nanoc-view',
    ),
  )

  @sockets << socket
end
on_socket_disconnected(socket) click to toggle source
# File lib/adsf/live/web_socket_server.rb, line 73
def on_socket_disconnected(socket)
  @sockets.delete(socket)
end
run(started_waiter) click to toggle source
# File lib/adsf/live/web_socket_server.rb, line 50
def run(started_waiter)
  EventMachine.run do
    EventMachine.defer(-> { started_waiter << true })

    EventMachine::WebSocket.run(host: @host, port: @port) do |socket|
      socket.onopen  { on_socket_connected(socket) }
      socket.onclose { on_socket_disconnected(socket) }
    end
  end
end
start() click to toggle source
# File lib/adsf/live/web_socket_server.rb, line 35
def start
  started_waiter = SizedQueue.new(1)

  thread =
    Thread.new do
      Thread.current.abort_on_exception = true
      run(started_waiter)
      @stopped_waiter << true
    end

  started_waiter.pop

  thread
end