Class: Chocomint::Console::Worker
- Inherits:
-
Object
- Object
- Chocomint::Console::Worker
- 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
-
#initialize(command:, cols:, rows:, cwd:, c2w_name:, w2c_name:) ⇒ Worker
constructor
c2w_name: 親→worker パイプ, w2c_name: worker→親 パイプ (親が作成済み)。.
- #run ⇒ Object
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
#run ⇒ Object
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 |