-
-
Notifications
You must be signed in to change notification settings - Fork 29
/
example.dart
138 lines (121 loc) · 4.31 KB
/
example.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import 'dart:convert';
import 'dart:io';
import 'package:centrifuge/centrifuge.dart' as centrifuge;
void main() async {
final url = 'ws://localhost:8000/connection/websocket';
final channel = 'chat:index';
// generate user JWT token for user "dart":
// ./centrifugo gentoken --user dart
final userJwtToken =
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkYXJ0IiwiZXhwIjoyMjc5NDQzNjgwLCJpYXQiOjE2NzQ2NDM2ODB9.XgsPZzAD4kMj7HdybJfpMGuDaRmuLvhUUxCGHs3mtXA';
// generate subscription JWT token for user "dart" and channel "chat:index":
// ./centrifugo gensubtoken --user dart --channel chat:index
final subscriptionJwtToken =
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkYXJ0IiwiZXhwIjoyMjc5NDQ0MDE4LCJpYXQiOjE2NzQ2NDQwMTgsImNoYW5uZWwiOiJjaGF0OmluZGV4In0.FjpnF6ofq3XCr1iqnwTZcpxCx6btuzCnn29DAIJbsBo';
final onEvent = (dynamic event) {
print('client> $event');
};
try {
final client = centrifuge.createClient(
url,
centrifuge.ClientConfig(
token: userJwtToken,
// Headers are only supported on platforms that support dart:io
headers: <String, dynamic>{'X-Example-Header': 'example'},
));
// State changes.
client.connecting.listen(onEvent);
client.connected.listen(onEvent);
client.disconnected.listen(onEvent);
// Handle async errors.
client.error.listen(onEvent);
// Server-side subscriptions.
client.subscribing.listen(onEvent);
client.subscribed.listen(onEvent);
client.unsubscribed.listen(onEvent);
client.publication.listen(onEvent);
client.join.listen(onEvent);
client.leave.listen(onEvent);
final subscription = client.newSubscription(
channel,
centrifuge.SubscriptionConfig(
token: subscriptionJwtToken,
// getToken: (centrifuge.SubscriptionTokenEvent event) {
// return Future.value('');
// },
),
);
final onSubscriptionEvent = (dynamic event) async {
print('subscription $channel> $event');
};
// State changes.
subscription.subscribing.listen(onSubscriptionEvent);
subscription.subscribed.listen(onSubscriptionEvent);
subscription.unsubscribed.listen(onSubscriptionEvent);
// Messages.
subscription.publication.listen(onSubscriptionEvent);
subscription.join.listen(onSubscriptionEvent);
subscription.leave.listen(onSubscriptionEvent);
// Handle subscription async errors.
subscription.error.listen(onSubscriptionEvent);
await subscription.subscribe();
await client.connect();
final handler = _handleUserInput(client, subscription);
await for (List<int> codeUnit in stdin) {
final message = utf8.decode(codeUnit).trim();
handler(message);
}
} catch (ex) {
print(ex);
}
}
Function(String) _handleUserInput(centrifuge.Client client, centrifuge.Subscription subscription) {
return (String message) async {
switch (message) {
case '#subscribe':
await subscription.subscribe();
break;
case '#unsubscribe':
await subscription.unsubscribe();
break;
case '#remove':
await client.removeSubscription(subscription);
break;
case '#connect':
await client.connect();
break;
case '#rpc':
final request = jsonEncode({'param': 'test'});
final data = utf8.encode(request);
final result = await client.rpc('test', data);
print('RPC result: ' + utf8.decode(result.data));
break;
case '#presence':
final result = await subscription.presence();
print(result);
break;
case '#presenceStats':
final result = await subscription.presenceStats();
print(result);
break;
case '#history':
final result = await subscription.history(limit: 10);
print('History num publications: ' + result.publications.length.toString());
print('Stream top position: ' + result.offset.toString() + ', epoch: ' + result.epoch);
break;
case '#disconnect':
await client.disconnect();
break;
default:
final output = jsonEncode({'input': message});
final data = utf8.encode(output);
try {
await subscription.publish(data);
} catch (ex) {
print("can't publish: $ex");
}
break;
}
return;
};
}