WinptyShellSession constructor

WinptyShellSession({
  1. required WinptyLib winpty,
  2. required Pointer<Void> winptyPtr,
  3. required Pointer<Void> childHandle,
  4. required String coninName,
  5. required String conoutName,
})

Implementation

WinptyShellSession({
  required WinptyLib winpty,
  required Pointer<Void> winptyPtr,
  required Pointer<Void> childHandle,
  required String coninName,
  required String conoutName,
}) : _winpty = winpty,
     _wp = winptyPtr,
     _child = childHandle {
  // Open conin for writing (single client per pipe; the reader isolate opens
  // conout). A failure leaves an invalid handle and writes become no-ops.
  final namePtr = coninName.toNativeUtf16();
  try {
    _conin = _k.createFileW(
      namePtr,
      kGenericWrite,
      0,
      nullptr,
      kOpenExisting,
      0,
      nullptr,
    );
  } finally {
    calloc.free(namePtr);
  }

  _readerPort.listen((msg) {
    if (msg is Uint8List) {
      if (!_stdout.isClosed) _stdout.add(msg);
    } else {
      // Sentinel: conout reached EOF (child exited / pipe broke).
      if (!_stdout.isClosed) _stdout.close();
      _readerPort.close();
    }
  });
  _waiterPort.listen((msg) {
    if (msg is int && !_exit.isCompleted) _exit.complete(msg);
    _waiterPort.close();
    _dispose();
  });

  Isolate.spawn(_readerMain, (_readerPort.sendPort, conoutName));
  Isolate.spawn(_waiterMain, (_waiterPort.sendPort, _child.address));
}