encode method
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);
}