onSend method

  1. @override
Future<WebSocketMessage?> onSend(
  1. WebSocketMessage message
)
override

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,
    },
  );
}