AmarWave Flutter / Dart SDK
Official Dart/Flutter client SDK for AmarWave — the real-time WebSocket platform.
Installation
Add to your pubspec.yaml:
dependencies:
amarwave:
path: ../sdk/flutter # local path during development
# OR from pub.dev once published:
# amarwave: ^1.0.0
Quick Start
import 'package:amarwave/amarwave.dart';
void main() {
final aw = AmarWave(
const AmarWaveConfig(
appKey: 'YOUR_APP_KEY',
cluster: 'default', // resolves amarwave.com automatically
),
);
aw.connection.bind('connected', (_) {
print('Connected! Socket ID: ${aw.connection.socketId}');
});
final ch = aw.subscribe('public-chat');
ch.bind('message', (data) {
print('New message: $data');
});
aw.connect();
}
Configuration
| Parameter | Type | Default | Description |
|---|---|---|---|
appKey |
String |
required | Your AmarWave application key |
cluster |
String? |
null |
Named cluster — auto-resolves host/port ('default', 'eu', 'us', 'ap1', 'ap2') |
appSecret |
String? |
null |
App secret for client-side HMAC auth |
apiHost |
String? |
cluster value | HTTP API hostname override |
apiPort |
int |
cluster value | HTTP API port override |
forceTLS |
bool |
false |
Force wss:// and https:// |
authEndpoint |
String |
'/broadcasting/auth' |
Server-side auth endpoint |
authHeaders |
Map<String,String> |
{} |
Extra auth request headers |
reconnectDelay |
Duration |
1s |
Base reconnect delay |
maxReconnectDelay |
Duration |
30s |
Max reconnect delay |
maxRetries |
int |
5 |
Max retries (0 = infinite) |
activityTimeout |
Duration |
120s |
Ping inactivity timeout |
pongTimeout |
Duration |
30s |
Pong wait timeout |
disableStats |
bool |
false |
Disable usage stats in pings |
Channel Types
Public Channel
No authentication required.
final ch = aw.subscribe('public-chat');
ch.bind('message', (data) => print(data));
Private Channel
Requires HMAC auth. Either set appSecret in config (client-side, not for production) or configure an authEndpoint on your backend.
final ch = aw.subscribe('private-orders');
ch.bind('order-placed', (data) => print(data));
Presence Channel
Like private channels, but also tracks which members are subscribed.
final lobby = aw.subscribe('presence-lobby') as AmarWavePresenceChannel;
lobby.bind('subscribed', (_) {
print('Members: ${lobby.memberCount}');
print('All members: ${lobby.members}');
});
lobby.bind('amarwave_internal:member_added', (data) {
print('Joined: $data');
});
lobby.bind('amarwave_internal:member_removed', (data) {
print('Left: $data');
});
Publishing Events
Events can be published via the HTTP API. This works from both client and server.
Via channel reference
final ch = aw.subscribe('public-chat');
await ch.publish('message', {'user': 'Alice', 'text': 'Hello!'});
Via top-level shortcut
await aw.publish('public-chat', 'message', {'user': 'Alice', 'text': 'Hello!'});
Publishing is queued automatically before subscription confirmation and flushed once the server confirms the subscription.
Connection Lifecycle Events
Bind on aw.connection or directly on aw:
aw.connection.bind('connected', (_) => print('Connected'));
aw.connection.bind('disconnected', (_) => print('Disconnected'));
aw.connection.bind('connecting', (_) => print('Connecting...'));
aw.connection.bind('failed', (_) => print('Max retries exceeded'));
aw.bind('error', (err) => print('Error: $err'));
Disconnect
aw.disconnect();
This stops all reconnect attempts and closes the WebSocket cleanly.
Unsubscribe
aw.unsubscribe('public-chat');
Global Event Listener
Listen to every event on a channel:
ch.bindGlobal((event, data) => print('Event: $event, Data: $data'));
Server-Side Auth Endpoint
For private/presence channels in production, implement an auth endpoint on your backend:
POST /broadcasting/auth
Body: { "socket_id": "...", "channel_name": "private-orders" }
Response: { "auth": "<appKey>:<hmac_signature>" }
The PHP SDK ships with authenticate() and authenticatePresence() helpers for this.
License
MIT
Libraries
- amarwave
- AmarWave — Official Dart/Flutter real-time WebSocket client SDK.