send method
Sends raw data through the WebSocket
Implementation
@override
Future<void> send(dynamic data) async {
if (_disposed) return;
if (_currentState != WebSocketState.connected) {
throw StateError('WebSocket is not connected');
}
if (_shouldFailSending) {
final error = Exception('Mock sending failure');
if (!_disposed) _errorController.add(error);
throw error;
}
WebSocketMessage message;
if (data is String) {
if (_isPingMessageData(data)) {
message = WebSocketMessage(
data: data,
timestamp: DateTime.now(),
type: 'heartbeat',
metadata: {'isHeartbeat': true},
);
} else {
try {
final jsonData = jsonDecode(data);
message = WebSocketMessage.json(jsonData);
} catch (_) {
message = WebSocketMessage.text(data);
}
}
} else if (data is List<int>) {
message = WebSocketMessage.binary(data);
} else {
message = WebSocketMessage.now(data: data);
}
_sentMessages.add(message);
if (_autoRespondToPing && _isPingMessage(message)) {
final t = Timer(Duration(milliseconds: 50), () {
if (!_disposed) simulatePongMessage();
});
_timers.add(t);
}
}