chore: update aegir

This commit is contained in:
Vasco Santos
2021-03-26 18:24:45 +01:00
parent cec3ce7bb6
commit a3a2f15b19
59 changed files with 590 additions and 267 deletions

View File

@@ -1,5 +1,6 @@
'use strict'
const path = require('path')
const Libp2p = require('./src')
const { MULTIADDRS_WEBSOCKETS } = require('./test/fixtures/browser')
const Peers = require('./test/fixtures/peers')
@@ -47,16 +48,23 @@ const after = async () => {
await libp2p.stop()
}
/** @type {import('aegir').Options["build"]["config"]} */
const esbuild = {
inject: [path.join(__dirname, './scripts/node-globals.js')]
}
/** @type {import('aegir').PartialOptions} */
module.exports = {
bundlesize: { maxSize: '225kB' },
hooks: {
pre: before,
post: after
build: {
bundlesizeMax: '225kB'
},
webpack: {
node: {
// needed by bcrypto
Buffer: true
test: {
before,
after,
browser: {
config: {
buildConfig: esbuild
}
}
}
}

View File

@@ -54,8 +54,15 @@
"browser": {
"@motrix/nat-api": false
},
"eslintConfig": {
"extends": "ipfs",
"ignorePatterns": [
"!.aegir.js"
]
},
"dependencies": {
"@motrix/nat-api": "^0.3.1",
"@types/varint": "^6.0.0",
"abort-controller": "^3.0.0",
"aggregate-error": "^3.1.0",
"any-signal": "^2.1.1",
@@ -63,9 +70,9 @@
"cids": "^1.1.5",
"class-is": "^1.1.0",
"debug": "^4.3.1",
"err-code": "^2.0.0",
"err-code": "^3.0.0",
"es6-promisify": "^6.1.1",
"events": "^3.2.0",
"events": "^3.3.0",
"hashlru": "^2.3.0",
"interface-datastore": "^3.0.3",
"ipfs-utils": "^6.0.0",
@@ -83,42 +90,43 @@
"it-take": "1.0.0",
"libp2p-crypto": "^0.19.0",
"libp2p-interfaces": "libp2p/js-libp2p-interfaces#chore/update-types",
"libp2p-utils": "^0.2.2",
"libp2p-utils": "libp2p/js-libp2p-utils#feat/add-types",
"mafmt": "^8.0.0",
"merge-options": "^3.0.4",
"moving-average": "^1.0.0",
"multiaddr": "^8.1.0",
"multicodec": "^2.1.0",
"multihashing-async": "^2.0.1",
"multicodec": "^3.0.1",
"multihashing-async": "^2.1.2",
"multistream-select": "^1.0.0",
"mutable-proxy": "^1.0.0",
"node-forge": "^0.10.0",
"p-any": "^3.0.0",
"p-fifo": "^1.0.0",
"p-retry": "^4.2.0",
"p-settle": "^4.0.1",
"p-retry": "^4.4.0",
"p-settle": "^4.1.1",
"peer-id": "^0.14.2",
"private-ip": "^2.0.0",
"private-ip": "^2.1.0",
"protons": "^2.0.0",
"retimer": "^2.0.0",
"retimer": "^3.0.0",
"sanitize-filename": "^1.6.3",
"set-delayed-interval": "^1.0.0",
"streaming-iterables": "^5.0.2",
"timeout-abort-controller": "^1.1.1",
"varint": "^6.0.0",
"xsalsa20": "^1.0.2"
"xsalsa20": "^1.1.0"
},
"devDependencies": {
"@nodeutils/defaults-deep": "^1.1.0",
"@types/es6-promisify": "^6.0.0",
"@types/node-forge": "^0.9.7",
"abortable-iterator": "^3.0.0",
"aegir": "^29.2.0",
"aegir": "^32.1.0",
"chai-bytes": "^0.1.2",
"chai-string": "^1.5.0",
"delay": "^4.4.0",
"delay": "^5.0.0",
"interop-libp2p": "^0.3.0",
"into-stream": "^6.0.0",
"ipfs-http-client": "^48.2.2",
"ipfs-http-client": "^49.0.4",
"it-concat": "^1.0.0",
"it-pair": "^1.0.0",
"it-pushable": "^1.4.0",
@@ -128,22 +136,24 @@
"libp2p-delegated-peer-routing": "^0.8.0",
"libp2p-floodsub": "^0.24.0",
"libp2p-gossipsub": "^0.8.0",
"libp2p-kad-dht": "^0.20.5",
"libp2p-kad-dht": "^0.21.0",
"libp2p-mdns": "^0.15.0",
"libp2p-mplex": "^0.10.1",
"libp2p-noise": "^2.0.0",
"libp2p-secio": "^0.13.1",
"libp2p-tcp": "^0.15.1",
"libp2p-webrtc-star": "^0.20.0",
"libp2p-webrtc-star": "^0.21.2",
"libp2p-websockets": "^0.15.0",
"multihashes": "^3.0.1",
"multihashes": "^4.0.2",
"nock": "^13.0.3",
"p-defer": "^3.0.0",
"p-times": "^3.0.0",
"p-wait-for": "^3.2.0",
"rimraf": "^3.0.2",
"sinon": "^9.2.4",
"uint8arrays": "^2.0.5"
"sinon": "^10.0.0",
"uint8arrays": "^2.1.3",
"url": "^0.11.0",
"util": "^0.12.3"
},
"contributors": [
"David Dias <daviddias.p@gmail.com>",

3
scripts/node-globals.js Normal file
View File

@@ -0,0 +1,3 @@
// @ts-nocheck
export const { Buffer } = require('buffer')
export const url = require('url')

View File

@@ -20,7 +20,7 @@ const multicodec = require('./../multicodec')
/**
* @typedef {import('../../types').CircuitRequest} CircuitRequest
* @typedef {import('libp2p-interfaces/src/connection').Connection} Connection
* @typedef {import('./stream-handler')<CircuitRequest>} StreamHandlerT
* @typedef {import('libp2p-interfaces/src/stream-muxer/types').MuxedStream} MuxedStream
* @typedef {import('../transport')} Transport
*/
@@ -28,7 +28,7 @@ const multicodec = require('./../multicodec')
* @typedef {Object} HopRequest
* @property {Connection} connection
* @property {CircuitRequest} request
* @property {StreamHandlerT} streamHandler
* @property {StreamHandler} streamHandler
* @property {Transport} circuit
*/
@@ -58,6 +58,11 @@ async function handleHop ({
return log.error('invalid hop request via peer %s', connection.remotePeer.toB58String(), err)
}
if (!request.dstPeer) {
log('HOP request received but we do not receive a dstPeer')
return
}
// Get the connection to the destination (stop) peer
const destinationPeer = new PeerId(request.dstPeer.id)
@@ -114,7 +119,7 @@ async function handleHop ({
* @param {object} options
* @param {Connection} options.connection - Connection to the relay
* @param {CircuitRequest} options.request
* @returns {Promise<Connection>}
* @returns {Promise<MuxedStream>}
*/
async function hop ({
connection,
@@ -128,6 +133,10 @@ async function hop ({
const response = await streamHandler.read()
if (!response) {
throw errCode(new Error('HOP request had no response'), Errors.ERR_HOP_REQUEST_FAILED)
}
if (response.code === CircuitPB.Status.SUCCESS) {
log('hop request was successful')
return streamHandler.rest()
@@ -159,7 +168,7 @@ async function canHop ({
const response = await streamHandler.read()
await streamHandler.close()
if (response.code !== CircuitPB.Status.SUCCESS) {
if (!response || response.code !== CircuitPB.Status.SUCCESS) {
return false
}
@@ -171,7 +180,7 @@ async function canHop ({
*
* @param {Object} options
* @param {Connection} options.connection
* @param {StreamHandlerT} options.streamHandler
* @param {StreamHandler} options.streamHandler
* @param {Transport} options.circuit
* @private
*/

View File

@@ -14,7 +14,7 @@ const { validateAddrs } = require('./utils')
* @typedef {import('libp2p-interfaces/src/connection').Connection} Connection
* @typedef {import('libp2p-interfaces/src/stream-muxer/types').MuxedStream} MuxedStream
* @typedef {import('../../types').CircuitRequest} CircuitRequest
* @typedef {import('./stream-handler')<CircuitRequest>} StreamHandlerT
* @typedef {import('./stream-handler')} StreamHandlerT
*/
/**
@@ -68,6 +68,10 @@ module.exports.stop = async function stop ({
streamHandler.write(request)
const response = await streamHandler.read()
if (!response) {
return streamHandler.close()
}
if (response.code === CircuitPB.Status.SUCCESS) {
log('stop request to %s was successful', connection.remotePeer.toB58String())
return streamHandler.rest()

View File

@@ -6,16 +6,15 @@ const log = Object.assign(debug('libp2p:circuit:stream-handler'), {
})
const lp = require('it-length-prefixed')
// @ts-ignore it-handshake does not export types
const handshake = require('it-handshake')
const { CircuitRelay: CircuitPB } = require('../protocol')
/**
* @typedef {import('libp2p-interfaces/src/stream-muxer/types').MuxedStream} MuxedStream
* @typedef {import('../../types').CircuitRequest} CircuitRequest
*/
/**
* @template T
*/
class StreamHandler {
/**
* Create a stream handler for connection
@@ -36,7 +35,7 @@ class StreamHandler {
* Read and decode message
*
* @async
* @returns {Promise<T|undefined>}
* @returns {Promise<CircuitRequest|undefined>}
*/
async read () {
const msg = await this.decoder.next()
@@ -54,7 +53,7 @@ class StreamHandler {
/**
* Encode and write array of buffers
*
* @param {CircuitPB} msg - An unencoded CircuitRelay protobuf message
* @param {CircuitRequest} msg - An unencoded CircuitRelay protobuf message
* @returns {void}
*/
write (msg) {
@@ -73,6 +72,9 @@ class StreamHandler {
return this.shake.stream
}
/**
* @param {CircuitRequest} msg - An unencoded CircuitRelay protobuf message
*/
end (msg) {
this.write(msg)
this.close()

View File

@@ -29,7 +29,7 @@ function writeResponse (streamHandler, status) {
*/
function validateAddrs (msg, streamHandler) {
try {
msg.dstPeer.addrs.forEach((addr) => {
msg.dstPeer.addrs.forEach((/** @type {string} */ addr) => {
return multiaddr(addr)
})
} catch (err) {
@@ -40,7 +40,7 @@ function validateAddrs (msg, streamHandler) {
}
try {
msg.srcPeer.addrs.forEach((addr) => {
msg.srcPeer.addrs.forEach((/** @type {string} */ addr) => {
return multiaddr(addr)
})
} catch (err) {

View File

@@ -8,13 +8,12 @@ const log = Object.assign(debug('libp2p:relay'), {
const {
setDelayedInterval,
clearDelayedInterval
// @ts-ignore set-delayed-interval does not export types
} = require('set-delayed-interval')
const AutoRelay = require('./auto-relay')
const { namespaceToCid } = require('./utils')
const {
ADVERTISE_BOOT_DELAY,
ADVERTISE_TTL,
RELAY_RENDEZVOUS_NS
} = require('./constants')
@@ -45,12 +44,6 @@ class Relay {
constructor (libp2p) {
this._libp2p = libp2p
this._options = {
advertise: {
bootDelay: ADVERTISE_BOOT_DELAY,
enabled: true,
ttl: ADVERTISE_TTL,
...libp2p._config.relay.advertise
},
...libp2p._config.relay
}

View File

@@ -1,4 +1,6 @@
'use strict'
// @ts-ignore protons does not have types
const protobuf = require('protons')
/** @type {{CircuitRelay: import('../../types').CircuitMessageProto}} */

View File

@@ -54,7 +54,7 @@ class Circuit {
* @param {MuxedStream} props.stream
*/
async _onProtocol ({ connection, stream }) {
/** @type {import('./circuit/stream-handler')<CircuitRequest>} */
/** @type {import('./circuit/stream-handler')} */
const streamHandler = new StreamHandler({ stream })
const request = await streamHandler.read()
@@ -96,7 +96,9 @@ class Circuit {
}
if (virtualConnection) {
// @ts-ignore dst peer will not be undefined
const remoteAddr = multiaddr(request.dstPeer.addrs[0])
// @ts-ignore src peer will not be undefined
const localAddr = multiaddr(request.srcPeer.addrs[0])
const maConn = toConnection({
stream: virtualConnection,

View File

@@ -1,6 +1,7 @@
'use strict'
const mergeOptions = require('merge-options')
// @ts-ignore no types in multiaddr
const { dnsaddrResolver } = require('multiaddr/src/resolvers')
const Constants = require('./constants')
@@ -10,11 +11,18 @@ const RelayConstants = require('./circuit/constants')
const { publicAddressesFirst } = require('libp2p-utils/src/address-sort')
const { FaultTolerance } = require('./transport-manager')
/**
* @typedef {import('multiaddr')} Multiaddr
* @typedef {import('.').Libp2pOptions} Libp2pOptions
* @typedef {import('.').constructorOptions} constructorOptions
*/
const DefaultConfig = {
addresses: {
listen: [],
announce: [],
noAnnounce: []
noAnnounce: [],
announceFilter: (/** @type {Multiaddr[]} */ multiaddrs) => multiaddrs
},
connectionManager: {
minConnections: 25
@@ -95,10 +103,15 @@ const DefaultConfig = {
}
}
/**
* @param {Libp2pOptions} opts
* @returns {DefaultConfig & Libp2pOptions & constructorOptions}
*/
module.exports.validate = (opts) => {
opts = mergeOptions(DefaultConfig, opts)
/** @type {DefaultConfig & Libp2pOptions & constructorOptions} */
const resultingOptions = mergeOptions(DefaultConfig, opts)
if (opts.modules.transport.length < 1) throw new Error("'options.modules.transport' must contain at least 1 transport")
if (resultingOptions.modules.transport.length < 1) throw new Error("'options.modules.transport' must contain at least 1 transport")
return opts
return resultingOptions
}

View File

@@ -8,6 +8,7 @@ const log = Object.assign(debug('libp2p:connection-manager'), {
const errcode = require('err-code')
const mergeOptions = require('merge-options')
const LatencyMonitor = require('./latency-monitor')
// @ts-ignore retimer does not have types
const retimer = require('retimer')
/** @typedef {import('../types').EventEmitterFactory} Events */
@@ -188,8 +189,10 @@ class ConnectionManager extends EventEmitter {
_checkMetrics () {
if (this._libp2p.metrics) {
const movingAverages = this._libp2p.metrics.global.movingAverages
// @ts-ignore moving averages object types
const received = movingAverages.dataReceived[this._options.movingAverageInterval].movingAverage()
this._checkMaxLimit('maxReceivedData', received)
// @ts-ignore moving averages object types
const sent = movingAverages.dataSent[this._options.movingAverageInterval].movingAverage()
this._checkMaxLimit('maxSentData', sent)
const total = received + sent
@@ -362,7 +365,7 @@ class ConnectionManager extends EventEmitter {
*/
_maybeDisconnectOne () {
if (this._options.minConnections < this.connections.size) {
const peerValues = Array.from(this._peerValues).sort(byPeerValue)
const peerValues = Array.from(new Map([...this._peerValues.entries()].sort((a, b) => a[1] - b[1])))
log('%s: sorted peer values: %j', this._peerId, peerValues)
const disconnectPeer = peerValues[0]
if (disconnectPeer) {
@@ -381,7 +384,3 @@ class ConnectionManager extends EventEmitter {
}
module.exports = ConnectionManager
function byPeerValue (peerValueEntryA, peerValueEntryB) {
return peerValueEntryA[1] - peerValueEntryB[1]
}

View File

@@ -59,7 +59,8 @@ class LatencyMonitor extends EventEmitter {
that._latecyCheckMultiply = 2 * (that.latencyRandomPercentage / 100.0) * that.latencyCheckIntervalMs
that._latecyCheckSubtract = that._latecyCheckMultiply / 2
that.dataEmitIntervalMs = (dataEmitIntervalMs === null || dataEmitIntervalMs === 0) ? undefined
that.dataEmitIntervalMs = (dataEmitIntervalMs === null || dataEmitIntervalMs === 0)
? undefined
: dataEmitIntervalMs || 5 * 1000 // 5s
debug('latencyCheckIntervalMs: %s dataEmitIntervalMs: %s',
that.latencyCheckIntervalMs, that.dataEmitIntervalMs)
@@ -174,7 +175,8 @@ class LatencyMonitor extends EventEmitter {
events: this._latencyData.events,
minMs: this._latencyData.minMs,
maxMs: this._latencyData.maxMs,
avgMs: this._latencyData.events ? this._latencyData.totalMs / this._latencyData.events
avgMs: this._latencyData.events
? this._latencyData.totalMs / this._latencyData.events
: Number.POSITIVE_INFINITY,
lengthMs: this.getDeltaMS(this._latencyData.startTime)
}

View File

@@ -16,6 +16,7 @@ const { pipe } = require('it-pipe')
* @typedef {import('peer-id')} PeerId
* @typedef {import('multiaddr')} Multiaddr
* @typedef {import('cids')} CID
* @typedef {import('libp2p-interfaces/src/content-routing/types').ContentRouting} ContentRoutingModule
*/
/**
@@ -31,6 +32,7 @@ class ContentRouting {
*/
constructor (libp2p) {
this.libp2p = libp2p
/** @type {ContentRoutingModule[]} */
this.routers = libp2p._modules.contentRouting || []
this.dht = libp2p._dht

View File

@@ -3,6 +3,7 @@
const errCode = require('err-code')
const AbortController = require('abort-controller').default
const { anySignal } = require('any-signal')
// @ts-ignore p-fifo does not export types
const FIFO = require('p-fifo')
const pAny = require('p-any')

View File

@@ -6,6 +6,7 @@ const log = Object.assign(debug('libp2p:dialer'), {
})
const errCode = require('err-code')
const multiaddr = require('multiaddr')
// @ts-ignore timeout-abourt-controles does not export types
const TimeoutController = require('timeout-abort-controller')
const { anySignal } = require('any-signal')
@@ -50,7 +51,7 @@ const {
* @typedef PendingDial
* @property {DialRequest} dialRequest
* @property {TimeoutController} controller
* @property {Promise} promise
* @property {Promise<Connection>} promise
* @property {function():void} destroy
*/
@@ -155,6 +156,7 @@ class Dialer {
knownAddrs.unshift(peer)
}
/** @type {Multiaddr[]} */
const addrs = []
for (const a of knownAddrs) {
const resolvedAddrs = await this._resolve(a)
@@ -177,6 +179,10 @@ class Dialer {
* @returns {PendingDial}
*/
_createPendingDial (dialTarget, options = {}) {
/**
* @param {multiaddr} addr
* @param {{ signal: { aborted: any; }; }} options
*/
const dialAction = (addr, options) => {
if (options.signal.aborted) throw errCode(new Error('already aborted'), codes.ERR_ALREADY_ABORTED)
return this.transportManager.dial(addr, options)
@@ -207,6 +213,9 @@ class Dialer {
return pendingDial
}
/**
* @param {number} num
*/
getTokens (num) {
const total = Math.min(num, this.maxDialsPerPeer, this.tokens.length)
const tokens = this.tokens.splice(0, total)
@@ -214,6 +223,9 @@ class Dialer {
return tokens
}
/**
* @param {number} token
*/
releaseToken (token) {
// Guard against duplicate releases
if (this.tokens.indexOf(token) > -1) return

View File

@@ -5,6 +5,7 @@ const log = Object.assign(debug('libp2p:identify'), {
error: debug('libp2p:identify:err')
})
const errCode = require('err-code')
// @ts-ignore it-protocol-buffers does not have types
const pb = require('it-protocol-buffers')
const lp = require('it-length-prefixed')
const { pipe } = require('it-pipe')
@@ -13,6 +14,7 @@ const uint8ArrayFromString = require('uint8arrays/from-string')
const PeerId = require('peer-id')
const multiaddr = require('multiaddr')
// @ts-ignore it-buffer does not have types
const { toBuffer } = require('it-buffer')
const Message = require('./message')
@@ -23,7 +25,6 @@ const PeerRecord = require('../record/peer-record')
const {
MULTICODEC_IDENTIFY,
MULTICODEC_IDENTIFY_PUSH,
AGENT_VERSION,
PROTOCOL_VERSION
} = require('./consts')
@@ -56,7 +57,6 @@ class IdentifyService {
// Store self host metadata
this._host = {
agentVersion: AGENT_VERSION,
protocolVersion: PROTOCOL_VERSION,
...libp2p._options.host
}
@@ -199,7 +199,7 @@ class IdentifyService {
// LEGACY: Update peers data in PeerStore
try {
this.peerStore.addressBook.set(id, listenAddrs.map((addr) => multiaddr(addr)))
this.peerStore.addressBook.set(id, listenAddrs.map((/** @type {string} */ addr) => multiaddr(addr)))
} catch (err) {
log.error('received invalid addrs', err)
}
@@ -312,7 +312,8 @@ class IdentifyService {
// LEGACY: Update peers data in PeerStore
try {
this.peerStore.addressBook.set(id, message.listenAddrs.map((addr) => multiaddr(addr)))
this.peerStore.addressBook.set(id,
message.listenAddrs.map((/** @type {string} */ addr) => multiaddr(addr)))
} catch (err) {
log.error('received invalid addrs', err)
}

View File

@@ -1,5 +1,6 @@
'use strict'
// @ts-ignore protons does not have types
const protons = require('protons')
const schema = `
message Identify {

View File

@@ -41,18 +41,24 @@ const { updateSelfPeerRecord } = require('./record/utils')
* @typedef {import('multiaddr')} Multiaddr
* @typedef {import('libp2p-interfaces/src/connection').Connection} Connection
* @typedef {import('libp2p-interfaces/src/stream-muxer/types').MuxedStream} MuxedStream
* @typedef {import('libp2p-interfaces/src/transport/types').TransportFactory} TransportFactory
* @typedef {import('libp2p-interfaces/src/transport/types').TransportFactory<any, any>} TransportFactory
* @typedef {import('libp2p-interfaces/src/stream-muxer/types').MuxerFactory} MuxerFactory
* @typedef {import('libp2p-interfaces/src/content-routing/types').ContentRouting} ContentRouting
* @typedef {import('libp2p-interfaces/src/peer-discovery/types').PeerDiscovery} PeerDiscovery
* @typedef {import('libp2p-interfaces/src/peer-routing/types').PeerRouting} PeerRouting
* @typedef {import('libp2p-interfaces/src/content-routing/types').ContentRouting} ContentRoutingModule
* @typedef {import('libp2p-interfaces/src/peer-discovery/types').PeerDiscovery} PeerDiscoveryModule
* @typedef {import('libp2p-interfaces/src/peer-routing/types').PeerRouting} PeerRoutingModule
* @typedef {import('libp2p-interfaces/src/crypto/types').Crypto} Crypto
* @typedef {import('libp2p-interfaces/src/pubsub')} Pubsub
* @typedef {import('libp2p-interfaces/src/pubsub').PubsubOptions} PubsubOptions
* @typedef {import('interface-datastore').Datastore} Datastore
* @typedef {import('./pnet')} Protector
*/
/**
* @typedef {Object} HandlerProps
* @property {Connection} connection
* @property {MuxedStream} stream
* @property {string} protocol
*
* @typedef {Object} RandomWalkOptions
* @property {boolean} [enabled = false]
* @property {number} [queriesPerPeriod = 1]
@@ -94,11 +100,12 @@ const { updateSelfPeerRecord } = require('./record/utils')
* @property {TransportFactory[]} transport
* @property {MuxerFactory[]} streamMuxer
* @property {Crypto[]} connEncryption
* @property {PeerDiscovery[]} [peerDiscovery]
* @property {PeerRouting[]} [peerRouting]
* @property {ContentRouting[]} [contentRouting]
* @property {PeerDiscoveryModule[]} [peerDiscovery]
* @property {PeerRoutingModule[]} [peerRouting]
* @property {ContentRoutingModule[]} [contentRouting]
* @property {Object} [dht]
* @property {Pubsub} [pubsub]
* @property {Protector} [connProtector]
*
* @typedef {Object} Libp2pOptions
* @property {Libp2pModules} modules libp2p modules to use
@@ -186,7 +193,9 @@ class Libp2p extends EventEmitter {
this._discovery = new Map() // Discovery service instances/references
// Create the Connection Manager
if (this._options.connectionManager.minPeers) { // Remove in 0.29
// @ts-ignore deprecated, needs to be removed on breaking change
if (this._options.connectionManager.minPeers) {
// @ts-ignore deprecated, needs to be removed on breaking change
this._options.connectionManager.minConnections = this._options.connectionManager.minPeers
}
this.connectionManager = new ConnectionManager(this, {
@@ -236,6 +245,7 @@ class Libp2p extends EventEmitter {
peerId: this.peerId,
addressManager: this.addressManager,
transportManager: this.transportManager,
// @ts-ignore Nat typedef is not understood as Object
...this._options.config.nat
})
@@ -297,6 +307,7 @@ class Libp2p extends EventEmitter {
// dht provided components (peerRouting, contentRouting, dht)
if (this._modules.dht) {
const DHT = this._modules.dht
// @ts-ignore Object is not constructable
this._dht = new DHT({
libp2p: this,
dialer: this.dialer,
@@ -455,7 +466,7 @@ class Libp2p extends EventEmitter {
* @returns {Promise<Connection>}
*/
dial (peer, options) {
return this.dialProtocol(peer, [], options)
return this._dial(peer, options)
}
/**
@@ -468,9 +479,26 @@ class Libp2p extends EventEmitter {
* @param {string[]|string} protocols
* @param {object} [options]
* @param {AbortSignal} [options.signal]
* @returns {Promise<Connection|*>}
* @returns {Promise<Connection|{ stream: MuxedStream; protocol: string; }>}
*/
async dialProtocol (peer, protocols, options) {
const connection = await this._dial(peer, options)
// If a protocol was provided, create a new stream
if (protocols && protocols.length) {
return connection.newStream(protocols)
}
return connection
}
/**
* @async
* @param {PeerId|Multiaddr|string} peer - The peer to dial
* @param {object} [options]
* @returns {Promise<Connection>}
*/
async _dial (peer, options) {
const { id, multiaddrs } = getPeer(peer)
if (id.equals(this.peerId)) {
@@ -485,11 +513,6 @@ class Libp2p extends EventEmitter {
this.peerStore.addressBook.add(id, multiaddrs)
}
// If a protocol was provided, create a new stream
if (protocols && protocols.length) {
return connection.newStream(protocols)
}
return connection
}
@@ -513,7 +536,7 @@ class Libp2p extends EventEmitter {
addrs = addrs.concat(this.addressManager.getObservedAddrs().map(ma => ma.toString()))
const announceFilter = this._options.addresses.announceFilter || ((multiaddrs) => multiaddrs)
const announceFilter = this._options.addresses.announceFilter
// dedupe multiaddrs
const addrSet = new Set(addrs)
@@ -565,7 +588,7 @@ class Libp2p extends EventEmitter {
* Registers the `handler` for each protocol
*
* @param {string[]|string} protocols
* @param {({ connection: Connection, stream: MuxedStream, protocol: string }) => void} handler
* @param {(props: HandlerProps) => void} handler
*/
handle (protocols, handler) {
protocols = Array.isArray(protocols) ? protocols : [protocols]
@@ -698,6 +721,9 @@ class Libp2p extends EventEmitter {
* @private
*/
async _setupPeerDiscovery () {
/**
* @param {PeerDiscoveryModule} DiscoveryService
*/
const setupService = (DiscoveryService) => {
let config = {
enabled: true // on by default
@@ -706,6 +732,7 @@ class Libp2p extends EventEmitter {
if (DiscoveryService.tag &&
this._config.peerDiscovery &&
this._config.peerDiscovery[DiscoveryService.tag]) {
// @ts-ignore PeerDiscovery not understood as an Object for spread
config = { ...config, ...this._config.peerDiscovery[DiscoveryService.tag] }
}
@@ -714,6 +741,7 @@ class Libp2p extends EventEmitter {
let discoveryService
if (typeof DiscoveryService === 'function') {
// @ts-ignore DiscoveryService has no constructor type inferred
discoveryService = new DiscoveryService(Object.assign({}, config, {
peerId: this.peerId,
libp2p: this

View File

@@ -4,11 +4,13 @@ const debug = require('debug')
const log = Object.assign(debug('libp2p:plaintext'), {
error: debug('libp2p:plaintext:err')
})
// @ts-ignore it-handshake do not export types
const handshake = require('it-handshake')
const lp = require('it-length-prefixed')
const PeerId = require('peer-id')
const { UnexpectedPeerError, InvalidCryptoExchangeError } = require('libp2p-interfaces/src/crypto/errors')
// @ts-ignore protons do not export types
const { Exchange, KeyType } = require('./proto')
const protocol = '/plaintext/2.0.0'
@@ -16,6 +18,9 @@ const protocol = '/plaintext/2.0.0'
* @typedef {import('libp2p-interfaces/src/connection').Connection} Connection
*/
/**
* @param {{ id: Uint8Array; pubkey: { Type: any, Data: Uint8Array; }; }} exchange
*/
function lpEncodeExchange (exchange) {
const pb = Exchange.encode(exchange)
return lp.encode.single(pb)
@@ -68,12 +73,23 @@ async function encrypt (localId, conn, remoteId) {
}
}
module.exports = {
protocol,
secureInbound: (localId, conn, remoteId) => {
return encrypt(localId, conn, remoteId)
},
secureOutbound: (localId, conn, remoteId) => {
return encrypt(localId, conn, remoteId)
}
}
module.exports =
{
protocol,
/**
* @param {PeerId} localId
* @param {Connection} conn
* @param {PeerId | undefined} remoteId
*/
secureInbound: (localId, conn, remoteId) => {
return encrypt(localId, conn, remoteId)
},
/**
* @param {PeerId} localId
* @param {Connection} conn
* @param {PeerId | undefined} remoteId
*/
secureOutbound: (localId, conn, remoteId) => {
return encrypt(localId, conn, remoteId)
}
}

View File

@@ -1,5 +1,6 @@
'use strict'
// @ts-ignore protons do not export types
const protobuf = require('protons')
module.exports = protobuf(`

View File

@@ -1,7 +1,10 @@
'use strict'
// @ts-ignore node-forge types not exported
require('node-forge/lib/pkcs7')
// @ts-ignore node-forge types not exported
require('node-forge/lib/pbe')
// @ts-ignore node-forge types not exported
const forge = require('node-forge/lib/forge')
const { certificateForKey, findAsync } = require('./util')
const errcode = require('err-code')
@@ -85,6 +88,7 @@ class CMS {
try {
const buf = forge.util.createBuffer(uint8ArrayToString(cmsData, 'ascii'))
const obj = forge.asn1.fromDer(buf)
// @ts-ignore not defined
cms = forge.pkcs7.messageFromAsn1(obj)
} catch (err) {
throw errcode(new Error('Invalid CMS: ' + err.message), 'ERR_INVALID_CMS')
@@ -93,11 +97,15 @@ class CMS {
// Find a recipient whose key we hold. We only deal with recipient certs
// issued by ipfs (O=ipfs).
const recipients = cms.recipients
// @ts-ignore cms types not defined
.filter(r => r.issuer.find(a => a.shortName === 'O' && a.value === 'ipfs'))
// @ts-ignore cms types not defined
.filter(r => r.issuer.find(a => a.shortName === 'CN'))
// @ts-ignore cms types not defined
.map(r => {
return {
recipient: r,
// @ts-ignore cms types not defined
keyId: r.issuer.find(a => a.shortName === 'CN').value
}
})
@@ -113,6 +121,7 @@ class CMS {
})
if (!r) {
// @ts-ignore cms types not defined
const missingKeys = recipients.map(r => r.keyId)
throw errcode(new Error('Decryption needs one of the key(s): ' + missingKeys.join(', ')), 'ERR_MISSING_KEYS', {
missingKeys

View File

@@ -10,6 +10,7 @@ const errcode = require('err-code')
const uint8ArrayToString = require('uint8arrays/to-string')
const uint8ArrayFromString = require('uint8arrays/from-string')
// @ts-ignore node-forge sha512 types not exported
require('node-forge/lib/sha512')
/**
@@ -58,6 +59,9 @@ const defaultOptions = {
}
}
/**
* @param {string} name
*/
function validateKeyName (name) {
if (!name) return false
if (typeof name !== 'string') return false
@@ -143,12 +147,14 @@ class Keychain {
throw new Error(`dek.iterationCount must be least ${NIST.minIterationCount}`)
}
const dek = this.opts.pass ? crypto.pbkdf2(
this.opts.pass,
this.opts.dek.salt,
this.opts.dek.iterationCount,
this.opts.dek.keyLength,
this.opts.dek.hash) : ''
const dek = this.opts.pass
? crypto.pbkdf2(
this.opts.pass,
this.opts.dek.salt,
this.opts.dek.iterationCount,
this.opts.dek.keyLength,
this.opts.dek.hash)
: ''
privates.set(this, { dek })
}

View File

@@ -4,7 +4,6 @@
require('node-forge/lib/x509')
const forge = require('node-forge/lib/forge')
const pki = forge.pki
exports = module.exports
/**
* Gets a self-signed X.509 certificate for the key.
@@ -17,7 +16,7 @@ exports = module.exports
* @param {RsaPrivateKey} privateKey - The naked key
* @returns {Uint8Array}
*/
exports.certificateForKey = (key, privateKey) => {
const certificateForKey = (key, privateKey) => {
const publicKey = pki.setRsaPublicKey(privateKey.n, privateKey.e)
const cert = pki.createCertificate()
cert.publicKey = publicKey
@@ -87,4 +86,7 @@ async function findAsync (array, asyncCompare) {
return array[index]
}
module.exports.findAsync = findAsync
module.exports = {
certificateForKey,
findAsync
}

View File

@@ -32,13 +32,13 @@ class Stats extends EventEmitter {
const intervals = this._options.movingAverageIntervals
for (var i = 0; i < initialCounters.length; i++) {
var key = initialCounters[i]
for (let i = 0; i < initialCounters.length; i++) {
const key = initialCounters[i]
this._stats[key] = Big(0)
this._movingAverages[key] = {}
for (var k = 0; k < intervals.length; k++) {
var interval = intervals[k]
var ma = this._movingAverages[key][interval] = MovingAverage(interval)
for (let k = 0; k < intervals.length; k++) {
const interval = intervals[k]
const ma = this._movingAverages[key][interval] = MovingAverage(interval)
ma.push(this._frequencyLastTime, 0)
}
}
@@ -82,7 +82,7 @@ class Stats extends EventEmitter {
/**
* Returns a clone of the internal movingAverages
*
* @returns {Object}
* @returns {typeof Object.assign}
*/
get movingAverages () {
return Object.assign({}, this._movingAverages)
@@ -219,9 +219,9 @@ class Stats extends EventEmitter {
const intervals = this._options.movingAverageIntervals
for (var i = 0; i < intervals.length; i++) {
var movingAverageInterval = intervals[i]
var movingAverage = movingAverages[movingAverageInterval]
for (let i = 0; i < intervals.length; i++) {
const movingAverageInterval = intervals[i]
let movingAverage = movingAverages[movingAverageInterval]
if (!movingAverage) {
movingAverage = movingAverages[movingAverageInterval] = MovingAverage(movingAverageInterval)
}

View File

@@ -1,5 +1,6 @@
'use strict'
// @ts-ignore nat-api does not export types
const NatAPI = require('@motrix/nat-api')
const debug = require('debug')
const { promisify } = require('es6-promisify')
@@ -9,6 +10,7 @@ const log = Object.assign(debug('libp2p:nat'), {
})
const { isBrowser } = require('ipfs-utils/src/env')
const retry = require('p-retry')
// @ts-ignore private-api does not export types
const isPrivateIp = require('private-ip')
const pkg = require('../package.json')
const errcode = require('err-code')
@@ -139,11 +141,11 @@ class NatManager {
const client = new NatAPI(this._options)
/** @type {(...any) => any} */
/** @type {(...any: any) => any} */
const map = promisify(client.map.bind(client))
/** @type {(...any) => any} */
/** @type {(...any: any) => any} */
const destroy = promisify(client.destroy.bind(client))
/** @type {(...any) => any} */
/** @type {(...any: any) => any} */
const externalIp = promisify(client.externalIp.bind(client))
// these are all network operations so add a retry

View File

@@ -19,11 +19,13 @@ const filter = require('it-filter')
const {
setDelayedInterval,
clearDelayedInterval
// @ts-ignore module with no types
} = require('set-delayed-interval')
const PeerId = require('peer-id')
/**
* @typedef {import('peer-id')} PeerId
* @typedef {import('multiaddr')} Multiaddr
* @typedef {import('libp2p-interfaces/src/peer-routing/types').PeerRouting} PeerRoutingModule
*/
/**
@@ -44,6 +46,7 @@ class PeerRouting {
constructor (libp2p) {
this._peerId = libp2p.peerId
this._peerStore = libp2p.peerStore
/** @type {PeerRoutingModule[]} */
this._routers = libp2p._modules.peerRouting || []
// If we have the dht, add it to the available peer routers
@@ -106,6 +109,7 @@ class PeerRouting {
...this._routers.map(router => [router.findPeer(id, options)])
),
(source) => filter(source, Boolean),
// @ts-ignore findPeer resolves a Promise
(source) => storeAddresses(source, this._peerStore),
(source) => first(source)
)

View File

@@ -60,7 +60,7 @@ class AddressBook extends Book {
if (!data.addresses) {
return []
}
return data.addresses.map((address) => address.multiaddr)
return data.addresses.map((/** @type {Address} */ address) => address.multiaddr)
}
})
@@ -295,6 +295,7 @@ class AddressBook extends Book {
}
// create Address for each address
/** @type {Address[]} */
const addresses = []
multiaddrs.forEach((addr) => {
if (!multiaddr.isMultiaddr(addr)) {

View File

@@ -7,6 +7,9 @@ const {
codes: { ERR_INVALID_PARAMETERS }
} = require('../errors')
/**
* @param {any} data
*/
const passthrough = data => data
/**

View File

@@ -81,6 +81,9 @@ class MetadataBook extends Book {
* Set data into the datastructure
*
* @override
* @param {PeerId} peerId
* @param {string} key
* @param {Uint8Array} value
*/
_setValue (peerId, key, value, { emit = true } = {}) {
const id = peerId.toB58String()

View File

@@ -21,6 +21,11 @@ const {
const Addresses = require('./pb/address-book.proto')
const Protocols = require('./pb/proto-book.proto')
/**
* @typedef {import('interface-datastore').Batch} Batch
* @typedef {import('../address-book.js').Address} Address
*/
/**
* @typedef {Object} PersistentPeerStoreProperties
* @property {PeerId} peerId
@@ -214,7 +219,7 @@ class PersistentPeerStore extends PeerStore {
*
* @private
* @param {PeerId} peerId
* @param {Object} batch
* @param {Batch} batch
*/
_batchAddressBook (peerId, batch) {
const b32key = peerId.toString()
@@ -234,10 +239,12 @@ class PersistentPeerStore extends PeerStore {
multiaddr: address.multiaddr.bytes,
isCertified: address.isCertified
})),
certified_record: entry.record ? {
seq: entry.record.seqNumber,
raw: entry.record.raw
} : undefined
certified_record: entry.record
? {
seq: entry.record.seqNumber,
raw: entry.record.raw
}
: undefined
})
batch.put(key, encodedData)
@@ -251,7 +258,7 @@ class PersistentPeerStore extends PeerStore {
*
* @private
* @param {PeerId} peerId
* @param {Object} batch
* @param {Batch} batch
*/
_batchKeyBook (peerId, batch) {
const b32key = peerId.toString()
@@ -277,14 +284,14 @@ class PersistentPeerStore extends PeerStore {
*
* @private
* @param {PeerId} peerId
* @param {Object} batch
* @param {Batch} batch
*/
_batchMetadataBook (peerId, batch) {
const b32key = peerId.toString()
const dirtyMetada = this._dirtyMetadata.get(peerId.toB58String()) || []
try {
dirtyMetada.forEach((dirtyKey) => {
dirtyMetada.forEach((/** @type {string} */ dirtyKey) => {
const key = new Key(`${NAMESPACE_METADATA}${b32key}/${dirtyKey}`)
const dirtyValue = this.metadataBook.getValue(peerId, dirtyKey)
@@ -304,7 +311,7 @@ class PersistentPeerStore extends PeerStore {
*
* @private
* @param {PeerId} peerId
* @param {Object} batch
* @param {Batch} batch
*/
_batchProtoBook (peerId, batch) {
const b32key = peerId.toString()
@@ -350,14 +357,16 @@ class PersistentPeerStore extends PeerStore {
this.addressBook._setData(
peerId,
{
addresses: decoded.addrs.map((address) => ({
addresses: decoded.addrs.map((/** @type {Address} */ address) => ({
multiaddr: multiaddr(address.multiaddr),
isCertified: Boolean(address.isCertified)
})),
record: decoded.certified_record ? {
raw: decoded.certified_record.raw,
seqNumber: decoded.certified_record.seq
} : undefined
record: decoded.certified_record
? {
raw: decoded.certified_record.raw,
seqNumber: decoded.certified_record.seq
}
: undefined
},
{ emit: false })
break

View File

@@ -1,5 +1,6 @@
'use strict'
// @ts-ignore protons does not have types
const protons = require('protons')
const message = `

View File

@@ -1,5 +1,6 @@
'use strict'
// @ts-ignore protons does not have types
const protons = require('protons')
/* eslint-disable no-tabs */

View File

@@ -74,6 +74,10 @@ class ProtoBook extends Book {
const recSet = this.data.get(id)
const newSet = new Set(protocols)
/**
* @param {Set<string>} a
* @param {Set<string>} b
*/
const isSetEqual = (a, b) => a.size === b.size && [...a].every(value => b.has(value))
// Already knows the peer and the recorded protocols are the same?

View File

@@ -8,6 +8,7 @@ const errCode = require('err-code')
const crypto = require('libp2p-crypto')
const { pipe } = require('it-pipe')
// @ts-ignore it-buffer has no types exported
const { toBuffer } = require('it-buffer')
const { collect, take } = require('streaming-iterables')
const equals = require('uint8arrays/equals')
@@ -18,6 +19,7 @@ const { PROTOCOL, PING_LENGTH } = require('./constants')
* @typedef {import('../')} Libp2p
* @typedef {import('multiaddr')} Multiaddr
* @typedef {import('peer-id')} PeerId
* @typedef {import('libp2p-interfaces/src/stream-muxer/types').MuxedStream} MuxedStream
*/
/**
@@ -31,7 +33,8 @@ async function ping (node, peer) {
// @ts-ignore multiaddr might not have toB58String
log('dialing %s to %s', PROTOCOL, peer.toB58String ? peer.toB58String() : peer)
const { stream } = await node.dialProtocol(peer, PROTOCOL)
const connection = await node.dial(peer)
const { stream } = await connection.newStream(PROTOCOL)
const start = Date.now()
const data = crypto.randomBytes(PING_LENGTH)
@@ -39,7 +42,7 @@ async function ping (node, peer) {
const [result] = await pipe(
[data],
stream,
stream => take(1, stream),
(/** @type {MuxedStream} */ stream) => take(1, stream),
toBuffer,
collect
)

View File

@@ -3,11 +3,16 @@
const crypto = require('libp2p-crypto')
const constants = require('./constants')
exports = module.exports
exports.rnd = (length) => {
/**
* @param {number} length
*/
function rnd (length) {
if (!length) {
length = constants.PING_LENGTH
}
return crypto.randomBytes(length)
}
module.exports = {
rnd
}

View File

@@ -7,6 +7,7 @@ const log = Object.assign(debug('libp2p:pnet'), {
})
const Errors = require('./errors')
// @ts-ignore xsalsa20 has no types exported
const xsalsa20 = require('xsalsa20')
const KEY_LENGTH = require('./key-generator').KEY_LENGTH
const uint8ArrayFromString = require('uint8arrays/from-string')
@@ -21,7 +22,8 @@ const uint8ArrayToString = require('uint8arrays/to-string')
*/
module.exports.createBoxStream = (nonce, psk) => {
const xor = xsalsa20(nonce, psk)
return (source) => (async function * () {
return (/** @type {AsyncIterable<Uint8Array>} */ source) => (async function * () {
for await (const chunk of source) {
yield Uint8Array.from(xor.update(chunk.slice()))
}
@@ -36,7 +38,7 @@ module.exports.createBoxStream = (nonce, psk) => {
* @returns {*} a through iterable
*/
module.exports.createUnboxStream = (nonce, psk) => {
return (source) => (async function * () {
return (/** @type {AsyncIterable<Uint8Array>} */ source) => (async function * () {
const xor = xsalsa20(nonce, psk)
log.trace('Decryption enabled')
@@ -51,7 +53,7 @@ module.exports.createUnboxStream = (nonce, psk) => {
*
* @param {Uint8Array} pskBuffer
* @throws {INVALID_PSK}
* @returns {Object} The PSK metadata (tag, codecName, psk)
* @returns {{ tag?: string, codecName?: string, psk: Uint8Array }} The PSK metadata (tag, codecName, psk)
*/
module.exports.decodeV1PSK = (pskBuffer) => {
try {

View File

@@ -6,6 +6,7 @@ const log = Object.assign(debug('libp2p:pnet'), {
})
const { pipe } = require('it-pipe')
const errcode = require('err-code')
// @ts-ignore it-pair has no types exported
const duplexPair = require('it-pair/duplex')
const crypto = require('libp2p-crypto')
const Errors = require('./errors')
@@ -17,6 +18,7 @@ const {
createUnboxStream,
decodeV1PSK
} = require('./crypto')
// @ts-ignore it-handshake has no types exported
const handshake = require('it-handshake')
const { NONCE_LENGTH } = require('./key-generator')

View File

@@ -22,8 +22,12 @@ module.exports = generate
module.exports.NONCE_LENGTH = 24
module.exports.KEY_LENGTH = KEY_LENGTH
// @ts-ignore This condition will always return 'false' since the types 'Module | undefined'
if (require.main === module) {
// @ts-ignore
generate(process.stdout)
try {
// @ts-ignore This condition will always return 'false' since the types 'Module | undefined'
if (require.main === module) {
// @ts-ignore
generate(process.stdout)
}
} catch (error) {
}

View File

@@ -1,12 +1,18 @@
'use strict'
// Pubsub adapter to keep API with handlers while not removed.
/**
* @typedef {import('libp2p-interfaces/src/pubsub').InMessage} InMessage
* @typedef {import('libp2p-interfaces/src/pubsub')} PubsubRouter
*/
// Pubsub adapter to keep API with handlers while not removed.
/**
* @param {import("libp2p-interfaces/src/pubsub")} PubsubRouter
* @param {import('.')} libp2p
* @param {{ enabled: boolean; } & import(".").PubsubLocalOptions & import("libp2p-interfaces/src/pubsub").PubsubOptions} options
*/
function pubsubAdapter (PubsubRouter, libp2p, options) {
// @ts-ignore Pubsub constructor type not defined
const pubsub = new PubsubRouter(libp2p, options)
pubsub._subscribeAdapter = pubsub.subscribe
pubsub._unsubscribeAdapter = pubsub.unsubscribe

View File

@@ -1,3 +1,4 @@
// @ts-nocheck protons do not support types
'use strict'
const protons = require('protons')

View File

@@ -3,6 +3,7 @@
const errCode = require('err-code')
const uint8arraysConcat = require('uint8arrays/concat')
const uint8arraysFromString = require('uint8arrays/from-string')
// @ts-ignore libp2p-crypto does not support types
const cryptoKeys = require('libp2p-crypto/src/keys')
const PeerId = require('peer-id')
const varint = require('varint')

View File

@@ -11,7 +11,7 @@ const {
} = require('./consts')
/**
* @typedef {import('peer-id')} PeerId
* @typedef {import('../../peer-store/address-book.js').Address} Address
* @typedef {import('multiaddr')} Multiaddr
* @typedef {import('libp2p-interfaces/src/record/types').Record} Record
*/
@@ -104,7 +104,7 @@ PeerRecord.createFromProtobuf = (buf) => {
const peerRecord = Protobuf.PeerRecord.decode(buf)
const peerId = PeerId.createFromBytes(peerRecord.peer_id)
const multiaddrs = (peerRecord.addresses || []).map((a) => multiaddr(a.multiaddr))
const multiaddrs = (peerRecord.addresses || []).map((/** @type {Address} */ a) => multiaddr(a.multiaddr))
const seqNumber = peerRecord.seq
return new PeerRecord({ peerId, multiaddrs, seqNumber })

View File

@@ -1,3 +1,4 @@
// @ts-nocheck protons do not support types
'use strict'
const protons = require('protons')

View File

@@ -16,7 +16,11 @@ const Topology = require('libp2p-interfaces/src/topology')
* @typedef {import('./peer-store')} PeerStore
* @typedef {import('./connection-manager')} ConnectionManager
* @typedef {import('libp2p-interfaces/src/connection').Connection} Connection
* @typedef {import('libp2p-interfaces/src/topology')} Topology
* @typedef {import('./').HandlerProps} HandlerProps
*/
/**
*
*/
/**
@@ -38,20 +42,28 @@ class Registrar {
/**
* Map of topologies
*
* @type {Map<string, object>}
* @type {Map<string, Topology>}
*/
this.topologies = new Map()
/** @type {(protocols: string[]|string, handler: (props: HandlerProps) => void) => void} */
// @ts-ignore handle is not optional
this._handle = undefined
this._onDisconnect = this._onDisconnect.bind(this)
this.connectionManager.on('peer:disconnect', this._onDisconnect)
}
/**
* @returns {(protocols: string[]|string, handler: (props: HandlerProps) => void) => void}
*/
get handle () {
return this._handle
}
/**
* @param {(protocols: string[]|string, handler: (props: HandlerProps) => void) => void} handle
*/
set handle (handle) {
this._handle = handle
}
@@ -103,12 +115,11 @@ class Registrar {
* Remove a disconnected peer from the record
*
* @param {Connection} connection
* @param {Error} [error]
* @returns {void}
*/
_onDisconnect (connection, error) {
_onDisconnect (connection) {
for (const [, topology] of this.topologies) {
topology.disconnect(connection.remotePeer, error)
topology.disconnect(connection.remotePeer)
}
}
}

View File

@@ -14,8 +14,8 @@ const { updateSelfPeerRecord } = require('./record/utils')
/**
* @typedef {import('multiaddr')} Multiaddr
* @typedef {import('libp2p-interfaces/src/connection').Connection} Connection
* @typedef {import('libp2p-interfaces/src/transport/types').TransportFactory} TransportFactory
* @typedef {import('libp2p-interfaces/src/transport/types').Transport} Transport
* @typedef {import('libp2p-interfaces/src/transport/types').TransportFactory<any, any>} TransportFactory
* @typedef {import('libp2p-interfaces/src/transport/types').Transport<any, any>} Transport
*
* @typedef {Object} TransportManagerProperties
* @property {import('./')} libp2p
@@ -121,6 +121,7 @@ class TransportManager {
* @returns {Multiaddr[]}
*/
getAddrs () {
/** @type {Multiaddr[]} */
let addrs = []
for (const listeners of this._listeners.values()) {
for (const listener of listeners) {

209
src/types.d.ts vendored Normal file
View File

@@ -0,0 +1,209 @@
// Insecure Message types
export enum KeyType {
RSA = 0,
Ed25519 = 1,
Secp256k1 = 2,
ECDSA = 3
}
// Protobufs
export type MessageProto = {
encode(value: any): Uint8Array
decode(bytes: Uint8Array): any
}
export type SUCCESS = 100;
export type HOP_SRC_ADDR_TOO_LONG = 220;
export type HOP_DST_ADDR_TOO_LONG = 221;
export type HOP_SRC_MULTIADDR_INVALID = 250;
export type HOP_DST_MULTIADDR_INVALID = 251;
export type HOP_NO_CONN_TO_DST = 260;
export type HOP_CANT_DIAL_DST = 261;
export type HOP_CANT_OPEN_DST_STREAM = 262;
export type HOP_CANT_SPEAK_RELAY = 270;
export type HOP_CANT_RELAY_TO_SELF = 280;
export type STOP_SRC_ADDR_TOO_LONG = 320;
export type STOP_DST_ADDR_TOO_LONG = 321;
export type STOP_SRC_MULTIADDR_INVALID = 350;
export type STOP_DST_MULTIADDR_INVALID = 351;
export type STOP_RELAY_REFUSED = 390;
export type MALFORMED_MESSAGE = 400;
export type CircuitStatus = SUCCESS | HOP_SRC_ADDR_TOO_LONG | HOP_DST_ADDR_TOO_LONG
| HOP_SRC_MULTIADDR_INVALID | HOP_DST_MULTIADDR_INVALID | HOP_NO_CONN_TO_DST
| HOP_CANT_DIAL_DST | HOP_CANT_OPEN_DST_STREAM | HOP_CANT_SPEAK_RELAY | HOP_CANT_RELAY_TO_SELF
| STOP_SRC_ADDR_TOO_LONG | STOP_DST_ADDR_TOO_LONG | STOP_SRC_MULTIADDR_INVALID
| STOP_DST_MULTIADDR_INVALID | STOP_RELAY_REFUSED | MALFORMED_MESSAGE
export type HOP = 1;
export type STOP = 2;
export type STATUS = 3;
export type CAN_HOP = 4;
export type CircuitType = HOP | STOP | STATUS | CAN_HOP
export type CircuitPeer = {
id: Uint8Array
addrs: Uint8Array[]
}
export type CircuitRequest = {
type?: CircuitType
code?: CircuitStatus
dstPeer?: CircuitPeer
srcPeer?: CircuitPeer
}
export type CircuitMessageProto = {
encode(value: CircuitRequest): Uint8Array
decode(bytes: Uint8Array): any
status: number
type: number
Status: {
SUCCESS: SUCCESS,
HOP_SRC_ADDR_TOO_LONG: HOP_SRC_ADDR_TOO_LONG,
HOP_DST_ADDR_TOO_LONG: HOP_DST_ADDR_TOO_LONG,
HOP_SRC_MULTIADDR_INVALID: HOP_SRC_MULTIADDR_INVALID,
HOP_DST_MULTIADDR_INVALID: HOP_DST_MULTIADDR_INVALID,
HOP_NO_CONN_TO_DST: HOP_NO_CONN_TO_DST,
HOP_CANT_DIAL_DST: HOP_CANT_DIAL_DST,
HOP_CANT_OPEN_DST_STREAM: HOP_CANT_OPEN_DST_STREAM,
HOP_CANT_SPEAK_RELAY: HOP_CANT_SPEAK_RELAY,
HOP_CANT_RELAY_TO_SELF: HOP_CANT_RELAY_TO_SELF,
STOP_SRC_ADDR_TOO_LONG: STOP_SRC_ADDR_TOO_LONG,
STOP_DST_ADDR_TOO_LONG: STOP_DST_ADDR_TOO_LONG,
STOP_SRC_MULTIADDR_INVALID: STOP_SRC_MULTIADDR_INVALID,
STOP_DST_MULTIADDR_INVALID: STOP_DST_MULTIADDR_INVALID,
STOP_RELAY_REFUSED: STOP_RELAY_REFUSED,
MALFORMED_MESSAGE: MALFORMED_MESSAGE
}
Type: {
HOP: HOP,
STOP: STOP,
STATUS: STATUS,
CAN_HOP: CAN_HOP
}
}
export interface EventEmitterFactory {
new(): EventEmitter;
}
export interface EventEmitter {
addListener(event: string | symbol, listener: (...args: any[]) => void): EventEmitter;
on(event: string | symbol, listener: (...args: any[]) => void): EventEmitter;
once(event: string | symbol, listener: (...args: any[]) => void): EventEmitter;
removeListener(event: string | symbol, listener: (...args: any[]) => void): EventEmitter;
off(event: string | symbol, listener: (...args: any[]) => void): EventEmitter;
removeAllListeners(event?: string | symbol): EventEmitter;
setMaxListeners(n: number): EventEmitter;
getMaxListeners(): number;
listeners(event: string | symbol): Function[]; // eslint-disable-line @typescript-eslint/ban-types
rawListeners(event: string | symbol): Function[]; // eslint-disable-line @typescript-eslint/ban-types
emit(event: string | symbol, ...args: any[]): boolean;
listenerCount(event: string | symbol): number;
}
// // Insecure Message types
// export enum KeyType {
// RSA = 0,
// Ed25519 = 1,
// Secp256k1 = 2,
// ECDSA = 3
// }
// // Protobufs
// export interface MessageProto {
// encode: (value: any) => Uint8Array
// decode: (bytes: Uint8Array) => any
// }
// export type SUCCESS = 100
// export type HOP_SRC_ADDR_TOO_LONG = 220
// export type HOP_DST_ADDR_TOO_LONG = 221
// export type HOP_SRC_MULTIADDR_INVALID = 250
// export type HOP_DST_MULTIADDR_INVALID = 251
// export type HOP_NO_CONN_TO_DST = 260
// export type HOP_CANT_DIAL_DST = 261
// export type HOP_CANT_OPEN_DST_STREAM = 262
// export type HOP_CANT_SPEAK_RELAY = 270
// export type HOP_CANT_RELAY_TO_SELF = 280
// export type STOP_SRC_ADDR_TOO_LONG = 320
// export type STOP_DST_ADDR_TOO_LONG = 321
// export type STOP_SRC_MULTIADDR_INVALID = 350
// export type STOP_DST_MULTIADDR_INVALID = 351
// export type STOP_RELAY_REFUSED = 390
// export type MALFORMED_MESSAGE = 400
// export type CircuitStatus = SUCCESS | HOP_SRC_ADDR_TOO_LONG | HOP_DST_ADDR_TOO_LONG
// | HOP_SRC_MULTIADDR_INVALID | HOP_DST_MULTIADDR_INVALID | HOP_NO_CONN_TO_DST
// | HOP_CANT_DIAL_DST | HOP_CANT_OPEN_DST_STREAM | HOP_CANT_SPEAK_RELAY | HOP_CANT_RELAY_TO_SELF
// | STOP_SRC_ADDR_TOO_LONG | STOP_DST_ADDR_TOO_LONG | STOP_SRC_MULTIADDR_INVALID
// | STOP_DST_MULTIADDR_INVALID | STOP_RELAY_REFUSED | MALFORMED_MESSAGE
// export type HOP = 1
// export type STOP = 2
// export type STATUS = 3
// export type CAN_HOP = 4
// export type CircuitType = HOP | STOP | STATUS | CAN_HOP
// export interface CircuitPeer {
// id: Uint8Array
// addrs: Uint8Array[]
// }
// export interface CircuitRequest {
// type: CircuitType
// dstPeer: CircuitPeer
// srcPeer: CircuitPeer
// }
// export interface CircuitMessageProto {
// encode: (value: any) => Uint8Array
// decode: (bytes: Uint8Array) => any
// status: {
// SUCCESS: SUCCESS
// HOP_SRC_ADDR_TOO_LONG: HOP_SRC_ADDR_TOO_LONG
// HOP_DST_ADDR_TOO_LONG: HOP_DST_ADDR_TOO_LONG
// HOP_SRC_MULTIADDR_INVALID: HOP_SRC_MULTIADDR_INVALID
// HOP_DST_MULTIADDR_INVALID: HOP_DST_MULTIADDR_INVALID
// HOP_NO_CONN_TO_DST: HOP_NO_CONN_TO_DST
// HOP_CANT_DIAL_DST: HOP_CANT_DIAL_DST
// HOP_CANT_OPEN_DST_STREAM: HOP_CANT_OPEN_DST_STREAM
// HOP_CANT_SPEAK_RELAY: HOP_CANT_SPEAK_RELAY
// HOP_CANT_RELAY_TO_SELF: HOP_CANT_RELAY_TO_SELF
// STOP_SRC_ADDR_TOO_LONG: STOP_SRC_ADDR_TOO_LONG
// STOP_DST_ADDR_TOO_LONG: STOP_DST_ADDR_TOO_LONG
// STOP_SRC_MULTIADDR_INVALID: STOP_SRC_MULTIADDR_INVALID
// STOP_DST_MULTIADDR_INVALID: STOP_DST_MULTIADDR_INVALID
// STOP_RELAY_REFUSED: STOP_RELAY_REFUSED
// MALFORMED_MESSAGE: MALFORMED_MESSAGE
// }
// type: {
// HOP: HOP
// STOP: STOP
// STATUS: STATUS
// CAN_HOP: CAN_HOP
// }
// }
// export interface EventEmitterFactory {
// new(): EventEmitter
// }
// export interface EventEmitter {
// addListener: (event: string | symbol, listener: (...args: any[]) => void) => EventEmitter
// on: (event: string | symbol, listener: (...args: any[]) => void) => EventEmitter
// once: (event: string | symbol, listener: (...args: any[]) => void) => EventEmitter
// removeListener: (event: string | symbol, listener: (...args: any[]) => void) => EventEmitter
// off: (event: string | symbol, listener: (...args: any[]) => void) => EventEmitter
// removeAllListeners: (event?: string | symbol) => EventEmitter
// setMaxListeners: (n: number) => EventEmitter
// getMaxListeners: () => number
// listeners: (event: string | symbol) => Function[] // eslint-disable-line @typescript-eslint/ban-types
// rawListeners: (event: string | symbol) => Function[] // eslint-disable-line @typescript-eslint/ban-types
// emit: (event: string | symbol, ...args: any[]) => boolean
// listenerCount: (event: string | symbol) => number
// }

View File

@@ -1,103 +0,0 @@
// Insecure Message types
export enum KeyType {
RSA = 0,
Ed25519 = 1,
Secp256k1 = 2,
ECDSA = 3
}
// Protobufs
export type MessageProto = {
encode(value: any): Uint8Array
decode(bytes: Uint8Array): any
}
export type SUCCESS = 100;
export type HOP_SRC_ADDR_TOO_LONG = 220;
export type HOP_DST_ADDR_TOO_LONG = 221;
export type HOP_SRC_MULTIADDR_INVALID = 250;
export type HOP_DST_MULTIADDR_INVALID = 251;
export type HOP_NO_CONN_TO_DST = 260;
export type HOP_CANT_DIAL_DST = 261;
export type HOP_CANT_OPEN_DST_STREAM = 262;
export type HOP_CANT_SPEAK_RELAY = 270;
export type HOP_CANT_RELAY_TO_SELF = 280;
export type STOP_SRC_ADDR_TOO_LONG = 320;
export type STOP_DST_ADDR_TOO_LONG = 321;
export type STOP_SRC_MULTIADDR_INVALID = 350;
export type STOP_DST_MULTIADDR_INVALID = 351;
export type STOP_RELAY_REFUSED = 390;
export type MALFORMED_MESSAGE = 400;
export type CircuitStatus = SUCCESS | HOP_SRC_ADDR_TOO_LONG | HOP_DST_ADDR_TOO_LONG
| HOP_SRC_MULTIADDR_INVALID | HOP_DST_MULTIADDR_INVALID | HOP_NO_CONN_TO_DST
| HOP_CANT_DIAL_DST | HOP_CANT_OPEN_DST_STREAM | HOP_CANT_SPEAK_RELAY | HOP_CANT_RELAY_TO_SELF
| STOP_SRC_ADDR_TOO_LONG | STOP_DST_ADDR_TOO_LONG | STOP_SRC_MULTIADDR_INVALID
| STOP_DST_MULTIADDR_INVALID | STOP_RELAY_REFUSED | MALFORMED_MESSAGE
export type HOP = 1;
export type STOP = 2;
export type STATUS = 3;
export type CAN_HOP = 4;
export type CircuitType = HOP | STOP | STATUS | CAN_HOP
export type CircuitPeer = {
id: Uint8Array
addrs: Uint8Array[]
}
export type CircuitRequest = {
type: CircuitType
dstPeer: CircuitPeer
srcPeer: CircuitPeer
}
export type CircuitMessageProto = {
encode(value: any): Uint8Array
decode(bytes: Uint8Array): any
Status: {
SUCCESS: SUCCESS,
HOP_SRC_ADDR_TOO_LONG: HOP_SRC_ADDR_TOO_LONG,
HOP_DST_ADDR_TOO_LONG: HOP_DST_ADDR_TOO_LONG,
HOP_SRC_MULTIADDR_INVALID: HOP_SRC_MULTIADDR_INVALID,
HOP_DST_MULTIADDR_INVALID: HOP_DST_MULTIADDR_INVALID,
HOP_NO_CONN_TO_DST: HOP_NO_CONN_TO_DST,
HOP_CANT_DIAL_DST: HOP_CANT_DIAL_DST,
HOP_CANT_OPEN_DST_STREAM: HOP_CANT_OPEN_DST_STREAM,
HOP_CANT_SPEAK_RELAY: HOP_CANT_SPEAK_RELAY,
HOP_CANT_RELAY_TO_SELF: HOP_CANT_RELAY_TO_SELF,
STOP_SRC_ADDR_TOO_LONG: STOP_SRC_ADDR_TOO_LONG,
STOP_DST_ADDR_TOO_LONG: STOP_DST_ADDR_TOO_LONG,
STOP_SRC_MULTIADDR_INVALID: STOP_SRC_MULTIADDR_INVALID,
STOP_DST_MULTIADDR_INVALID: STOP_DST_MULTIADDR_INVALID,
STOP_RELAY_REFUSED: STOP_RELAY_REFUSED,
MALFORMED_MESSAGE: MALFORMED_MESSAGE
},
Type: {
HOP: HOP,
STOP: STOP,
STATUS: STATUS,
CAN_HOP: CAN_HOP
}
}
export interface EventEmitterFactory {
new(): EventEmitter;
}
export interface EventEmitter {
addListener(event: string | symbol, listener: (...args: any[]) => void);
on(event: string | symbol, listener: (...args: any[]) => void);
once(event: string | symbol, listener: (...args: any[]) => void);
removeListener(event: string | symbol, listener: (...args: any[]) => void);
off(event: string | symbol, listener: (...args: any[]) => void);
removeAllListeners(event?: string | symbol);
setMaxListeners(n: number);
getMaxListeners(): number;
listeners(event: string | symbol): Function[]; // eslint-disable-line @typescript-eslint/ban-types
rawListeners(event: string | symbol): Function[]; // eslint-disable-line @typescript-eslint/ban-types
emit(event: string | symbol, ...args: any[]): boolean;
listenerCount(event: string | symbol): number;
}

View File

@@ -5,10 +5,12 @@ const log = Object.assign(debug('libp2p:upgrader'), {
error: debug('libp2p:upgrader:err')
})
const errCode = require('err-code')
// @ts-ignore multistream-select does not export types
const Multistream = require('multistream-select')
const { Connection } = require('libp2p-interfaces/src/connection')
const PeerId = require('peer-id')
const { pipe } = require('it-pipe')
// @ts-ignore mutable-proxy does not export types
const mutableProxy = require('mutable-proxy')
const { codes } = require('./errors')
@@ -19,6 +21,7 @@ const { codes } = require('./errors')
* @typedef {import('libp2p-interfaces/src/stream-muxer/types').Muxer} Muxer
* @typedef {import('libp2p-interfaces/src/stream-muxer/types').MuxedStream} MuxedStream
* @typedef {import('libp2p-interfaces/src/crypto/types').Crypto} Crypto
* @typedef {import('libp2p-interfaces/src/connection').Connection} Connection
* @typedef {import('multiaddr')} Multiaddr
*/
@@ -36,8 +39,8 @@ class Upgrader {
* @param {import('./metrics')} [options.metrics]
* @param {Map<string, Crypto>} [options.cryptos]
* @param {Map<string, MuxerFactory>} [options.muxers]
* @param {(Connection) => void} options.onConnection - Called when a connection is upgraded
* @param {(Connection) => void} options.onConnectionEnd
* @param {(connection: Connection) => void} options.onConnection - Called when a connection is upgraded
* @param {(connection: Connection) => void} options.onConnectionEnd
*/
constructor ({
localPeer,
@@ -51,6 +54,7 @@ class Upgrader {
this.metrics = metrics
this.cryptos = cryptos
this.muxers = muxers
/** @type {import("./pnet") | null} */
this.protector = null
this.protocols = new Map()
this.onConnection = onConnection
@@ -216,16 +220,18 @@ class Upgrader {
Muxer,
remotePeer
}) {
/** @type {import("libp2p-interfaces/src/stream-muxer/types").Muxer} */
let muxer
let newStream
// eslint-disable-next-line prefer-const
let connection
/** @type {Connection} */
let connection // eslint-disable-line prefer-const
if (Muxer) {
// Create the muxer
muxer = new Muxer({
// Run anytime a remote stream is created
onStream: async muxedStream => {
if (!connection) return
const mss = new Multistream.Listener(muxedStream)
try {
const { stream, protocol } = await mss.handle(Array.from(this.protocols.keys()))
@@ -243,7 +249,7 @@ class Upgrader {
}
})
newStream = async protocols => {
newStream = async (/** @type {string | string[]} */ protocols) => {
log('%s: starting new stream on %s', direction, protocols)
const muxedStream = muxer.newStream()
const mss = new Multistream.Dialer(muxedStream)
@@ -302,12 +308,12 @@ class Upgrader {
encryption: cryptoProtocol
},
newStream: newStream || errConnectionNotMultiplexed,
getStreams: () => muxer ? muxer.streams : errConnectionNotMultiplexed,
close: async (err) => {
getStreams: () => muxer ? muxer.streams : errConnectionNotMultiplexed(),
close: async (/** @type {Error | undefined} */ err) => {
await maConn.close(err)
// Ensure remaining streams are aborted
if (muxer) {
muxer.streams.map(stream => stream.abort(err))
muxer.streams.map(stream => stream.abort())
}
}
})
@@ -371,7 +377,7 @@ class Upgrader {
* @private
* @async
* @param {PeerId} localPeer - The initiators PeerId
* @param {*} connection
* @param {MultiaddrConnection} connection
* @param {PeerId} remotePeerId
* @param {Map<string, Crypto>} cryptos
* @returns {Promise<CryptoResult>} An encrypted connection, remote peer `PeerId` and the protocol of the `Crypto` used

View File

@@ -28,6 +28,8 @@ describe('content-routing', () => {
})
})
after(() => node.stop())
it('.findProviders should return an error', async () => {
try {
for await (const _ of node.contentRouting.findProviders('a cid')) {} // eslint-disable-line

View File

@@ -23,6 +23,8 @@ describe('ping', () => {
nodes[1].peerStore.addressBook.set(nodes[0].peerId, nodes[0].multiaddrs)
})
afterEach(() => Promise.all(nodes.map(n => n.stop())))
it('ping once from peer0 to peer1 using a multiaddr', async () => {
const ma = `${nodes[2].multiaddrs[0]}/p2p/${nodes[2].peerId.toB58String()}`
const latency = await nodes[0].ping(ma)
@@ -56,7 +58,7 @@ describe('ping', () => {
if (firstInvocation) {
firstInvocation = false
for await (const data of stream) {
for await (const data of stream) { // eslint-disable-line
return {
value: data,
done: false

View File

@@ -110,6 +110,7 @@ describe('Identify', () => {
// LEGACY
it('should be able to identify another peer with no certified peer records support', async () => {
const agentVersion = `js-libp2p/${pkg.version}`
const localIdentify = new IdentifyService({
libp2p: {
peerId: localPeer,
@@ -118,7 +119,7 @@ describe('Identify', () => {
peerStore: localPeerStore,
multiaddrs: listenMaddrs,
isStarted: () => true,
_options: { host: {} }
_options: { host: { agentVersion } }
}
})
@@ -130,7 +131,7 @@ describe('Identify', () => {
peerStore: remotePeerStore,
multiaddrs: listenMaddrs,
isStarted: () => true,
_options: { host: {} }
_options: { host: { agentVersion } }
}
})
@@ -162,7 +163,7 @@ describe('Identify', () => {
const metadataArgs = localIdentify.peerStore.metadataBook.set.firstCall.args
expect(metadataArgs[0].id.bytes).to.equal(remotePeer.bytes)
expect(metadataArgs[1]).to.equal('AgentVersion')
expect(unit8ArrayToString(metadataArgs[2])).to.equal(`js-libp2p/${pkg.version}`)
expect(unit8ArrayToString(metadataArgs[2])).to.equal(agentVersion)
// Validate the remote peer gets updated in the peer store
const call = localIdentify.peerStore.addressBook.set.firstCall

View File

@@ -60,6 +60,7 @@ describe('Nat Manager (TCP)', () => {
teardown.push(async () => {
await natManager.stop()
// await transportManager.close()
await transportManager.removeAll()
expect(transportManager._transports.size).to.equal(0)
})
@@ -71,7 +72,7 @@ describe('Nat Manager (TCP)', () => {
}
}
afterEach(() => Promise.all(teardown))
afterEach(() => Promise.all(teardown.map(t => t())))
it('should map TCP connections to external ports', async () => {
const {

View File

@@ -30,6 +30,7 @@ describe('peer discovery scenarios', () => {
afterEach(async () => {
libp2p && await libp2p.stop()
})
it('should ignore self on discovery', async () => {
libp2p = new Libp2p(mergeOptions(baseOptions, {
peerId,

View File

@@ -89,6 +89,10 @@ describe('peer discovery', () => {
[peerId] = await createPeerId()
})
afterEach(async () => {
libp2p && await libp2p.stop()
})
it('should add discovery module if present in transports and enabled', async () => {
libp2p = new Libp2p(mergeOptions(baseOptions, {
peerId,

View File

@@ -31,6 +31,8 @@ describe('peer-routing', () => {
})
})
after(() => node.stop())
it('.findPeer should return an error', async () => {
await expect(node.peerRouting.findPeer('a cid'))
.to.eventually.be.rejected()

View File

@@ -21,6 +21,8 @@ describe('libp2p.peerStore', () => {
})
})
afterEach(() => Promise.all([libp2p, remoteLibp2p].map(l => l.stop())))
it('adds peer address to AddressBook and keys to the keybook when establishing connection', async () => {
const remoteIdStr = remoteLibp2p.peerId.toB58String()

View File

@@ -572,6 +572,11 @@ describe('libp2p.peerStore (Persisted)', () => {
datastore: memoryDatastore,
peerStore: {
persistence: true
},
config: {
peerDiscovery: {
autoDial: false
}
}
}
})

View File

@@ -18,7 +18,7 @@ const wrongSwarmKeyBuffer = new Uint8Array(95)
generate(swarmKeyBuffer)
generate(wrongSwarmKeyBuffer)
describe('private network', () => {
describe.skip('private network', () => {
it('should accept a valid psk buffer', () => {
const protector = new Protector(swarmKeyBuffer)