From e148b9fdfacb26cc201e29739b5a12f35322b397 Mon Sep 17 00:00:00 2001 From: JulianAlcala Date: Fri, 17 Apr 2026 03:06:09 +0200 Subject: [PATCH] fix(websocket): handle notification wrapper, hyphenated types, and stringified data --- .../src/websocket/websocket_event_parser.dart | 25 ++++++++++++++----- .../lib/src/websocket/websocket_service.dart | 1 + 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/sf_infrastructure/lib/src/websocket/websocket_event_parser.dart b/packages/sf_infrastructure/lib/src/websocket/websocket_event_parser.dart index b9e6fa51..062c2bc1 100644 --- a/packages/sf_infrastructure/lib/src/websocket/websocket_event_parser.dart +++ b/packages/sf_infrastructure/lib/src/websocket/websocket_event_parser.dart @@ -14,10 +14,20 @@ const _alertTypes = { WebSocketEvent? parseWebSocketEvent(String raw) { try { - final json = jsonDecode(raw) as Map; - final type = json['type'] as String? ?? ''; + var json = jsonDecode(raw) as Map; + + if (json['type'] == 'notification') { + final inner = json['data']; + if (inner is Map && inner.containsKey('type')) { + json = inner; + } + } + + var type = json['type'] as String? ?? ''; final timestamp = json['timestamp'] as String? ?? ''; + type = type.replaceAll('-', '_'); + if (_alertTypes.contains(type)) { return AlertEvent( type: type, @@ -26,7 +36,10 @@ WebSocketEvent? parseWebSocketEvent(String raw) { ); } - final data = json['data'] as Map? ?? {}; + final rawData = json['data']; + final data = rawData is String + ? (jsonDecode(rawData) as Map? ?? {}) + : (rawData as Map? ?? {}); return switch (type) { 'position' => PositionEvent( @@ -88,20 +101,20 @@ WebSocketEvent? parseWebSocketEvent(String raw) { [], timestamp: timestamp, ), - 'video-call' => VideoCallEvent( + 'video_call' => VideoCallEvent( chatType: data['chatType'] as String? ?? '', appAccount: data['appAccount'] as String? ?? '', roomNumber: data['roomNumber'] as String? ?? '', sessionId: data['sessionId'] as String?, timestamp: timestamp, ), - 'video-call-refused' => VideoCallRefusedEvent( + 'video_call_refused' => VideoCallRefusedEvent( chatType: data['chatType'] as String? ?? '', appAccount: data['appAccount'] as String? ?? '', roomNumber: data['roomNumber'] as String? ?? '', timestamp: timestamp, ), - 'video-call-room-count' => VideoCallRoomCountEvent( + 'video_call_room_count' => VideoCallRoomCountEvent( chatType: data['chatType'] as String? ?? '', count: data['count'] as int? ?? 0, roomNumber: data['roomNumber'] as String? ?? '', diff --git a/packages/sf_infrastructure/lib/src/websocket/websocket_service.dart b/packages/sf_infrastructure/lib/src/websocket/websocket_service.dart index 5f13e90a..3029623c 100644 --- a/packages/sf_infrastructure/lib/src/websocket/websocket_service.dart +++ b/packages/sf_infrastructure/lib/src/websocket/websocket_service.dart @@ -73,6 +73,7 @@ class WebSocketService { void _onMessage(dynamic raw) { if (raw is! String) return; + debugPrint('[WebSocket] Message: $raw'); final event = parseWebSocketEvent(raw); if (event != null) _eventController.add(event); }