parse method

Future<void> parse(
  1. Uint8List data
)

Implementation

Future<void> parse(Uint8List data) async {
  _Command? command;
  for (_Command cmd in cmdMap.keys) {
    Uint8List buf = Uint8List.fromList(cmdMap[cmd]!);
    bool isExist = true;
    if (data.length >= buf.length) {
      for (int i = 0; i < buf.length; i++) {
        if (buf[i] != data[i]) {
          isExist = false;
          break;
        }
      }
      command = cmd;
      if (isExist) break;
    }
  }
  switch (command ?? '') {
    case _Command.PING:
      _statusCallback(Status.PING_TIMER, null);
      send(cmdMap[_Command.PONG]);
      break;
    case _Command.PONG:
      _statusCallback(Status.PONG_TIMER, null);
      if (!_pongCompleter.isCompleted) {
        _pongCompleter.complete();
      }
      break;
    case _Command.OK:
      _statusCallback(Status.OK_MSG, null);
      send(cmdMap[_Command.OK]);
      break;
    case _Command.ERROR:
      final error = utf8.decode(data.sublist(cmdMap[_Command.ERROR]!.length, data.length - 2));
      _statusCallback(Status.ERROR, error);
      break;
    case _Command.MSG:
    case _Command.HMSG:
      String? subject;
      int? sid;
      int totalBytes = 0;
      int i, start = cmdMap[command]!.length;
      for (i = start; i < data.length; i++) {
        if (data[i] == 32) {
          subject = utf8.decode(data.sublist(start, i));
          break;
        }
      }
      start = i + 1;
      for (i = start; i < data.length; i++) {
        if (data[i] == 32) {
          sid = protoParseInt(data.sublist(start, i));
          break;
        }
      }
      start = i + 1;
      for (i = start; i < data.length; i++) {
        if (data[i] == 13 && data[i + 1] == 10) {
          totalBytes = protoParseInt(data.sublist(start, i));
          break;
        }
      }
      start = i + 2;
      if (subs[sid] != null) {
        Subscription s = subs[sid]!;
        if (totalBytes > 0 && s.callback is SubCallback) {
          if (start + totalBytes < data.length) {
            s.callback!(SubscriptionResult(data.sublist(start, start + totalBytes), s, subject));
          } else {
            _openSubscription = OpenSubscription(s, subject, totalBytes);
            if (data.length > start) {
              _openSubscription!.buffer.addAll(data.sublist(start));
            }
          }
        }
      }
      break;
  }
}