-
Notifications
You must be signed in to change notification settings - Fork 177
/
Copy pathtailwindcss.rb
68 lines (57 loc) · 1.61 KB
/
tailwindcss.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
require "puma/plugin"
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.
IO.popen(Tailwindcss::Commands.watch_command, 'r+') do |io|
IO.copy_stream(io, $stdout)
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