syntax = "proto3";

package go.micro.router;

option go_package = "github.com/micro/go-micro/v2/router/service/proto;router";
// Router service is used by the proxy to lookup routes
service Router {
  rpc Lookup(LookupRequest) returns (LookupResponse) {};
  rpc Watch(WatchRequest) returns (stream Event) {};
  rpc Advertise(Request) returns (stream Advert) {};
  rpc Process(Advert) returns (ProcessResponse) {};
}

service Table {
  rpc Create(Route) returns (CreateResponse) {};
  rpc Delete(Route) returns (DeleteResponse) {};
  rpc Update(Route) returns (UpdateResponse) {};
  rpc List(Request) returns (ListResponse) {};
  rpc Query(QueryRequest) returns (QueryResponse) {};
}

// Empty request
message Request {}

// Empty response
message Response {}

// ListResponse is returned by List
message ListResponse {
  repeated Route routes = 1;
}

// LookupRequest is made to Lookup
message LookupRequest {
  Query query = 1;
}

// LookupResponse is returned by Lookup
message LookupResponse {
  repeated Route routes = 1;
}

// QueryRequest queries Table for Routes
message QueryRequest{
  Query query = 1;
}

// QueryResponse is returned by Query
message QueryResponse {
  repeated Route routes = 1;
}

// WatchRequest is made to Watch Router
message WatchRequest {}

// AdvertType defines the type of advert
enum AdvertType {
  AdvertAnnounce = 0;
  AdvertUpdate = 1;
}

// Advert is router advertsement streamed by Watch
message Advert {
  // id of the advertising router
  string id = 1;
  // type of advertisement
  AdvertType type = 2;
  // unix timestamp of the advertisement
  int64 timestamp = 3;
  // TTL of the Advert
  int64 ttl = 4;
  // events is a list of advertised events
  repeated Event events = 5;
}

// ProcessResponse is returned by Process
message ProcessResponse {}

// CreateResponse is returned by Create
message CreateResponse {}

// DeleteResponse is returned by Delete
message DeleteResponse {}

// UpdateResponse is returned by Update
message UpdateResponse {}

// EventType defines the type of event
enum EventType {
  Create = 0;
  Delete = 1;
  Update = 2;
}

// Event is routing table event
message Event {
  // the unique event id
  string id = 1;
  // type of event
  EventType type = 2;
  // unix timestamp of event
  int64 timestamp = 3;
  // service route
  Route route = 4;
}

// Query is passed in a LookupRequest
message Query {
  // service to lookup
  string service = 1;
  // gateway to lookup
  string gateway = 2;
  // network to lookup
  string network = 3;
}

// Route is a service route
message Route {
  // service for the route
  string service = 1;
  // the address that advertise this route
  string address = 2;
  // gateway as the next hop
  string gateway = 3;
  // the network for this destination
  string network = 4;
  // router if the router id
  string router = 5;
  // the network link
  string link = 6;
  // the metric / score of this route
  int64 metric = 7;
}