flutter_websocket_plus 0.1.0
flutter_websocket_plus: ^0.1.0 copied to clipboard
WebSocket connection management with reconnection logic and message queuing. Supports all 6 platforms with WASM compatibility.
import 'dart:async';
import 'package:flutter_websocket_plus/flutter_websocket_plus.dart';
String _separator() => List.filled(60, '=').join();
void main() async {
print('π flutter_websocket_plus - Comprehensive Example');
print(_separator());
// ============================================================
// Feature 1: Configurable - Show all configuration options
// ============================================================
print('\nπ Feature: Configurable');
print('Creating WebSocket configuration with all options...');
final config = WebSocketConfig(
url: 'wss://echo.websocket.org',
connectionTimeout: Duration(seconds: 30),
enableReconnection: true,
maxReconnectionAttempts: 10,
initialReconnectionDelay: Duration(seconds: 1),
maxReconnectionDelay: Duration(minutes: 5),
enableMessageQueue: true,
maxQueueSize: 1000,
heartbeatInterval: Duration(seconds: 30),
enableHeartbeat: true,
headers: {'User-Agent': 'flutter_websocket_plus'},
protocols: [],
);
print('β Configuration created with:');
print(' - URL: ${config.url}');
print(' - Reconnection: ${config.enableReconnection}');
print(' - Message Queue: ${config.enableMessageQueue}');
print(' - Heartbeat: ${config.enableHeartbeat}');
// ============================================================
// Feature 2: Custom Reconnection Strategy
// ============================================================
print('\nπ Feature: Automatic Reconnection with Custom Strategy');
print('Creating exponential backoff reconnection strategy...');
final reconnectionStrategy = ExponentialBackoffStrategy(
initialDelay: Duration(seconds: 1),
maxDelay: Duration(minutes: 5),
multiplier: 2.0,
);
print('β Reconnection strategy created');
// ============================================================
// Feature 3: WebSocket Manager Creation
// ============================================================
print('\nπ§ Feature: WebSocket Manager');
print('Creating WebSocket manager...');
final manager = WebSocketManager(
config: config,
reconnectionStrategy: reconnectionStrategy,
);
print('β Manager created');
// ============================================================
// Feature 4: Event Handling
// ============================================================
print('\nπ‘ Feature: Event Handling');
print('Setting up event listeners...');
manager.eventStream.listen((event) {
switch (event.type) {
case 'connecting':
print(' π‘ Event: Connecting to server...');
break;
case 'connected':
print(' β
Event: Connected to WebSocket server');
break;
case 'disconnected':
print(' β Event: Disconnected from server');
break;
case 'reconnecting':
print(' π Event: Reconnecting... Attempt ${event.data}');
break;
case 'messageSent':
print(' π€ Event: Message sent');
break;
case 'messageQueued':
print(' π¬ Event: Message queued (connection down)');
break;
case 'error':
print(' β οΈ Event: Error - ${event.data}');
break;
default:
print(' π¨ Event: ${event.type}');
}
});
print('β Event listeners set up');
// ============================================================
// Feature 5: Connection State Monitoring
// ============================================================
print('\nπ Feature: Connection State Monitoring');
print('Setting up state stream listener...');
manager.stateStream.listen((state) {
print(' π State: ${state.connectionState.name}');
print(' - Queue size: ${state.queueSize}');
print(' - Reconnecting: ${state.isReconnecting}');
print(' - Attempt: ${state.reconnectionAttempt}');
});
print('β State monitoring set up');
// ============================================================
// Feature 6: Message Listening
// ============================================================
print('\nπ¨ Feature: Message Listening');
print('Setting up message stream listener...');
manager.messageStream.listen((message) {
print(' π¨ Received: ${message.type} message');
print(' - Data: ${message.data}');
print(' - Timestamp: ${message.timestamp}');
print(' - ID: ${message.id}');
});
print('β Message listener set up');
// ============================================================
// Feature 7: Connect to Server
// ============================================================
print('\nπ Feature: Connection');
print('Connecting to WebSocket server...');
try {
await manager.connect();
print('β Connection initiated');
// Wait a bit for connection to establish
await Future.delayed(Duration(seconds: 2));
if (manager.isConnected) {
print('β
Successfully connected!');
} else {
print('β³ Connection in progress...');
}
} catch (e) {
print('β Connection error: $e');
}
// ============================================================
// Feature 8: Send Different Message Types
// ============================================================
print('\nπ€ Feature: Sending Messages');
if (manager.isConnected) {
print('Sending text message...');
await manager.sendText('Hello, WebSocket!');
await Future.delayed(Duration(milliseconds: 500));
print('Sending JSON message...');
await manager.sendJson({
'type': 'message',
'content': 'Hello from flutter_websocket_plus!',
'timestamp': DateTime.now().toIso8601String(),
});
await Future.delayed(Duration(milliseconds: 500));
print('Sending binary message...');
await manager.sendBinary([72, 101, 108, 108, 111]); // "Hello" in bytes
await Future.delayed(Duration(milliseconds: 500));
print('β Messages sent');
} else {
print('β οΈ Not connected, messages will be queued');
// Feature 9: Message Queuing (when disconnected)
print('\n㪠Feature: Message Queuing');
print('Sending message while disconnected (will be queued)...');
final queuedMessage = WebSocketMessage.json({
'type': 'queued',
'data': 'This will be queued',
}, requiresAck: true);
await manager.send(queuedMessage);
print('β Message queued (queue size: ${manager.queueStatistics['size']})');
}
// ============================================================
// Feature 10: Heartbeat Support
// ============================================================
print('\nπ Feature: Heartbeat Support');
if (config.enableHeartbeat) {
print('Heartbeat is enabled (interval: ${config.heartbeatInterval})');
print('Ping messages will be sent automatically');
// Manually send ping to demonstrate
if (manager.isConnected) {
print('Sending manual ping...');
await manager.sendPing();
await Future.delayed(Duration(milliseconds: 500));
print('β Ping sent');
}
} else {
print('Heartbeat is disabled');
}
// ============================================================
// Feature 11: Statistics & Monitoring
// ============================================================
print('\nπ Feature: Statistics & Monitoring');
print('Getting comprehensive statistics...');
final stats = manager.getStatistics();
print('\nπ Manager Statistics:');
print(' - Connection State: ${stats['connectionState']}');
print(' - Is Connected: ${stats['isConnected']}');
print(' - Is Reconnecting: ${stats['isReconnecting']}');
print(' - Reconnection Attempts: ${stats['reconnectionAttempt']}');
if (stats['connectionStatistics'] != null) {
final connStats = stats['connectionStatistics'] as Map<String, dynamic>;
print('\nπ‘ Connection Statistics:');
print(' - Messages Sent: ${connStats['messagesSent'] ?? 0}');
print(' - Messages Received: ${connStats['messagesReceived'] ?? 0}');
print(' - Errors: ${connStats['errorsCount'] ?? 0}');
print(' - Ping Sent: ${connStats['pingSent'] ?? 0}');
print(' - Pong Received: ${connStats['pongReceived'] ?? 0}');
if (connStats['heartbeatHealth'] != null) {
print(' - Heartbeat Health: ${connStats['heartbeatHealth']}');
}
}
final queueStats = manager.queueStatistics;
print('\n㪠Queue Statistics:');
print(' - Size: ${queueStats['size']}');
print(' - Max Size: ${queueStats['maxSize']}');
print(' - Utilization: ${queueStats['utilization']}');
print(' - Retryable: ${queueStats['retryableCount']}');
print(' - Ack Required: ${queueStats['ackRequiredCount']}');
print('β Statistics retrieved');
// ============================================================
// Feature 12: Error Handling
// ============================================================
print('\nπ‘οΈ Feature: Error Handling');
print('Error handling is demonstrated through:');
print(' - Automatic reconnection on connection failure');
print(' - Message queuing when connection is down');
print(' - Retry mechanism for failed messages');
print(' - Error events in event stream');
print('β Error handling is active');
// ============================================================
// Feature 13: Cross-Platform Support
// ============================================================
print('\nπ Feature: Cross-Platform Support');
print('This package works on:');
print(' β
iOS');
print(' β
Android');
print(' β
Web (including WASM)');
print(' β
Windows');
print(' β
macOS');
print(' β
Linux');
print('β Cross-platform support verified');
// ============================================================
// Wait and demonstrate features
// ============================================================
print('\nβ³ Waiting 5 seconds to demonstrate real-time features...');
print('(Watch for heartbeat pings, message responses, etc.)\n');
await Future.delayed(Duration(seconds: 5));
// ============================================================
// Final Statistics
// ============================================================
print('\nπ Final Statistics:');
final finalStats = manager.getStatistics();
print(' Connection State: ${finalStats['connectionState']}');
print(' Queue Size: ${finalStats['queueStatistics']['size']}');
if (finalStats['connectionStatistics'] != null) {
final connStats =
finalStats['connectionStatistics'] as Map<String, dynamic>;
print(' Messages Sent: ${connStats['messagesSent'] ?? 0}');
print(' Messages Received: ${connStats['messagesReceived'] ?? 0}');
}
// ============================================================
// Cleanup
// ============================================================
print('\nπ§Ή Cleaning up...');
await manager.dispose();
print('β Manager disposed');
print('\n' + _separator());
print('β¨ Example completed! All features demonstrated.');
print(_separator());
}