query method

  1. @override
Future<String?> query(
  1. String query, {
  2. Duration timeout = const Duration(seconds: 2),
})
override

Queries the terminal for information by writing query and waiting for a response.

Returns the response string, or null if the query timed out.

This is intended for non-TUI use cases. In a TUI, use the message loop.

Implementation

@override
Future<String?> query(
  String query, {
  Duration timeout = const Duration(seconds: 2),
}) async {
  if (!isTerminal) return null;

  final wasRaw = _rawModeEnabled;
  if (!wasRaw) enableRawMode();

  try {
    write(query);
    await flush();

    final completer = Completer<String?>();
    final buffer = StringBuffer();

    final timer = Timer(timeout, () {
      if (!completer.isCompleted) completer.complete(null);
    });

    final sub = input.listen((data) {
      buffer.write(String.fromCharCodes(data));
      final s = buffer.toString();

      // Common terminal response terminators:
      // - BEL (0x07)
      // - ST (ESC \)
      // - DA1 response ends with 'c' (e.g. ESC [ ? 62 ; 1 c)
      if (s.contains('\x07') || s.contains('\x1b\\') || s.endsWith('c')) {
        if (!completer.isCompleted) completer.complete(s);
      }
    });

    final result = await completer.future;
    timer.cancel();
    await sub.cancel();
    return result;
  } finally {
    if (!wasRaw) disableRawMode();
  }
}