sendRequest method

Future<RemoteMessage> sendRequest(
  1. String action,
  2. Map<String, dynamic> payload, {
  3. Duration timeout = const Duration(seconds: 30),
})

Send a message and wait for a response.

Implementation

Future<RemoteMessage> sendRequest(
  String action,
  Map<String, dynamic> payload, {
  Duration timeout = const Duration(seconds: 30),
}) async {
  if (_state != RemoteSessionState.connected) {
    throw StateError('Not connected');
  }

  final id = _nextMessageId();
  final message = RemoteMessage(
    id: id,
    type: 'request',
    action: action,
    payload: payload,
    timestamp: DateTime.now(),
  );

  final completer = Completer<RemoteMessage>();
  _pendingRequests[id] = completer;

  _socket!.add(jsonEncode(message.toJson()));

  // Update session info.
  _sessionInfo = _sessionInfo?.copyWith(
    lastActivity: DateTime.now(),
    messageCount: (_sessionInfo?.messageCount ?? 0) + 1,
  );

  // Timeout.
  return completer.future.timeout(
    timeout,
    onTimeout: () {
      _pendingRequests.remove(id);
      throw TimeoutException('Request timed out', timeout);
    },
  );
}