class FFWD::Debug::TCP

Public Class Methods

new(host, port, rebind_timeout) click to toggle source
# File lib/ffwd/debug/tcp.rb, line 28
def initialize host, port, rebind_timeout
  @clients = {}
  @sessions = {}
  @host = host
  @port = port
  @peer = "#{@host}:#{@port}"
  info = "tcp://#{@peer}"

  r = FFWD.retry :timeout => rebind_timeout do |attempt|
    EM.start_server @host, @port, Connection, self
    log.info "Bind on #{info} (attempt #{attempt})"
  end

  r.error do |a, t, e|
    log.warning "Bind on #{info} failed, retry ##{a} in #{t}s: #{e}"
  end

  r.depend_on self
end

Public Instance Methods

monitor(channel, type) click to toggle source

Setup monitor hooks for the specified input and output channel.

# File lib/ffwd/debug/tcp.rb, line 65
def monitor channel, type
  channel.starting do
    if session = @sessions[channel.id]
      log.error "Session already monitored: #{channel.id}"
      return
    end

    session = MonitorSession.new channel, type

    # provide the session to any already connected clients.
    @clients.each do |peer, client|
      session.register peer, client
    end

    @sessions[channel.id] = session
  end

  channel.stopping do
    @sessions.delete channel.id
  end
end
register_client(peer, client) click to toggle source
# File lib/ffwd/debug/tcp.rb, line 48
def register_client peer, client
  @sessions.each do |id, session|
    session.register peer, client
  end

  @clients[peer] = client
end
unregister_client(peer, client) click to toggle source
# File lib/ffwd/debug/tcp.rb, line 56
def unregister_client peer, client
  @sessions.each do |id, session|
    session.unregister peer, client
  end

  @clients.delete peer
end