mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-10-31 02:04:52 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			55 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| 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<String> _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"),
 | |
|     );
 | |
|   }
 | |
| }
 |