UNPKG

1.06 kBJavaScriptView Raw
1'use strict'
2
3const errcode = require('err-code')
4const uint8ArrayToString = require('uint8arrays/to-string')
5
6/**
7 * Select the best record out of the given records.
8 *
9 * @param {import('libp2p-interfaces/src/types').DhtSelectors} selectors
10 * @param {Uint8Array} k
11 * @param {Array<Uint8Array>} records
12 */
13const bestRecord = (selectors, k, records) => {
14 if (records.length === 0) {
15 const errMsg = 'No records given'
16
17 throw errcode(new Error(errMsg), 'ERR_NO_RECORDS_RECEIVED')
18 }
19
20 const kStr = uint8ArrayToString(k)
21 const parts = kStr.split('/')
22
23 if (parts.length < 3) {
24 const errMsg = 'Record key does not have a selector function'
25
26 throw errcode(new Error(errMsg), 'ERR_NO_SELECTOR_FUNCTION_FOR_RECORD_KEY')
27 }
28
29 const selector = selectors[parts[1].toString()]
30
31 if (!selector) {
32 const errMsg = `Unrecognized key prefix: ${parts[1]}`
33
34 throw errcode(new Error(errMsg), 'ERR_UNRECOGNIZED_KEY_PREFIX')
35 }
36
37 return selector(k, records)
38}
39
40module.exports = {
41 bestRecord: bestRecord,
42 selectors: require('./selectors')
43}