// 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.

[JavaPackage="io.v.mojo.discovery"]
module discovery;

// Copied from v.io/v23/discovery/types.vdl
struct Service {
  // The universal unique identifier of a service instance.
  // If this is not specified, a random 128 bit (16 byte) UUID will be used.
  string? InstanceId;
  // Optional name of the service instance.
  string? InstanceName;
  // The interface that the service implements.
  // E.g., 'v.io/v23/services/vtrace.Store'.
  string InterfaceName;
  // The service attributes.
  // E.g., {'resolution': '1024x768'}.
  map<string, string>? Attrs;
  // The addresses that the service is served on.
  // E.g., '/host:port/a/b/c'.
  array<string> Addrs;
  // The service attachments.
  // E.g., {'thumbnail': binary_data }.
  map<string, array<uint8>>? Attachments;
};

enum UpdateType {
  found = 1,
  lost,
};

struct ScanUpdate {
  Service service;
  UpdateType update_type;
};

struct Error {
  string id;
  int32 action;
  string msg;
};

// Discovery provides Vanadium discovery operations.
[ServiceName="v23::discovery::Discovery"]
interface Discovery {
  // StartAdvertising advertises the service to be discovered by "Scanner"
  // implementations. visibility is used to limit the principals that can see
  // the advertisement. An empty set means that there are no restrictions on
  // visibility (i.e, equivalent to []security.BlessingPattern{security.AllPrincipals}).
  //
  // It is an error to have simultaneously active advertisements for two identical
  // instances (service.InstanceUuid).
  StartAdvertising(Service service, array<string>? visibility) => (string instance_id, Error? err);

  // StopAdvertising stops the advertisement associated with the given instance id.
  StopAdvertising(string instance_id) => (Error? Err);

  // Scan scans for services matching the query passed and calls ScanHandler with updates.
  //
  // The query is a WHERE expression of syncQL query against scanned services, where
  // keys are InstanceUuids and values are Service.
  //
  // Examples
  //
  //    v.InstanceName = "v.io/i"
  //    v.InstanceName = "v.io/i" AND v.Attrs["a"] = "v"
  //    v.Attrs["a"] = "v1" OR v.Attrs["a"] = "v2"
  //
  // SyncQL tutorial at:
  //    https://github.com/vanadium/docs/blob/master/tutorials/syncql-tutorial.md
  StartScan(string query, ScanHandler handler) => (uint32 scan_id, Error? err);

  // StopScan stops the scanning associated with the given scan id.
  StopScan(uint32 scan_id) => (Error? err);
};

// ScanHandler is used to pass updates about services that are found/lost during the scan.
[ServiceName="v23::discovery::ScanHandler"]
interface ScanHandler {
  // Update will be called when a Service is found or lost.
  Update(ScanUpdate update);
};
