import type { Direction, Stream } from '@libp2p/interface-connection' import type { AbortOptions } from '@libp2p/interfaces' import type { Duplex, Source } from 'it-stream-types' import type { Uint8ArrayList } from 'uint8arraylist' export interface StreamMuxerFactory { /** * The protocol used to select this muxer during connection opening */ protocol: string /** * Creates a new stream muxer to be used with a new connection */ createStreamMuxer: (init?: StreamMuxerInit) => StreamMuxer } /** * A libp2p stream muxer */ export interface StreamMuxer extends Duplex, Source, Promise> { /** * The protocol used to select this muxer during connection opening */ protocol: string /** * A list of streams that are currently open. Closed streams will not be returned. */ readonly streams: Stream[] /** * Initiate a new stream with the given name. If no name is * provided, the id of the stream will be used. */ newStream: (name?: string) => Stream | Promise /** * Close or abort all tracked streams and stop the muxer */ close: (err?: Error) => void } export interface StreamMuxerInit extends AbortOptions { /** * A callback function invoked every time an incoming stream is opened */ onIncomingStream?: (stream: Stream) => void /** * A callback function invoke every time a stream ends */ onStreamEnd?: (stream: Stream) => void /** * Outbound stream muxers are opened by the local node, inbound stream muxers are opened by the remote */ direction?: Direction }