start method

void start({
  1. ProtocolMessageHandler? onMessage,
  2. void onDone()?,
  3. void onError(
    1. Object? error
    )?,
})

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");
  }();
}