besterd/spec.md

2.2 KiB

Bester protocol

What is bester?

Bester is a protocol for authenticated message-passing in a federated network.

Protocol

Every message in bester contains the following:

[4 bytes - message size (little endian)][JSON message]

JSON payload

The JSON message MUST be a JSON object and MUST include a field named header.

Received message:

"header" : {
	
}

This header field MUST contain the following fields of which are JSON objects, authentication.

The header field MUST contain two field of which are of type JSON string, scope and type.

Received message:

"header" : {
	"scope" : "scope",
	"type" : "type",
	"authentication" : {}
}

The authentication field MUST be a JSON object and must contain two fields username and password which MUST both be JSON strings.

The scope field MUST be a JSON string. The type field MUST be a JSON string.

Received message:

"header" : {
	"scope" : "scope",
	"type" : "type",
	"authentication" : {
		"username" : "username",
		"password" : "password"
	}
}

There MUST also be a field in the original JSON message named payload, the JSON type doesn't matter.

Received message:

"header" : {
	"scope" : "scope",
	"type" : "type",
	"authentication" : {
		"username" : "username",
		"password" : "password"
	}
},
"payload" : anything

Message handling

The way messages are handled depends on their type. The way the server deals with it works like this.

The server configuration looks like this:

"handlers" : {
	"availableTypes" : ["type1", "type2"],
	"typeMap" :{
		"type1" : {"handlerBinary" : "aBin", "unixDomainSocketPath" : "aSock"},
		"type2" : {"handlerBinary" : "bBin", "unixDomainSocketPath" : "bSock"}
	}
}

Sending payloads

When it comes to payloads, all that is needed is a field called payload that is a of any JSON type.

Received message (from client to server):

"payload" = ...

Receiving responses

When the payload has been passed off from client to server and server to message handler then the response from the message handler must be as follows:

"response" : {
	"scope" : "scope",
	"type" : "type",
	"payload" : ...
}

TODO: To field and also add examples of usage