Node Protocol - AtlasNet/Protocols GitHub Wiki
Each node provides an Apache Thrift service endpoint.
Transport in use is TCP. Default port is 1975
.
Thrift protocol in use is BinaryProtocol
.
Service specification
Node information block
struct AtlasNodeInfo {
1: string name,
2: string host,
3: i64 port,
4: i64 protocolVersion
}
- name - arbitrary node description, provided by the node itself
- host - node hostname or IP address
- port - node's TCP port
- protocolVersion - node's service protocol version (currently 1).
Message information block
struct AtlasMessage {
1: string data,
2: string recipientKey
}
- data - message payload in Base64
- recipientKey - PEM-encoded message recipient's key
Message listing information block
struct AtlasListing {
1: AtlasNodeInfo node,
2: i64 id,
}
- node - node information block describing node on which the message was received and stored
- id - message ID on the storage node
Node service
service AtlasNode {
i32 ping(),
AtlasNodeInfo getInfo(),
void hello(1: AtlasNodeInfo info),
void join(),
void registerNode(1: AtlasNodeInfo info, 2: AtlasNodeInfo via),
list<AtlasNodeInfo> getKnownNodes(),
void postMessage(1: AtlasMessage message),
void registerMessageListing(1: string recipientKey, 2: i64 messageId),
void unregisterMessageListing(1: i64 messageId),
string getAuthChallenge(1: string publicKey),
i64 confirmAuth(1: string response),
list<AtlasListing> getListings(),
i64 hasMessage(1: i64 id),
AtlasMessage retrieveMessage(1: i64 id)
}
- i32 ping() - ensures connectivity - should return 1 if the node is operational and usable
- AtlasNodeInfo getInfo() - returns node information block for this node
- void hello(1: AtlasNodeInfo info) - identifies caller node to the serving node
- void join() - notifies the serving node that caller node would like to join the network through the serving node
- void registerNode(1: AtlasNodeInfo info, 2: AtlasNodeInfo via) - notifies the serving node that a 3rd party node has joined the network via the caller node (caller node's information supplied in via argument) and should be added to the known nodes list
- list getKnownNodes() - should return current list of nodes known by the serving node
- void postMessage(1: AtlasMessage message) - stores a supplied message block on the serving node
- void registerMessageListing(1: string recipientKey, 2: i64 messageId) - notifies the serving node that a new message listing, for a message stored on the caller node, is to be created. messageId denotes message ID on the caller node, and recipientKey contains PEM-encoded public key of the message's recipient
- void unregisterMessageListing(1: i64 messageId) - notifies the serving node that a message with ID messageId has been retrieved from the caller node, or has expired, and should be removed from serving node's message listings
- string getAuthChallenge(1: string publicKey) - notifies the serving node that a calling client would like to initiate an authentication sequence and prove its identity. Returns a Base64-encoded cryptographic challenge block. See Authentication
- i64 confirmAuth(1: string response) - submits a response to an authentication challenge. Returns 1 if the response is correct, and connection is now AUTHENTICATED, otherwise the connection remains in UNAUTHENTICATED state.
- list getListings() - returns a list of message listing blocks which describe messages pending for the currently authenticated recipient. Connection must be in AUTHENTICATED state before this method is used
- i64 hasMessage(1: i64 id) - returns 1 if a message with ID id is currently stored on the node and can be retrieved by currently authenticated client. Connection must be in AUTHENTICATED state before this method is used
- AtlasMessage retrieveMessage(1: i64 id) - retrieves a message with ID id from the node. Message is then deleted from the node's storage. Connection must be in AUTHENTICATED state before this method is used