diff --git a/src/index.ts b/src/index.ts index cd9d78d..9bd919d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -85,9 +85,9 @@ export { GoAwayCode, type FrameHeader, type FrameType } from './frame.js' export type { YamuxMuxerInit } export interface YamuxMuxerComponents { - logger: ComponentLogger + logger?: ComponentLogger } -export function yamux (init: YamuxMuxerInit = {}): (components: YamuxMuxerComponents) => StreamMuxerFactory { - return (components) => new Yamux(components, init) +export function yamux (init: YamuxMuxerInit = {}): (components?: YamuxMuxerComponents) => StreamMuxerFactory { + return (components) => new Yamux(components ?? {}, init) } diff --git a/src/muxer.ts b/src/muxer.ts index df4e792..9822e7b 100644 --- a/src/muxer.ts +++ b/src/muxer.ts @@ -47,7 +47,7 @@ export class YamuxMuxer implements StreamMuxer { private readonly config: Config private readonly log?: Logger - private readonly logger: ComponentLogger + private readonly logger?: ComponentLogger /** Used to close the muxer from either the sink or source */ private readonly closeController: AbortController @@ -82,7 +82,7 @@ export class YamuxMuxer implements StreamMuxer { this.client = init.direction === 'outbound' this.config = { ...defaultConfig, ...init } this.logger = components.logger - this.log = this.logger.forComponent('libp2p:yamux') + this.log = this.logger?.forComponent('libp2p:yamux') verifyConfig(this.config) this.closeController = new AbortController() @@ -364,7 +364,7 @@ export class YamuxMuxer implements StreamMuxer { this.closeStream(id) this.onStreamEnd?.(stream) }, - log: this.logger.forComponent(`libp2p:yamux:${direction}:${id}`), + log: this.logger?.forComponent(`libp2p:yamux:${direction}:${id}`), config: this.config, getRTT: this.getRTT.bind(this) }) diff --git a/src/stream.ts b/src/stream.ts index 3297673..0c1e39f 100644 --- a/src/stream.ts +++ b/src/stream.ts @@ -1,4 +1,4 @@ -import { CodeError } from '@libp2p/interface' +import { CodeError, type Logger } from '@libp2p/interface' import { AbstractStream, type AbstractStreamInit } from '@libp2p/utils/abstract-stream' import each from 'it-foreach' import { ERR_RECV_WINDOW_EXCEEDED, ERR_STREAM_ABORT, INITIAL_STREAM_WINDOW } from './constants.js' @@ -15,12 +15,31 @@ export enum StreamState { Finished, } -export interface YamuxStreamInit extends AbstractStreamInit { +export interface YamuxStreamInit extends Omit { name?: string sendFrame(header: FrameHeader, body?: Uint8ArrayList): void getRTT(): number config: Config state: StreamState + log?: Logger +} + +// https://github.com/libp2p/js-libp2p/issues/2276 +// https://github.com/libp2p/js-libp2p/blob/bca8d6e689b47d85dda74082ed72e671139391de/packages/logger/src/index.ts#L86 +function createDisabledLogger(namespace: string): Logger { + const logger = (): void => {} + logger.enabled = false + logger.color = '' + logger.diff = 0 + logger.log = (): void => {} + logger.namespace = namespace + logger.destroy = () => true + logger.extend = () => logger + logger.debug = logger + logger.error = logger + logger.trace = logger + + return logger } /** YamuxStream is used to represent a logical stream within a session */ @@ -54,6 +73,7 @@ export class YamuxStream extends AbstractStream { constructor (init: YamuxStreamInit) { super({ ...init, + log: init.log ?? createDisabledLogger('yamux'), onEnd: (err?: Error) => { this.state = StreamState.Finished init.onEnd?.(err)