docs: messages
This commit is contained in:
parent
f619a066c6
commit
96d7074b2d
154
lib/messages.js
154
lib/messages.js
|
@ -56,11 +56,33 @@ var randomNonce = bmcrypto.randomBytes(8);
|
||||||
// TODO(Kagami): User agent and stream numbers size limits per
|
// TODO(Kagami): User agent and stream numbers size limits per
|
||||||
// <https://github.com/Bitmessage/PyBitmessage/issues/767>.
|
// <https://github.com/Bitmessage/PyBitmessage/issues/767>.
|
||||||
var version = exports.version = {
|
var version = exports.version = {
|
||||||
|
/**
|
||||||
|
* @typedef {Object} DecodeResult
|
||||||
|
* @property {Object} services -
|
||||||
|
* [Service]{@link module:bitmessage/structs.ServicesBitfield}
|
||||||
|
* features to be enabled for this connection
|
||||||
|
* @property {Date} time - Node time
|
||||||
|
* @property {string} remoteHost - IPv4/IPv6 address of the node
|
||||||
|
* receiving this message
|
||||||
|
* @property {number} remotePort - Port of the node receiving this
|
||||||
|
* message
|
||||||
|
* @property {number} port - Incoming port of the node sending this
|
||||||
|
* message
|
||||||
|
* @property {Buffer} nonce - Random nonce used to detect connection
|
||||||
|
* to self
|
||||||
|
* @property {(Array|string|Buffer)} userAgent -
|
||||||
|
* [User agent]{@link module:bitmessage/user-agent} of the node
|
||||||
|
* @property {number[]} streamNumbers - Streams accepted by the node
|
||||||
|
* @property {number} length - Real data length
|
||||||
|
* @memberof module:bitmessage/messages.version
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode `version` message.
|
* Decode `version` message.
|
||||||
* NOTE: `nonce` is copied.
|
* NOTE: `nonce` is copied.
|
||||||
* @param {Buffer} buf - Message
|
* @param {Buffer} buf - Message
|
||||||
* @return {Object} Decoded `version` structure.
|
* @return {DecodeResult}
|
||||||
|
* [Decoded `version` structure.]{@link module:bitmessage/messages.version.DecodeResult}
|
||||||
*/
|
*/
|
||||||
decode: function(buf) {
|
decode: function(buf) {
|
||||||
var decoded = message.decode(buf);
|
var decoded = message.decode(buf);
|
||||||
|
@ -70,9 +92,7 @@ var version = exports.version = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode `version` message payload.
|
* Decode `version` message payload.
|
||||||
* NOTE: `nonce` is copied.
|
* The same as [decode]{@link module:bitmessage/messages.version.decode}.
|
||||||
* @param {Buffer} buf - Message payload
|
|
||||||
* @return {Object} Decoded `version` structure.
|
|
||||||
*/
|
*/
|
||||||
decodePayload: function(buf) {
|
decodePayload: function(buf) {
|
||||||
// 4 + 8 + 8 + 26 + 26 + 8 + (1+) + (1+)
|
// 4 + 8 + 8 + 26 + 26 + 8 + (1+) + (1+)
|
||||||
|
@ -109,6 +129,24 @@ var version = exports.version = {
|
||||||
/**
|
/**
|
||||||
* Encode `version` message.
|
* Encode `version` message.
|
||||||
* @param {Object} opts - Version options
|
* @param {Object} opts - Version options
|
||||||
|
* @param {Object=} opts.services -
|
||||||
|
* [Service]{@link module:bitmessage/structs.ServicesBitfield}
|
||||||
|
* features to be enabled for this connection (`NODE_NETWORK` by
|
||||||
|
* default)
|
||||||
|
* @param {Date=} opts.time - Node time (current time by default)
|
||||||
|
* @param {string} opts.remoteHost - IPv4/IPv6 address of the node
|
||||||
|
* receiving this message
|
||||||
|
* @param {number} opts.remotePort - Port of the node receiving this
|
||||||
|
* message
|
||||||
|
* @param {number=} opts.port - Incoming port of the node (8444 by
|
||||||
|
* default)
|
||||||
|
* @param {Buffer=} opts.nonce - Random nonce used to detect connection
|
||||||
|
* to self (unique per node.js process by default)
|
||||||
|
* @param {(Array|string|Buffer)=} opts.userAgent -
|
||||||
|
* [User agent]{@link module:bitmessage/user-agent} of the node
|
||||||
|
* (bitmessage's by default)
|
||||||
|
* @param {Array<number>=} opts.streamNumbers - Streams accepted by the
|
||||||
|
* node (1 by default)
|
||||||
* @return {Buffer} Encoded message.
|
* @return {Buffer} Encoded message.
|
||||||
*/
|
*/
|
||||||
encode: function(opts) {
|
encode: function(opts) {
|
||||||
|
@ -118,8 +156,7 @@ var version = exports.version = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode `version` message payload.
|
* Encode `version` message payload.
|
||||||
* @param {Object} opts - Version options
|
* The same as [encode]{@link module:bitmessage/messages.version.encode}.
|
||||||
* @return {Buffer} Encoded payload.
|
|
||||||
*/
|
*/
|
||||||
encodePayload: function(opts) {
|
encodePayload: function(opts) {
|
||||||
// Deal with default options.
|
// Deal with default options.
|
||||||
|
@ -166,10 +203,19 @@ var version = exports.version = {
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
var addr = exports.addr = {
|
var addr = exports.addr = {
|
||||||
|
/**
|
||||||
|
* @typedef {Object} DecodeResult
|
||||||
|
* @property {Object[]} addrs - List of
|
||||||
|
* [decoded `net_addr` structures]{@link module:bitmessage/structs.net_addr.DecodeResult}
|
||||||
|
* @property {number} length - Real data length
|
||||||
|
* @memberof module:bitmessage/messages.addr
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode `addr` message.
|
* Decode `addr` message.
|
||||||
* @param {Buffer} buf - Message
|
* @param {Buffer} buf - Message
|
||||||
* @return {Object} Decoded `addr` structure.
|
* @return {DecodeResult}
|
||||||
|
* [Decoded `addr` structure.]{@link module:bitmessage/messages.addr.DecodeResult}
|
||||||
*/
|
*/
|
||||||
decode: function(buf) {
|
decode: function(buf) {
|
||||||
var decoded = message.decode(buf);
|
var decoded = message.decode(buf);
|
||||||
|
@ -179,8 +225,7 @@ var addr = exports.addr = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode `addr` message payload.
|
* Decode `addr` message payload.
|
||||||
* @param {Buffer} buf - Message payload
|
* The same as [decode]{@link module:bitmessage/messages.addr.decode}.
|
||||||
* @return {Object} Decoded `addr` structure.
|
|
||||||
*/
|
*/
|
||||||
decodePayload: function(buf) {
|
decodePayload: function(buf) {
|
||||||
var decoded = structs.var_int.decode(buf);
|
var decoded = structs.var_int.decode(buf);
|
||||||
|
@ -202,7 +247,8 @@ var addr = exports.addr = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode `addr` message.
|
* Encode `addr` message.
|
||||||
* @param {Object[]} addrs - Network addresses
|
* @param {Object[]} addrs - List of
|
||||||
|
* [net_addr encode options]{@link module:bitmessage/structs.net_addr.encode}
|
||||||
* @return {Buffer} Encoded message.
|
* @return {Buffer} Encoded message.
|
||||||
*/
|
*/
|
||||||
encode: function(addrs) {
|
encode: function(addrs) {
|
||||||
|
@ -212,8 +258,7 @@ var addr = exports.addr = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode `addr` message payload.
|
* Encode `addr` message payload.
|
||||||
* @param {Object[]} addrs - Network addresses
|
* The same as [encode]{@link module:bitmessage/messages.addr.encode}.
|
||||||
* @return {Buffer} Encoded payload.
|
|
||||||
*/
|
*/
|
||||||
encodePayload: function(addrs) {
|
encodePayload: function(addrs) {
|
||||||
assert(addrs.length <= 1000, "Too many address entires");
|
assert(addrs.length <= 1000, "Too many address entires");
|
||||||
|
@ -231,10 +276,19 @@ var addr = exports.addr = {
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
var inv = exports.inv = {
|
var inv = exports.inv = {
|
||||||
|
/**
|
||||||
|
* @typedef {Object} DecodeResult
|
||||||
|
* @property {Buffer[]} inventory - List of
|
||||||
|
* [inventory vectors]{@link module:bitmessage/structs.inv_vect}
|
||||||
|
* @property {number} length - Real data length
|
||||||
|
* @memberof module:bitmessage/messages.inv
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode `inv` message.
|
* Decode `inv` message.
|
||||||
* @param {Buffer} buf - Message
|
* @param {Buffer} buf - Message
|
||||||
* @return {Object} Decoded `inv` structure.
|
* @return {DecodeResult}
|
||||||
|
* [Decoded `inv` structure.]{@link module:bitmessage/messages.inv.DecodeResult}
|
||||||
*/
|
*/
|
||||||
decode: function(buf) {
|
decode: function(buf) {
|
||||||
var decoded = message.decode(buf);
|
var decoded = message.decode(buf);
|
||||||
|
@ -244,8 +298,7 @@ var inv = exports.inv = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode `inv` message payload.
|
* Decode `inv` message payload.
|
||||||
* @param {Buffer} buf - Message payload
|
* The same as [decode]{@link module:bitmessage/messages.inv.decode}.
|
||||||
* @return {Object} Decoded `inv` structure.
|
|
||||||
*/
|
*/
|
||||||
decodePayload: function(buf) {
|
decodePayload: function(buf) {
|
||||||
var decoded = structs.var_int.decode(buf);
|
var decoded = structs.var_int.decode(buf);
|
||||||
|
@ -267,7 +320,8 @@ var inv = exports.inv = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode `inv` message.
|
* Encode `inv` message.
|
||||||
* @param {Buffer[]} inventory - Inventory vector list
|
* @param {Buffer[]} inventory -
|
||||||
|
* [Inventory vector]{@link module:bitmessage/structs.inv_vect} list
|
||||||
* @return {Buffer} Encoded message.
|
* @return {Buffer} Encoded message.
|
||||||
*/
|
*/
|
||||||
encode: function(inventory) {
|
encode: function(inventory) {
|
||||||
|
@ -277,8 +331,7 @@ var inv = exports.inv = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode `inv` message payload.
|
* Encode `inv` message payload.
|
||||||
* @param {Buffer[]} inventory - Inventory vector list
|
* The same as [encode]{@link module:bitmessage/messages.inv.encode}.
|
||||||
* @return {Buffer} Encoded payload.
|
|
||||||
*/
|
*/
|
||||||
encodePayload: function(inventory) {
|
encodePayload: function(inventory) {
|
||||||
assert(inventory.length <= 50000, "Too many inventory entires");
|
assert(inventory.length <= 50000, "Too many inventory entires");
|
||||||
|
@ -296,10 +349,19 @@ var inv = exports.inv = {
|
||||||
* @namespace
|
* @namespace
|
||||||
*/
|
*/
|
||||||
exports.getdata = objectAssign({}, inv, {
|
exports.getdata = objectAssign({}, inv, {
|
||||||
|
/**
|
||||||
|
* @typedef {Object} DecodeResult
|
||||||
|
* @property {Buffer[]} inventory - List of
|
||||||
|
* [inventory vectors]{@link module:bitmessage/structs.inv_vect}
|
||||||
|
* @property {number} length - Real data length
|
||||||
|
* @memberof module:bitmessage/messages.getdata
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode `getdata` message.
|
* Decode `getdata` message.
|
||||||
* @param {Buffer} buf - Message
|
* @param {Buffer} buf - Message
|
||||||
* @return {Object} Decoded `getdata` structure.
|
* @return {DecodeResult}
|
||||||
|
* [Decoded `getdata` structure.]{@link module:bitmessage/messages.getdata.DecodeResult}
|
||||||
* @memberof module:bitmessage/messages.getdata
|
* @memberof module:bitmessage/messages.getdata
|
||||||
*/
|
*/
|
||||||
decode: function(buf) {
|
decode: function(buf) {
|
||||||
|
@ -307,9 +369,18 @@ exports.getdata = objectAssign({}, inv, {
|
||||||
assert(decoded.command === "getdata", "Bad command");
|
assert(decoded.command === "getdata", "Bad command");
|
||||||
return inv.decodePayload(decoded.payload);
|
return inv.decodePayload(decoded.payload);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode `getdata` message payload.
|
||||||
|
* The same as [decode]{@link module:bitmessage/messages.getdata.decode}.
|
||||||
|
* @function decodePayload
|
||||||
|
* @memberof module:bitmessage/messages.getdata
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode `getdata` message.
|
* Encode `getdata` message.
|
||||||
* @param {Buffer[]} inventory - Inventory vector list
|
* @param {Buffer[]} inventory -
|
||||||
|
* [Inventory vector]{@link module:bitmessage/structs.inv_vect} list
|
||||||
* @return {Buffer} Encoded message.
|
* @return {Buffer} Encoded message.
|
||||||
* @memberof module:bitmessage/messages.getdata
|
* @memberof module:bitmessage/messages.getdata
|
||||||
*/
|
*/
|
||||||
|
@ -317,17 +388,10 @@ exports.getdata = objectAssign({}, inv, {
|
||||||
var payload = inv.encodePayload(inventory);
|
var payload = inv.encodePayload(inventory);
|
||||||
return message.encode("getdata", payload);
|
return message.encode("getdata", payload);
|
||||||
},
|
},
|
||||||
/**
|
|
||||||
* Decode `getdata` message payload.
|
|
||||||
* @param {Buffer} buf - Message payload
|
|
||||||
* @return {Object} Decoded `inv` structure.
|
|
||||||
* @function decodePayload
|
|
||||||
* @memberof module:bitmessage/messages.getdata
|
|
||||||
*/
|
|
||||||
/**
|
/**
|
||||||
* Encode `getdata` message payload.
|
* Encode `getdata` message payload.
|
||||||
* @param {Buffer[]} inventory - Inventory vector list
|
* The same as [encode]{@link module:bitmessage/messages.getdata.encode}.
|
||||||
* @return {Buffer} Encoded payload.
|
|
||||||
* @function encodePayload
|
* @function encodePayload
|
||||||
* @memberof module:bitmessage/messages.getdata
|
* @memberof module:bitmessage/messages.getdata
|
||||||
*/
|
*/
|
||||||
|
@ -359,10 +423,24 @@ var error = exports.error = {
|
||||||
*/
|
*/
|
||||||
FATAL: 2,
|
FATAL: 2,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} DecodeResult
|
||||||
|
* @property {number} fatal - Type of the error
|
||||||
|
* @property {number} banTime - The other node informs that it will
|
||||||
|
* not accept further connections for this number of seconds
|
||||||
|
* @property {?Buffer} vector -
|
||||||
|
* [Inventory vector]{@link module:bitmessage/structs.inv_vect}
|
||||||
|
* related to the error
|
||||||
|
* @property {string} errorText - A human-readable error description
|
||||||
|
* @property {number} length - Real data length
|
||||||
|
* @memberof module:bitmessage/messages.error
|
||||||
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode `error` message.
|
* Decode `error` message.
|
||||||
* @param {Buffer} buf - Message
|
* @param {Buffer} buf - Message
|
||||||
* @return {Object} Decoded `error` structure.
|
* @return {DecodeResult}
|
||||||
|
* [Decoded `error` structure.]{@link module:bitmessage/messages.error.DecodeResult}
|
||||||
*/
|
*/
|
||||||
decode: function(buf) {
|
decode: function(buf) {
|
||||||
var decoded = message.decode(buf);
|
var decoded = message.decode(buf);
|
||||||
|
@ -372,8 +450,7 @@ var error = exports.error = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode `error` message payload.
|
* Decode `error` message payload.
|
||||||
* @param {Buffer} buf - Message payload
|
* The same as [decode]{@link module:bitmessage/messages.error.decode}.
|
||||||
* @return {Object} Decoded `error` structure.
|
|
||||||
*/
|
*/
|
||||||
decodePayload: function(buf) {
|
decodePayload: function(buf) {
|
||||||
assert(buf.length >= 4, "Buffer is too small");
|
assert(buf.length >= 4, "Buffer is too small");
|
||||||
|
@ -413,6 +490,16 @@ var error = exports.error = {
|
||||||
/**
|
/**
|
||||||
* Encode `error` message.
|
* Encode `error` message.
|
||||||
* @param {Object} opts - Error options
|
* @param {Object} opts - Error options
|
||||||
|
* @param {number=} opts.fatal - Type of the error
|
||||||
|
* ([warning]{@link module:bitmessage/messages.error.WARNING} by
|
||||||
|
* default)
|
||||||
|
* @param {number=} opts.banTime - Inform the other node, that you
|
||||||
|
* will not accept further connections for this number of seconds (0
|
||||||
|
* by default)
|
||||||
|
* @param {Buffer=} opts.vector - A 32-byte
|
||||||
|
* [inventory vector]{@link module:bitmessage/structs.inv_vect}
|
||||||
|
* related to the error (empty by default)
|
||||||
|
* @param {string} opts.errorText - A human-readable error description
|
||||||
* @return {Buffer} Encoded message.
|
* @return {Buffer} Encoded message.
|
||||||
*/
|
*/
|
||||||
encode: function(opts) {
|
encode: function(opts) {
|
||||||
|
@ -422,8 +509,7 @@ var error = exports.error = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode `error` message payload.
|
* Encode `error` message payload.
|
||||||
* @param {Object} opts - Error options
|
* The same as [encode]{@link module:bitmessage/messages.error.encode}.
|
||||||
* @return {Buffer} Encoded payload.
|
|
||||||
*/
|
*/
|
||||||
encodePayload: function(opts) {
|
encodePayload: function(opts) {
|
||||||
var fatal = opts.fatal || error.WARNING;
|
var fatal = opts.fatal || error.WARNING;
|
||||||
|
|
|
@ -122,6 +122,7 @@ TcpTransport.prototype._setupClient = function(client, accepted) {
|
||||||
self.on("message", function(command) {
|
self.on("message", function(command) {
|
||||||
if (!established) {
|
if (!established) {
|
||||||
// TODO: Process version data.
|
// TODO: Process version data.
|
||||||
|
// TODO: Disconnect if proto version < 3.
|
||||||
if (command === "version") {
|
if (command === "version") {
|
||||||
if (verackSent) {
|
if (verackSent) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -65,6 +65,7 @@ WsTransport.prototype.connect = function(url, protocols) {
|
||||||
self.on("message", function(command) {
|
self.on("message", function(command) {
|
||||||
if (!established) {
|
if (!established) {
|
||||||
// TODO: Process version data.
|
// TODO: Process version data.
|
||||||
|
// TODO: Disconnect if proto version < 3.
|
||||||
if (command === "version") {
|
if (command === "version") {
|
||||||
if (verackSent) {
|
if (verackSent) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -121,6 +121,7 @@ WsTransport.prototype._setupClient = function(client, accepted) {
|
||||||
self.on("message", function(command) {
|
self.on("message", function(command) {
|
||||||
if (!established) {
|
if (!established) {
|
||||||
// TODO: Process version data.
|
// TODO: Process version data.
|
||||||
|
// TODO: Disconnect if proto version < 3.
|
||||||
if (command === "version") {
|
if (command === "version") {
|
||||||
if (verackSent) {
|
if (verackSent) {
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user