import 'package:comunic/models/api_request.dart'; import 'package:comunic/models/config.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; /// User web socket helper /// /// @author Pierre Hubert class WebSocketHelper { static WebSocketChannel _ws; /// Check out whether we are currently connected to WebSocket or not static bool isConnected() { return _ws != null && _ws.closeCode == null; } /// Get WebSocket access token //TODO : Handles the case user tokens were destroyed (auto sign-out user) static Future _getWsToken() async => (await APIRequest(uri: "ws/token", needLogin: true).exec()) .assertOk() .getObject()["token"]; /// Connect to WebSocket static connect() async { if (isConnected()) return; // First, get an access token final token = await _getWsToken(); // Determine websocket URI final wsURL = "${(config().apiServerSecure ? "wss" : "ws")}://${config() .apiServerName}${config().apiServerUri}ws?token=$token"; final wsURI = Uri.parse(wsURL); // Connect _ws = WebSocketChannel.connect(wsURI); _ws.stream.listen( // When we got data (onData) => print("WS New data: $onData"), // Print errors on console onError: (e, stack) { print("WS error! $e"); print(stack); }, // Notify when the channel is closed onDone: () => print("WS Channel closed"), ); } }