Class: ReactEmailRails::RenderModes::Subprocess::CommandRunner

Inherits:
Object
  • Object
show all
Defined in:
lib/react_email_rails/render_modes/subprocess/command_runner.rb

Defined Under Namespace

Classes: Result

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(command:, input:, timeout:) ⇒ CommandRunner

Returns a new instance of CommandRunner.



10
11
12
13
14
# File 'lib/react_email_rails/render_modes/subprocess/command_runner.rb', line 10

def initialize(command:, input:, timeout:)
  @command = command
  @input = input
  @timeout = timeout
end

Class Method Details

.capture(command, input: nil, timeout:) ⇒ Object



5
6
7
# File 'lib/react_email_rails/render_modes/subprocess/command_runner.rb', line 5

def capture(command, input: nil, timeout:)
  new(command:, input:, timeout:).capture
end

Instance Method Details

#captureObject



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/react_email_rails/render_modes/subprocess/command_runner.rb', line 16

def capture
  Open3.popen3(*command, pgroup: true) do |stdin, stdout, stderr, wait_thread|
    out_reader = read_async(stdout)
    err_reader = read_async(stderr)

    write_input(stdin)

    if wait_thread.join(timeout).nil?
      terminate_process("KILL", wait_thread.pid)
      wait_thread.join
      out_reader.kill
      err_reader.kill
      raise(Timeout::Error)
    end

    Result.new(stdout: out_reader.value, stderr: err_reader.value, status: wait_thread.value)
  end
end