query method
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 {
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();
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();
}
}