dart_faye 1.2.5
dart_faye: ^1.2.5 copied to clipboard
A complete Dart implementation of Faye, a publish-subscribe messaging system that implements the Bayeux protocol.
import 'dart:async';
import 'package:dart_faye/dart_faye.dart';
/// Main example demonstrating the dart_faye library
///
/// This example shows:
/// - Basic client setup and connection
/// - Subscribing to channels
/// - Publishing messages
/// - Error handling
/// - State management
/// - Using extensions for authentication
void main() async {
print('๐ Dart Faye - Real-time Messaging Example');
print('==========================================\n');
// Create a client with custom options
final client = Client('http://localhost:8000/bayeux', {
'timeout': 30,
'interval': 1000,
});
// Set up an authentication extension
final authExtension = DefaultFayeExtension(
api: 'your-api-key-here',
token: 'your-auth-token-here',
onLog: (level, data) {
print('๐ [Extension $level] $data');
},
);
client.setExtension(authExtension);
// Set up event listeners
_setupEventListeners(client);
try {
// Connect to the server
print('๐ Connecting to server...');
await client.connect();
// Wait for connection to be established
await Future.delayed(Duration(seconds: 1));
// Subscribe to multiple channels
print('๐ก Subscribing to channels...');
await client.subscribe('/chat/general', (data) {
print('๐ฌ [General] ${data['user']}: ${data['message']}');
});
await client.subscribe('/notifications', (data) {
print('๐ [Notification] ${data['title']}: ${data['message']}');
});
await client.subscribe('/status/*', (data) {
print('๐ [Status] ${data['user']} is ${data['status']}');
});
// Wait for subscriptions to be established
await Future.delayed(Duration(seconds: 2));
// Publish messages to different channels
print('๐ค Publishing messages...');
await client.publish('/chat/general', {
'user': 'Alice',
'message': 'Hello everyone!',
'timestamp': DateTime.now().toIso8601String(),
});
await Future.delayed(Duration(seconds: 1));
await client.publish('/notifications', {
'type': 'info',
'title': 'Welcome',
'message': 'Alice has joined the chat',
'timestamp': DateTime.now().toIso8601String(),
});
await Future.delayed(Duration(seconds: 1));
await client.publish('/status/alice', {
'user': 'Alice',
'status': 'online',
'lastSeen': DateTime.now().toIso8601String(),
});
// Wait for messages to be processed
await Future.delayed(Duration(seconds: 2));
// Get client statistics
final stats = client.statistics;
print('\n๐ Client Statistics:');
print(' - State: ${_getStateName(stats['state'])}');
print(' - Client ID: ${stats['clientId'] ?? 'Not connected'}');
print(' - Transport: ${stats['transport'] ?? 'Not set'}');
print(' - Active Subscriptions: ${stats['subscriptions']}');
print(' - Reconnection Advice: ${stats['advice']['reconnect']}');
// Demonstrate channel pattern matching
print('\n๐ฏ Testing channel patterns...');
await client.subscribe('/chat/*', (data) {
print('๐ฌ [Any Chat] ${data['user']}: ${data['message']}');
});
await Future.delayed(Duration(seconds: 1));
await client.publish('/chat/room1', {
'user': 'Bob',
'message': 'Hello from room 1!',
'timestamp': DateTime.now().toIso8601String(),
});
await Future.delayed(Duration(seconds: 2));
} catch (e) {
print('โ Error during operation: $e');
} finally {
// Cleanup
print('\n๐งน Cleaning up...');
await client.disconnect();
await client.close();
print('โ
Example completed');
}
}
void _setupEventListeners(Client client) {
// Listen to connection state changes
client.stateStream.listen((state) {
switch (state) {
case Client.unconnected:
print('๐ก State: Disconnected');
break;
case Client.connecting:
print('๐ State: Connecting...');
break;
case Client.connected:
print('โ
State: Connected');
break;
case Client.disconnected:
print('โ State: Disconnected');
break;
}
});
// Listen to errors
client.errorStream.listen((error) {
print('โ Error: ${error.message}');
if (error.isNetworkError) {
print(' This is a network error - check your connection');
} else if (error.isTimeoutError) {
print(' This is a timeout error - server may be slow');
} else if (error.isProtocolError) {
print(' This is a protocol error - check message format');
}
});
// Listen to all messages (for debugging)
client.messageStream.listen((message) {
final channel = message['channel'] as String?;
if (channel != null && channel.startsWith('/meta/')) {
print('๐ง Meta message: $channel');
}
});
}
String _getStateName(int state) {
switch (state) {
case Client.unconnected:
return 'Unconnected';
case Client.connecting:
return 'Connecting';
case Client.connected:
return 'Connected';
case Client.disconnected:
return 'Disconnected';
default:
return 'Unknown ($state)';
}
}