Sha256: becf22f54089ec741ddf46419fec71e1f6c04c921495b86643fa27ef19628f0a

Contents?: true

Size: 1.68 KB

Versions: 12

Compression:

Stored size: 1.68 KB

Contents

# frozen_string_literal: true

module Pakyow
  module Processes
    class Proxy
      class << self
        def find_local_port
          server = TCPServer.new("127.0.0.1", 0)
          port = server.addr[1]
          server.close
          port
        end
      end

      def initialize(host:, port:, proxy_port:)
        @host, @port, @proxy_port = host, port, proxy_port
      end

      def run
        endpoint = Async::HTTP::Endpoint.parse(
          "http://#{@host}:#{@port}"
        )

        server = Server.new(
          host: @host, port: @proxy_port, forwarded: "#{@host}:#{@port}"
        )

        Async::Reactor.run do
          Async::HTTP::Server.new(server, endpoint).run

          if !ENV.key?("PW_RESPAWN")
            Pakyow.logger << Pakyow::Processes::Server.running_text(
              scheme: "http", host: @host, port: @port
            )
          end
        end
      end

      class Server
        def initialize(port:, host:, forwarded:)
          @port, @host, @forwarded = port, host, forwarded
          @destination = "#{@host}:#{@port}"
          @client = Async::HTTP::Client.new(
            Async::HTTP::Endpoint.parse(
              File.join("http://#{@destination}")
            )
          )
        end

        def call(request, total_waits = 0)
          @client.call(request)
        rescue
          if total_waits == 30
            Async::HTTP::Protocol::Response.new(
              nil, 404, [], Async::HTTP::Body::Buffered.wrap(
                StringIO.new("app did not respond")
              )
            )
          else
            Async::Task.current.sleep 0.5
            call(request, total_waits + 1)
          end
        end
      end
    end
  end
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
pakyow-core-1.0.6 lib/pakyow/processes/proxy.rb
pakyow-core-1.0.5 lib/pakyow/processes/proxy.rb
pakyow-core-1.0.4 lib/pakyow/processes/proxy.rb
pakyow-core-1.0.3 lib/pakyow/processes/proxy.rb
pakyow-core-1.0.2 lib/pakyow/processes/proxy.rb
pakyow-core-1.0.1 lib/pakyow/processes/proxy.rb
pakyow-core-1.0.0 lib/pakyow/processes/proxy.rb
pakyow-core-1.0.0.rc5 lib/pakyow/processes/proxy.rb
pakyow-core-1.0.0.rc4 lib/pakyow/processes/proxy.rb
pakyow-core-1.0.0.rc3 lib/pakyow/processes/proxy.rb
pakyow-core-1.0.0.rc2 lib/pakyow/processes/proxy.rb
pakyow-core-1.0.0.rc1 lib/pakyow/processes/proxy.rb