write method
Writes data to the connection.
Implementation
@override
Future<void> write(Uint8List data) async {
// Acquire write lock to ensure writes are atomic and don't interleave
await _acquireWriteLock();
try {
_log.finer(
'SecuredConnection.write: Plaintext data received (length: ${data.length}, first 20 bytes: ${data.take(20).toList()})');
// libp2p Noise spec: 2-byte length prefix, max 65535 bytes per frame.
// Max plaintext per frame = 65535 - 16 (MAC) = 65519 bytes.
const maxPlaintextPerFrame = 65535 - 16;
// Chunk data if it exceeds max plaintext per frame
var offset = 0;
do {
final chunkEnd = (offset + maxPlaintextPerFrame < data.length)
? offset + maxPlaintextPerFrame
: data.length;
final chunk = data.sublist(offset, chunkEnd);
await _writeFrame(chunk);
offset = chunkEnd;
} while (offset < data.length);
} finally {
// Always release the write lock, even if an exception occurs
_releaseWriteLock();
}
}