Skip to content

Commit f245744

Browse files
fix: use multibase, add buffer, remove ip dep (#113)
* fix: use multibase and add buffer Adds buffer related to ipfs/js-ipfs#2924 Uses multibase to encode. * Update src/convert.js Co-Authored-By: Jacob Heun <[email protected]> * Update src/convert.js Co-Authored-By: Jacob Heun <[email protected]> * fix: remove ip dep Co-authored-by: Jacob Heun <[email protected]>
1 parent 072326e commit f245744

File tree

6 files changed

+116
-16
lines changed

6 files changed

+116
-16
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,4 @@ test/test-data/go-ipfs-repo/LOG.old
4141

4242
# while testing npm5
4343
package-lock.json
44+
yarn.lock

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,11 @@
3232
"bugs": "https://github.com/multiformats/js-multiaddr/issues",
3333
"homepage": "https://github.com/multiformats/js-multiaddr",
3434
"dependencies": {
35-
"bs58": "^4.0.1",
35+
"buffer": "^5.5.0",
3636
"cids": "~0.7.1",
3737
"class-is": "^1.1.0",
38-
"hi-base32": "~0.5.0",
39-
"ip": "^1.1.5",
4038
"is-ip": "^3.1.0",
39+
"multibase": "^0.6.0",
4140
"varint": "^5.0.0"
4241
},
4342
"devDependencies": {

src/codec.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict'
22

3+
const { Buffer } = require('buffer')
34
const convert = require('./convert')
45
const protocols = require('./protocols-table')
56
const varint = require('varint')

src/convert.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
'use strict'
22

3-
const ip = require('ip')
4-
const isIp = require('is-ip')
3+
const { Buffer } = require('buffer')
4+
const ip = require('./ip')
55
const protocols = require('./protocols-table')
6-
const bs58 = require('bs58')
76
const CID = require('cids')
8-
const base32 = require('hi-base32')
7+
const multibase = require('multibase')
98
const varint = require('varint')
109

1110
module.exports = Convert
@@ -83,15 +82,15 @@ Convert.toBuffer = function convertToBuffer (proto, str) {
8382
}
8483

8584
function ip2buf (ipString) {
86-
if (!isIp(ipString)) {
85+
if (!ip.isIP(ipString)) {
8786
throw new Error('invalid ip address')
8887
}
8988
return ip.toBuffer(ipString)
9089
}
9190

9291
function buf2ip (ipBuff) {
9392
const ipString = ip.toString(ipBuff)
94-
if (!isIp(ipString)) {
93+
if (!ip.isIP(ipString)) {
9594
throw new Error('invalid ip address')
9695
}
9796
return ipString
@@ -138,8 +137,7 @@ function buf2mh (buf) {
138137
if (address.length !== size) {
139138
throw new Error('inconsistent lengths')
140139
}
141-
142-
return bs58.encode(address)
140+
return multibase.encode('base58btc', address).toString().slice(1)
143141
}
144142

145143
function onion2buf (str) {
@@ -150,7 +148,9 @@ function onion2buf (str) {
150148
if (addr[0].length !== 16) {
151149
throw new Error('failed to parse onion addr: ' + addr[0] + ' not a Tor onion address.')
152150
}
153-
const buf = Buffer.from(base32.decode.asBytes(addr[0].toUpperCase()))
151+
152+
// onion addresses do not include the multibase prefix, add it before decoding
153+
const buf = multibase.decode('b' + addr[0])
154154

155155
// onion port number
156156
const port = parseInt(addr[1], 10)
@@ -169,7 +169,8 @@ function onion32buf (str) {
169169
if (addr[0].length !== 56) {
170170
throw new Error('failed to parse onion addr: ' + addr[0] + ' not a Tor onion3 address.')
171171
}
172-
const buf = Buffer.from(base32.decode.asBytes(addr[0].toUpperCase()))
172+
// onion addresses do not include the multibase prefix, add it before decoding
173+
const buf = multibase.decode('b' + addr[0])
173174

174175
// onion port number
175176
const port = parseInt(addr[1], 10)
@@ -183,7 +184,7 @@ function onion32buf (str) {
183184
function buf2onion (buf) {
184185
const addrBytes = buf.slice(0, buf.length - 2)
185186
const portBytes = buf.slice(buf.length - 2)
186-
const addr = base32.encode(addrBytes).toLowerCase()
187+
const addr = multibase.encode('base32', addrBytes).toString().slice(1)
187188
const port = buf2port(portBytes)
188189
return addr + ':' + port
189190
}

src/index.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
'use strict'
22

33
const codec = require('./codec')
4+
const { Buffer } = require('buffer')
45
const protocols = require('./protocols-table')
56
const varint = require('varint')
6-
const bs58 = require('bs58')
7+
const multibase = require('multibase')
78
const CID = require('cids')
89
const withIs = require('class-is')
910
const inspect = Symbol.for('nodejs.util.inspect.custom')
@@ -308,7 +309,7 @@ Multiaddr.prototype.getPeerId = function getPeerId () {
308309
// Get the last id
309310
b58str = tuples.pop()[1]
310311
// Get multihash, unwrap from CID if needed
311-
b58str = bs58.encode(new CID(b58str).multihash)
312+
b58str = multibase.encode('base58btc', new CID(b58str).multihash).toString().slice(1)
312313
} catch (e) {
313314
b58str = null
314315
}

src/ip.js

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
'use strict'
2+
3+
const isIp = require('is-ip')
4+
5+
const isIP = isIp
6+
const isV4 = isIp.v4
7+
const isV6 = isIp.v6
8+
9+
// Copied from https://github.com/indutny/node-ip/blob/master/lib/ip.js#L7
10+
const toBuffer = function (ip, buff, offset) {
11+
offset = ~~offset
12+
13+
var result
14+
15+
if (isV4(ip)) {
16+
result = buff || Buffer.alloc(offset + 4)
17+
ip.split(/\./g).map(function (byte) {
18+
result[offset++] = parseInt(byte, 10) & 0xff
19+
})
20+
} else if (isV6(ip)) {
21+
var sections = ip.split(':', 8)
22+
23+
var i
24+
for (i = 0; i < sections.length; i++) {
25+
var isv4 = isV4(sections[i])
26+
var v4Buffer
27+
28+
if (isv4) {
29+
v4Buffer = toBuffer(sections[i])
30+
sections[i] = v4Buffer.slice(0, 2).toString('hex')
31+
}
32+
33+
if (v4Buffer && ++i < 8) {
34+
sections.splice(i, 0, v4Buffer.slice(2, 4).toString('hex'))
35+
}
36+
}
37+
38+
if (sections[0] === '') {
39+
while (sections.length < 8) sections.unshift('0')
40+
} else if (sections[sections.length - 1] === '') {
41+
while (sections.length < 8) sections.push('0')
42+
} else if (sections.length < 8) {
43+
for (i = 0; i < sections.length && sections[i] !== ''; i++);
44+
var argv = [i, 1]
45+
for (i = 9 - sections.length; i > 0; i--) {
46+
argv.push('0')
47+
}
48+
sections.splice.apply(sections, argv)
49+
}
50+
51+
result = buff || Buffer.alloc(offset + 16)
52+
for (i = 0; i < sections.length; i++) {
53+
var word = parseInt(sections[i], 16)
54+
result[offset++] = (word >> 8) & 0xff
55+
result[offset++] = word & 0xff
56+
}
57+
}
58+
59+
if (!result) {
60+
throw Error('Invalid ip address: ' + ip)
61+
}
62+
63+
return result
64+
}
65+
66+
// Copied from https://github.com/indutny/node-ip/blob/master/lib/ip.js#L63
67+
const toString = function (buff, offset, length) {
68+
offset = ~~offset
69+
length = length || (buff.length - offset)
70+
71+
var result = []
72+
if (length === 4) {
73+
// IPv4
74+
for (let i = 0; i < length; i++) {
75+
result.push(buff[offset + i])
76+
}
77+
result = result.join('.')
78+
} else if (length === 16) {
79+
// IPv6
80+
for (let i = 0; i < length; i += 2) {
81+
result.push(buff.readUInt16BE(offset + i).toString(16))
82+
}
83+
result = result.join(':')
84+
result = result.replace(/(^|:)0(:0)*:0(:|$)/, '$1::$3')
85+
result = result.replace(/:{3,4}/, '::')
86+
}
87+
88+
return result
89+
}
90+
91+
module.exports = {
92+
isIP,
93+
isV4,
94+
isV6,
95+
toBuffer,
96+
toString
97+
}

0 commit comments

Comments
 (0)