require 'socket' require './event_loop' def handle_next_request(server, &handler) begin socket = server.accept_nonblock request = socket.gets.strip puts "Started handling req: #{request} #{Time.now}" handler.call(socket) add_callback { handle_next_request(server, &handler) } rescue IO::WaitReadable, Errno::EINTR add_callback { handle_next_request(server, &handler) } end end run_loop do server = TCPServer.new("127.0.0.1", 5678) puts "Listening on localhost:5678" handle_next_request(server) do |socket| set_timeout(5000) do puts "Responding 5 seconds later: #{Time.now}" socket.puts <<~HTTP HTTP/1.1 200 OK Content-Type: text/html Hii 👋 HTTP socket.close end set_timeout(0) { puts "0ms later: #{Time.now}" } set_timeout(1500) { puts "1.5s later: #{Time.now}" } end end