From d4e08a9eae0df821c3e6231799141cdb798539e7 Mon Sep 17 00:00:00 2001 From: Vasco Santos Date: Tue, 6 Oct 2020 11:28:05 +0200 Subject: [PATCH 1/5] feat: is multiaddr private --- package.json | 9 +++--- src/is-multiaddr-private.js | 9 ++++++ test/is-multiaddr-private.spec.js | 51 +++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 src/is-multiaddr-private.js create mode 100644 test/is-multiaddr-private.spec.js diff --git a/package.json b/package.json index d571b20..ee73470 100644 --- a/package.json +++ b/package.json @@ -29,17 +29,18 @@ }, "homepage": "https://github.com/libp2p/js-libp2p-utils#readme", "devDependencies": { - "aegir": "^25.0.0", + "aegir": "^26.0.0", "it-pair": "^1.0.0", "it-pipe": "^1.1.0", - "streaming-iterables": "^5.0.2" + "streaming-iterables": "^5.0.3" }, "dependencies": { "abortable-iterator": "^3.0.0", - "debug": "^4.1.1", + "debug": "^4.2.0", "err-code": "^2.0.3", "ip-address": "^6.1.0", - "multiaddr": "^8.0.0" + "multiaddr": "^8.0.0", + "private-ip": "^1.0.5" }, "contributors": [ "Vasco Santos ", diff --git a/src/is-multiaddr-private.js b/src/is-multiaddr-private.js new file mode 100644 index 0000000..6463c7a --- /dev/null +++ b/src/is-multiaddr-private.js @@ -0,0 +1,9 @@ +'use strict' + +const isIpPrivate = require('private-ip') + +module.exports = (multiaddr) => { + const { address } = multiaddr.nodeAddress() + + return isIpPrivate(address) +} diff --git a/test/is-multiaddr-private.spec.js b/test/is-multiaddr-private.spec.js new file mode 100644 index 0000000..985e17d --- /dev/null +++ b/test/is-multiaddr-private.spec.js @@ -0,0 +1,51 @@ +/* eslint-env mocha */ +'use strict' + +const { expect } = require('aegir/utils/chai') +const multiaddr = require('multiaddr') + +const isMultiaddrPrivate = require('../src/is-multiaddr-private') + +describe('isMultiaddrPrivate', () => { + it('identifies private ip4 multiaddrs', () => { + const m1 = multiaddr('/ip4/127.0.0.1/tcp/1000') + const m2 = multiaddr('/ip4/10.0.0.1/tcp/1000') + const m3 = multiaddr('/ip4/192.168.0.1/tcp/1000') + const m4 = multiaddr('/ip4/172.16.0.1/tcp/1000') + + expect(isMultiaddrPrivate(m1)).to.eql(true) + expect(isMultiaddrPrivate(m2)).to.eql(true) + expect(isMultiaddrPrivate(m3)).to.eql(true) + expect(isMultiaddrPrivate(m4)).to.eql(true) + }) + + it('identifies public ip4 multiaddrs', () => { + const m1 = multiaddr('/ip4/101.0.26.90/tcp/1000') + const m2 = multiaddr('/ip4/40.1.20.9/tcp/1000') + const m3 = multiaddr('/ip4/92.168.0.1/tcp/1000') + const m4 = multiaddr('/ip4/2.16.0.1/tcp/1000') + + expect(isMultiaddrPrivate(m1)).to.eql(false) + expect(isMultiaddrPrivate(m2)).to.eql(false) + expect(isMultiaddrPrivate(m3)).to.eql(false) + expect(isMultiaddrPrivate(m4)).to.eql(false) + }) + + it('identifies private ip6 multiaddrs', () => { + const m1 = multiaddr('/ip6/fd52:8342:fc46:6c91:3ac9:86ff:fe31:7095/tcp/1000') + + expect(isMultiaddrPrivate(m1)).to.eql(true) + }) + + it('identifies public ip6 multiaddrs', () => { + const m1 = multiaddr('/ip6/2001:8a0:7ac5:4201:3ac9:86ff:fe31:7095/tcp/1000') + + expect(isMultiaddrPrivate(m1)).to.eql(false) + }) + + it('identifies dns multiaddrs as not private', () => { + const m1 = multiaddr('/dns4/wss0.bootstrap.libp2p.io/tcp/443') + + expect(isMultiaddrPrivate(m1)).to.eql(false) + }) +}) From 841195a965f8d3cdc6fae9b37bf897550fb43fb4 Mon Sep 17 00:00:00 2001 From: Vasco Santos Date: Wed, 7 Oct 2020 11:17:03 +0200 Subject: [PATCH 2/5] feat: add isLoopback --- package.json | 1 + src/is-multiaddr-private.js | 9 ---- src/multiaddr/is-loopback.js | 16 +++++++ src/multiaddr/is-private.js | 16 +++++++ test/multiaddr/is-loopback.spec.js | 45 +++++++++++++++++++ .../is-private.spec.js} | 26 +++++------ 6 files changed, 91 insertions(+), 22 deletions(-) delete mode 100644 src/is-multiaddr-private.js create mode 100644 src/multiaddr/is-loopback.js create mode 100644 src/multiaddr/is-private.js create mode 100644 test/multiaddr/is-loopback.spec.js rename test/{is-multiaddr-private.spec.js => multiaddr/is-private.spec.js} (62%) diff --git a/package.json b/package.json index ee73470..68d7dab 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "debug": "^4.2.0", "err-code": "^2.0.3", "ip-address": "^6.1.0", + "is-loopback-addr": "^1.0.0", "multiaddr": "^8.0.0", "private-ip": "^1.0.5" }, diff --git a/src/is-multiaddr-private.js b/src/is-multiaddr-private.js deleted file mode 100644 index 6463c7a..0000000 --- a/src/is-multiaddr-private.js +++ /dev/null @@ -1,9 +0,0 @@ -'use strict' - -const isIpPrivate = require('private-ip') - -module.exports = (multiaddr) => { - const { address } = multiaddr.nodeAddress() - - return isIpPrivate(address) -} diff --git a/src/multiaddr/is-loopback.js b/src/multiaddr/is-loopback.js new file mode 100644 index 0000000..afd4943 --- /dev/null +++ b/src/multiaddr/is-loopback.js @@ -0,0 +1,16 @@ +'use strict' + +const isLoopbackAddr = require('is-loopback-addr') + +/** + * Check if a given multiaddr is a loopback address. + * @param {Multiaddr} ma + * @returns {boolean} + */ +function isLoopback (ma) { + const { address } = ma.nodeAddress() + + return isLoopbackAddr(address) +} + +module.exports = isLoopback diff --git a/src/multiaddr/is-private.js b/src/multiaddr/is-private.js new file mode 100644 index 0000000..733941c --- /dev/null +++ b/src/multiaddr/is-private.js @@ -0,0 +1,16 @@ +'use strict' + +const isIpPrivate = require('private-ip') + +/** + * Check if a given multiaddr has a private address. + * @param {Multiaddr} ma + * @returns {boolean} + */ +function isPrivate (ma) { + const { address } = ma.nodeAddress() + + return isIpPrivate(address) +} + +module.exports = isPrivate diff --git a/test/multiaddr/is-loopback.spec.js b/test/multiaddr/is-loopback.spec.js new file mode 100644 index 0000000..59beab1 --- /dev/null +++ b/test/multiaddr/is-loopback.spec.js @@ -0,0 +1,45 @@ +/* eslint-env mocha */ +'use strict' + +const { expect } = require('aegir/utils/chai') +const multiaddr = require('multiaddr') + +const isLoopback = require('../../src/multiaddr/is-loopback') + +describe('multiaddr isLoopback', () => { + it('identifies loopback ip4 multiaddrs', () => { + const m1 = multiaddr('/ip4/127.0.0.1/tcp/1000') + const m2 = multiaddr('/ip4/127.0.1.1/tcp/1000') + const m3 = multiaddr('/ip4/127.1.1.1/tcp/1000') + const m4 = multiaddr('/ip4/127.255.255.255/tcp/1000') + + expect(isLoopback(m1)).to.eql(true) + expect(isLoopback(m2)).to.eql(true) + expect(isLoopback(m3)).to.eql(true) + expect(isLoopback(m4)).to.eql(true) + }) + + it('identifies non loopback ip4 multiaddrs', () => { + const m1 = multiaddr('/ip4/101.0.26.90/tcp/1000') + const m2 = multiaddr('/ip4/10.0.0.1/tcp/1000') + const m3 = multiaddr('/ip4/192.168.0.1/tcp/1000') + const m4 = multiaddr('/ip4/172.16.0.1/tcp/1000') + + expect(isLoopback(m1)).to.eql(false) + expect(isLoopback(m2)).to.eql(false) + expect(isLoopback(m3)).to.eql(false) + expect(isLoopback(m4)).to.eql(false) + }) + + it('identifies loopback ip6 multiaddrs', () => { + const m1 = multiaddr('/ip6/::1/tcp/1000') + + expect(isLoopback(m1)).to.eql(true) + }) + + it('identifies non loopback ip6 multiaddrs', () => { + const m1 = multiaddr('/ip6/2001:8a0:7ac5:4201:3ac9:86ff:fe31:7095/tcp/1000') + + expect(isLoopback(m1)).to.eql(false) + }) +}) diff --git a/test/is-multiaddr-private.spec.js b/test/multiaddr/is-private.spec.js similarity index 62% rename from test/is-multiaddr-private.spec.js rename to test/multiaddr/is-private.spec.js index 985e17d..8de3e4c 100644 --- a/test/is-multiaddr-private.spec.js +++ b/test/multiaddr/is-private.spec.js @@ -4,19 +4,19 @@ const { expect } = require('aegir/utils/chai') const multiaddr = require('multiaddr') -const isMultiaddrPrivate = require('../src/is-multiaddr-private') +const isPrivate = require('../../src/multiaddr/is-private') -describe('isMultiaddrPrivate', () => { +describe('multiaddr isPrivate', () => { it('identifies private ip4 multiaddrs', () => { const m1 = multiaddr('/ip4/127.0.0.1/tcp/1000') const m2 = multiaddr('/ip4/10.0.0.1/tcp/1000') const m3 = multiaddr('/ip4/192.168.0.1/tcp/1000') const m4 = multiaddr('/ip4/172.16.0.1/tcp/1000') - expect(isMultiaddrPrivate(m1)).to.eql(true) - expect(isMultiaddrPrivate(m2)).to.eql(true) - expect(isMultiaddrPrivate(m3)).to.eql(true) - expect(isMultiaddrPrivate(m4)).to.eql(true) + expect(isPrivate(m1)).to.eql(true) + expect(isPrivate(m2)).to.eql(true) + expect(isPrivate(m3)).to.eql(true) + expect(isPrivate(m4)).to.eql(true) }) it('identifies public ip4 multiaddrs', () => { @@ -25,27 +25,27 @@ describe('isMultiaddrPrivate', () => { const m3 = multiaddr('/ip4/92.168.0.1/tcp/1000') const m4 = multiaddr('/ip4/2.16.0.1/tcp/1000') - expect(isMultiaddrPrivate(m1)).to.eql(false) - expect(isMultiaddrPrivate(m2)).to.eql(false) - expect(isMultiaddrPrivate(m3)).to.eql(false) - expect(isMultiaddrPrivate(m4)).to.eql(false) + expect(isPrivate(m1)).to.eql(false) + expect(isPrivate(m2)).to.eql(false) + expect(isPrivate(m3)).to.eql(false) + expect(isPrivate(m4)).to.eql(false) }) it('identifies private ip6 multiaddrs', () => { const m1 = multiaddr('/ip6/fd52:8342:fc46:6c91:3ac9:86ff:fe31:7095/tcp/1000') - expect(isMultiaddrPrivate(m1)).to.eql(true) + expect(isPrivate(m1)).to.eql(true) }) it('identifies public ip6 multiaddrs', () => { const m1 = multiaddr('/ip6/2001:8a0:7ac5:4201:3ac9:86ff:fe31:7095/tcp/1000') - expect(isMultiaddrPrivate(m1)).to.eql(false) + expect(isPrivate(m1)).to.eql(false) }) it('identifies dns multiaddrs as not private', () => { const m1 = multiaddr('/dns4/wss0.bootstrap.libp2p.io/tcp/443') - expect(isMultiaddrPrivate(m1)).to.eql(false) + expect(isPrivate(m1)).to.eql(false) }) }) From e8409c55b02498822a2a32508be8a64ca717ccf8 Mon Sep 17 00:00:00 2001 From: Vasco Santos Date: Wed, 7 Oct 2020 11:25:21 +0200 Subject: [PATCH 3/5] chore: update aegir --- package.json | 2 +- src/array-equals.js | 1 + src/multiaddr/is-loopback.js | 1 + src/multiaddr/is-private.js | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 68d7dab..15ad818 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ }, "homepage": "https://github.com/libp2p/js-libp2p-utils#readme", "devDependencies": { - "aegir": "^26.0.0", + "aegir": "^27.0.0", "it-pair": "^1.0.0", "it-pipe": "^1.1.0", "streaming-iterables": "^5.0.3" diff --git a/src/array-equals.js b/src/array-equals.js index e293167..4679e27 100644 --- a/src/array-equals.js +++ b/src/array-equals.js @@ -3,6 +3,7 @@ /** * Verify if two arrays of non primitive types with the "equals" function are equal. * Compatible with multiaddr, peer-id and Buffer. + * * @param {Array<*>} a * @param {Array<*>} b * @returns {boolean} diff --git a/src/multiaddr/is-loopback.js b/src/multiaddr/is-loopback.js index afd4943..1c11c1c 100644 --- a/src/multiaddr/is-loopback.js +++ b/src/multiaddr/is-loopback.js @@ -4,6 +4,7 @@ const isLoopbackAddr = require('is-loopback-addr') /** * Check if a given multiaddr is a loopback address. + * * @param {Multiaddr} ma * @returns {boolean} */ diff --git a/src/multiaddr/is-private.js b/src/multiaddr/is-private.js index 733941c..69192b7 100644 --- a/src/multiaddr/is-private.js +++ b/src/multiaddr/is-private.js @@ -4,6 +4,7 @@ const isIpPrivate = require('private-ip') /** * Check if a given multiaddr has a private address. + * * @param {Multiaddr} ma * @returns {boolean} */ From b47bf6f7da448385cadb2ecb61e3982e7bc1144b Mon Sep 17 00:00:00 2001 From: Vasco Santos Date: Wed, 7 Oct 2020 14:40:32 +0200 Subject: [PATCH 4/5] chore: add docs and more tests --- README.md | 54 +++++++++++++++++++++++++ test/multiaddr/is-loopback.spec.js | 58 ++++++++++++++++----------- test/multiaddr/is-private.spec.js | 63 +++++++++++++++++------------- 3 files changed, 124 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 5553afd..517ded6 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,60 @@ const ipAndPortToMultiaddr = require('libp2p-utils/src/ip-port-to-multiaddr') const ma = ipAndPortToMultiaddr('127.0.0.1', 9000) ``` +## API + +### multiaddr `.isLoopback(ma)` + +Check if a given multiaddr is a loopback address. + +##### Parameters + +| Name | Type | Description | +|------|------|-------------| +| ma | `Multiaddr` | multiaddr to verify | + +##### Returns + +| Type | Description | +|------|-------------| +| `boolean` | returns true if multiaddr is a loopback address, false otherwise | + +##### Example + +```js +const multiaddr = require('multiaddr') +const isLoopback = require('libp2p-utils/src/multiaddr/is-loopback') + +const ma = multiaddr('/ip4/127.0.0.1/tcp/1000') +isMultiaddrLoopbackAddrs = isLoopback(ma) +``` + +#### multiaddr `.isPrivate(ma)` + +Check if a given multiaddr has a private address. + +##### Parameters + +| Name | Type | Description | +|------|------|-------------| +| ma | `Multiaddr` | multiaddr to verify | + +##### Returns + +| Type | Description | +|------|-------------| +| `boolean` | returns true if multiaddr is a private address, false otherwise | + +##### Example + +```js +const multiaddr = require('multiaddr') +const isPrivate = require('libp2p-utils/src/multiaddr/is-private') + +const ma = multiaddr('/ip4/10.0.0.1/tcp/1000') +isMultiaddrPrivateAddrs = isPrivate(ma) +``` + ## Contribute Contributions welcome. Please check out [the issues](https://github.com/libp2p/js-libp2p-utils/issues). diff --git a/test/multiaddr/is-loopback.spec.js b/test/multiaddr/is-loopback.spec.js index 59beab1..2880973 100644 --- a/test/multiaddr/is-loopback.spec.js +++ b/test/multiaddr/is-loopback.spec.js @@ -8,38 +8,50 @@ const isLoopback = require('../../src/multiaddr/is-loopback') describe('multiaddr isLoopback', () => { it('identifies loopback ip4 multiaddrs', () => { - const m1 = multiaddr('/ip4/127.0.0.1/tcp/1000') - const m2 = multiaddr('/ip4/127.0.1.1/tcp/1000') - const m3 = multiaddr('/ip4/127.1.1.1/tcp/1000') - const m4 = multiaddr('/ip4/127.255.255.255/tcp/1000') - - expect(isLoopback(m1)).to.eql(true) - expect(isLoopback(m2)).to.eql(true) - expect(isLoopback(m3)).to.eql(true) - expect(isLoopback(m4)).to.eql(true) + [ + multiaddr('/ip4/127.0.0.1/tcp/1000'), + multiaddr('/ip4/127.0.1.1/tcp/1000'), + multiaddr('/ip4/127.1.1.1/tcp/1000'), + multiaddr('/ip4/127.255.255.255/tcp/1000') + ].forEach(ma => { + expect(isLoopback(ma)).to.eql(true) + }) }) it('identifies non loopback ip4 multiaddrs', () => { - const m1 = multiaddr('/ip4/101.0.26.90/tcp/1000') - const m2 = multiaddr('/ip4/10.0.0.1/tcp/1000') - const m3 = multiaddr('/ip4/192.168.0.1/tcp/1000') - const m4 = multiaddr('/ip4/172.16.0.1/tcp/1000') - - expect(isLoopback(m1)).to.eql(false) - expect(isLoopback(m2)).to.eql(false) - expect(isLoopback(m3)).to.eql(false) - expect(isLoopback(m4)).to.eql(false) + [ + multiaddr('/ip4/101.0.26.90/tcp/1000'), + multiaddr('/ip4/10.0.0.1/tcp/1000'), + multiaddr('/ip4/192.168.0.1/tcp/1000'), + multiaddr('/ip4/172.16.0.1/tcp/1000') + ].forEach(ma => { + expect(isLoopback(ma)).to.eql(false) + }) }) it('identifies loopback ip6 multiaddrs', () => { - const m1 = multiaddr('/ip6/::1/tcp/1000') - - expect(isLoopback(m1)).to.eql(true) + [ + multiaddr('/ip6/::1/tcp/1000') + ].forEach(ma => { + expect(isLoopback(ma)).to.eql(true) + }) }) it('identifies non loopback ip6 multiaddrs', () => { - const m1 = multiaddr('/ip6/2001:8a0:7ac5:4201:3ac9:86ff:fe31:7095/tcp/1000') + [ + multiaddr('/ip6/2001:8a0:7ac5:4201:3ac9:86ff:fe31:7095/tcp/1000'), + multiaddr('/ip6/::/tcp/1000') + ].forEach(ma => { + expect(isLoopback(ma)).to.eql(false) + }) + }) - expect(isLoopback(m1)).to.eql(false) + it('identifies other multiaddrs as not loopback addresses', () => { + [ + multiaddr('/dns4/wss0.bootstrap.libp2p.io/tcp/443'), + multiaddr('/dns6/wss0.bootstrap.libp2p.io/tcp/443') + ].forEach(ma => { + expect(isLoopback(ma)).to.eql(false) + }) }) }) diff --git a/test/multiaddr/is-private.spec.js b/test/multiaddr/is-private.spec.js index 8de3e4c..aef5503 100644 --- a/test/multiaddr/is-private.spec.js +++ b/test/multiaddr/is-private.spec.js @@ -8,44 +8,51 @@ const isPrivate = require('../../src/multiaddr/is-private') describe('multiaddr isPrivate', () => { it('identifies private ip4 multiaddrs', () => { - const m1 = multiaddr('/ip4/127.0.0.1/tcp/1000') - const m2 = multiaddr('/ip4/10.0.0.1/tcp/1000') - const m3 = multiaddr('/ip4/192.168.0.1/tcp/1000') - const m4 = multiaddr('/ip4/172.16.0.1/tcp/1000') - - expect(isPrivate(m1)).to.eql(true) - expect(isPrivate(m2)).to.eql(true) - expect(isPrivate(m3)).to.eql(true) - expect(isPrivate(m4)).to.eql(true) + [ + multiaddr('/ip4/127.0.0.1/tcp/1000'), + multiaddr('/ip4/10.0.0.1/tcp/1000'), + multiaddr('/ip4/192.168.0.1/tcp/1000'), + multiaddr('/ip4/172.16.0.1/tcp/1000') + ].forEach(ma => { + expect(isPrivate(ma)).to.eql(true) + }) }) it('identifies public ip4 multiaddrs', () => { - const m1 = multiaddr('/ip4/101.0.26.90/tcp/1000') - const m2 = multiaddr('/ip4/40.1.20.9/tcp/1000') - const m3 = multiaddr('/ip4/92.168.0.1/tcp/1000') - const m4 = multiaddr('/ip4/2.16.0.1/tcp/1000') - - expect(isPrivate(m1)).to.eql(false) - expect(isPrivate(m2)).to.eql(false) - expect(isPrivate(m3)).to.eql(false) - expect(isPrivate(m4)).to.eql(false) + [ + multiaddr('/ip4/101.0.26.90/tcp/1000'), + multiaddr('/ip4/40.1.20.9/tcp/1000'), + multiaddr('/ip4/92.168.0.1/tcp/1000'), + multiaddr('/ip4/2.16.0.1/tcp/1000') + ].forEach(ma => { + expect(isPrivate(ma)).to.eql(false) + }) }) it('identifies private ip6 multiaddrs', () => { - const m1 = multiaddr('/ip6/fd52:8342:fc46:6c91:3ac9:86ff:fe31:7095/tcp/1000') - - expect(isPrivate(m1)).to.eql(true) + [ + multiaddr('/ip6/fd52:8342:fc46:6c91:3ac9:86ff:fe31:7095/tcp/1000'), + multiaddr('/ip6/fd52:8342:fc46:6c91:3ac9:86ff:fe31:1/tcp/1000') + ].forEach(ma => { + expect(isPrivate(ma)).to.eql(true) + }) }) it('identifies public ip6 multiaddrs', () => { - const m1 = multiaddr('/ip6/2001:8a0:7ac5:4201:3ac9:86ff:fe31:7095/tcp/1000') - - expect(isPrivate(m1)).to.eql(false) + [ + multiaddr('/ip6/2001:8a0:7ac5:4201:3ac9:86ff:fe31:7095/tcp/1000'), + multiaddr('/ip6/2000:8a0:7ac5:4201:3ac9:86ff:fe31:7095/tcp/1000') + ].forEach(ma => { + expect(isPrivate(ma)).to.eql(false) + }) }) - it('identifies dns multiaddrs as not private', () => { - const m1 = multiaddr('/dns4/wss0.bootstrap.libp2p.io/tcp/443') - - expect(isPrivate(m1)).to.eql(false) + it('identifies other multiaddrs as not private addresses', () => { + [ + multiaddr('/dns4/wss0.bootstrap.libp2p.io/tcp/443'), + multiaddr('/dns6/wss0.bootstrap.libp2p.io/tcp/443') + ].forEach(ma => { + expect(isPrivate(ma)).to.eql(false) + }) }) }) From 45c82dfe02617114e5e6be7a7ba0f3a069398f86 Mon Sep 17 00:00:00 2001 From: Vasco Santos Date: Wed, 7 Oct 2020 16:44:27 +0200 Subject: [PATCH 5/5] fix: markdown --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 517ded6..471eaea 100644 --- a/README.md +++ b/README.md @@ -44,19 +44,19 @@ const ma = ipAndPortToMultiaddr('127.0.0.1', 9000) Check if a given multiaddr is a loopback address. -##### Parameters +#### Parameters | Name | Type | Description | |------|------|-------------| | ma | `Multiaddr` | multiaddr to verify | -##### Returns +#### Returns | Type | Description | |------|-------------| | `boolean` | returns true if multiaddr is a loopback address, false otherwise | -##### Example +#### Example ```js const multiaddr = require('multiaddr') @@ -66,23 +66,23 @@ const ma = multiaddr('/ip4/127.0.0.1/tcp/1000') isMultiaddrLoopbackAddrs = isLoopback(ma) ``` -#### multiaddr `.isPrivate(ma)` +### multiaddr `.isPrivate(ma)` Check if a given multiaddr has a private address. -##### Parameters +#### Parameters | Name | Type | Description | |------|------|-------------| | ma | `Multiaddr` | multiaddr to verify | -##### Returns +#### Returns | Type | Description | |------|-------------| | `boolean` | returns true if multiaddr is a private address, false otherwise | -##### Example +#### Example ```js const multiaddr = require('multiaddr')