dart_faye 1.2.5 copy "dart_faye: ^1.2.5" to clipboard
dart_faye: ^1.2.5 copied to clipboard

A complete Dart implementation of Faye, a publish-subscribe messaging system that implements the Bayeux protocol.

example/lib/main.dart

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)';
  }
}
0
likes
150
points
44
downloads

Publisher

verified publishermikewhob.com

Weekly Downloads

A complete Dart implementation of Faye, a publish-subscribe messaging system that implements the Bayeux protocol.

Homepage
Repository (GitHub)
View/report issues

Topics

#real-time #messaging #networking

Documentation

Documentation
API reference

License

MIT (license)

Dependencies

http, logging, meta, uuid, web_socket_channel

More

Packages that depend on dart_faye