mirror of
https://github.com/fluencelabs/js-libp2p-interfaces
synced 2025-04-28 22:42:18 +00:00
fix: type incompatibilities (#75)
This commit is contained in:
parent
bac57b05dc
commit
67a5f51805
27
.github/workflows/typecheck.yml
vendored
Normal file
27
.github/workflows/typecheck.yml
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- main
|
||||||
|
- default
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- '**'
|
||||||
|
|
||||||
|
name: Typecheck
|
||||||
|
jobs:
|
||||||
|
check:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [12.x]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm install
|
||||||
|
- name: Typecheck
|
||||||
|
uses: gozala/typescript-error-reporter-action@v1.0.8
|
12
package.json
12
package.json
@ -9,6 +9,18 @@
|
|||||||
"types",
|
"types",
|
||||||
"dist"
|
"dist"
|
||||||
],
|
],
|
||||||
|
"types": "dist/src/index.d.ts",
|
||||||
|
"typesVersions": {
|
||||||
|
"*": {
|
||||||
|
"src/*": [
|
||||||
|
"dist/src/*",
|
||||||
|
"dist/src/*/index"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"eslintConfig": {
|
||||||
|
"extends": "ipfs"
|
||||||
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "aegir lint",
|
"lint": "aegir lint",
|
||||||
"build": "aegir build",
|
"build": "aegir build",
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
/* eslint-disable valid-jsdoc */
|
|
||||||
|
|
||||||
const PeerId = require('peer-id')
|
const PeerId = require('peer-id')
|
||||||
const multiaddr = require('multiaddr')
|
const multiaddr = require('multiaddr')
|
||||||
const errCode = require('err-code')
|
const errCode = require('err-code')
|
||||||
const Status = require('./status')
|
const { OPEN, CLOSING, CLOSED } = require('./status')
|
||||||
|
|
||||||
const connectionSymbol = Symbol.for('@libp2p/interface-connection/connection')
|
const connectionSymbol = Symbol.for('@libp2p/interface-connection/connection')
|
||||||
|
|
||||||
@ -51,7 +50,7 @@ class Connection {
|
|||||||
/**
|
/**
|
||||||
* Connection identifier.
|
* Connection identifier.
|
||||||
*/
|
*/
|
||||||
this.id = (parseInt(Math.random() * 1e9)).toString(36) + Date.now()
|
this.id = (parseInt(String(Math.random() * 1e9))).toString(36) + Date.now()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Observed multiaddr of the local peer
|
* Observed multiaddr of the local peer
|
||||||
@ -75,10 +74,12 @@ class Connection {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Connection metadata.
|
* Connection metadata.
|
||||||
|
*
|
||||||
|
* @type {Stat & {status: Status}}
|
||||||
*/
|
*/
|
||||||
this._stat = {
|
this._stat = {
|
||||||
...stat,
|
...stat,
|
||||||
status: Status.OPEN
|
status: OPEN
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -152,11 +153,11 @@ class Connection {
|
|||||||
* @returns {Promise<{stream: MuxedStream, protocol: string}>} with muxed+multistream-selected stream and selected protocol
|
* @returns {Promise<{stream: MuxedStream, protocol: string}>} with muxed+multistream-selected stream and selected protocol
|
||||||
*/
|
*/
|
||||||
async newStream (protocols) {
|
async newStream (protocols) {
|
||||||
if (this.stat.status === Status.CLOSING) {
|
if (this.stat.status === CLOSING) {
|
||||||
throw errCode(new Error('the connection is being closed'), 'ERR_CONNECTION_BEING_CLOSED')
|
throw errCode(new Error('the connection is being closed'), 'ERR_CONNECTION_BEING_CLOSED')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.stat.status === Status.CLOSED) {
|
if (this.stat.status === CLOSED) {
|
||||||
throw errCode(new Error('the connection is closed'), 'ERR_CONNECTION_CLOSED')
|
throw errCode(new Error('the connection is closed'), 'ERR_CONNECTION_CLOSED')
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,7 +179,7 @@ class Connection {
|
|||||||
* @param {MuxedStream} muxedStream - a muxed stream
|
* @param {MuxedStream} muxedStream - a muxed stream
|
||||||
* @param {object} properties - the stream properties to be registered
|
* @param {object} properties - the stream properties to be registered
|
||||||
* @param {string} properties.protocol - the protocol used by the stream
|
* @param {string} properties.protocol - the protocol used by the stream
|
||||||
* @param {object} properties.metadata - metadata of the stream
|
* @param {object} [properties.metadata] - metadata of the stream
|
||||||
* @returns {void}
|
* @returns {void}
|
||||||
*/
|
*/
|
||||||
addStream (muxedStream, { protocol, metadata = {} }) {
|
addStream (muxedStream, { protocol, metadata = {} }) {
|
||||||
@ -204,7 +205,7 @@ class Connection {
|
|||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
async close () {
|
async close () {
|
||||||
if (this.stat.status === Status.CLOSED) {
|
if (this.stat.status === CLOSED) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,16 +213,31 @@ class Connection {
|
|||||||
return this._closing
|
return this._closing
|
||||||
}
|
}
|
||||||
|
|
||||||
this.stat.status = Status.CLOSING
|
this.stat.status = CLOSING
|
||||||
|
|
||||||
// Close raw connection
|
// Close raw connection
|
||||||
this._closing = await this._close()
|
this._closing = await this._close()
|
||||||
|
|
||||||
this._stat.timeline.close = Date.now()
|
this._stat.timeline.close = Date.now()
|
||||||
this.stat.status = Status.CLOSED
|
this.stat.status = CLOSED
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {Object} Stat
|
||||||
|
* @property {string} direction - connection establishment direction ("inbound" or "outbound").
|
||||||
|
* @property {Timeline} timeline - connection relevant events timestamp.
|
||||||
|
* @property {string} [multiplexer] - connection multiplexing identifier.
|
||||||
|
* @property {string} [encryption] - connection encryption method identifier.
|
||||||
|
*
|
||||||
|
* @typedef {Object} Timeline
|
||||||
|
* @property {number} open - connection opening timestamp.
|
||||||
|
* @property {number} [upgraded] - connection upgraded timestamp.
|
||||||
|
* @property {number} [close]
|
||||||
|
*
|
||||||
|
* @typedef {import('./status').Status} Status
|
||||||
|
*/
|
||||||
|
|
||||||
module.exports = Connection
|
module.exports = Connection
|
||||||
|
|
||||||
function validateArgs (localAddr, localPeer, remotePeer, newStream, close, getStreams, stat) {
|
function validateArgs (localAddr, localPeer, remotePeer, newStream, close, getStreams, stat) {
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
/**
|
|
||||||
* @module connection/index
|
|
||||||
* @type {typeof import('./connection')}
|
|
||||||
*/
|
|
||||||
exports.Connection = require('./connection')
|
exports.Connection = require('./connection')
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
module.exports = {
|
const STATUS = {
|
||||||
OPEN: /** @type {'open'} */('open'),
|
OPEN: /** @type {'open'} */('open'),
|
||||||
CLOSING: /** @type {'closing'} */('closing'),
|
CLOSING: /** @type {'closing'} */('closing'),
|
||||||
CLOSED: /** @type {'closed'} */('closed')
|
CLOSED: /** @type {'closed'} */('closed')
|
||||||
}
|
}
|
||||||
|
module.exports = STATUS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {STATUS[keyof STATUS]} Status
|
||||||
|
*/
|
||||||
|
@ -74,6 +74,7 @@ module.exports = (test) => {
|
|||||||
let timelineProxy
|
let timelineProxy
|
||||||
const proxyHandler = {
|
const proxyHandler = {
|
||||||
set () {
|
set () {
|
||||||
|
// @ts-ignore - TS fails to infer here
|
||||||
return Reflect.set(...arguments)
|
return Reflect.set(...arguments)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -138,7 +139,9 @@ module.exports = (test) => {
|
|||||||
expect(connection.stat.timeline.close).to.not.exist()
|
expect(connection.stat.timeline.close).to.not.exist()
|
||||||
|
|
||||||
await connection.close()
|
await connection.close()
|
||||||
|
// @ts-ignore - fails to infer callCount
|
||||||
expect(proxyHandler.set.callCount).to.equal(1)
|
expect(proxyHandler.set.callCount).to.equal(1)
|
||||||
|
// @ts-ignore - fails to infer getCall
|
||||||
const [obj, key, value] = proxyHandler.set.getCall(0).args
|
const [obj, key, value] = proxyHandler.set.getCall(0).args
|
||||||
expect(obj).to.eql(connection.stat.timeline)
|
expect(obj).to.eql(connection.stat.timeline)
|
||||||
expect(key).to.equal('close')
|
expect(key).to.equal('close')
|
||||||
|
@ -6,7 +6,7 @@ const expect = chai.expect
|
|||||||
chai.use(require('dirty-chai'))
|
chai.use(require('dirty-chai'))
|
||||||
|
|
||||||
const duplexPair = require('it-pair/duplex')
|
const duplexPair = require('it-pair/duplex')
|
||||||
const pipe = require('it-pipe')
|
const { pipe } = require('it-pipe')
|
||||||
const PeerId = require('peer-id')
|
const PeerId = require('peer-id')
|
||||||
const { collect } = require('streaming-iterables')
|
const { collect } = require('streaming-iterables')
|
||||||
const uint8arrayFromString = require('uint8arrays/from-string')
|
const uint8arrayFromString = require('uint8arrays/from-string')
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
/* eslint-disable valid-jsdoc */
|
|
||||||
|
|
||||||
const debug = require('debug')
|
const debug = require('debug')
|
||||||
const EventEmitter = require('events')
|
const { EventEmitter } = require('events')
|
||||||
const errcode = require('err-code')
|
const errcode = require('err-code')
|
||||||
|
|
||||||
const pipe = require('it-pipe')
|
const { pipe } = require('it-pipe')
|
||||||
|
|
||||||
const MulticodecTopology = require('../topology/multicodec-topology')
|
const MulticodecTopology = require('../topology/multicodec-topology')
|
||||||
const { codes } = require('./errors')
|
const { codes } = require('./errors')
|
||||||
@ -46,7 +45,7 @@ class PubsubBaseProtocol extends EventEmitter {
|
|||||||
* @param {string} props.debugName - log namespace
|
* @param {string} props.debugName - log namespace
|
||||||
* @param {Array<string>|string} props.multicodecs - protocol identificers to connect
|
* @param {Array<string>|string} props.multicodecs - protocol identificers to connect
|
||||||
* @param {Libp2p} props.libp2p
|
* @param {Libp2p} props.libp2p
|
||||||
* @param {SignaturePolicy} [props.globalSignaturePolicy = SignaturePolicy.StrictSign] - defines how signatures should be handled
|
* @param {SignaturePolicyType} [props.globalSignaturePolicy = SignaturePolicy.StrictSign] - defines how signatures should be handled
|
||||||
* @param {boolean} [props.canRelayMessage = false] - if can relay messages not subscribed
|
* @param {boolean} [props.canRelayMessage = false] - if can relay messages not subscribed
|
||||||
* @param {boolean} [props.emitSelf = false] - if publish should emit to self, if subscribed
|
* @param {boolean} [props.emitSelf = false] - if publish should emit to self, if subscribed
|
||||||
* @abstract
|
* @abstract
|
||||||
@ -226,6 +225,7 @@ class PubsubBaseProtocol extends EventEmitter {
|
|||||||
const peer = this._addPeer(peerId, protocol)
|
const peer = this._addPeer(peerId, protocol)
|
||||||
peer.attachInboundStream(stream)
|
peer.attachInboundStream(stream)
|
||||||
|
|
||||||
|
// @ts-ignore - peer.inboundStream maybe null
|
||||||
this._processMessages(idB58Str, peer.inboundStream, peer)
|
this._processMessages(idB58Str, peer.inboundStream, peer)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,6 +243,7 @@ class PubsubBaseProtocol extends EventEmitter {
|
|||||||
try {
|
try {
|
||||||
const { stream, protocol } = await conn.newStream(this.multicodecs)
|
const { stream, protocol } = await conn.newStream(this.multicodecs)
|
||||||
const peer = this._addPeer(peerId, protocol)
|
const peer = this._addPeer(peerId, protocol)
|
||||||
|
// @ts-ignore MuxedStream is not DuplexIterableStream
|
||||||
await peer.attachOutboundStream(stream)
|
await peer.attachOutboundStream(stream)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
this.log.err(err)
|
this.log.err(err)
|
||||||
@ -257,7 +258,7 @@ class PubsubBaseProtocol extends EventEmitter {
|
|||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @param {PeerId} peerId - peerId
|
* @param {PeerId} peerId - peerId
|
||||||
* @param {Error} err - error for connection end
|
* @param {Error} [err] - error for connection end
|
||||||
*/
|
*/
|
||||||
_onPeerDisconnected (peerId, err) {
|
_onPeerDisconnected (peerId, err) {
|
||||||
const idB58Str = peerId.toB58String()
|
const idB58Str = peerId.toB58String()
|
||||||
@ -341,6 +342,7 @@ class PubsubBaseProtocol extends EventEmitter {
|
|||||||
await pipe(
|
await pipe(
|
||||||
stream,
|
stream,
|
||||||
async (source) => {
|
async (source) => {
|
||||||
|
// @ts-ignore - DuplexIterableStream isn't defined as iterable
|
||||||
for await (const data of source) {
|
for await (const data of source) {
|
||||||
const rpcBytes = data instanceof Uint8Array ? data : data.slice()
|
const rpcBytes = data instanceof Uint8Array ? data : data.slice()
|
||||||
const rpcMsg = this._decodeRpc(rpcBytes)
|
const rpcMsg = this._decodeRpc(rpcBytes)
|
||||||
@ -395,7 +397,7 @@ class PubsubBaseProtocol extends EventEmitter {
|
|||||||
* Handles a subscription change from a peer
|
* Handles a subscription change from a peer
|
||||||
*
|
*
|
||||||
* @param {string} id
|
* @param {string} id
|
||||||
* @param {RPC.SubOpt} subOpt
|
* @param {RPCSubOpts} subOpt
|
||||||
*/
|
*/
|
||||||
_processRpcSubOpt (id, subOpt) {
|
_processRpcSubOpt (id, subOpt) {
|
||||||
const t = subOpt.topicID
|
const t = subOpt.topicID
|
||||||
@ -457,7 +459,7 @@ class PubsubBaseProtocol extends EventEmitter {
|
|||||||
* The default msgID implementation
|
* The default msgID implementation
|
||||||
* Child class can override this.
|
* Child class can override this.
|
||||||
*
|
*
|
||||||
* @param {RPC.Message} msg - the message object
|
* @param {RPCMessage} msg - the message object
|
||||||
* @returns {Uint8Array} message id as bytes
|
* @returns {Uint8Array} message id as bytes
|
||||||
*/
|
*/
|
||||||
getMsgId (msg) {
|
getMsgId (msg) {
|
||||||
@ -590,8 +592,8 @@ class PubsubBaseProtocol extends EventEmitter {
|
|||||||
* Should be used by the routers to create the message to send.
|
* Should be used by the routers to create the message to send.
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @param {Message} message
|
* @param {RPCMessage} message
|
||||||
* @returns {Promise<Message>}
|
* @returns {Promise<RPCMessage>}
|
||||||
*/
|
*/
|
||||||
_buildMessage (message) {
|
_buildMessage (message) {
|
||||||
const signaturePolicy = this.globalSignaturePolicy
|
const signaturePolicy = this.globalSignaturePolicy
|
||||||
@ -728,6 +730,16 @@ class PubsubBaseProtocol extends EventEmitter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {any} Libp2p
|
||||||
|
* @typedef {import('./peer-streams').DuplexIterableStream} DuplexIterableStream
|
||||||
|
* @typedef {import('../connection/connection')} Connection
|
||||||
|
* @typedef {import('./message').RPC} RPC
|
||||||
|
* @typedef {import('./message').SubOpts} RPCSubOpts
|
||||||
|
* @typedef {import('./message').Message} RPCMessage
|
||||||
|
* @typedef {import('./signature-policy').SignaturePolicyType} SignaturePolicyType
|
||||||
|
*/
|
||||||
|
|
||||||
module.exports = PubsubBaseProtocol
|
module.exports = PubsubBaseProtocol
|
||||||
module.exports.message = message
|
module.exports.message = message
|
||||||
module.exports.utils = utils
|
module.exports.utils = utils
|
||||||
|
@ -40,6 +40,7 @@ async function verifySignature (message) {
|
|||||||
const baseMessage = { ...message }
|
const baseMessage = { ...message }
|
||||||
delete baseMessage.signature
|
delete baseMessage.signature
|
||||||
delete baseMessage.key
|
delete baseMessage.key
|
||||||
|
// @ts-ignore - from is optional
|
||||||
baseMessage.from = PeerId.createFromCID(baseMessage.from).toBytes()
|
baseMessage.from = PeerId.createFromCID(baseMessage.from).toBytes()
|
||||||
const bytes = uint8ArrayConcat([
|
const bytes = uint8ArrayConcat([
|
||||||
SignPrefix,
|
SignPrefix,
|
||||||
@ -50,6 +51,7 @@ async function verifySignature (message) {
|
|||||||
const pubKey = await messagePublicKey(message)
|
const pubKey = await messagePublicKey(message)
|
||||||
|
|
||||||
// verify the base message
|
// verify the base message
|
||||||
|
// @ts-ignore - may not have signature
|
||||||
return pubKey.verify(bytes, message.signature)
|
return pubKey.verify(bytes, message.signature)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,6 +64,7 @@ async function verifySignature (message) {
|
|||||||
*/
|
*/
|
||||||
async function messagePublicKey (message) {
|
async function messagePublicKey (message) {
|
||||||
// should be available in the from property of the message (peer id)
|
// should be available in the from property of the message (peer id)
|
||||||
|
// @ts-ignore - from is optional
|
||||||
const from = PeerId.createFromCID(message.from)
|
const from = PeerId.createFromCID(message.from)
|
||||||
|
|
||||||
if (message.key) {
|
if (message.key) {
|
||||||
@ -78,6 +81,11 @@ async function messagePublicKey (message) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {import('..').InMessage} InMessage
|
||||||
|
* @typedef {import('libp2p-crypto').PublicKey} PublicKey
|
||||||
|
*/
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
messagePublicKey,
|
messagePublicKey,
|
||||||
signMessage,
|
signMessage,
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const EventEmitter = require('events')
|
const { EventEmitter } = require('events')
|
||||||
|
|
||||||
const lp = require('it-length-prefixed')
|
const lp = require('it-length-prefixed')
|
||||||
|
|
||||||
|
/** @type {typeof import('it-pushable').default} */
|
||||||
|
// @ts-ignore
|
||||||
const pushable = require('it-pushable')
|
const pushable = require('it-pushable')
|
||||||
const pipe = require('it-pipe')
|
const { pipe } = require('it-pipe')
|
||||||
const abortable = require('abortable-iterator')
|
const { source: abortable } = require('abortable-iterator')
|
||||||
const AbortController = require('abort-controller')
|
const AbortController = require('abort-controller').default
|
||||||
const debug = require('debug')
|
const debug = require('debug')
|
||||||
|
|
||||||
const log = debug('libp2p-pubsub:peer-streams')
|
const log = debug('libp2p-pubsub:peer-streams')
|
||||||
@ -19,7 +22,7 @@ log.error = debug('libp2p-pubsub:peer-streams:error')
|
|||||||
*
|
*
|
||||||
* @typedef {object} DuplexIterableStream
|
* @typedef {object} DuplexIterableStream
|
||||||
* @property {Sink} sink
|
* @property {Sink} sink
|
||||||
* @property {() AsyncIterator<Uint8Array>} source
|
* @property {AsyncIterator<Uint8Array>} source
|
||||||
*
|
*
|
||||||
* @typedef PeerId
|
* @typedef PeerId
|
||||||
* @type import('peer-id')
|
* @type import('peer-id')
|
||||||
@ -51,33 +54,33 @@ class PeerStreams extends EventEmitter {
|
|||||||
* The raw outbound stream, as retrieved from conn.newStream
|
* The raw outbound stream, as retrieved from conn.newStream
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @type {DuplexIterableStream}
|
* @type {null|DuplexIterableStream}
|
||||||
*/
|
*/
|
||||||
this._rawOutboundStream = null
|
this._rawOutboundStream = null
|
||||||
/**
|
/**
|
||||||
* The raw inbound stream, as retrieved from the callback from libp2p.handle
|
* The raw inbound stream, as retrieved from the callback from libp2p.handle
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @type {DuplexIterableStream}
|
* @type {null|DuplexIterableStream}
|
||||||
*/
|
*/
|
||||||
this._rawInboundStream = null
|
this._rawInboundStream = null
|
||||||
/**
|
/**
|
||||||
* An AbortController for controlled shutdown of the inbound stream
|
* An AbortController for controlled shutdown of the inbound stream
|
||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
* @type {typeof AbortController}
|
* @type {null|AbortController}
|
||||||
*/
|
*/
|
||||||
this._inboundAbortController = null
|
this._inboundAbortController = null
|
||||||
/**
|
/**
|
||||||
* Write stream -- its preferable to use the write method
|
* Write stream -- its preferable to use the write method
|
||||||
*
|
*
|
||||||
* @type {import('it-pushable').Pushable<Uint8Array>>}
|
* @type {null|import('it-pushable').Pushable<Uint8Array>}
|
||||||
*/
|
*/
|
||||||
this.outboundStream = null
|
this.outboundStream = null
|
||||||
/**
|
/**
|
||||||
* Read stream
|
* Read stream
|
||||||
*
|
*
|
||||||
* @type {DuplexIterableStream}
|
* @type {null|DuplexIterableStream}
|
||||||
*/
|
*/
|
||||||
this.inboundStream = null
|
this.inboundStream = null
|
||||||
}
|
}
|
||||||
@ -113,6 +116,7 @@ class PeerStreams extends EventEmitter {
|
|||||||
throw new Error('No writable connection to ' + id)
|
throw new Error('No writable connection to ' + id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @ts-ignore - this.outboundStream could be null
|
||||||
this.outboundStream.push(data)
|
this.outboundStream.push(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,11 +133,13 @@ class PeerStreams extends EventEmitter {
|
|||||||
// - transformed with length-prefix transform
|
// - transformed with length-prefix transform
|
||||||
this._inboundAbortController = new AbortController()
|
this._inboundAbortController = new AbortController()
|
||||||
this._rawInboundStream = stream
|
this._rawInboundStream = stream
|
||||||
|
// @ts-ignore - abortable returns AsyncIterable and not a DuplexIterableStream
|
||||||
this.inboundStream = abortable(
|
this.inboundStream = abortable(
|
||||||
pipe(
|
pipe(
|
||||||
this._rawInboundStream,
|
this._rawInboundStream,
|
||||||
lp.decode()
|
lp.decode()
|
||||||
),
|
),
|
||||||
|
// @ts-ignore - possibly null
|
||||||
this._inboundAbortController.signal,
|
this._inboundAbortController.signal,
|
||||||
{ returnOnAbort: true }
|
{ returnOnAbort: true }
|
||||||
)
|
)
|
||||||
@ -144,7 +150,7 @@ class PeerStreams extends EventEmitter {
|
|||||||
/**
|
/**
|
||||||
* Attach a raw outbound stream and setup a write stream
|
* Attach a raw outbound stream and setup a write stream
|
||||||
*
|
*
|
||||||
* @param {Stream} stream
|
* @param {DuplexIterableStream} stream
|
||||||
* @returns {Promise<void>}
|
* @returns {Promise<void>}
|
||||||
*/
|
*/
|
||||||
async attachOutboundStream (stream) {
|
async attachOutboundStream (stream) {
|
||||||
@ -153,6 +159,7 @@ class PeerStreams extends EventEmitter {
|
|||||||
const _prevStream = this.outboundStream
|
const _prevStream = this.outboundStream
|
||||||
if (_prevStream) {
|
if (_prevStream) {
|
||||||
// End the stream without emitting a close event
|
// End the stream without emitting a close event
|
||||||
|
// @ts-ignore - outboundStream may be null
|
||||||
await this.outboundStream.end(false)
|
await this.outboundStream.end(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,9 +167,12 @@ class PeerStreams extends EventEmitter {
|
|||||||
this.outboundStream = pushable({
|
this.outboundStream = pushable({
|
||||||
onEnd: (shouldEmit) => {
|
onEnd: (shouldEmit) => {
|
||||||
// close writable side of the stream
|
// close writable side of the stream
|
||||||
this._rawOutboundStream.reset && this._rawOutboundStream.reset()
|
// @ts-ignore - DuplexIterableStream does not define reset
|
||||||
|
this._rawOutboundStream && this._rawOutboundStream.reset && this._rawOutboundStream.reset()
|
||||||
this._rawOutboundStream = null
|
this._rawOutboundStream = null
|
||||||
this.outboundStream = null
|
this.outboundStream = null
|
||||||
|
// @ts-ignore - shouldEmit is `Error | undefined` so condition is
|
||||||
|
// always false
|
||||||
if (shouldEmit !== false) {
|
if (shouldEmit !== false) {
|
||||||
this.emit('close')
|
this.emit('close')
|
||||||
}
|
}
|
||||||
@ -195,6 +205,7 @@ class PeerStreams extends EventEmitter {
|
|||||||
}
|
}
|
||||||
// End the inbound stream
|
// End the inbound stream
|
||||||
if (this.inboundStream) {
|
if (this.inboundStream) {
|
||||||
|
// @ts-ignore - possibly null
|
||||||
this._inboundAbortController.abort()
|
this._inboundAbortController.abort()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* Enum for Signature Policy
|
* Enum for Signature Policy
|
||||||
* Details how message signatures are produced/consumed
|
* Details how message signatures are produced/consumed
|
||||||
*/
|
*/
|
||||||
exports.SignaturePolicy = {
|
const SignaturePolicy = {
|
||||||
/**
|
/**
|
||||||
* On the producing side:
|
* On the producing side:
|
||||||
* * Build messages with the signature, key (from may be enough for certain inlineable public key types), from and seqno fields.
|
* * Build messages with the signature, key (from may be enough for certain inlineable public key types), from and seqno fields.
|
||||||
@ -24,5 +24,10 @@ exports.SignaturePolicy = {
|
|||||||
* * Propagate only if the fields are absent, reject otherwise.
|
* * Propagate only if the fields are absent, reject otherwise.
|
||||||
* * A message_id function will not be able to use the above fields, and should instead rely on the data field. A commonplace strategy is to calculate a hash.
|
* * A message_id function will not be able to use the above fields, and should instead rely on the data field. A commonplace strategy is to calculate a hash.
|
||||||
*/
|
*/
|
||||||
StrictNoSign: /** @type {'StrictNoSign'} */ 'StrictNoSign'
|
StrictNoSign: /** @type {'StrictNoSign'} */ ('StrictNoSign')
|
||||||
}
|
}
|
||||||
|
exports.SignaturePolicy = SignaturePolicy
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {SignaturePolicy[keyof SignaturePolicy]} SignaturePolicyType
|
||||||
|
*/
|
||||||
|
@ -62,7 +62,7 @@ module.exports = (common) => {
|
|||||||
pubsub.publish(topic, data)
|
pubsub.publish(topic, data)
|
||||||
|
|
||||||
// Wait 1 second to guarantee that self is not noticed
|
// Wait 1 second to guarantee that self is not noticed
|
||||||
return new Promise((resolve) => setTimeout(() => resolve(), 1000))
|
return new Promise((resolve) => setTimeout(resolve, 1000))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -50,7 +50,10 @@ module.exports = (common) => {
|
|||||||
sinon.spy(pubsub, '_publish')
|
sinon.spy(pubsub, '_publish')
|
||||||
sinon.spy(pubsub, 'validate')
|
sinon.spy(pubsub, 'validate')
|
||||||
|
|
||||||
const peerStream = new PeerStreams({ id: await PeerId.create() })
|
const peerStream = new PeerStreams({
|
||||||
|
id: await PeerId.create(),
|
||||||
|
protocol: 'test'
|
||||||
|
})
|
||||||
const rpc = {
|
const rpc = {
|
||||||
subscriptions: [],
|
subscriptions: [],
|
||||||
msgs: [{
|
msgs: [{
|
||||||
@ -82,7 +85,11 @@ module.exports = (common) => {
|
|||||||
sinon.spy(pubsub, '_publish')
|
sinon.spy(pubsub, '_publish')
|
||||||
sinon.spy(pubsub, 'validate')
|
sinon.spy(pubsub, 'validate')
|
||||||
|
|
||||||
const peerStream = new PeerStreams({ id: await PeerId.create() })
|
const peerStream = new PeerStreams({
|
||||||
|
id: await PeerId.create(),
|
||||||
|
protocol: 'test'
|
||||||
|
})
|
||||||
|
|
||||||
const rpc = {
|
const rpc = {
|
||||||
subscriptions: [],
|
subscriptions: [],
|
||||||
msgs: [{
|
msgs: [{
|
||||||
|
@ -113,9 +113,9 @@ module.exports = (common) => {
|
|||||||
|
|
||||||
// await subscription change
|
// await subscription change
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
new Promise(resolve => psA.once('pubsub:subscription-change', () => resolve())),
|
new Promise(resolve => psA.once('pubsub:subscription-change', () => resolve(null))),
|
||||||
new Promise(resolve => psB.once('pubsub:subscription-change', () => resolve())),
|
new Promise(resolve => psB.once('pubsub:subscription-change', () => resolve(null))),
|
||||||
new Promise(resolve => psC.once('pubsub:subscription-change', () => resolve()))
|
new Promise(resolve => psC.once('pubsub:subscription-change', () => resolve(null)))
|
||||||
])
|
])
|
||||||
|
|
||||||
// await a cycle
|
// await a cycle
|
||||||
@ -166,9 +166,9 @@ module.exports = (common) => {
|
|||||||
|
|
||||||
// await subscription change
|
// await subscription change
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
new Promise(resolve => psA.once('pubsub:subscription-change', () => resolve())),
|
new Promise(resolve => psA.once('pubsub:subscription-change', () => resolve(null))),
|
||||||
new Promise(resolve => psB.once('pubsub:subscription-change', () => resolve())),
|
new Promise(resolve => psB.once('pubsub:subscription-change', () => resolve(null))),
|
||||||
new Promise(resolve => psC.once('pubsub:subscription-change', () => resolve()))
|
new Promise(resolve => psC.once('pubsub:subscription-change', () => resolve(null)))
|
||||||
])
|
])
|
||||||
|
|
||||||
psA.on(topic, incMsg)
|
psA.on(topic, incMsg)
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
/* eslint-disable valid-jsdoc */
|
|
||||||
|
|
||||||
const randomBytes = require('libp2p-crypto/src/random-bytes')
|
const randomBytes = require('libp2p-crypto/src/random-bytes')
|
||||||
const uint8ArrayToString = require('uint8arrays/to-string')
|
const uint8ArrayToString = require('uint8arrays/to-string')
|
||||||
@ -88,8 +87,8 @@ exports.ensureArray = (maybeArray) => {
|
|||||||
/**
|
/**
|
||||||
* Ensures `message.from` is base58 encoded
|
* Ensures `message.from` is base58 encoded
|
||||||
*
|
*
|
||||||
* @template {Object} T
|
* @template {{from?:any}} T
|
||||||
* @param {T} message
|
* @param {T & {from?:string, receivedFrom:string}} message
|
||||||
* @param {string} [peerId]
|
* @param {string} [peerId]
|
||||||
* @returns {T & {from?: string, peerId?: string }}
|
* @returns {T & {from?: string, peerId?: string }}
|
||||||
*/
|
*/
|
||||||
@ -105,7 +104,7 @@ exports.normalizeInRpcMessage = (message, peerId) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @template {Object} T
|
* @template {{from?:any, data?:any}} T
|
||||||
*
|
*
|
||||||
* @param {T} message
|
* @param {T} message
|
||||||
* @returns {T & {from?: Uint8Array, data?: Uint8Array}}
|
* @returns {T & {from?: Uint8Array, data?: Uint8Array}}
|
||||||
|
@ -5,7 +5,7 @@ const chai = require('chai')
|
|||||||
chai.use(require('chai-checkmark'))
|
chai.use(require('chai-checkmark'))
|
||||||
const { expect } = chai
|
const { expect } = chai
|
||||||
const pair = require('it-pair/duplex')
|
const pair = require('it-pair/duplex')
|
||||||
const pipe = require('it-pipe')
|
const { pipe } = require('it-pipe')
|
||||||
const { collect, map, consume } = require('streaming-iterables')
|
const { collect, map, consume } = require('streaming-iterables')
|
||||||
|
|
||||||
function close (stream) {
|
function close (stream) {
|
||||||
|
@ -3,12 +3,12 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
const pair = require('it-pair/duplex')
|
const pair = require('it-pair/duplex')
|
||||||
const pipe = require('it-pipe')
|
const { pipe } = require('it-pipe')
|
||||||
const { consume } = require('streaming-iterables')
|
const { consume } = require('streaming-iterables')
|
||||||
const Tcp = require('libp2p-tcp')
|
const Tcp = require('libp2p-tcp')
|
||||||
const multiaddr = require('multiaddr')
|
const multiaddr = require('multiaddr')
|
||||||
const abortable = require('abortable-iterator')
|
const { source: abortable } = require('abortable-iterator')
|
||||||
const AbortController = require('abort-controller')
|
const AbortController = require('abort-controller').default
|
||||||
const uint8arrayFromString = require('uint8arrays/from-string')
|
const uint8arrayFromString = require('uint8arrays/from-string')
|
||||||
|
|
||||||
const mh = multiaddr('/ip4/127.0.0.1/tcp/0')
|
const mh = multiaddr('/ip4/127.0.0.1/tcp/0')
|
||||||
|
@ -2,7 +2,10 @@
|
|||||||
|
|
||||||
const { expect } = require('chai')
|
const { expect } = require('chai')
|
||||||
const pair = require('it-pair/duplex')
|
const pair = require('it-pair/duplex')
|
||||||
const pipe = require('it-pipe')
|
const { pipe } = require('it-pipe')
|
||||||
|
|
||||||
|
/** @type {typeof import('p-limit').default} */
|
||||||
|
// @ts-ignore - wrong type defs
|
||||||
const pLimit = require('p-limit')
|
const pLimit = require('p-limit')
|
||||||
const { collect, tap, consume } = require('streaming-iterables')
|
const { collect, tap, consume } = require('streaming-iterables')
|
||||||
|
|
||||||
@ -61,8 +64,11 @@ module.exports = async (Muxer, nStreams, nMsg, limit) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function marker (n) {
|
function marker (n) {
|
||||||
|
/** @type {Function} */
|
||||||
let check
|
let check
|
||||||
let i = 0
|
let i = 0
|
||||||
|
|
||||||
|
/** @type {Promise<void>} */
|
||||||
const done = new Promise((resolve, reject) => {
|
const done = new Promise((resolve, reject) => {
|
||||||
check = err => {
|
check = err => {
|
||||||
i++
|
i++
|
||||||
@ -78,5 +84,7 @@ function marker (n) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// @ts-ignore - TS can't see that assignement occured
|
||||||
return { check, done }
|
return { check, done }
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
/* eslint-disable valid-jsdoc */
|
|
||||||
|
|
||||||
const noop = () => {}
|
const noop = () => {}
|
||||||
const topologySymbol = Symbol.for('@libp2p/js-interfaces/topology')
|
const topologySymbol = Symbol.for('@libp2p/js-interfaces/topology')
|
||||||
@ -15,8 +14,10 @@ const topologySymbol = Symbol.for('@libp2p/js-interfaces/topology')
|
|||||||
* @property {Handlers} [handlers]
|
* @property {Handlers} [handlers]
|
||||||
*
|
*
|
||||||
* @typedef {Object} Handlers
|
* @typedef {Object} Handlers
|
||||||
* @property {(peerId: PeerId, conn: import('../connection')) => void} [onConnect] - protocol "onConnect" handler
|
* @property {(peerId: PeerId, conn: Connection) => void} [onConnect] - protocol "onConnect" handler
|
||||||
* @property {(peerId: PeerId) => void} [onDisconnect] - protocol "onDisconnect" handler
|
* @property {(peerId: PeerId, error?:Error) => void} [onDisconnect] - protocol "onDisconnect" handler
|
||||||
|
*
|
||||||
|
* @typedef {import('../connection/connection')} Connection
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class Topology {
|
class Topology {
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
/* eslint-disable valid-jsdoc */
|
|
||||||
|
|
||||||
const Topology = require('./index')
|
const Topology = require('./index')
|
||||||
const multicodecTopologySymbol = Symbol.for('@libp2p/js-interfaces/topology/multicodec-topology')
|
const multicodecTopologySymbol = Symbol.for('@libp2p/js-interfaces/topology/multicodec-topology')
|
||||||
@ -138,7 +137,7 @@ class MulticodecTopology extends Topology {
|
|||||||
/**
|
/**
|
||||||
* @typedef {import('peer-id')} PeerId
|
* @typedef {import('peer-id')} PeerId
|
||||||
* @typedef {import('multiaddr')} Multiaddr
|
* @typedef {import('multiaddr')} Multiaddr
|
||||||
* @typedef {import('../connection')} Connection
|
* @typedef {import('../connection/connection')} Connection
|
||||||
* @typedef {import('.').Options} TopologyOptions
|
* @typedef {import('.').Options} TopologyOptions
|
||||||
* @typedef {Object} MulticodecOptions
|
* @typedef {Object} MulticodecOptions
|
||||||
* @property {string[]} multicodecs - protocol multicodecs
|
* @property {string[]} multicodecs - protocol multicodecs
|
||||||
|
@ -9,8 +9,8 @@ chai.use(dirtyChai)
|
|||||||
const { isValidTick } = require('./utils')
|
const { isValidTick } = require('./utils')
|
||||||
const goodbye = require('it-goodbye')
|
const goodbye = require('it-goodbye')
|
||||||
const { collect } = require('streaming-iterables')
|
const { collect } = require('streaming-iterables')
|
||||||
const pipe = require('it-pipe')
|
const { pipe } = require('it-pipe')
|
||||||
const AbortController = require('abort-controller')
|
const AbortController = require('abort-controller').default
|
||||||
const AbortError = require('../errors').AbortError
|
const AbortError = require('../errors').AbortError
|
||||||
const sinon = require('sinon')
|
const sinon = require('sinon')
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ chai.use(dirtyChai)
|
|||||||
const sinon = require('sinon')
|
const sinon = require('sinon')
|
||||||
|
|
||||||
const pWaitFor = require('p-wait-for')
|
const pWaitFor = require('p-wait-for')
|
||||||
const pipe = require('it-pipe')
|
const { pipe } = require('it-pipe')
|
||||||
const uint8arrayFromString = require('uint8arrays/from-string')
|
const uint8arrayFromString = require('uint8arrays/from-string')
|
||||||
const { isValidTick } = require('./utils')
|
const { isValidTick } = require('./utils')
|
||||||
|
|
||||||
|
@ -1,32 +1,9 @@
|
|||||||
{
|
{
|
||||||
"include": ["src/**/*.js"],
|
"extends": "./node_modules/aegir/src/config/tsconfig.aegir.json",
|
||||||
"exclude": ["src/**/tests/*", "src/utils"],
|
|
||||||
|
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
// Tells TypeScript to read JS files, as
|
"outDir": "dist"
|
||||||
// normally they are ignored as source files
|
},
|
||||||
"allowJs": true,
|
"include": [
|
||||||
"forceConsistentCasingInFileNames": true,
|
"src"
|
||||||
"noImplicitReturns": false,
|
]
|
||||||
"noImplicitAny": false,
|
|
||||||
"noImplicitThis": true,
|
|
||||||
"noFallthroughCasesInSwitch": true,
|
|
||||||
"noUnusedLocals": true,
|
|
||||||
"noUnusedParameters": false,
|
|
||||||
"strictFunctionTypes": true,
|
|
||||||
"strictNullChecks": true,
|
|
||||||
"strictPropertyInitialization": true,
|
|
||||||
"strictBindCallApply": true,
|
|
||||||
"strict": true,
|
|
||||||
"alwaysStrict": true,
|
|
||||||
"stripInternal": true,
|
|
||||||
// Generate d.ts files
|
|
||||||
"declaration": true,
|
|
||||||
// This compiler run should
|
|
||||||
// only output d.ts files
|
|
||||||
"emitDeclarationOnly": true,
|
|
||||||
"esModuleInterop": true,
|
|
||||||
"rootDir": "./src",
|
|
||||||
"outDir": "./src"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user