Sha256: fa03df1541bb05822b5e001cac478e656a5c36d7e7bca687614538345c4ec955

Contents?: true

Size: 1.69 KB

Versions: 10

Compression:

Stored size: 1.69 KB

Contents

require "puma/plugin"
require "tailwindcss/commands"

Puma::Plugin.create do
  attr_reader :puma_pid, :tailwind_pid, :log_writer

  def start(launcher)
    @log_writer = launcher.log_writer
    @puma_pid = $$
    @tailwind_pid = fork do
      Thread.new { monitor_puma }
      # Using IO.popen(command, 'r+') will avoid watch_command read from $stdin.
      # If we use system(*command) instead, IRB and Debug can't read from $stdin
      # correctly bacause some keystrokes will be taken by watch_command.
      begin
        IO.popen(Tailwindcss::Commands.watch_command, 'r+') do |io|
          IO.copy_stream(io, $stdout)
        end
      rescue Interrupt
      end
    end

    launcher.events.on_stopped { stop_tailwind }

    in_background do
      monitor_tailwind
    end
  end

  private
    def stop_tailwind
      Process.waitpid(tailwind_pid, Process::WNOHANG)
      log "Stopping tailwind..."
      Process.kill(:INT, tailwind_pid) if tailwind_pid
      Process.wait(tailwind_pid)
    rescue Errno::ECHILD, Errno::ESRCH
    end

    def monitor_puma
      monitor(:puma_dead?, "Detected Puma has gone away, stopping tailwind...")
    end

    def monitor_tailwind
      monitor(:tailwind_dead?, "Detected tailwind has gone away, stopping Puma...")
    end

    def monitor(process_dead, message)
      loop do
        if send(process_dead)
          log message
          Process.kill(:INT, $$)
          break
        end
        sleep 2
      end
    end

    def tailwind_dead?
      Process.waitpid(tailwind_pid, Process::WNOHANG)
      false
    rescue Errno::ECHILD, Errno::ESRCH
      true
    end

    def puma_dead?
      Process.ppid != puma_pid
    end

    def log(...)
      log_writer.log(...)
    end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
tailwindcss-rails-4.2.0 lib/puma/plugin/tailwindcss.rb
tailwindcss-rails-4.1.0 lib/puma/plugin/tailwindcss.rb
tailwindcss-rails-4.0.0 lib/puma/plugin/tailwindcss.rb
tailwindcss-rails-4.0.0.rc5 lib/puma/plugin/tailwindcss.rb
tailwindcss-rails-4.0.0.rc4 lib/puma/plugin/tailwindcss.rb
tailwindcss-rails-4.0.0.rc3 lib/puma/plugin/tailwindcss.rb
tailwindcss-rails-4.0.0.rc2 lib/puma/plugin/tailwindcss.rb
tailwindcss-rails-3.3.1 lib/puma/plugin/tailwindcss.rb
tailwindcss-rails-4.0.0.rc1 lib/puma/plugin/tailwindcss.rb
tailwindcss-rails-3.3.0 lib/puma/plugin/tailwindcss.rb