mirror of
https://github.com/fluencelabs/js-libp2p
synced 2025-04-25 10:32:14 +00:00
Instead of making the `.dht` and `.pubsub` properties optional, use dummy implementations that throw exceptions if they are not configured. This way we don't have to null guard everywhere they are accessed.
106 lines
2.7 KiB
TypeScript
106 lines
2.7 KiB
TypeScript
/* eslint-env mocha */
|
|
|
|
import { expect } from 'aegir/chai'
|
|
import mergeOptions from 'merge-options'
|
|
import pDefer from 'p-defer'
|
|
import delay from 'delay'
|
|
import { createLibp2p, Libp2p } from '../../src/index.js'
|
|
import { baseOptions, pubsubSubsystemOptions } from './utils.js'
|
|
import { createPeerId } from '../utils/creators/peer.js'
|
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
import { FloodSub } from '@libp2p/floodsub'
|
|
import type { PubSub } from '@libp2p/interfaces/pubsub'
|
|
|
|
describe('Pubsub subsystem is configurable', () => {
|
|
let libp2p: Libp2p
|
|
|
|
afterEach(async () => {
|
|
if (libp2p != null) {
|
|
await libp2p.stop()
|
|
}
|
|
})
|
|
|
|
it('should throw if no module is provided', async () => {
|
|
libp2p = await createLibp2p(baseOptions)
|
|
await libp2p.start()
|
|
expect(() => libp2p.pubsub.getTopics()).to.throw()
|
|
})
|
|
|
|
it('should not throw if the module is provided', async () => {
|
|
libp2p = await createLibp2p(pubsubSubsystemOptions)
|
|
await libp2p.start()
|
|
expect(libp2p.pubsub.getTopics()).to.be.empty()
|
|
})
|
|
|
|
it('should start and stop by default once libp2p starts', async () => {
|
|
const peerId = await createPeerId()
|
|
|
|
const customOptions = mergeOptions(pubsubSubsystemOptions, {
|
|
peerId
|
|
})
|
|
|
|
libp2p = await createLibp2p(customOptions)
|
|
expect(libp2p.pubsub.isStarted()).to.equal(false)
|
|
|
|
await libp2p.start()
|
|
expect(libp2p.pubsub.isStarted()).to.equal(true)
|
|
|
|
await libp2p.stop()
|
|
expect(libp2p.pubsub.isStarted()).to.equal(false)
|
|
})
|
|
})
|
|
|
|
describe('Pubsub subscription handlers adapter', () => {
|
|
let libp2p: Libp2p
|
|
|
|
beforeEach(async () => {
|
|
const peerId = await createPeerId()
|
|
|
|
libp2p = await createLibp2p(mergeOptions(pubsubSubsystemOptions, {
|
|
peerId,
|
|
pubsub: new FloodSub({
|
|
emitSelf: true
|
|
})
|
|
}))
|
|
|
|
await libp2p.start()
|
|
})
|
|
|
|
afterEach(async () => {
|
|
if (libp2p != null) {
|
|
await libp2p.stop()
|
|
}
|
|
})
|
|
|
|
it('extends pubsub with subscribe handler', async () => {
|
|
let countMessages = 0
|
|
const topic = 'topic'
|
|
const defer = pDefer()
|
|
|
|
const handler = () => {
|
|
countMessages++
|
|
defer.resolve()
|
|
}
|
|
|
|
const pubsub: PubSub | undefined = libp2p.pubsub
|
|
|
|
if (pubsub == null) {
|
|
throw new Error('Pubsub was not enabled')
|
|
}
|
|
|
|
pubsub.subscribe(topic)
|
|
pubsub.addEventListener('message', handler)
|
|
pubsub.publish(topic, uint8ArrayFromString('useless-data'))
|
|
await defer.promise
|
|
|
|
pubsub.unsubscribe(topic)
|
|
pubsub.removeEventListener('message', handler)
|
|
pubsub.publish(topic, uint8ArrayFromString('useless-data'))
|
|
|
|
// wait to guarantee that the handler is not called twice
|
|
await delay(100)
|
|
|
|
expect(countMessages).to.equal(1)
|
|
})
|
|
})
|