class Appril::RTCPController

Attributes

socket[R]

Public Instance Methods

index() click to toggle source
# File lib/appril/rtcp_controller.rb, line 5
def index
  return unless websocket?

  @socket = Tubesock.hijack(env)
  @socket.onopen(&method(:on_open))
  @socket.onmessage(&method(:on_message))
  @socket.onclose(&method(:on_close))
  @socket.listen

  halt websocket_response
end

Private Instance Methods

_env() click to toggle source

environmental data to be sent to client at App initialization

# File lib/appril/rtcp_controller.rb, line 95
def _env
  {}
end
call_controller(controller, method, arguments, params, env) click to toggle source
# File lib/appril/rtcp_controller.rb, line 82
def call_controller controller, method, arguments, params, env
  controller.new(method, arguments, params).call(env)
end
connected() click to toggle source

called after socket connection established

# File lib/appril/rtcp_controller.rb, line 91
def connected
end
disconnected() click to toggle source

called when socket connection closed

# File lib/appril/rtcp_controller.rb, line 100
def disconnected
end
on_close() click to toggle source
# File lib/appril/rtcp_controller.rb, line 72
def on_close
  @socket.close! if @socket
  @socket = nil
  disconnected
end
on_message(msg) click to toggle source
# File lib/appril/rtcp_controller.rb, line 24
def on_message msg

  msg = indifferent_params(JSON.parse(msg))
  if controller = resolve_controller(msg[:controller])

    status, _, body = call_controller(
      controller,
      msg[:method],
      msg[:arguments],
      msg[:params],
      env.merge(RocketIO::REQUEST_METHOD => msg[:request_method], rtcp_serial: msg[:serial])
    )

    if status.to_i / 100 == 2

      if body.is_a?(Proc)
        body.call
        return
      end

      if msg[:reply]
        write(serial: msg[:serial], data: body)
      end

      return
    end
  else
    body = '404: Not Found'
  end

  error = if body.is_a?(Array) && body.size == 1
    body[0]
  else
    body
  end

  if msg && msg[:serial]
    write(serial: msg[:serial], error: error)
  else
    write(error: error)
  end

rescue Errno::EPIPE => e
  close
rescue Exception => e
  __error__(500, e)
end
on_open() click to toggle source
# File lib/appril/rtcp_controller.rb, line 19
def on_open
  connected
  write(serial: 0, data: _env)
end
resolve_controller(controller) click to toggle source
# File lib/appril/rtcp_controller.rb, line 78
def resolve_controller controller
  ::RocketIO.controllers.find {|c| c.name == controller}
end
write(data) click to toggle source
# File lib/appril/rtcp_controller.rb, line 86
def write data
  @socket.send_data(data.to_json)
end