syntax = "proto3";

package go.micro.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;
}