Sha256: 49056872f260abbf7eb980a9c852627eb27239afe2a194b0932e8fcf02fbbef3

Contents?: true

Size: 1.28 KB

Versions: 1

Compression:

Stored size: 1.28 KB

Contents

# frozen_string_literal: true

module Nonnative
  class Process
    def initialize(configuration, logger)
      @configuration = configuration
      @logger = logger
    end

    def start
      @child_pid = spawn(configuration.process)
      return if port_open?

      logger.error('Process has started though did respond in time', pid: child_pid)
    end

    def stop
      ::Process.kill('SIGHUP', child_pid)
      return if port_closed?

      logger.error('Process has stopped though did respond in time', pid: child_pid)
    end

    private

    attr_reader :configuration, :logger, :child_pid

    def port_open?
      timeout do
        open_socket
        true
      rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
        sleep_interval
        retry
      end
    end

    def port_closed?
      timeout do
        open_socket
        raise Nonnative::Error
      rescue Nonnative::Error
        sleep_interval
        retry
      rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
        true
      end
    end

    def timeout
      Timeout.timeout(configuration.timeout) do
        yield
      end
    rescue Timeout::Error
      false
    end

    def open_socket
      TCPSocket.new('127.0.0.1', configuration.port).close
    end

    def sleep_interval
      sleep 0.01
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
nonnative-0.3.0 lib/nonnative/process.rb