From 75d1c1f2f43e72643fdabd045cdc1a28fe69e5ef Mon Sep 17 00:00:00 2001 From: Kagami Hiiragi Date: Thu, 15 Jan 2015 21:11:33 +0300 Subject: [PATCH] Implement messages.addr --- README.md | 4 ++-- lib/messages.js | 49 ++++++++++++++++++++++++++++++++++++++++++++----- test.js | 20 ++++++++++++++++++++ 3 files changed, 66 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9c268cf..e8667a2 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,8 @@ API documentation is available [here](https://bitchan.github.io/bitmessage/docs/ - [x] pubkey features - [ ] Message types - [x] version - - [ ] verack - - [ ] addr + - [x] verack + - [x] addr - [ ] inv - [ ] getdata - [ ] error diff --git a/lib/messages.js b/lib/messages.js index caaa920..0909560 100644 --- a/lib/messages.js +++ b/lib/messages.js @@ -21,11 +21,11 @@ exports.version = { NONCE: new Buffer("20bde0a3355dad78", "hex"), /** - * Decode version payload. + * Decode `version` payload. * NOTE: `nonce` is copied. - * @param {Buffer} buf - Buffer that starts with encoded version + * @param {Buffer} buf - Buffer that starts with encoded `version` * payload - * @return {Object} Decoded version structure. + * @return {Object} Decoded `version` structure. */ decode: function(payload) { // 4 + 8 + 8 + 26 + 26 + 8 + (1+) + (1+) @@ -59,9 +59,9 @@ exports.version = { }, /** - * Encode version payload. + * Encode `version` payload. * @param {Object} opts - Version options - * @return {Buffer} Encoded version payload. + * @return {Buffer} Encoded `version` payload. */ encode: function(opts) { // Deal with default options. @@ -97,3 +97,42 @@ exports.version = { ]); }, }; + +/** + * Addresses message. Provide information on known nodes of the network. + * @see {@link https://bitmessage.org/wiki/Protocol_specification#addr} + * @namespace + */ +exports.addr = { + /** + * Decode `addr` payload. + * @param {Buffer} buf - Buffer that starts with encoded `addr` payload + * @return {Object} Decoded `addr` structure. + */ + decode: function(buf) { + var decoded = structs.var_int.decode(buf); + var listLength = decoded.value; + var length = decoded.length + listLength * 38; + assert(buf.length >= length, "Buffer is too small"); + var rest = decoded.rest; + var addrs = new Array(listLength); + for (var i = 0; i < listLength; i++) { + addrs[i] = structs.net_addr.decode(rest.slice(i*38, (i+1)*38)); + } + return { + addrs: addrs, + // Real data length. + length: length, + }; + }, + + /** + * Encode `addr` payload. + * @param {Object[]} addrs - Network addresses + * @return {Buffer} Encoded `addr` payload. + */ + encode: function(addrs) { + var addrsBuf = Buffer.concat(addrs.map(structs.net_addr.encode)); + return Buffer.concat([structs.var_int.encode(addrs.length), addrsBuf]); + }, +}; diff --git a/test.js b/test.js index e6ac178..971dc58 100644 --- a/test.js +++ b/test.js @@ -18,6 +18,7 @@ var serviceFeatures = structs.serviceFeatures; var pubkeyFeatures = structs.pubkeyFeatures; var messages = bitmessage.messages; var version = messages.version; +var addr = messages.addr; var WIF = bitmessage.WIF; var POW = bitmessage.POW; var Address = bitmessage.Address; @@ -301,6 +302,25 @@ describe("Message types", function() { expect(res.length).to.equal(101); }); }); + + describe("addr", function() { + it("should encode and decode", function() { + var res = addr.decode(addr.encode([])); + expect(res.length).to.equal(1); + expect(res.addrs).to.deep.equal([]); + + res = addr.decode(addr.encode([ + {host: "1.2.3.4", port: 8444}, + {host: "ff::1", port: 18444}, + ])); + expect(res.length).to.equal(77); + expect(res.addrs.length).to.equal(2); + expect(res.addrs[0].host).to.equal("1.2.3.4"); + expect(res.addrs[0].port).to.equal(8444); + expect(res.addrs[1].host).to.equal("ff:0:0:0:0:0:0:1"); + expect(res.addrs[1].port).to.equal(18444); + }); + }); }); describe("WIF", function() {