-
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathwsprotocol_repo_impl.dart
More file actions
77 lines (65 loc) · 2.24 KB
/
wsprotocol_repo_impl.dart
File metadata and controls
77 lines (65 loc) · 2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import 'dart:async';
import 'dart:convert';
import 'package:web_socket_channel/web_socket_channel.dart';
class WsprotocolRepoImpl {
final String socketUrl;
WebSocketChannel? _channel;
// A broadcast controller lets multiple listeners receive the stream of messages.
final StreamController<dynamic> _messageController = StreamController<dynamic>.broadcast();
WsprotocolRepoImpl(this.socketUrl);
/// Establishes the WebSocket connection and sets up message listeners.
void connect() {
final Uri websocketUri = Uri.parse(socketUrl);
try {
_channel = WebSocketChannel.connect(websocketUri);
// Listen for incoming messages.
_channel?.stream.listen(
(message) {
// Forward the incoming message to listeners.
_messageController.add(message);
},
onError: (error) {
// Forward errors to listeners.
// _messageController.addError(error);
// Extract error message
final String errorMessage = error is WebSocketChannelException
? 'WebSocket Error: ${error.inner}'
: 'Unknown WebSocket Error: $error';
// Forward a structured error message
_messageController.addError(errorMessage);
},
onDone: () {
// Optionally notify listeners that the connection has closed.
_messageController.add('Connection closed');
},
cancelOnError: true,
);
} catch (e) {
// Forward any connection errors.
_messageController.addError(e);
}
}
/// Returns a stream of messages from the WebSocket.
Stream<dynamic> get messages => _messageController.stream;
/// Sends a plain text message over the WebSocket.
void sendMessage(String message) {
if (_channel == null) {
connect();
}
if (_channel != null) {
_channel?.sink.add(message);
} else {
throw Exception("WebSocket connection is not established. Call connect() first.");
}
}
/// Sends a JSON-encoded message over the WebSocket.
void sendJson(Map<String, dynamic> data) {
final jsonString = jsonEncode(data);
sendMessage(jsonString);
}
/// Closes the WebSocket connection.
void disconnect() {
_channel?.sink.close();
_channel = null;
}
}