Class: Chocomint::Console::Worker

Inherits:
Object
  • Object
show all
Defined in:
lib/chocomint/console/worker.rb

Overview

ConPTY を保持し、名前付きパイプを介して親 (WorkerProcess) と対話するワーカー。

ConPTY は「コンソール付きプロセス」からしか正しく動かない (chocomint-conpty メモの制約) ため、このワーカーは新規コンソール付きで spawn される。通信に stdio を使うと新規コンソールとの関連付けが壊れて ConPTY 出力が止まるため、制御通信は独立した名前付きパイプで行う。

プロトコル (親 ⇄ worker、いずれも 1 行 = 1 JSON):

親 → worker: {"type":"input","data":<base64>} / {"type":"resize","cols":N,"rows":M}
worker → 親: {"type":"output","data":<base64>} / {"type":"exit","code":N}

Instance Method Summary collapse

Constructor Details

#initialize(command:, cols:, rows:, cwd:, c2w_name:, w2c_name:) ⇒ Worker

c2w_name: 親→worker パイプ, w2c_name: worker→親 パイプ (親が作成済み)。



21
22
23
24
25
26
# File 'lib/chocomint/console/worker.rb', line 21

def initialize(command:, cols:, rows:, cwd:, c2w_name:, w2c_name:)
  @pty = ConPTY.new(command: command, cols: cols, rows: rows, cwd: cwd)
  @c2w_name = c2w_name
  @w2c_name = w2c_name
  @mutex = Mutex.new
end

Instance Method Details

#runObject



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/chocomint/console/worker.rb', line 28

def run
  # 親の ConnectNamedPipe の順序 (c2w → w2c) に合わせて接続する。
  @c2w = File.open(@c2w_name, "rb")
  @w2c = File.open(@w2c_name, "wb")
  @w2c.sync = true
  @pty.open
  reader = start_output_pump
  while (line = @c2w.gets)
    handle(line)
  end
rescue StandardError
  # 接続断・tty 破損等。ensure でクリーンアップする。
ensure
  @pty.close if @pty.open?
  reader&.join(1)
  @c2w&.close
  @w2c&.close
end