Imgkl / EventFlux

A Dart package for efficient handling of server-sent event streams with easy connectivity and data management.
https://pub.dev/packages/eventflux
MIT License
25 stars 8 forks source link

EventFlux is a Dart package designed for efficient handling of server-sent event streams. It provides easy-to-use connectivity, data management, and robust error handling for real-time data applications. 🚀

Supported Platforms

Android iOS Web MacOS Windows Linux
🏗️

Pssst... see those question marks? That's your cue, tech adventurers! Dive in, test, and tell me all about it. 🚀🛠️

Inspiration 💡

EventFlux was born from the inspiration I found in the flutter_client_sse package by Pratik Baid. His work laid a great foundation, and I aimed to build upon it, adding my own twist to enhance SSE stream management with better features. 🛠️

Why EventFlux? 🌟

EventFlux for Every Scenario 🌟

Get Started in a Snap 📦

Add EventFlux to your Dart project's dependencies, and you're golden:

dependencies:
  eventflux: ^2.2.1

How to Use (Spoiler: It's Super Easy) 🔧

Here's a quick example to get you started:

The Simple Streamer ✨  
Need just one SSE connection? It's a breeze with EventFlux! Perfect for when your app is dancing solo with a single SSE. ```dart import 'package:eventflux/eventflux.dart'; void main() { // Connect and start the magic! EventFlux.instance.connect( EventFluxConnectionType.get, 'https://example.com/events', files: [ /// Optional, If you want to send multipart files with the request ], multipartRequest: true, // Optional, By default, it will be considered as normal request, but if the files are provided or this flag is true, it will be considered as multipart request onSuccessCallback: (EventFluxResponse? response) { response.stream?.listen((data) { // Your data is now in the spotlight! }); }, onError: (oops) { // Oops! Time to handle those little hiccups. // You can also choose to disconnect here }, autoReconnect: true // Keep the party going, automatically! reconnectConfig: ReconnectConfig( mode: ReconnectMode.linear, // or exponential, interval: Duration(seconds: 5), reconnectHeader: () async { /// If you want to send custom headers during reconnect which are different from the initial connection /// If you don't want to send any headers, you can skip this, initial headers will be used // Your async code to refresh or fetch headers // For example, fetching a new access token: String newAccessToken = await fetchNewAccessToken(); return { 'Authorization': 'Bearer $newAccessToken', 'Accept': 'text/event-stream', }; }, maxAttempts: 5, // or -1 for infinite, onReconnect: () { // Things to execute when reconnect happens // FYI: for network changes, the `onReconnect` will not be called. // It will only be called when the connection is interupted by the server and eventflux is trying to reconnect. } ), ); } ```  
Supercharged 🚀  
When your app just need a multiple parallel SSE connections, use this. ```dart import 'package:eventflux/eventflux.dart'; void main() { // Create separate EventFlux instances for each SSE connection EventFlux e1 = EventFlux.spawn(); EventFlux e2 = EventFlux.spawn(); // First connection - firing up! e1.connect(EventFluxConnectionType.get, 'https://example1.com/events', tag: "SSE Connection 1", // Optional tag for debugging, you'll see this in logs onSuccessCallback: (EventFluxResponse? data) { data.stream?.listen((data) { // Your 1st Stream's data is being fetched! }); }, onError: (oops) { // Oops! Time to handle those little hiccups. // You can also choose to disconnect here }, ); // Second connection - firing up! e2.connect(EventFluxConnectionType.get, 'https://example2.com/events', tag: "SSE Connection 2", // Optional tag for debugging, you'll see this in logs onSuccessCallback: (EventFluxResponse? data) { data.stream?.listen((data) { // Your 2nd Stream's data is also being fetched! }); }, onError: (oops) { // Oops! Time to handle those little hiccups. // You can also choose to disconnect here }, autoReconnect: true // Keep the party going, automatically! reconnectConfig: ReconnectConfig( mode: ReconnectMode.exponential, // or linear, interval: Duration(seconds: 5), maxAttempts: 5, // or -1 for infinite, reconnectHeader: () async { /// If you want to send custom headers during reconnect which are different from the initial connection /// If you don't want to send any headers, you can skip this, initial headers will be used // Your async code to refresh or fetch headers // For example, fetching a new access token: String newAccessToken = await fetchNewAccessToken(); return { 'Authorization': 'Bearer $newAccessToken', 'Accept': 'text/event-stream', }; }, onReconnect: () { // Things to execute when reconnect happens // FYI: for network changes, the `onReconnect` will not be called. // It will only be called when the connection is interupted by the server and eventflux is trying to re-establish the connection. } ), ); } ``` ℹ️ Remember to disconnect all instances when you are done with it to avoid memory leaks.  

Need More Info? 📚

For detailed documentation, please see the respective Dart files in the lib folder.

EventFlux Class Documentation 📖

EventFlux is a Dart class for managing server-sent event streams. It provides methods for connecting to, disconnecting from, and managing SSE streams.

Connect  
Connects to a server-sent event stream. | Parameter | Type | Description | Default | | ------------------- | ------------------------------- | ---------------------------------------------------------- | --------------------------------- | | `type` | `EventFluxConnectionType` | The type of HTTP request (GET or POST). | - | | `url` | `String` | The URL of the SSE stream to connect to. | - | | `header` | `Map` | HTTP headers for the request. | `{'Accept': 'text/event-stream'}` | | `onConnectionClose` | `Function()?` | Callback function triggered when the connection is closed. | - | | `autoReconnect` | `bool` | Whether to automatically reconnect on disconnection. | `false` | | `reconnectConfig` | `ReconnectConfig?` | Configuration for auto-reconnect. If `auto-reconnect` is true, this is required| - | | `onSuccessCallback` | `Function(EventFluxResponse?)` | Callback invoked upon successful connection. | - | | `onError` | `Function(EventFluxException)?` | Callback for handling errors. | - | | `body` | `Map?` | Optional body for POST request types. | - | | `files` | `List?` | Optional list of files to send with the request. | - | | `multipartRequest` | `bool` | Whether the request is a multipart request. | `false` | | `tag` | `String` | Optional tag for debugging. | - | | `logReceivedData` | `bool` | Whether to log received data. | `false` | | `httpClient` | `HttpClientAdapter?` | Optional Http Client Adapter to allow usage of different http clients. | - |  
Disconnect  
Disconnects from the SSE stream. | Parameter | Type | Description | | --------- | ---- | ------------------------------ | | - | - | This method has no parameters. | Returns a `Future` indicating the disconnection status.  
Spawn  
| Parameter | Type | Description | | --------- | ---- | ------------------------------ | | - | - | This method has no parameters. | Returns a new instance of `EventFlux`, this is used for having multiple SSE connections.  

Be a Part of the Adventure 🤝

Got ideas? Want to contribute? Jump aboard! Open an issue or send a pull request. Let's make EventFlux even more awesome together!

The Boring (but Important) Stuff 📝

Licensed under MIT - use it freely, but let's play nice and give credit where it's due!