start method
Implementation
void start({ProtocolMessageHandler? onMessage, void Function()? onDone, void Function(Object? error)? onError}) {
if (onMessage != null) {
addHandler("*", onMessage);
}
channel.start(onDataReceived, onDone: onDone, onError: onError);
() async {
await for (final message in _send.stream) {
//debugPrint("message recv on protocol ${message.id} ${message.type}");
final packets = (message.data.length / 1024).ceil();
final packet = BytesBuilder();
packet.add(
Uint8List(16)
..buffer.asByteData().setUint32(0, message.id >> 32, Endian.big)
..buffer.asByteData().setUint32(4, message.id & 0xffff, Endian.big)
..buffer.asByteData().setInt32(8, 0, Endian.big)
..buffer.asByteData().setInt32(12, packets, Endian.big),
);
packet.add(utf8.encode(message.type));
await channel.sendData(packet.toBytes());
for (var i = 0; i < packets; i++) {
final packetBuilder = BytesBuilder();
final header = Uint8List(12).buffer.asByteData();
header.setUint32(0, message.id >> 32, Endian.big);
header.setUint32(4, message.id & 0xffff, Endian.big);
header.setInt32(8, i + 1, Endian.big);
packetBuilder.add(Uint8List.view(header.buffer));
packetBuilder.add(Uint8List.sublistView(message.data, i * 1024, min((i + 1) * 1024, message.data.length)));
await channel.sendData(packetBuilder.toBytes());
}
message.sent.complete();
//debugPrint("message sent on protocol ${message.id} ${message.type}");
}
//debugPrint("protocol done");
}();
}