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: () {
      if (!_done.isCompleted) {
        _done.complete(null);
      }
      if (onDone != null) {
        onDone();
      }
    },
    onError: (error) {
      _done.complete(error);
      if (onError != null) {
        onError(error);
      }
    },
  );

  () async {
    await for (final message in _send.stream) {
      //debugPrint("message recv on protocol ${message.id} ${message.type}");
      try {
        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 & 0xffffffff, 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 & 0xffffffff, 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());
        }
        if (!message.sent.isCompleted) {
          message.sent.complete();
        }
      } catch (error, stackTrace) {
        _sendError = error;
        if (!message.sent.isCompleted) {
          message.sent.completeError(error, stackTrace);
        }
        if (!_done.isCompleted) {
          _done.complete(error);
        }
        break;
      }

      //debugPrint("message sent on protocol ${message.id} ${message.type}");
    }
    //debugPrint("protocol done");
  }();
}