Skip to content

Commit fe38340

Browse files
feat!: update to latest libp2p interfaces (#74)
BREAKING CHANGE: uses new single-issue libp2p interface modules Co-authored-by: achingbrain <[email protected]>
1 parent cee5c38 commit fe38340

15 files changed

+91
-73
lines changed

README.md

+18-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,25 @@
1-
# libp2p-pubsub <!-- omit in toc -->
1+
# @libp2p/pubsub <!-- omit in toc -->
22

3-
[![test & maybe release](https://github.com/libp2p/js-libp2p-pubsub/actions/workflows/js-test-and-release.yml/badge.svg)](https://github.com/libp2p/js-libp2p-pubsub/actions/workflows/js-test-and-release.yml)
3+
[![libp2p.io](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/)
4+
[![IRC](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p)
5+
[![Discuss](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg?style=flat-square)](https://discuss.libp2p.io)
6+
[![codecov](https://img.shields.io/codecov/c/github/libp2p/js-libp2p-pubsub.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-pubsub)
7+
[![CI](https://img.shields.io/github/workflow/status/libp2p/js-libp2p-interfaces/test%20&%20maybe%20release/master?style=flat-square)](https://github.com/libp2p/js-libp2p-pubsub/actions/workflows/js-test-and-release.yml)
48

5-
> Contains an implementation of the Pubsub interface
9+
> libp2p pubsub base class
610
711
## Table of contents <!-- omit in toc -->
812

13+
- [Install](#install)
914
- [Usage](#usage)
1015
- [License](#license)
11-
- [Contribution](#contribution)
16+
- [Contribution](#contribution)
17+
18+
## Install
19+
20+
```console
21+
$ npm i @libp2p/pubsub
22+
```
1223

1324
## Usage
1425

@@ -28,9 +39,9 @@ class MyPubsubImplementation extends PubSubBaseProtocol {
2839

2940
Licensed under either of
3041

31-
* Apache 2.0, ([LICENSE-APACHE](LICENSE-APACHE) / http://www.apache.org/licenses/LICENSE-2.0)
32-
* MIT ([LICENSE-MIT](LICENSE-MIT) / http://opensource.org/licenses/MIT)
42+
- Apache 2.0, ([LICENSE-APACHE](LICENSE-APACHE) / <http://www.apache.org/licenses/LICENSE-2.0>)
43+
- MIT ([LICENSE-MIT](LICENSE-MIT) / <http://opensource.org/licenses/MIT>)
3344

34-
### Contribution
45+
## Contribution
3546

3647
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

package.json

+21-16
Original file line numberDiff line numberDiff line change
@@ -45,24 +45,24 @@
4545
],
4646
"exports": {
4747
".": {
48-
"import": "./dist/src/index.js",
49-
"types": "./dist/src/index.d.ts"
48+
"types": "./dist/src/index.d.ts",
49+
"import": "./dist/src/index.js"
5050
},
5151
"./errors": {
52-
"import": "./dist/src/errors.js",
53-
"types": "./dist/src/errors.d.ts"
52+
"types": "./dist/src/errors.d.ts",
53+
"import": "./dist/src/errors.js"
5454
},
5555
"./peer-streams": {
56-
"import": "./dist/src/peer-streams.js",
57-
"types": "./dist/src/peer-streams.d.ts"
56+
"types": "./dist/src/peer-streams.d.ts",
57+
"import": "./dist/src/peer-streams.js"
5858
},
5959
"./signature-policy": {
60-
"import": "./dist/src/signature-policy.js",
61-
"types": "./dist/src/signature-policy.d.ts"
60+
"types": "./dist/src/signature-policy.d.ts",
61+
"import": "./dist/src/signature-policy.js"
6262
},
6363
"./utils": {
64-
"import": "./dist/src/utils.js",
65-
"types": "./dist/src/utils.d.ts"
64+
"types": "./dist/src/utils.d.ts",
65+
"import": "./dist/src/utils.js"
6666
}
6767
},
6868
"eslintConfig": {
@@ -172,26 +172,31 @@
172172
"release": "aegir release"
173173
},
174174
"dependencies": {
175-
"@libp2p/crypto": "^0.22.8",
176-
"@libp2p/interfaces": "^2.0.0",
175+
"@libp2p/components": "^1.0.0",
176+
"@libp2p/crypto": "^1.0.0",
177+
"@libp2p/interfaces": "^3.0.2",
177178
"@libp2p/logger": "^1.1.0",
178179
"@libp2p/peer-collections": "^1.0.0",
179180
"@libp2p/peer-id": "^1.1.0",
180-
"@libp2p/topology": "^1.1.0",
181-
"@multiformats/multiaddr": "^10.1.5",
181+
"@libp2p/topology": "^2.0.0",
182+
"@multiformats/multiaddr": "^10.2.0",
182183
"abortable-iterator": "^4.0.2",
183184
"err-code": "^3.0.1",
184185
"iso-random-stream": "^2.0.0",
185186
"it-length-prefixed": "^7.0.1",
186187
"it-pipe": "^2.0.3",
187-
"it-pushable": "^2.0.1",
188+
"it-pushable": "^3.0.0",
188189
"multiformats": "^9.6.3",
189190
"p-queue": "^7.2.0",
190191
"uint8arrays": "^3.0.0"
191192
},
192193
"devDependencies": {
194+
"@libp2p/interface-connection": "^1.0.1",
195+
"@libp2p/interface-peer-id": "^1.0.2",
196+
"@libp2p/interface-pubsub": "^1.0.1",
197+
"@libp2p/interface-registrar": "^1.0.0",
193198
"@libp2p/peer-id-factory": "^1.0.0",
194-
"aegir": "^37.0.7",
199+
"aegir": "^37.2.0",
195200
"delay": "^5.0.0",
196201
"it-pair": "^2.0.2",
197202
"p-defer": "^4.0.0",

src/index.ts

+16-13
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import {
1111
signMessage,
1212
verifySignature
1313
} from './sign.js'
14-
import type { PeerId } from '@libp2p/interfaces/peer-id'
15-
import type { IncomingStreamData } from '@libp2p/interfaces/registrar'
16-
import type { Connection } from '@libp2p/interfaces/connection'
17-
import type { PubSub, Message, StrictNoSign, StrictSign, PubSubInit, PubSubEvents, PeerStreams, PubSubRPCMessage, PubSubRPC, PubSubRPCSubscription, SubscriptionChangeData, PublishResult } from '@libp2p/interfaces/pubsub'
14+
import type { PeerId } from '@libp2p/interface-peer-id'
15+
import type { IncomingStreamData } from '@libp2p/interface-registrar'
16+
import type { Connection } from '@libp2p/interface-connection'
17+
import type { PubSub, Message, StrictNoSign, StrictSign, PubSubInit, PubSubEvents, PeerStreams, PubSubRPCMessage, PubSubRPC, PubSubRPCSubscription, SubscriptionChangeData, PublishResult } from '@libp2p/interface-pubsub'
1818
import { PeerMap, PeerSet } from '@libp2p/peer-collections'
19-
import { Components, Initializable } from '@libp2p/interfaces/components'
19+
import { Components, Initializable } from '@libp2p/components'
2020

2121
const log = logger('libp2p:pubsub')
2222

@@ -63,7 +63,7 @@ export abstract class PubSubBaseProtocol<Events = PubSubEvents> extends EventEmi
6363
public multicodecs: string[]
6464
public components: Components = new Components()
6565

66-
private _registrarTopologyId: string | undefined
66+
private _registrarTopologyIds: string[] | undefined
6767
protected enabled: boolean
6868

6969
constructor (props: PubSubInit) {
@@ -112,17 +112,18 @@ export abstract class PubSubBaseProtocol<Events = PubSubEvents> extends EventEmi
112112

113113
log('starting')
114114

115+
const registrar = this.components.getRegistrar()
115116
// Incoming streams
116117
// Called after a peer dials us
117-
await this.components.getRegistrar().handle(this.multicodecs, this._onIncomingStream)
118+
await Promise.all(this.multicodecs.map(async multicodec => await registrar.handle(multicodec, this._onIncomingStream)))
118119

119120
// register protocol with topology
120121
// Topology callbacks called on connection manager changes
121122
const topology = createTopology({
122123
onConnect: this._onPeerConnected,
123124
onDisconnect: this._onPeerDisconnected
124125
})
125-
this._registrarTopologyId = await this.components.getRegistrar().register(this.multicodecs, topology)
126+
this._registrarTopologyIds = await Promise.all(this.multicodecs.map(async multicodec => await registrar.register(multicodec, topology)))
126127

127128
log('started')
128129
this.started = true
@@ -136,12 +137,14 @@ export abstract class PubSubBaseProtocol<Events = PubSubEvents> extends EventEmi
136137
return
137138
}
138139

140+
const registrar = this.components.getRegistrar()
141+
139142
// unregister protocol and handlers
140-
if (this._registrarTopologyId != null) {
141-
this.components.getRegistrar().unregister(this._registrarTopologyId)
143+
if (this._registrarTopologyIds != null) {
144+
this._registrarTopologyIds?.map(id => registrar.unregister(id))
142145
}
143146

144-
await this.components.getRegistrar().unhandle(this.multicodecs)
147+
await Promise.all(this.multicodecs.map(async multicodec => await registrar.unhandle(multicodec)))
145148

146149
log('stopping')
147150
for (const peerStreams of this.peers.values()) {
@@ -553,7 +556,7 @@ export abstract class PubSubBaseProtocol<Events = PubSubEvents> extends EventEmi
553556
/**
554557
* Get a list of the peer-ids that are subscribed to one topic.
555558
*/
556-
getSubscribers (topic: string) {
559+
getSubscribers (topic: string): PeerId[] {
557560
if (!this.started) {
558561
throw errcode(new Error('not started yet'), 'ERR_NOT_STARTED_YET')
559562
}
@@ -676,7 +679,7 @@ export abstract class PubSubBaseProtocol<Events = PubSubEvents> extends EventEmi
676679
return Array.from(this.subscriptions)
677680
}
678681

679-
getPeers () {
682+
getPeers (): PeerId[] {
680683
if (!this.started) {
681684
throw new Error('Pubsub is not started')
682685
}

src/peer-streams.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import * as lp from 'it-length-prefixed'
44
import { pushable } from 'it-pushable'
55
import { pipe } from 'it-pipe'
66
import { abortableSource } from 'abortable-iterator'
7-
import type { PeerId } from '@libp2p/interfaces/peer-id'
8-
import type { Stream } from '@libp2p/interfaces/connection'
7+
import type { PeerId } from '@libp2p/interface-peer-id'
8+
import type { Stream } from '@libp2p/interface-connection'
99
import type { Pushable } from 'it-pushable'
10-
import type { PeerStreamEvents } from '@libp2p/interfaces/pubsub'
10+
import type { PeerStreamEvents } from '@libp2p/interface-pubsub'
1111

1212
const log = logger('libp2p-pubsub:peer-streams')
1313

src/sign.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { concat as uint8ArrayConcat } from 'uint8arrays/concat'
22
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
33
import { toRpcMessage } from './utils.js'
4-
import type { PeerId } from '@libp2p/interfaces/peer-id'
4+
import type { PeerId } from '@libp2p/interface-peer-id'
55
import { keys } from '@libp2p/crypto'
6-
import type { Message, PubSubRPCMessage } from '@libp2p/interfaces/pubsub'
6+
import type { Message, PubSubRPCMessage } from '@libp2p/interface-pubsub'
77
import { peerIdFromKeys } from '@libp2p/peer-id'
88

99
export const SignPrefix = uint8ArrayFromString('libp2p-pubsub:')

src/utils.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { randomBytes } from 'iso-random-stream'
22
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
33
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
44
import { sha256 } from 'multiformats/hashes/sha2'
5-
import type { Message, PubSubRPCMessage } from '@libp2p/interfaces/pubsub'
5+
import type { Message, PubSubRPCMessage } from '@libp2p/interface-pubsub'
66
import { peerIdFromBytes } from '@libp2p/peer-id'
77
import { codes } from './errors.js'
88
import errcode from 'err-code'

test/emit-self.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
} from './utils/index.js'
77
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
88
import delay from 'delay'
9-
import { Components } from '@libp2p/interfaces/components'
9+
import { Components } from '@libp2p/components'
1010

1111
const protocol = '/pubsub/1.0.0'
1212
const topic = 'foo'

test/instance.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { expect } from 'aegir/chai'
22
import { PubSubBaseProtocol } from '../src/index.js'
3-
import type { PublishResult, PubSubRPC, PubSubRPCMessage } from '@libp2p/interfaces/pubsub'
3+
import type { PublishResult, PubSubRPC, PubSubRPCMessage } from '@libp2p/interface-pubsub'
44

55
class PubsubProtocol extends PubSubBaseProtocol {
66
decodeRpc (bytes: Uint8Array): PubSubRPC {

test/lifecycle.spec.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ import {
88
MockRegistrar,
99
mockIncomingStreamEvent
1010
} from './utils/index.js'
11-
import type { PeerId } from '@libp2p/interfaces/peer-id'
12-
import type { Registrar } from '@libp2p/interfaces/registrar'
13-
import type { PublishResult, PubSubRPC, PubSubRPCMessage } from '@libp2p/interfaces/pubsub'
14-
import { Components } from '@libp2p/interfaces/components'
11+
import type { PeerId } from '@libp2p/interface-peer-id'
12+
import type { Registrar } from '@libp2p/interface-registrar'
13+
import type { PublishResult, PubSubRPC, PubSubRPCMessage } from '@libp2p/interface-pubsub'
14+
import { Components } from '@libp2p/components'
1515

1616
class PubsubProtocol extends PubSubBaseProtocol {
1717
decodeRpc (bytes: Uint8Array): PubSubRPC {
@@ -158,7 +158,7 @@ describe('pubsub base lifecycle', () => {
158158

159159
// Notify peers of connection
160160
await topologyA.onConnect(peerIdB, c0)
161-
await handlerB(await mockIncomingStreamEvent(protocol, c1, peerIdA))
161+
await handlerB.handler(await mockIncomingStreamEvent(protocol, c1, peerIdA))
162162

163163
expect(pubsubA.peers.size).to.be.eql(1)
164164
expect(pubsubB.peers.size).to.be.eql(1)
@@ -179,7 +179,7 @@ describe('pubsub base lifecycle', () => {
179179
sinon.spy(c0, 'newStream')
180180

181181
await topologyA.onConnect(peerIdB, c0)
182-
await handlerB(await mockIncomingStreamEvent(protocol, c1, peerIdA))
182+
await handlerB.handler(await mockIncomingStreamEvent(protocol, c1, peerIdA))
183183
expect(c0.newStream).to.have.property('callCount', 1)
184184

185185
// @ts-expect-error _removePeer is a protected method
@@ -219,7 +219,7 @@ describe('pubsub base lifecycle', () => {
219219
sinon.stub(c0, 'newStream').throws(error)
220220

221221
await topologyA.onConnect(peerIdB, c0)
222-
await handlerB(await mockIncomingStreamEvent(protocol, c1, peerIdA))
222+
await handlerB.handler(await mockIncomingStreamEvent(protocol, c1, peerIdA))
223223

224224
expect(c0.newStream).to.have.property('callCount', 1)
225225
})
@@ -237,7 +237,7 @@ describe('pubsub base lifecycle', () => {
237237
const [c0, c1] = ConnectionPair()
238238

239239
await topologyA.onConnect(peerIdB, c0)
240-
await handlerB(await mockIncomingStreamEvent(protocol, c1, peerIdA))
240+
await handlerB.handler(await mockIncomingStreamEvent(protocol, c1, peerIdA))
241241

242242
// Notice peers of disconnect
243243
topologyA?.onDisconnect(peerIdB)

test/message.spec.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import {
77
MockRegistrar,
88
PubsubImplementation
99
} from './utils/index.js'
10-
import type { PeerId } from '@libp2p/interfaces/peer-id'
11-
import type { Message } from '@libp2p/interfaces/pubsub'
12-
import { Components } from '@libp2p/interfaces/components'
10+
import type { PeerId } from '@libp2p/interface-peer-id'
11+
import type { Message } from '@libp2p/interface-pubsub'
12+
import { Components } from '@libp2p/components'
1313

1414
describe('pubsub base messages', () => {
1515
let peerId: PeerId

test/pubsub.spec.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import {
1111
PubsubImplementation,
1212
mockIncomingStreamEvent
1313
} from './utils/index.js'
14-
import type { PeerId } from '@libp2p/interfaces/peer-id'
14+
import type { PeerId } from '@libp2p/interface-peer-id'
1515
import { PeerSet } from '@libp2p/peer-collections'
16-
import { Components } from '@libp2p/interfaces/components'
16+
import { Components } from '@libp2p/components'
1717
import { createEd25519PeerId } from '@libp2p/peer-id-factory'
1818
import { noSignMsgId } from '../src/utils.js'
19-
import type { PubSubRPC } from '@libp2p/interfaces/src/pubsub'
19+
import type { PubSubRPC } from '@libp2p/interface-pubsub'
2020
import delay from 'delay'
2121
import pDefer from 'p-defer'
2222

@@ -149,7 +149,7 @@ describe('pubsub base implementation', () => {
149149
const [c0, c1] = ConnectionPair()
150150

151151
await topologyA.onConnect(peerIdB, c0)
152-
await handlerB(await mockIncomingStreamEvent(protocol, c1, peerIdA))
152+
await handlerB.handler(await mockIncomingStreamEvent(protocol, c1, peerIdA))
153153
})
154154

155155
afterEach(async () => {
@@ -259,7 +259,7 @@ describe('pubsub base implementation', () => {
259259
const [c0, c1] = ConnectionPair()
260260

261261
await topologyA.onConnect(peerIdB, c0)
262-
await handlerB(await mockIncomingStreamEvent(protocol, c1, peerIdA))
262+
await handlerB.handler(await mockIncomingStreamEvent(protocol, c1, peerIdA))
263263
})
264264

265265
afterEach(async () => {

test/sign.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import {
1010
import * as PeerIdFactory from '@libp2p/peer-id-factory'
1111
import { randomSeqno, toRpcMessage } from '../src/utils.js'
1212
import { keys } from '@libp2p/crypto'
13-
import type { Message, PubSubRPCMessage } from '@libp2p/interfaces/pubsub'
14-
import type { PeerId } from '@libp2p/interfaces/peer-id'
13+
import type { Message, PubSubRPCMessage } from '@libp2p/interface-pubsub'
14+
import type { PeerId } from '@libp2p/interface-peer-id'
1515

1616
function encodeMessage (message: PubSubRPCMessage) {
1717
return RPC.Message.encode(message)

test/topic-validators.spec.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import {
1010
MockRegistrar,
1111
PubsubImplementation
1212
} from './utils/index.js'
13-
import type { PeerId } from '@libp2p/interfaces/peer-id'
14-
import type { PubSubRPC } from '@libp2p/interfaces/pubsub'
15-
import { Components } from '@libp2p/interfaces/components'
13+
import type { PeerId } from '@libp2p/interface-peer-id'
14+
import type { PubSubRPC } from '@libp2p/interface-pubsub'
15+
import { Components } from '@libp2p/components'
1616

1717
const protocol = '/pubsub/1.0.0'
1818

test/utils.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { expect } from 'aegir/chai'
22
import * as utils from '../src/utils.js'
33
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
4-
import type { Message, PubSubRPCMessage } from '@libp2p/interfaces/pubsub'
4+
import type { Message, PubSubRPCMessage } from '@libp2p/interface-pubsub'
55
import { peerIdFromBytes, peerIdFromString } from '@libp2p/peer-id'
66

77
describe('utils', () => {

0 commit comments

Comments
 (0)