decodePayload static method

dynamic decodePayload(
  1. dynamic data, {
  2. bool binaryType = false,
  3. required dynamic callback(
    1. dynamic err, [
    2. dynamic foo,
    3. dynamic bar
    ]),
})

Implementation

static decodePayload(data,
    {bool binaryType = false, required callback(err, [foo, bar])}) {
  if (data is! String) {
    return decodePayloadAsBinary(data,
        binaryType: binaryType, callback: callback);
  }

  if (data == '') {
    // parser error - ignoring payload
    return callback(Error, 0, 1);
  }

  var length = '', n, msg, packet;

  for (int i = 0, l = data.length; i < l; i++) {
    var chr = data[i];

    if (chr != ':') {
      length += chr;
      continue;
    }

    if (length.isEmpty || (length != '${(n = num.tryParse(length))}')) {
      // parser error - ignoring payload
      return callback(ERROR, 0, 1);
    }

    int nv = n!;
    msg = data.substring(i + 1, i + 1 + nv);

    if (length != '${msg.length}') {
      // parser error - ignoring payload
      return callback(ERROR, 0, 1);
    }

    if (msg.isNotEmpty) {
      packet = decodePacket(msg, binaryType: binaryType, utf8decode: false);

      if (ERROR['type'] == packet['type'] &&
          ERROR['data'] == packet['data']) {
        // parser error in individual packet - ignoring payload
        return callback(ERROR, 0, 1);
      }

      var more = callback(packet, i + nv, l);
      if (false == more) return null;
    }

    // advance cursor
    i += nv;
    length = '';
  }

  if (length.isNotEmpty) {
    // parser error - ignoring payload
    return callback(ERROR, 0, 1);
  }
}