syntax = "proto3";

package kademlia;

// Record represents a dht record that contains a value
// for a key value pair
message Record {
	// The key that references this record
	bytes key = 1;

	// The actual value this record is storing
	bytes value = 2;

	// Note: These fields were removed from the Record message
	// hash of the authors public key
	//optional string author = 3;
	// A PKI signature for the key+value+author
	//optional bytes signature = 4;

	// Time the record was received, set by receiver
	string timeReceived = 5;

  // The original publisher of the record.
  // Currently specific to rust-libp2p.
  bytes publisher = 666;

  // The remaining TTL of the record, in seconds.
  // Currently specific to rust-libp2p.
  uint32 ttl = 777;
};

enum MessageType {
	PUT_VALUE = 0;
	GET_VALUE = 1;
	ADD_PROVIDER = 2;
	GET_PROVIDERS = 3;
	FIND_NODE = 4;
	PING = 5;
}

enum ConnectionType {
	// sender does not have a connection to peer, and no extra information (default)
	NOT_CONNECTED = 0;

	// sender has a live connection to peer
	CONNECTED = 1;

	// sender recently connected to peer
	CAN_CONNECT = 2;

	// sender recently tried to connect to peer repeatedly but failed to connect
	// ("try" here is loose, but this should signal "made strong effort, failed")
	CANNOT_CONNECT = 3;
}

message Peer {
	// ID of a given peer.
	bytes id = 1;

	// multiaddrs for a given peer
	repeated bytes addrs = 2;

	// used to signal the sender's connection capabilities to the peer
	ConnectionType connection = 3;
}

message Message {
	// defines what type of message it is.
	MessageType type = 1;

	// defines what coral cluster level this query/response belongs to.
	// in case we want to implement coral's cluster rings in the future.
	int32 clusterLevelRaw = 10; // NOT USED

	// Used to specify the key associated with this message.
	// PUT_VALUE, GET_VALUE, ADD_PROVIDER, GET_PROVIDERS
	bytes key = 2;

	// Used to return a value
	// PUT_VALUE, GET_VALUE
	Record record = 3;

	// Used to return peers closer to a key in a query
	// GET_VALUE, GET_PROVIDERS, FIND_NODE
	repeated Peer closerPeers = 8;

	// Used to return Providers
	// ADD_PROVIDER, GET_PROVIDERS
	repeated Peer providerPeers = 9;
}
