syntax = "proto3";

package go.micro.network;

import "router/service/proto/router.proto";

// Network service is usesd to gain visibility into networks
service Network {
        // Connect to the network
        rpc Connect(ConnectRequest) returns (ConnectResponse) {};
        // Returns the entire network graph
        rpc Graph(GraphRequest) returns (GraphResponse) {};
        // Returns a list of known nodes in the network
        rpc Nodes(NodesRequest) returns (NodesResponse) {};
        // Returns a list of known routes in the network
        rpc Routes(RoutesRequest) returns (RoutesResponse) {};
        // Returns a list of known services based on routes
        rpc Services(ServicesRequest) returns (ServicesResponse) {};
        // Status returns network status
        rpc Status(StatusRequest) returns (StatusResponse) {};
}

// Query is passed in a LookupRequest
message Query {
	string service = 1;
	string address = 2;
	string gateway = 3;
	string router = 4;
	string network = 5;
}

message ConnectRequest {
	repeated Node nodes = 1;
}

message ConnectResponse {}

// PeerRequest requests list of peers
message NodesRequest {
        // node topology depth
        uint32 depth = 1;
}

// PeerResponse is returned by ListPeers
message NodesResponse {
        // return peer topology
        repeated Node nodes = 1;
}

message GraphRequest {
        // node topology depth
        uint32 depth = 1;
}

message GraphResponse {
	Peer root = 1;
}

message RoutesRequest {
	// filter based on
	Query query = 1;
}

message RoutesResponse {
	repeated go.micro.router.Route routes = 1;
}

message ServicesRequest {}

message ServicesResponse {
	repeated string services = 1;
}

message StatusRequest {}

message StatusResponse {
        Status status = 1;
}

// Error tracks network errors
message Error {
        uint32 count = 1;
        string msg = 2;
}

// Status is node status
message Status {
        Error error = 1;
}

// Node is network node
message Node {
        // node id
        string id = 1;
        // node address
        string address = 2;
        // the network
        string network = 3;
        // associated metadata
        map<string,string> metadata = 4;
        // node status
        Status status = 5;
}

// Connect is sent when the node connects to the network
message Connect {
        // network mode
        Node node = 1;
}

// Close is sent when the node disconnects from the network
message Close {
        // network node
        Node node = 1;
}

// Peer is used to advertise node peers
message Peer {
        // network node
        Node node = 1;
        // node peers
        repeated Peer peers = 2;
}

// Sync is network sync message
message Sync {
        // peer origin
        Peer peer = 1;
        // node routes
        repeated go.micro.router.Route routes = 2;
}