lib/byebug/remote.rb
# frozen_string_literal: true
require "socket"
require_relative "processors/control_processor"
require_relative "remote/server"
require_relative "remote/client"
#
# Remote debugging functionality.
#
module Byebug
# Port number used for remote debugging
PORT = 8989 unless defined?(PORT)
class << self
# If in remote mode, wait for the remote connection
attr_accessor :wait_connection
# The actual port that the server is started at
def actual_port
server.actual_port
end
# The actual port that the control server is started at
def actual_control_port
control.actual_port
end
#
# Interrupts the current thread
#
def interrupt
current_context.interrupt
end
#
# Starts the remote server main thread
#
def start_server(host = nil, port = PORT)
start_control(host, port.zero? ? 0 : port + 1)
server.start(host, port)
end
#
# Starts the remote server control thread
#
def start_control(host = nil, port = PORT + 1)
control.start(host, port)
end
#
# Connects to the remote byebug
#
def start_client(host = "localhost", port = PORT)
client.start(host, port)
end
def parse_host_and_port(host_port_spec)
location = host_port_spec.split(":")
location[1] ? [location[0], location[1].to_i] : ["localhost", location[0]]
end
private
def client
@client ||= Remote::Client.new(Context.interface)
end
def server
@server ||= Remote::Server.new(wait_connection: wait_connection) do |s|
Context.interface = RemoteInterface.new(s)
end
end
def control
@control ||= Remote::Server.new(wait_connection: false) do |s|
context = Byebug.current_context
interface = RemoteInterface.new(s)
ControlProcessor.new(context, interface).process_commands
end
end
end
end