encode method

Uint8List encode()

Encode the STUN message to bytes

Implementation

Uint8List encode() {
  // Calculate message length (excluding header)
  int messageLength = 0;
  attributes.forEach((_, value) => messageLength += value.length + 4); // 4 for type and length

  final buffer = ByteData(20 + messageLength); // 20 bytes header + attributes
  var offset = 0;

  // Write message type
  buffer.setUint16(offset, type);
  offset += 2;

  // Write message length
  buffer.setUint16(offset, messageLength);
  offset += 2;

  // Write magic cookie
  buffer.setUint32(offset, magicCookie);
  offset += 4;

  // Write transaction ID
  for (var i = 0; i < 12; i++) {
    buffer.setUint8(offset + i, transactionId[i]);
  }
  offset += 12;

  // Write attributes
  attributes.forEach((type, value) {
    buffer.setUint16(offset, type);
    offset += 2;
    buffer.setUint16(offset, value.length);
    offset += 2;
    final bytes = buffer.buffer.asUint8List(offset, value.length);
    bytes.setAll(0, value);
    offset += value.length;
    // Add padding if necessary
    if (value.length % 4 != 0) {
      offset += 4 - (value.length % 4);
    }
  });

  return buffer.buffer.asUint8List(0, 20 + messageLength);
}