| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| library discovery; |
| |
| import 'dart:async'; |
| |
| import 'package:mojo/bindings.dart' as bindings; |
| import 'gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart'; |
| |
| export 'gen/dart-gen/mojom/lib/discovery/discovery.mojom.dart' |
| show Service, ScanUpdate, UpdateType; |
| |
| part 'client_impl.dart'; |
| |
| typedef void ConnectToServiceFunction(String url, bindings.ProxyBase proxy); |
| |
| abstract class Client { |
| factory Client(ConnectToServiceFunction cts, String url) { |
| return new _Client(cts, url); |
| } |
| |
| /// Scan scans services that match the query and returns a scanner handle that |
| /// includes streams of found and lost services. |
| /// Scanning will continue until [stop] is called on the [Scanner] handle. |
| /// |
| /// For example, the following code waits until finding the first service that matches the |
| /// query and then stops scanning. |
| /// |
| /// Scanner scanner = client.scan('v.InterfaceName = "v.io/i" AND v.Attrs["a"] = "v"'); |
| /// Service firstFoundService = await scanner.onUpdate.firstWhere((update) => update.updateType == UpdateTypes.found).service; |
| /// scanner.stop(); |
| /// |
| /// The query is a WHERE expression of a syncQL query against advertised services, where |
| /// keys are InstanceIds and values are Services. |
| /// |
| /// SyncQL tutorial at: |
| /// https://github.com/vanadium/docs/blob/master/tutorials/syncql-tutorial.md |
| Future<Scanner> scan(String query); |
| |
| /// Advertise advertises the [Service] to be discovered by [scan]. |
| /// [visibility] is used to limit the principals that can see the advertisement. |
| /// An empty or null [visibility] means that there are no restrictions on visibility. |
| /// Advertising will continue until [stop] is called on the [Advertiser] handle. |
| /// |
| /// If service.InstanceId is not specified, a random unique identifier will be |
| /// assigned to it. Any change to service will not be applied after advertising starts. |
| /// |
| /// It is an error to have simultaneously active advertisements for two identical |
| /// instances (service.InstanceId). |
| /// |
| /// For example, the following code advertises a service for 10 seconds. |
| /// |
| /// Service service = new Service() |
| /// ..interfaceName = 'v.io/i' |
| /// ..attrs = {'a', 'v'}; |
| /// Advertiser advertiser = client.advertise(service); |
| /// new Timer(const Duration(seconds: 10), () => advertiser.stop()); |
| Future<Advertiser> advertise(Service service, |
| {List<String> visibility: null}); |
| } |
| |
| /// Handle to a scan call. |
| abstract class Scanner { |
| /// A stream of [Update] objects as services are found or lost by the scanner. |
| Stream<ScanUpdate> get onUpdate; |
| |
| /// Stops scanning. |
| Future stop(); |
| } |
| |
| /// Handle to an advertise call. |
| abstract class Advertiser { |
| /// Stops the advertisement. |
| Future stop(); |
| } |