onSend method
Called before a message is sent. Return null to drop the message.
Implementation
@override
Future<WebSocketMessage?> onSend(WebSocketMessage message) async {
if (!platformSupportsCompression) return message;
// Never compress heartbeat frames or binary blobs.
if (message.type == 'heartbeat' || message.type == 'binary') {
return message;
}
String? text;
final data = message.data;
if (data is String) {
text = data;
} else if (data is Map || data is List) {
text = jsonEncode(data);
} else {
return message;
}
if (text.length < threshold) return message;
final compressed = platformGzipEncode(utf8.encode(text));
final envelope = jsonEncode({
_kCompressed: 1,
_kData: base64Encode(compressed),
});
return WebSocketMessage(
data: envelope,
timestamp: message.timestamp,
type: message.type,
metadata: {
...?message.metadata,
_kCompressed: true,
'originalSize': text.length,
'compressedSize': compressed.length,
},
);
}