handleClientConnection method

Future<void> handleClientConnection (
  1. Socket connection,
  2. Stream listener,
  3. TCPRosHeader header
)

Implementation

Future<void> handleClientConnection(
    Socket connection, Stream listener, TCPRosHeader header) async {
  if (isShutdown) {
    return;
  }
  final name = connection.name;
  log.dartros.debug('Service $service handling new client connection');
  final writer = ByteDataWriter(endian: Endian.little);
  final validated = validateServiceClientHeader(
      writer, header, service, messageClass.md5sum);
  if (!validated) {
    log.dartros.error(
        'Error while validating service $service connection header: ${writer.toBytes()}');
    await connection.close();
    return;
  }
  createServiceServerHeader(writer, node.nodeName, messageClass.md5sum, type);
  connection.add(writer.toBytes());
  _clients[name] = connection;
  try {
    await for (final data in listener) {
      log.dartros.trace('Service $service got message! $data');
      final reader = ByteDataReader(endian: Endian.little)..add(data);
      final req = messageClass.request.deserialize(reader);
      final result = requestCallback(req);
      if (isShutdown) {
        return;
      }
      final writer = ByteDataWriter(endian: Endian.little);
      serializeServiceResponse(writer, result, true);
      log.dartros.debug('Serializing service response ${writer.toBytes()}');
      connection.add(writer.toBytes());
      await connection.flush();
      log.dartros.debug('Flushed service response');
      if (!header.persistent) {
        log.dartros.debug('Closing non-persistent service client');
        await connection.close();
        _clients.remove(name);
        return;
      }
    }
  } catch (e) {
    _clients.remove(name);
    log.dartros.debug('Service client $name disconnected with error: $e!');
  }
  _clients.remove(name);
  log.dartros.debug('Service client $name disconnected!');
}