platform/packages/sync/lib/angel_sync.dart
Tobe O 0aca1c51de Add 'packages/sync/' from commit 'f5129b68825dbf7d3cefa29f9fd33b9e6458ef6f'
git-subtree-dir: packages/sync
git-subtree-mainline: bda70d18e3
git-subtree-split: f5129b6882
2020-02-15 18:28:57 -05:00

49 lines
1.5 KiB
Dart

import 'dart:async';
import 'package:angel_websocket/angel_websocket.dart';
import 'package:pub_sub/pub_sub.dart' as pub_sub;
import 'package:stream_channel/stream_channel.dart';
/// Synchronizes WebSockets using `package:pub_sub`.
class PubSubSynchronizationChannel extends StreamChannelMixin<WebSocketEvent> {
/// The event name used to synchronize events on the server.
static const String eventName = 'angel_sync::event';
final StreamChannelController<WebSocketEvent> _ctrl =
new StreamChannelController<WebSocketEvent>();
pub_sub.ClientSubscription _subscription;
final pub_sub.Client client;
PubSubSynchronizationChannel(this.client) {
_ctrl.local.stream.listen((e) {
return client
.publish(eventName, e.toJson())
.catchError(_ctrl.local.sink.addError);
});
client.subscribe(eventName).then((sub) {
_subscription = sub
..listen((data) {
// Incoming is a Map
if (data is Map) {
var e = new WebSocketEvent.fromJson(data);
_ctrl.local.sink.add(e);
}
}, onError: _ctrl.local.sink.addError);
}).catchError(_ctrl.local.sink.addError);
}
@override
Stream<WebSocketEvent> get stream => _ctrl.foreign.stream;
StreamSink<WebSocketEvent> get sink => _ctrl.foreign.sink;
Future close() {
if (_subscription != null) {
_subscription.unsubscribe().then((_) => client.close());
} else
client.close();
return _ctrl.local.sink.close();
}
}