SyncSlides: Using new discovery API
MultiPart: 2/2
Change-Id: I2b1457740df62a1cd0ada1c3c7ede46373429de7
diff --git a/dart/lib/discovery/client.dart b/dart/lib/discovery/client.dart
index b5c8ecd..cf3d7dc 100644
--- a/dart/lib/discovery/client.dart
+++ b/dart/lib/discovery/client.dart
@@ -8,6 +8,8 @@
import 'package:logging/logging.dart';
import 'package:v23discovery/discovery.dart' as discovery;
+export 'package:v23discovery/discovery.dart' show UpdateType;
+
import '../models/all.dart' as model;
final Logger log = new Logger('discovery/client');
@@ -58,18 +60,12 @@
_advertisers.remove(presentationId);
}
-// TODO(aghassemi): Remove use once
-// https://github.com/vanadium/issues/issues/1071 is resolved
-// Currently we need to keep this mapping since discovery's lost event only
-// contains an auto generated instanceId which we need to map back to presentationId.
-Map<String, String> instanceIdToPresentationIdMap = new Map();
-
// Transforms a stream of discovery services to PresentationAdvertisement model objects.
-StreamTransformer toPresentation = new StreamTransformer.fromHandlers(
- handleData:
- (discovery.Service s, EventSink<model.PresentationAdvertisement> sink) {
+StreamTransformer toPresentationUpdate = new StreamTransformer.fromHandlers(
+ handleData: (discovery.Update u, EventSink<PresentationUpdate> sink) {
+ discovery.Service s = u.service;
+
String key = s.attrs['presentationid'];
- instanceIdToPresentationIdMap[s.instanceId] = key;
log.info('Found presentation ${s.attrs['name']} under $key.');
// Ignore our own advertised services.
if (_advertisers.containsKey(key)) {
@@ -85,27 +81,17 @@
new model.PresentationAdvertisement(
key, deck, syncgroupName, thumbnailSyncgroupName);
- sink.add(presentation);
-});
-
-// Transforms a stream of instanceIds to presentationIds.
-StreamTransformer toPresentationId = new StreamTransformer.fromHandlers(
- handleData: (String instanceId, EventSink<String> sink) {
- String presentationId = instanceIdToPresentationIdMap[instanceId];
- sink.add(presentationId);
+ sink.add(new PresentationUpdate._internal(presentation, u.updateType));
});
Future<PresentationScanner> scan() async {
- if (_scanner != null) {
- return _scanner;
- }
var query = 'v.InterfaceName = "$_presentationInterfaceName"';
_scanner = await _discoveryClient.scan(query);
log.info('Scan started.');
+
return new PresentationScanner._internal(
- _scanner.onFound.transform(toPresentation),
- _scanner.onLost.transform(toPresentationId));
+ _scanner.onUpdate.transform(toPresentationUpdate));
}
Future stopScan() async {
@@ -117,8 +103,13 @@
_scanner = null;
}
+class PresentationUpdate {
+ model.PresentationAdvertisement presentation;
+ discovery.UpdateType updateType;
+ PresentationUpdate._internal(this.presentation, this.updateType);
+}
+
class PresentationScanner {
- Stream<model.PresentationAdvertisement> onFound;
- Stream<String> onLost;
- PresentationScanner._internal(this.onFound, this.onLost);
+ Stream<PresentationUpdate> onUpdate;
+ PresentationScanner._internal(this.onUpdate);
}
diff --git a/dart/lib/stores/syncbase/store.dart b/dart/lib/stores/syncbase/store.dart
index 567bac5..7825e5b 100644
--- a/dart/lib/stores/syncbase/store.dart
+++ b/dart/lib/stores/syncbase/store.dart
@@ -78,26 +78,28 @@
Future _startScanningForPresentations() async {
discovery.PresentationScanner scanner = await discovery.scan();
- scanner.onFound.listen((model.PresentationAdvertisement newP) {
- _state._presentationsAdvertisements[newP.key] = newP;
- _triggerStateChange();
+ scanner.onUpdate.listen((discovery.PresentationUpdate update) {
+ if (update.updateType == discovery.UpdateType.found) {
+ _state._presentationsAdvertisements[update.presentation.key] =
+ update.presentation;
+ _triggerStateChange();
- // TODO(aghassemi): Use a simple RPC instead of a syncgroup to get the thumbnail.
- // See https://github.com/vanadium/syncslides/issues/17
- // Join the thumbnail syncgroup to get the thumbnail blob.
- String sgName = newP.thumbnailSyncgroupName;
- sb.joinSyncgroup(sgName);
- });
-
- scanner.onLost.listen((String presentationId) {
- _state._presentationsAdvertisements.remove(presentationId);
- _state._decks.values.forEach((_DeckState deck) {
- if (deck.presentation != null &&
- deck.presentation.key == presentationId) {
- deck._isPresenting = false;
- }
- });
- _triggerStateChange();
+ // TODO(aghassemi): Use a simple RPC instead of a syncgroup to get the thumbnail.
+ // See https://github.com/vanadium/syncslides/issues/17
+ // Join the thumbnail syncgroup to get the thumbnail blob.
+ String sgName = update.presentation.thumbnailSyncgroupName;
+ sb.joinSyncgroup(sgName);
+ } else if (update.updateType == discovery.UpdateType.lost) {
+ String presentationId = update.presentation.key;
+ _state._presentationsAdvertisements.remove(presentationId);
+ _state._decks.values.forEach((_DeckState deck) {
+ if (deck.presentation != null &&
+ deck.presentation.key == presentationId) {
+ deck._isPresenting = false;
+ }
+ });
+ _triggerStateChange();
+ }
});
}
diff --git a/dart/pubspec.lock b/dart/pubspec.lock
index 347d63f..5d48c44 100644
--- a/dart/pubspec.lock
+++ b/dart/pubspec.lock
@@ -258,7 +258,7 @@
v23discovery:
description: v23discovery
source: hosted
- version: "0.0.10"
+ version: "0.0.11"
vector_math:
description: vector_math
source: hosted
diff --git a/dart/pubspec.yaml b/dart/pubspec.yaml
index 9e9b207..e718cfd 100644
--- a/dart/pubspec.yaml
+++ b/dart/pubspec.yaml
@@ -6,7 +6,7 @@
logging: ">=0.11.2 <0.12.0"
mojo_services: ">=0.4.5 <0.5.0"
syncbase: ">=0.0.27 <0.1.0"
- v23discovery: ">=0.0.10 < 0.1.0"
+ v23discovery: ">=0.0.11 < 0.1.0"
uuid: ">=0.5.0 <0.6.0"
dev_dependencies:
flutter_tools: