mirror of
https://github.com/fluencelabs/js-libp2p-utils
synced 2025-04-24 17:52:19 +00:00
feat: address sorter (#13)
This commit is contained in:
parent
301c63a91e
commit
cb5e71644b
40
API.md
40
API.md
@ -1,5 +1,9 @@
|
|||||||
# API
|
# API
|
||||||
|
|
||||||
|
* [addressSort.publicAddressesFirst(addresses)](#addresssortpublicaddressesfirstaddresses)
|
||||||
|
* [Parameters](#parameters)
|
||||||
|
* [Returns](#returns)
|
||||||
|
* [Example](#example)
|
||||||
* [arrayEquals(a, b)](#arrayequalsa-b)
|
* [arrayEquals(a, b)](#arrayequalsa-b)
|
||||||
* [Parameters](#parameters)
|
* [Parameters](#parameters)
|
||||||
* [Returns](#returns)
|
* [Returns](#returns)
|
||||||
@ -21,6 +25,42 @@
|
|||||||
* [Returns](#returns-4)
|
* [Returns](#returns-4)
|
||||||
* [Example](#example-4)
|
* [Example](#example-4)
|
||||||
|
|
||||||
|
## addressSort.publicAddressesFirst(addresses)
|
||||||
|
|
||||||
|
Sort given addresses by putting public addresses first. In case of equality, a certified address will come first.
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
|------|------|-------------|
|
||||||
|
| addresses | `Array<Address>` | Array of AddressBook addresses |
|
||||||
|
|
||||||
|
### Returns
|
||||||
|
|
||||||
|
| Type | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| `Array<Address>` | returns array of sorted addresses |
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```js
|
||||||
|
const multiaddr = require('multiaddr')
|
||||||
|
const { publicAddressesFirst } = require('libp2p-utils/src/address-sort')
|
||||||
|
|
||||||
|
const addresses = [
|
||||||
|
{
|
||||||
|
multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000'),
|
||||||
|
isCertified: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000'),
|
||||||
|
isCertified: false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
const sortedAddresses = publicAddressesFirst(addresses)
|
||||||
|
```
|
||||||
|
|
||||||
## arrayEquals(a, b)
|
## arrayEquals(a, b)
|
||||||
|
|
||||||
Verify if two arrays of non primitive types with the "equals" function are equal.
|
Verify if two arrays of non primitive types with the "equals" function are equal.
|
||||||
|
44
src/address-sort.js
Normal file
44
src/address-sort.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
const isPrivate = require('./multiaddr/is-private')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare function for array.sort().
|
||||||
|
* This sort aims to move the private adresses to the end of the array.
|
||||||
|
* In case of equality, a certified address will come first.
|
||||||
|
*
|
||||||
|
* @param {Address} a
|
||||||
|
* @param {Address} b
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
function addressesPublicFirstCompareFunction (a, b) {
|
||||||
|
const isAPrivate = isPrivate(a.multiaddr)
|
||||||
|
const isBPrivate = isPrivate(b.multiaddr)
|
||||||
|
|
||||||
|
if (isAPrivate && !isBPrivate) {
|
||||||
|
return 1
|
||||||
|
} else if (!isAPrivate && isBPrivate) {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
// Check certified?
|
||||||
|
if (a.isCertified && !b.isCertified) {
|
||||||
|
return -1
|
||||||
|
} else if (!a.isCertified && b.isCertified) {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sort given addresses by putting public addresses first.
|
||||||
|
* In case of equality, a certified address will come first.
|
||||||
|
*
|
||||||
|
* @param {Array<Address>} addresses
|
||||||
|
* @returns {Array<Address>}
|
||||||
|
*/
|
||||||
|
function publicAddressesFirst (addresses) {
|
||||||
|
return [...addresses].sort(addressesPublicFirstCompareFunction)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.publicAddressesFirst = publicAddressesFirst
|
53
test/address-sort.spec.js
Normal file
53
test/address-sort.spec.js
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
'use strict'
|
||||||
|
/* eslint-env mocha */
|
||||||
|
|
||||||
|
const { expect } = require('aegir/utils/chai')
|
||||||
|
const multiaddr = require('multiaddr')
|
||||||
|
|
||||||
|
const { publicAddressesFirst } = require('../src/address-sort')
|
||||||
|
|
||||||
|
describe('address-sort', () => {
|
||||||
|
it('should sort public addresses first', () => {
|
||||||
|
const addresses = [
|
||||||
|
{
|
||||||
|
multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000'),
|
||||||
|
isCertified: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000'),
|
||||||
|
isCertified: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
multiaddr: multiaddr('/ip4/31.0.0.1/tcp/4000'),
|
||||||
|
isCertified: false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
const sortedAddresses = publicAddressesFirst(addresses)
|
||||||
|
expect(sortedAddresses[0].multiaddr.equals(multiaddr('/ip4/30.0.0.1/tcp/4000'))).to.eql(true)
|
||||||
|
expect(sortedAddresses[1].multiaddr.equals(multiaddr('/ip4/31.0.0.1/tcp/4000'))).to.eql(true)
|
||||||
|
expect(sortedAddresses[2].multiaddr.equals(multiaddr('/ip4/127.0.0.1/tcp/4000'))).to.eql(true)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should sort public certified addresses first', () => {
|
||||||
|
const addresses = [
|
||||||
|
{
|
||||||
|
multiaddr: multiaddr('/ip4/127.0.0.1/tcp/4000'),
|
||||||
|
isCertified: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
multiaddr: multiaddr('/ip4/30.0.0.1/tcp/4000'),
|
||||||
|
isCertified: false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
multiaddr: multiaddr('/ip4/31.0.0.1/tcp/4000'),
|
||||||
|
isCertified: true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
const sortedAddresses = publicAddressesFirst(addresses)
|
||||||
|
expect(sortedAddresses[0].multiaddr.equals(multiaddr('/ip4/31.0.0.1/tcp/4000'))).to.eql(true)
|
||||||
|
expect(sortedAddresses[1].multiaddr.equals(multiaddr('/ip4/30.0.0.1/tcp/4000'))).to.eql(true)
|
||||||
|
expect(sortedAddresses[2].multiaddr.equals(multiaddr('/ip4/127.0.0.1/tcp/4000'))).to.eql(true)
|
||||||
|
})
|
||||||
|
})
|
Loading…
x
Reference in New Issue
Block a user