You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
asciinema.org/app/models/terminal.rb

61 lines
996 B
Ruby

require 'open3'
class Terminal
BINARY_PATH = (Rails.root + "bin" + "terminal").to_s
def initialize(width, height)
@process = Process.new("#{BINARY_PATH} #{width} #{height}")
end
def feed(data)
process.write("d\n#{data.bytesize}\n")
process.write(data)
end
def snapshot
process.write("p\n")
lines = Yajl::Parser.new.parse(process.read_line)
Snapshot.build(lines)
end
def cursor
process.write("c\n")
c = Yajl::Parser.new.parse(process.read_line)
Cursor.new(c['x'], c['y'], c['visible'])
end
def release
process.stop
end
private
attr_reader :process
class Process
def initialize(command)
@stdin, @stdout, @thread = Open3.popen2(command)
end
def write(data)
raise "terminal died" unless @thread.alive?
@stdin.write(data)
end
def read_line
raise "terminal died" unless @thread.alive?
@stdout.readline.strip
end
def stop
@stdin.close
end
end
end