diff --git a/packages/interface-compliance-tests/src/pubsub/api.ts b/packages/interface-compliance-tests/src/pubsub/api.ts index 32cbc9920c..811d40cf23 100644 --- a/packages/interface-compliance-tests/src/pubsub/api.ts +++ b/packages/interface-compliance-tests/src/pubsub/api.ts @@ -1,4 +1,4 @@ -import { isStartable, start, stop } from '@libp2p/interface' +import { isPubSub, isStartable, start, stop } from '@libp2p/interface' import { expect } from 'aegir/chai' import delay from 'delay' import pDefer from 'p-defer' @@ -39,6 +39,10 @@ export default (common: TestSetup): void => { mockNetwork.reset() }) + it('is a PubSub implementation', () => { + expect(isPubSub(pubsub)).to.be.true() + }) + it('can start correctly', async () => { if (!isStartable(pubsub)) { return diff --git a/packages/interface/src/pubsub/index.ts b/packages/interface/src/pubsub/index.ts index a269cc4e8f..a53d6c1500 100644 --- a/packages/interface/src/pubsub/index.ts +++ b/packages/interface/src/pubsub/index.ts @@ -268,3 +268,16 @@ export interface PeerStreamEvents { 'stream:outbound': CustomEvent 'close': CustomEvent } + +/** + * All Pubsub implementations must use this symbol as the name of a property + * with a boolean `true` value + */ +export const pubSubSymbol = Symbol.for('@libp2p/pubsub') + +/** + * Returns true if the passed argument is a PubSub implementation + */ +export function isPubSub (obj?: any): obj is PubSub { + return Boolean(obj?.[pubSubSymbol]) +} diff --git a/packages/pubsub-floodsub/src/index.ts b/packages/pubsub-floodsub/src/index.ts index fd92f0b379..a2517a68c3 100644 --- a/packages/pubsub-floodsub/src/index.ts +++ b/packages/pubsub-floodsub/src/index.ts @@ -32,7 +32,7 @@ * ``` */ -import { serviceDependencies } from '@libp2p/interface' +import { pubSubSymbol, serviceDependencies } from '@libp2p/interface' import { PubSubBaseProtocol, type PubSubComponents } from '@libp2p/pubsub' import { toString } from 'uint8arrays/to-string' import { SimpleTimeCache } from './cache.js' @@ -78,6 +78,8 @@ export class FloodSub extends PubSubBaseProtocol { }) } + readonly [pubSubSymbol] = true + readonly [Symbol.toStringTag] = '@libp2p/floodsub' readonly [serviceDependencies]: string[] = [