handleClientConnection method
Future<void>
handleClientConnection
(- Socket connection,
- Stream listener,
- 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!');
}