The original wrapper placed Socket.IO connection events behind three callbacks: opened, message received, and closed. It declared:
socket_io_client: ^0.9.9
The preserved wrapper
import 'package:socket_io_client/socket_io_client.dart' as IO;
typedef void OnMessageCallback(String tag, dynamic msg);
typedef void OnCloseCallback(int code, String reason);
typedef void OnOpenCallback();
const EVENT = 'socket-event';
class SimpleWebSocket {
String url;
IO.Socket socket;
OnOpenCallback onOpen;
OnMessageCallback onMessage;
OnCloseCallback onClose;
SimpleWebSocket(this.url);
connect() async {
try {
socket = IO.io(url, <String, dynamic>{
'transports': ['websocket']
});
// Dart client
socket.on('connect', (_) {
print('connected');
onOpen();
});
socket.on(EVENT, (data) {
onMessage(EVENT, data);
});
socket.on('exception', (e) => print('Exception: $e'));
socket.on('connect_error', (e) => print('Connect error: $e'));
socket.on('disconnect', (e) {
print('disconnect');
onClose(0, e);
});
socket.on('fromServer', (_) => print(_));
} catch (e) {
this.onClose(500, e.toString());
}
}
send(event, data) {
if (socket != null) {
socket.emit(event, data);
print('send: $event - $data');
}
}
close() {
if (socket != null) socket.close();
}
}
The class forces the WebSocket transport and assumes its callbacks are assigned before events arrive. The close code it forwards is its own abstraction, not proof that every Socket.IO disconnect supplies a native WebSocket close code.
Reconnection, duplicate listeners, disposal, and error propagation need deliberate handling in a real screen lifecycle. This older API was not rebuilt, and no connection or message was sent for this revision.