onReceive method

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

Called after a message is received. Return null to drop the message.

Implementation

@override
Future<WebSocketMessage?> onReceive(WebSocketMessage message) async {
  if (!platformSupportsCompression) return message;

  final data = message.data;
  Map<String, dynamic>? envelope;

  if (data is String) {
    try {
      final decoded = jsonDecode(data);
      if (decoded is Map<String, dynamic>) envelope = decoded;
    } catch (_) {
      return message;
    }
  } else if (data is Map<String, dynamic>) {
    envelope = data;
  }

  if (envelope == null || envelope[_kCompressed] != 1) return message;

  final b64 = envelope[_kData] as String?;
  if (b64 == null) return message;

  try {
    final decompressed = utf8.decode(platformGzipDecode(base64Decode(b64)));
    dynamic parsed;
    try {
      parsed = jsonDecode(decompressed);
    } catch (_) {
      parsed = decompressed;
    }

    final meta = Map<String, dynamic>.from(message.metadata ?? {})
      ..remove(_kCompressed);

    return WebSocketMessage(
      data: parsed,
      timestamp: message.timestamp,
      type: message.type,
      metadata: meta,
    );
  } catch (_) {
    return message;
  }
}