@libp2p/mplex
Advanced tools
| import batchedBytes from 'it-batched-bytes'; | ||
| import * as varint from 'uint8-varint'; | ||
| import { Uint8ArrayList } from 'uint8arraylist'; | ||
| import varint from 'varint'; | ||
| import { allocUnsafe } from './alloc-unsafe.js'; | ||
@@ -21,10 +21,11 @@ import { MessageTypes } from './message-types.js'; | ||
| varint.encode(msg.id << 3 | msg.type, pool, offset); | ||
| offset += varint.encode.bytes ?? 0; | ||
| offset += varint.encodingLength(msg.id << 3 | msg.type); | ||
| if ((msg.type === MessageTypes.NEW_STREAM || msg.type === MessageTypes.MESSAGE_INITIATOR || msg.type === MessageTypes.MESSAGE_RECEIVER) && msg.data != null) { | ||
| varint.encode(msg.data.length, pool, offset); | ||
| offset += varint.encodingLength(msg.data.length); | ||
| } | ||
| else { | ||
| varint.encode(0, pool, offset); | ||
| offset += varint.encodingLength(0); | ||
| } | ||
| offset += varint.encode.bytes ?? 0; | ||
| const header = pool.subarray(this._poolOffset, offset); | ||
@@ -31,0 +32,0 @@ if (POOL_SIZE - offset < 100) { |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"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"} |
@@ -1,2 +0,2 @@ | ||
| import type { StreamMuxerFactory } from '@libp2p/interface-stream-muxer'; | ||
| import type { StreamMuxerFactory } from '@libp2p/interface/stream-muxer'; | ||
| export interface MplexInit { | ||
@@ -3,0 +3,0 @@ /** |
+11
-12
| import { type Message } from './message-types.js'; | ||
| import { type MplexStream } from './stream.js'; | ||
| import type { MplexInit } from './index.js'; | ||
| import type { Stream } from '@libp2p/interface-connection'; | ||
| import type { StreamMuxer, StreamMuxerInit } from '@libp2p/interface-stream-muxer'; | ||
| import type { AbortOptions } from '@libp2p/interface'; | ||
| import type { Stream } from '@libp2p/interface/connection'; | ||
| import type { StreamMuxer, StreamMuxerInit } from '@libp2p/interface/stream-muxer'; | ||
| import type { Sink, Source } from 'it-stream-types'; | ||
| import type { Uint8ArrayList } from 'uint8arraylist'; | ||
| export interface MplexStream extends Stream { | ||
| sourceReadableLength: () => number; | ||
| sourcePush: (data: Uint8ArrayList) => void; | ||
| } | ||
| interface MplexStreamMuxerInit extends MplexInit, StreamMuxerInit { | ||
| /** | ||
| * The default timeout to use in ms when shutting down the muxer. | ||
| */ | ||
| closeTimeout?: number; | ||
| } | ||
@@ -23,2 +25,3 @@ export declare class MplexStreamMuxer implements StreamMuxer { | ||
| private readonly rateLimiter; | ||
| private readonly closeTimeout; | ||
| constructor(init?: MplexStreamMuxerInit); | ||
@@ -37,3 +40,4 @@ /** | ||
| */ | ||
| close(err?: Error | undefined): void; | ||
| close(options?: AbortOptions): Promise<void>; | ||
| abort(err: Error): void; | ||
| /** | ||
@@ -57,7 +61,2 @@ * Called whenever an inbound stream is created | ||
| _createSink(): Sink<Source<Uint8ArrayList | Uint8Array>, Promise<void>>; | ||
| /** | ||
| * Creates a source that restricts outgoing message sizes | ||
| * and varint encodes them | ||
| */ | ||
| _createSource(): any; | ||
| _handleIncoming(message: Message): Promise<void>; | ||
@@ -64,0 +63,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"mplex.d.ts","sourceRoot":"","sources":["../../src/mplex.ts"],"names":[],"mappings":"AASA,OAAO,EAAkC,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAEjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AA0BpD,MAAM,WAAW,WAAY,SAAQ,MAAM;IACzC,oBAAoB,EAAE,MAAM,MAAM,CAAA;IAClC,UAAU,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAA;CAC3C;AAED,UAAU,oBAAqB,SAAQ,SAAS,EAAE,eAAe;CAAG;AAEpE,qBAAa,gBAAiB,YAAW,WAAW;IAC3C,QAAQ,SAAiB;IAEzB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC9D,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;IAEzC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+E;IACxG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8D;IACtF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;gBAElC,IAAI,CAAC,EAAE,oBAAoB;IAuCxC;;OAEG;IACH,IAAI,OAAO,IAAK,MAAM,EAAE,CAWvB;IAED;;;OAGG;IACH,SAAS,CAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAUjC;;OAEG;IACH,KAAK,CAAE,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI;IAWrC;;OAEG;IACH,kBAAkB,CAAE,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW;IAMvE,UAAU,CAAE,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;KAAE,GAAG,WAAW;IAmCnI;;;OAGG;IACH,WAAW,IAAK,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IA2BxE;;;OAGG;IACH,aAAa,IAAK,GAAG;IAgBf,eAAe,CAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAwFxD"} | ||
| {"version":3,"file":"mplex.d.ts","sourceRoot":"","sources":["../../src/mplex.ts"],"names":[],"mappings":"AASA,OAAO,EAAkC,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAA;AACjF,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AA2BpD,UAAU,oBAAqB,SAAQ,SAAS,EAAE,eAAe;IAC/D;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,qBAAa,gBAAiB,YAAW,WAAW;IAC3C,QAAQ,SAAiB;IAEzB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC9D,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAA;IAEzC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+E;IACxG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;gBAExB,IAAI,CAAC,EAAE,oBAAoB;IAuDxC;;OAEG;IACH,IAAI,OAAO,IAAK,MAAM,EAAE,CAWvB;IAED;;;OAGG;IACH,SAAS,CAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAUjC;;OAEG;IACG,KAAK,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BnD,KAAK,CAAE,GAAG,EAAE,KAAK,GAAG,IAAI;IASxB;;OAEG;IACH,kBAAkB,CAAE,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW;IAMvE,UAAU,CAAE,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;KAAE,GAAG,WAAW;IAmCnI;;;OAGG;IACH,WAAW,IAAK,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAyBlE,eAAe,CAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAsGxD"} |
+94
-67
@@ -1,5 +0,5 @@ | ||
| import { CodeError } from '@libp2p/interfaces/errors'; | ||
| import { CodeError } from '@libp2p/interface/errors'; | ||
| import { logger } from '@libp2p/logger'; | ||
| import { abortableSource } from 'abortable-iterator'; | ||
| import { anySignal } from 'any-signal'; | ||
| import { pipe } from 'it-pipe'; | ||
| import { pushableV } from 'it-pushable'; | ||
@@ -17,2 +17,3 @@ import { RateLimiterMemory } from 'rate-limiter-flexible'; | ||
| const DISCONNECT_THRESHOLD = 5; | ||
| const CLOSE_TIMEOUT = 500; | ||
| function printMessage(msg) { | ||
@@ -41,2 +42,3 @@ const output = { | ||
| rateLimiter; | ||
| closeTimeout; | ||
| constructor(init) { | ||
@@ -56,2 +58,3 @@ init = init ?? {}; | ||
| this._init = init; | ||
| this.closeTimeout = init.closeTimeout ?? CLOSE_TIMEOUT; | ||
| /** | ||
@@ -64,5 +67,16 @@ * An iterable sink | ||
| */ | ||
| const source = this._createSource(); | ||
| this._source = source; | ||
| this.source = source; | ||
| this._source = pushableV({ | ||
| objectMode: true, | ||
| onEnd: () => { | ||
| // the source has ended, we can't write any more messages to gracefully | ||
| // close streams so all we can do is destroy them | ||
| for (const stream of this._streams.initiators.values()) { | ||
| stream.destroy(); | ||
| } | ||
| for (const stream of this._streams.receivers.values()) { | ||
| stream.destroy(); | ||
| } | ||
| } | ||
| }); | ||
| this.source = pipe(this._source, source => encode(source, this._init.minSendBytes)); | ||
| /** | ||
@@ -107,13 +121,30 @@ * Close controller | ||
| */ | ||
| close(err) { | ||
| if (this.closeController.signal.aborted) | ||
| async close(options) { | ||
| if (this.closeController.signal.aborted) { | ||
| return; | ||
| if (err != null) { | ||
| this.streams.forEach(s => { s.abort(err); }); | ||
| } | ||
| else { | ||
| this.streams.forEach(s => { s.close(); }); | ||
| const signal = options?.signal ?? AbortSignal.timeout(this.closeTimeout); | ||
| try { | ||
| // try to gracefully close all streams | ||
| await Promise.all(this.streams.map(async (s) => s.close({ | ||
| signal | ||
| }))); | ||
| this._source.end(); | ||
| // try to gracefully close the muxer | ||
| await this._source.onEmpty({ | ||
| signal | ||
| }); | ||
| this.closeController.abort(); | ||
| } | ||
| this.closeController.abort(); | ||
| catch (err) { | ||
| this.abort(err); | ||
| } | ||
| } | ||
| abort(err) { | ||
| if (this.closeController.signal.aborted) { | ||
| return; | ||
| } | ||
| this.streams.forEach(s => { s.abort(err); }); | ||
| this.closeController.abort(err); | ||
| } | ||
| /** | ||
@@ -136,3 +167,3 @@ * Called whenever an inbound stream is created | ||
| } | ||
| const send = (msg) => { | ||
| const send = async (msg) => { | ||
| if (log.enabled) { | ||
@@ -144,3 +175,3 @@ log.trace('%s stream %s send', type, id, printMessage(msg)); | ||
| const onEnd = () => { | ||
| log('%s stream with id %s and protocol %s ended', type, id, stream.stat.protocol); | ||
| log('%s stream with id %s and protocol %s ended', type, id, stream.protocol); | ||
| registry.delete(id); | ||
@@ -161,5 +192,6 @@ if (this._init.onStreamEnd != null) { | ||
| const sink = async (source) => { | ||
| const signal = anySignal([this.closeController.signal, this._init.signal]); | ||
| try { | ||
| source = abortableSource(source, signal); | ||
| source = abortableSource(source, this.closeController.signal, { | ||
| returnOnAbort: true | ||
| }); | ||
| const decoder = new Decoder(this._init.maxMsgSize, this._init.maxUnprocessedMessageQueueSize); | ||
@@ -177,26 +209,5 @@ for await (const chunk of source) { | ||
| } | ||
| finally { | ||
| signal.clear(); | ||
| } | ||
| }; | ||
| return sink; | ||
| } | ||
| /** | ||
| * Creates a source that restricts outgoing message sizes | ||
| * and varint encodes them | ||
| */ | ||
| _createSource() { | ||
| const onEnd = (err) => { | ||
| this.close(err); | ||
| }; | ||
| const source = pushableV({ | ||
| objectMode: true, | ||
| onEnd | ||
| }); | ||
| return Object.assign(encode(source, this._init.minSendBytes), { | ||
| push: source.push, | ||
| end: source.end, | ||
| return: source.return | ||
| }); | ||
| } | ||
| async _handleIncoming(message) { | ||
@@ -226,3 +237,3 @@ const { id, type } = message; | ||
| // since there's no backpressure in mplex, the only thing we can really do to protect ourselves is close the connection | ||
| this._source.end(new Error('Too many open streams')); | ||
| this.abort(new Error('Too many open streams')); | ||
| return; | ||
@@ -242,37 +253,53 @@ } | ||
| log('missing stream %s for message type %s', id, MessageTypeNames[type]); | ||
| // if the remote keeps sending us messages for streams that have been | ||
| // closed or were never opened they may be attacking us so if they do | ||
| // this very quickly all we can do is close the connection | ||
| try { | ||
| await this.rateLimiter.consume('missing-stream', 1); | ||
| } | ||
| catch { | ||
| log('rate limit hit when receiving messages for streams that do not exist - closing remote connection'); | ||
| // since there's no backpressure in mplex, the only thing we can really do to protect ourselves is close the connection | ||
| this.abort(new Error('Too many messages for missing streams')); | ||
| return; | ||
| } | ||
| return; | ||
| } | ||
| const maxBufferSize = this._init.maxStreamBufferSize ?? MAX_STREAM_BUFFER_SIZE; | ||
| switch (type) { | ||
| case MessageTypes.MESSAGE_INITIATOR: | ||
| case MessageTypes.MESSAGE_RECEIVER: | ||
| if (stream.sourceReadableLength() > maxBufferSize) { | ||
| // Stream buffer has got too large, reset the stream | ||
| this._source.push({ | ||
| id: message.id, | ||
| type: type === MessageTypes.MESSAGE_INITIATOR ? MessageTypes.RESET_RECEIVER : MessageTypes.RESET_INITIATOR | ||
| }); | ||
| // Inform the stream consumer they are not fast enough | ||
| const error = new CodeError('Input buffer full - increase Mplex maxBufferSize to accommodate slow consumers', 'ERR_STREAM_INPUT_BUFFER_FULL'); | ||
| stream.abort(error); | ||
| return; | ||
| } | ||
| // We got data from the remote, push it into our local stream | ||
| stream.sourcePush(message.data); | ||
| break; | ||
| case MessageTypes.CLOSE_INITIATOR: | ||
| case MessageTypes.CLOSE_RECEIVER: | ||
| // We should expect no more data from the remote, stop reading | ||
| stream.closeRead(); | ||
| break; | ||
| case MessageTypes.RESET_INITIATOR: | ||
| case MessageTypes.RESET_RECEIVER: | ||
| // Stop reading and writing to the stream immediately | ||
| stream.reset(); | ||
| break; | ||
| default: | ||
| log('unknown message type %s', type); | ||
| try { | ||
| switch (type) { | ||
| case MessageTypes.MESSAGE_INITIATOR: | ||
| case MessageTypes.MESSAGE_RECEIVER: | ||
| if (stream.sourceReadableLength() > maxBufferSize) { | ||
| // Stream buffer has got too large, reset the stream | ||
| this._source.push({ | ||
| id: message.id, | ||
| type: type === MessageTypes.MESSAGE_INITIATOR ? MessageTypes.RESET_RECEIVER : MessageTypes.RESET_INITIATOR | ||
| }); | ||
| // Inform the stream consumer they are not fast enough | ||
| throw new CodeError('Input buffer full - increase Mplex maxBufferSize to accommodate slow consumers', 'ERR_STREAM_INPUT_BUFFER_FULL'); | ||
| } | ||
| // We got data from the remote, push it into our local stream | ||
| stream.sourcePush(message.data); | ||
| break; | ||
| case MessageTypes.CLOSE_INITIATOR: | ||
| case MessageTypes.CLOSE_RECEIVER: | ||
| // The remote has stopped writing, so we can stop reading | ||
| stream.remoteCloseWrite(); | ||
| break; | ||
| case MessageTypes.RESET_INITIATOR: | ||
| case MessageTypes.RESET_RECEIVER: | ||
| // The remote has errored, stop reading and writing to the stream immediately | ||
| stream.reset(); | ||
| break; | ||
| default: | ||
| log('unknown message type %s', type); | ||
| } | ||
| } | ||
| catch (err) { | ||
| log.error('error while processing message', err); | ||
| stream.abort(err); | ||
| } | ||
| } | ||
| } | ||
| //# sourceMappingURL=mplex.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"mplex.js","sourceRoot":"","sources":["../../src/mplex.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"mplex.js","sourceRoot":"","sources":["../../src/mplex.ts"],"names":[],"mappings":"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"} |
+15
-9
@@ -1,2 +0,2 @@ | ||
| import { AbstractStream, type AbstractStreamInit } from '@libp2p/interface-stream-muxer/stream'; | ||
| import { AbstractStream, type AbstractStreamInit } from '@libp2p/interface/stream-muxer/stream'; | ||
| import { Uint8ArrayList } from 'uint8arraylist'; | ||
@@ -6,3 +6,3 @@ import type { Message } from './message-types.js'; | ||
| id: number; | ||
| send: (msg: Message) => void; | ||
| send: (msg: Message) => Promise<void>; | ||
| name?: string; | ||
@@ -16,5 +16,10 @@ onEnd?: (err?: Error) => void; | ||
| name: string; | ||
| send: (msg: Message) => void; | ||
| send: (msg: Message) => Promise<void>; | ||
| /** | ||
| * The maximum allowable data size, any data larger than this will be | ||
| * chunked and sent in multiple data messages | ||
| */ | ||
| maxDataSize: number; | ||
| } | ||
| declare class MplexStream extends AbstractStream { | ||
| export declare class MplexStream extends AbstractStream { | ||
| private readonly name; | ||
@@ -24,8 +29,9 @@ private readonly streamId; | ||
| private readonly types; | ||
| private readonly maxDataSize; | ||
| constructor(init: MplexStreamInit); | ||
| sendNewStream(): void; | ||
| sendData(data: Uint8ArrayList): void; | ||
| sendReset(): void; | ||
| sendCloseWrite(): void; | ||
| sendCloseRead(): void; | ||
| sendNewStream(): Promise<void>; | ||
| sendData(data: Uint8ArrayList): Promise<void>; | ||
| sendReset(): Promise<void>; | ||
| sendCloseWrite(): Promise<void>; | ||
| sendCloseRead(): Promise<void>; | ||
| } | ||
@@ -32,0 +38,0 @@ export declare function createStream(options: Options): MplexStream; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,uCAAuC,CAAA;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAI/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAEjD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;IAC7B,IAAI,CAAC,EAAE,WAAW,GAAG,UAAU,CAAA;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,UAAU,eAAgB,SAAQ,kBAAkB;IAClD,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;CAC7B;AAED,cAAM,WAAY,SAAQ,cAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;gBAEjC,IAAI,EAAE,eAAe;IASlC,aAAa,IAAK,IAAI;IAItB,QAAQ,CAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IAIrC,SAAS,IAAK,IAAI;IAIlB,cAAc,IAAK,IAAI;IAIvB,aAAa,IAAK,IAAI;CAGvB;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAE,OAAO,GAAG,WAAW,CAY3D"} | ||
| {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,uCAAuC,CAAA;AAE/F,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAI/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAEjD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,CAAA;IAC7B,IAAI,CAAC,EAAE,WAAW,GAAG,UAAU,CAAA;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,UAAU,eAAgB,SAAQ,kBAAkB;IAClD,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAErC;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,WAAY,SAAQ,cAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;IACtD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAEvB,IAAI,EAAE,eAAe;IAU5B,aAAa,IAAK,OAAO,CAAC,IAAI,CAAC;IAI/B,QAAQ,CAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAe9C,SAAS,IAAK,OAAO,CAAC,IAAI,CAAC;IAI3B,cAAc,IAAK,OAAO,CAAC,IAAI,CAAC;IAIhC,aAAa,IAAK,OAAO,CAAC,IAAI,CAAC;CAGtC;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAE,OAAO,GAAG,WAAW,CAa3D"} |
+25
-12
@@ -1,2 +0,3 @@ | ||
| import { AbstractStream } from '@libp2p/interface-stream-muxer/stream'; | ||
| import { AbstractStream } from '@libp2p/interface/stream-muxer/stream'; | ||
| import { logger } from '@libp2p/logger'; | ||
| import { Uint8ArrayList } from 'uint8arraylist'; | ||
@@ -6,3 +7,3 @@ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'; | ||
| import { InitiatorMessageTypes, ReceiverMessageTypes } from './message-types.js'; | ||
| class MplexStream extends AbstractStream { | ||
| export class MplexStream extends AbstractStream { | ||
| name; | ||
@@ -12,2 +13,3 @@ streamId; | ||
| types; | ||
| maxDataSize; | ||
| constructor(init) { | ||
@@ -19,16 +21,26 @@ super(init); | ||
| this.streamId = init.streamId; | ||
| this.maxDataSize = init.maxDataSize; | ||
| } | ||
| sendNewStream() { | ||
| this.send({ id: this.streamId, type: InitiatorMessageTypes.NEW_STREAM, data: new Uint8ArrayList(uint8ArrayFromString(this.name)) }); | ||
| async sendNewStream() { | ||
| await this.send({ id: this.streamId, type: InitiatorMessageTypes.NEW_STREAM, data: new Uint8ArrayList(uint8ArrayFromString(this.name)) }); | ||
| } | ||
| sendData(data) { | ||
| this.send({ id: this.streamId, type: this.types.MESSAGE, data }); | ||
| async sendData(data) { | ||
| data = data.sublist(); | ||
| while (data.byteLength > 0) { | ||
| const toSend = Math.min(data.byteLength, this.maxDataSize); | ||
| await this.send({ | ||
| id: this.streamId, | ||
| type: this.types.MESSAGE, | ||
| data: data.sublist(0, toSend) | ||
| }); | ||
| data.consume(toSend); | ||
| } | ||
| } | ||
| sendReset() { | ||
| this.send({ id: this.streamId, type: this.types.RESET }); | ||
| async sendReset() { | ||
| await this.send({ id: this.streamId, type: this.types.RESET }); | ||
| } | ||
| sendCloseWrite() { | ||
| this.send({ id: this.streamId, type: this.types.CLOSE }); | ||
| async sendCloseWrite() { | ||
| await this.send({ id: this.streamId, type: this.types.CLOSE }); | ||
| } | ||
| sendCloseRead() { | ||
| async sendCloseRead() { | ||
| // mplex does not support close read, only close write | ||
@@ -46,5 +58,6 @@ } | ||
| onEnd, | ||
| send | ||
| send, | ||
| log: logger(`libp2p:mplex:stream:${type}:${id}`) | ||
| }); | ||
| } | ||
| //# sourceMappingURL=stream.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA2B,MAAM,uCAAuC,CAAA;AAC/F,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAkBhF,MAAM,WAAY,SAAQ,cAAc;IACrB,IAAI,CAAQ;IACZ,QAAQ,CAAQ;IAChB,IAAI,CAAwB;IAC5B,KAAK,CAAwB;IAE9C,YAAa,IAAqB;QAChC,KAAK,CAAC,IAAI,CAAC,CAAA;QAEX,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,oBAAoB,CAAA;QACzF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;IAC/B,CAAC;IAED,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,qBAAqB,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;IACrI,CAAC;IAED,QAAQ,CAAE,IAAoB;QAC5B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED,aAAa;QACX,sDAAsD;IACxD,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAE,OAAgB;IAC5C,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,WAAW,EAAE,UAAU,GAAG,YAAY,EAAE,GAAG,OAAO,CAAA;IAExF,OAAO,IAAI,WAAW,CAAC;QACrB,EAAE,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE;QAChD,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;QACnC,SAAS,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QACxD,WAAW,EAAE,UAAU;QACvB,KAAK;QACL,IAAI;KACL,CAAC,CAAA;AACJ,CAAC"} | ||
| {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"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"} |
| { | ||
| "MplexInit": "https://libp2p.github.io/js-libp2p-mplex/interfaces/MplexInit.html", | ||
| "mplex": "https://libp2p.github.io/js-libp2p-mplex/functions/mplex.html" | ||
| "MplexInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_mplex.MplexInit.html", | ||
| "mplex": "https://libp2p.github.io/js-libp2p/functions/_libp2p_mplex.mplex.html" | ||
| } |
+17
-112
| { | ||
| "name": "@libp2p/mplex", | ||
| "version": "8.0.4", | ||
| "version": "9.0.4", | ||
| "description": "JavaScript implementation of https://github.com/libp2p/mplex", | ||
| "license": "Apache-2.0 OR MIT", | ||
| "homepage": "https://github.com/libp2p/js-libp2p-mplex#readme", | ||
| "homepage": "https://github.com/libp2p/js-libp2p/tree/master/packages/stream-multiplexer-mplex#readme", | ||
| "repository": { | ||
| "type": "git", | ||
| "url": "git+https://github.com/libp2p/js-libp2p-mplex.git" | ||
| "url": "git+https://github.com/libp2p/js-libp2p.git" | ||
| }, | ||
| "bugs": { | ||
| "url": "https://github.com/libp2p/js-libp2p-mplex/issues" | ||
| "url": "https://github.com/libp2p/js-libp2p/issues" | ||
| }, | ||
@@ -24,6 +24,2 @@ "keywords": [ | ||
| ], | ||
| "engines": { | ||
| "node": ">=16.0.0", | ||
| "npm": ">=7.0.0" | ||
| }, | ||
| "type": "module", | ||
@@ -49,87 +45,2 @@ "types": "./dist/src/index.d.ts", | ||
| }, | ||
| "release": { | ||
| "branches": [ | ||
| "master" | ||
| ], | ||
| "plugins": [ | ||
| [ | ||
| "@semantic-release/commit-analyzer", | ||
| { | ||
| "preset": "conventionalcommits", | ||
| "releaseRules": [ | ||
| { | ||
| "breaking": true, | ||
| "release": "major" | ||
| }, | ||
| { | ||
| "revert": true, | ||
| "release": "patch" | ||
| }, | ||
| { | ||
| "type": "feat", | ||
| "release": "minor" | ||
| }, | ||
| { | ||
| "type": "fix", | ||
| "release": "patch" | ||
| }, | ||
| { | ||
| "type": "docs", | ||
| "release": "patch" | ||
| }, | ||
| { | ||
| "type": "test", | ||
| "release": "patch" | ||
| }, | ||
| { | ||
| "type": "deps", | ||
| "release": "patch" | ||
| }, | ||
| { | ||
| "scope": "no-release", | ||
| "release": false | ||
| } | ||
| ] | ||
| } | ||
| ], | ||
| [ | ||
| "@semantic-release/release-notes-generator", | ||
| { | ||
| "preset": "conventionalcommits", | ||
| "presetConfig": { | ||
| "types": [ | ||
| { | ||
| "type": "feat", | ||
| "section": "Features" | ||
| }, | ||
| { | ||
| "type": "fix", | ||
| "section": "Bug Fixes" | ||
| }, | ||
| { | ||
| "type": "chore", | ||
| "section": "Trivial Changes" | ||
| }, | ||
| { | ||
| "type": "docs", | ||
| "section": "Documentation" | ||
| }, | ||
| { | ||
| "type": "deps", | ||
| "section": "Dependencies" | ||
| }, | ||
| { | ||
| "type": "test", | ||
| "section": "Tests" | ||
| } | ||
| ] | ||
| } | ||
| } | ||
| ], | ||
| "@semantic-release/changelog", | ||
| "@semantic-release/npm", | ||
| "@semantic-release/github", | ||
| "@semantic-release/git" | ||
| ] | ||
| }, | ||
| "scripts": { | ||
@@ -147,26 +58,20 @@ "clean": "aegir clean", | ||
| "test:node": "aegir test -t node --cov", | ||
| "test:electron-main": "aegir test -t electron-main", | ||
| "release": "aegir release", | ||
| "docs": "aegir docs" | ||
| "test:electron-main": "aegir test -t electron-main" | ||
| }, | ||
| "dependencies": { | ||
| "@libp2p/interface-connection": "^5.0.0", | ||
| "@libp2p/interface-stream-muxer": "^4.1.2", | ||
| "@libp2p/interfaces": "^3.2.0", | ||
| "@libp2p/logger": "^2.0.0", | ||
| "abortable-iterator": "^5.0.0", | ||
| "any-signal": "^4.0.1", | ||
| "@libp2p/interface": "^0.1.2", | ||
| "@libp2p/logger": "^3.0.2", | ||
| "abortable-iterator": "^5.0.1", | ||
| "benchmark": "^2.1.4", | ||
| "it-batched-bytes": "^2.0.2", | ||
| "it-pushable": "^3.1.0", | ||
| "it-pushable": "^3.2.0", | ||
| "it-stream-types": "^2.0.1", | ||
| "rate-limiter-flexible": "^2.3.9", | ||
| "uint8arraylist": "^2.1.1", | ||
| "uint8arrays": "^4.0.2", | ||
| "varint": "^6.0.0" | ||
| "rate-limiter-flexible": "^2.3.11", | ||
| "uint8-varint": "^2.0.0", | ||
| "uint8arraylist": "^2.4.3", | ||
| "uint8arrays": "^4.0.6" | ||
| }, | ||
| "devDependencies": { | ||
| "@libp2p/interface-stream-muxer-compliance-tests": "^7.0.3", | ||
| "@types/varint": "^6.0.0", | ||
| "aegir": "^39.0.7", | ||
| "@libp2p/interface-compliance-tests": "^4.0.4", | ||
| "aegir": "^40.0.8", | ||
| "cborg": "^2.0.1", | ||
@@ -176,5 +81,5 @@ "delay": "^6.0.0", | ||
| "it-all": "^3.0.1", | ||
| "it-drain": "^3.0.1", | ||
| "it-drain": "^3.0.2", | ||
| "it-foreach": "^2.0.2", | ||
| "it-map": "^3.0.1", | ||
| "it-map": "^3.0.3", | ||
| "it-pipe": "^3.0.1", | ||
@@ -181,0 +86,0 @@ "it-to-buffer": "^4.0.1", |
+3
-3
@@ -5,4 +5,4 @@ # @libp2p/mplex <!-- omit in toc --> | ||
| [](https://discuss.libp2p.io) | ||
| [](https://codecov.io/gh/libp2p/js-libp2p-mplex) | ||
| [](https://github.com/libp2p/js-libp2p-mplex/actions/workflows/js-test-and-release.yml?query=branch%3Amaster) | ||
| [](https://codecov.io/gh/libp2p/js-libp2p) | ||
| [](https://github.com/libp2p/js-libp2p/actions/workflows/main.yml?query=branch%3Amaster) | ||
@@ -63,3 +63,3 @@ > JavaScript implementation of <https://github.com/libp2p/mplex> | ||
| - <https://libp2p.github.io/js-libp2p-mplex> | ||
| - <https://libp2p.github.io/js-libp2p/modules/_libp2p_mplex.html> | ||
@@ -66,0 +66,0 @@ ## License |
+4
-4
| import batchedBytes from 'it-batched-bytes' | ||
| import * as varint from 'uint8-varint' | ||
| import { Uint8ArrayList } from 'uint8arraylist' | ||
| import varint from 'varint' | ||
| import { allocUnsafe } from './alloc-unsafe.js' | ||
@@ -27,12 +27,12 @@ import { type Message, MessageTypes } from './message-types.js' | ||
| varint.encode(msg.id << 3 | msg.type, pool, offset) | ||
| offset += varint.encode.bytes ?? 0 | ||
| offset += varint.encodingLength(msg.id << 3 | msg.type) | ||
| if ((msg.type === MessageTypes.NEW_STREAM || msg.type === MessageTypes.MESSAGE_INITIATOR || msg.type === MessageTypes.MESSAGE_RECEIVER) && msg.data != null) { | ||
| varint.encode(msg.data.length, pool, offset) | ||
| offset += varint.encodingLength(msg.data.length) | ||
| } else { | ||
| varint.encode(0, pool, offset) | ||
| offset += varint.encodingLength(0) | ||
| } | ||
| offset += varint.encode.bytes ?? 0 | ||
| const header = pool.subarray(this._poolOffset, offset) | ||
@@ -39,0 +39,0 @@ |
+1
-1
| import { MplexStreamMuxer } from './mplex.js' | ||
| import type { StreamMuxer, StreamMuxerFactory, StreamMuxerInit } from '@libp2p/interface-stream-muxer' | ||
| import type { StreamMuxer, StreamMuxerFactory, StreamMuxerInit } from '@libp2p/interface/stream-muxer' | ||
@@ -4,0 +4,0 @@ export interface MplexInit { |
+117
-80
@@ -1,6 +0,6 @@ | ||
| import { CodeError } from '@libp2p/interfaces/errors' | ||
| import { CodeError } from '@libp2p/interface/errors' | ||
| import { logger } from '@libp2p/logger' | ||
| import { abortableSource } from 'abortable-iterator' | ||
| import { anySignal } from 'any-signal' | ||
| import { pushableV } from 'it-pushable' | ||
| import { pipe } from 'it-pipe' | ||
| import { type PushableV, pushableV } from 'it-pushable' | ||
| import { RateLimiterMemory } from 'rate-limiter-flexible' | ||
@@ -11,6 +11,7 @@ import { toString as uint8ArrayToString } from 'uint8arrays' | ||
| import { MessageTypes, MessageTypeNames, type Message } from './message-types.js' | ||
| import { createStream } from './stream.js' | ||
| import { createStream, type MplexStream } from './stream.js' | ||
| import type { MplexInit } from './index.js' | ||
| import type { Stream } from '@libp2p/interface-connection' | ||
| import type { StreamMuxer, StreamMuxerInit } from '@libp2p/interface-stream-muxer' | ||
| import type { AbortOptions } from '@libp2p/interface' | ||
| import type { Stream } from '@libp2p/interface/connection' | ||
| import type { StreamMuxer, StreamMuxerInit } from '@libp2p/interface/stream-muxer' | ||
| import type { Sink, Source } from 'it-stream-types' | ||
@@ -25,2 +26,3 @@ import type { Uint8ArrayList } from 'uint8arraylist' | ||
| const DISCONNECT_THRESHOLD = 5 | ||
| const CLOSE_TIMEOUT = 500 | ||
@@ -44,9 +46,9 @@ function printMessage (msg: Message): any { | ||
| export interface MplexStream extends Stream { | ||
| sourceReadableLength: () => number | ||
| sourcePush: (data: Uint8ArrayList) => void | ||
| interface MplexStreamMuxerInit extends MplexInit, StreamMuxerInit { | ||
| /** | ||
| * The default timeout to use in ms when shutting down the muxer. | ||
| */ | ||
| closeTimeout?: number | ||
| } | ||
| interface MplexStreamMuxerInit extends MplexInit, StreamMuxerInit {} | ||
| export class MplexStreamMuxer implements StreamMuxer { | ||
@@ -61,5 +63,6 @@ public protocol = '/mplex/6.7.0' | ||
| private readonly _init: MplexStreamMuxerInit | ||
| private readonly _source: { push: (val: Message) => void, end: (err?: Error) => void } | ||
| private readonly _source: PushableV<Message> | ||
| private readonly closeController: AbortController | ||
| private readonly rateLimiter: RateLimiterMemory | ||
| private readonly closeTimeout: number | ||
@@ -81,2 +84,3 @@ constructor (init?: MplexStreamMuxerInit) { | ||
| this._init = init | ||
| this.closeTimeout = init.closeTimeout ?? CLOSE_TIMEOUT | ||
@@ -91,6 +95,21 @@ /** | ||
| */ | ||
| const source = this._createSource() | ||
| this._source = source | ||
| this.source = source | ||
| this._source = pushableV<Message>({ | ||
| objectMode: true, | ||
| onEnd: (): void => { | ||
| // the source has ended, we can't write any more messages to gracefully | ||
| // close streams so all we can do is destroy them | ||
| for (const stream of this._streams.initiators.values()) { | ||
| stream.destroy() | ||
| } | ||
| for (const stream of this._streams.receivers.values()) { | ||
| stream.destroy() | ||
| } | ||
| } | ||
| }) | ||
| this.source = pipe( | ||
| this._source, | ||
| source => encode(source, this._init.minSendBytes) | ||
| ) | ||
| /** | ||
@@ -140,13 +159,39 @@ * Close controller | ||
| */ | ||
| close (err?: Error | undefined): void { | ||
| if (this.closeController.signal.aborted) return | ||
| async close (options?: AbortOptions): Promise<void> { | ||
| if (this.closeController.signal.aborted) { | ||
| return | ||
| } | ||
| if (err != null) { | ||
| this.streams.forEach(s => { s.abort(err) }) | ||
| } else { | ||
| this.streams.forEach(s => { s.close() }) | ||
| const signal = options?.signal ?? AbortSignal.timeout(this.closeTimeout) | ||
| try { | ||
| // try to gracefully close all streams | ||
| await Promise.all( | ||
| this.streams.map(async s => s.close({ | ||
| signal | ||
| })) | ||
| ) | ||
| this._source.end() | ||
| // try to gracefully close the muxer | ||
| await this._source.onEmpty({ | ||
| signal | ||
| }) | ||
| this.closeController.abort() | ||
| } catch (err: any) { | ||
| this.abort(err) | ||
| } | ||
| this.closeController.abort() | ||
| } | ||
| abort (err: Error): void { | ||
| if (this.closeController.signal.aborted) { | ||
| return | ||
| } | ||
| this.streams.forEach(s => { s.abort(err) }) | ||
| this.closeController.abort(err) | ||
| } | ||
| /** | ||
@@ -174,3 +219,3 @@ * Called whenever an inbound stream is created | ||
| const send = (msg: Message): void => { | ||
| const send = async (msg: Message): Promise<void> => { | ||
| if (log.enabled) { | ||
@@ -184,3 +229,3 @@ log.trace('%s stream %s send', type, id, printMessage(msg)) | ||
| const onEnd = (): void => { | ||
| log('%s stream with id %s and protocol %s ended', type, id, stream.stat.protocol) | ||
| log('%s stream with id %s and protocol %s ended', type, id, stream.protocol) | ||
| registry.delete(id) | ||
@@ -204,6 +249,6 @@ | ||
| const sink: Sink<Source<Uint8ArrayList | Uint8Array>, Promise<void>> = async source => { | ||
| const signal = anySignal([this.closeController.signal, this._init.signal]) | ||
| try { | ||
| source = abortableSource(source, signal) | ||
| source = abortableSource(source, this.closeController.signal, { | ||
| returnOnAbort: true | ||
| }) | ||
@@ -222,4 +267,2 @@ const decoder = new Decoder(this._init.maxMsgSize, this._init.maxUnprocessedMessageQueueSize) | ||
| this._source.end(err) // End the source with an error | ||
| } finally { | ||
| signal.clear() | ||
| } | ||
@@ -231,22 +274,2 @@ } | ||
| /** | ||
| * Creates a source that restricts outgoing message sizes | ||
| * and varint encodes them | ||
| */ | ||
| _createSource (): any { | ||
| const onEnd = (err?: Error): void => { | ||
| this.close(err) | ||
| } | ||
| const source = pushableV<Message>({ | ||
| objectMode: true, | ||
| onEnd | ||
| }) | ||
| return Object.assign(encode(source, this._init.minSendBytes), { | ||
| push: source.push, | ||
| end: source.end, | ||
| return: source.return | ||
| }) | ||
| } | ||
| async _handleIncoming (message: Message): Promise<void> { | ||
@@ -279,3 +302,3 @@ const { id, type } = message | ||
| // since there's no backpressure in mplex, the only thing we can really do to protect ourselves is close the connection | ||
| this._source.end(new Error('Too many open streams')) | ||
| this.abort(new Error('Too many open streams')) | ||
| return | ||
@@ -302,2 +325,14 @@ } | ||
| // if the remote keeps sending us messages for streams that have been | ||
| // closed or were never opened they may be attacking us so if they do | ||
| // this very quickly all we can do is close the connection | ||
| try { | ||
| await this.rateLimiter.consume('missing-stream', 1) | ||
| } catch { | ||
| log('rate limit hit when receiving messages for streams that do not exist - closing remote connection') | ||
| // since there's no backpressure in mplex, the only thing we can really do to protect ourselves is close the connection | ||
| this.abort(new Error('Too many messages for missing streams')) | ||
| return | ||
| } | ||
| return | ||
@@ -308,36 +343,38 @@ } | ||
| switch (type) { | ||
| case MessageTypes.MESSAGE_INITIATOR: | ||
| case MessageTypes.MESSAGE_RECEIVER: | ||
| if (stream.sourceReadableLength() > maxBufferSize) { | ||
| // Stream buffer has got too large, reset the stream | ||
| this._source.push({ | ||
| id: message.id, | ||
| type: type === MessageTypes.MESSAGE_INITIATOR ? MessageTypes.RESET_RECEIVER : MessageTypes.RESET_INITIATOR | ||
| }) | ||
| try { | ||
| switch (type) { | ||
| case MessageTypes.MESSAGE_INITIATOR: | ||
| case MessageTypes.MESSAGE_RECEIVER: | ||
| if (stream.sourceReadableLength() > maxBufferSize) { | ||
| // Stream buffer has got too large, reset the stream | ||
| this._source.push({ | ||
| id: message.id, | ||
| type: type === MessageTypes.MESSAGE_INITIATOR ? MessageTypes.RESET_RECEIVER : MessageTypes.RESET_INITIATOR | ||
| }) | ||
| // Inform the stream consumer they are not fast enough | ||
| const error = new CodeError('Input buffer full - increase Mplex maxBufferSize to accommodate slow consumers', 'ERR_STREAM_INPUT_BUFFER_FULL') | ||
| stream.abort(error) | ||
| // Inform the stream consumer they are not fast enough | ||
| throw new CodeError('Input buffer full - increase Mplex maxBufferSize to accommodate slow consumers', 'ERR_STREAM_INPUT_BUFFER_FULL') | ||
| } | ||
| return | ||
| } | ||
| // We got data from the remote, push it into our local stream | ||
| stream.sourcePush(message.data) | ||
| break | ||
| case MessageTypes.CLOSE_INITIATOR: | ||
| case MessageTypes.CLOSE_RECEIVER: | ||
| // We should expect no more data from the remote, stop reading | ||
| stream.closeRead() | ||
| break | ||
| case MessageTypes.RESET_INITIATOR: | ||
| case MessageTypes.RESET_RECEIVER: | ||
| // Stop reading and writing to the stream immediately | ||
| stream.reset() | ||
| break | ||
| default: | ||
| log('unknown message type %s', type) | ||
| // We got data from the remote, push it into our local stream | ||
| stream.sourcePush(message.data) | ||
| break | ||
| case MessageTypes.CLOSE_INITIATOR: | ||
| case MessageTypes.CLOSE_RECEIVER: | ||
| // The remote has stopped writing, so we can stop reading | ||
| stream.remoteCloseWrite() | ||
| break | ||
| case MessageTypes.RESET_INITIATOR: | ||
| case MessageTypes.RESET_RECEIVER: | ||
| // The remote has errored, stop reading and writing to the stream immediately | ||
| stream.reset() | ||
| break | ||
| default: | ||
| log('unknown message type %s', type) | ||
| } | ||
| } catch (err: any) { | ||
| log.error('error while processing message', err) | ||
| stream.abort(err) | ||
| } | ||
| } | ||
| } |
+36
-15
@@ -1,2 +0,3 @@ | ||
| import { AbstractStream, type AbstractStreamInit } from '@libp2p/interface-stream-muxer/stream' | ||
| import { AbstractStream, type AbstractStreamInit } from '@libp2p/interface/stream-muxer/stream' | ||
| import { logger } from '@libp2p/logger' | ||
| import { Uint8ArrayList } from 'uint8arraylist' | ||
@@ -10,3 +11,3 @@ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string' | ||
| id: number | ||
| send: (msg: Message) => void | ||
| send: (msg: Message) => Promise<void> | ||
| name?: string | ||
@@ -21,10 +22,17 @@ onEnd?: (err?: Error) => void | ||
| name: string | ||
| send: (msg: Message) => void | ||
| send: (msg: Message) => Promise<void> | ||
| /** | ||
| * The maximum allowable data size, any data larger than this will be | ||
| * chunked and sent in multiple data messages | ||
| */ | ||
| maxDataSize: number | ||
| } | ||
| class MplexStream extends AbstractStream { | ||
| export class MplexStream extends AbstractStream { | ||
| private readonly name: string | ||
| private readonly streamId: number | ||
| private readonly send: (msg: Message) => void | ||
| private readonly send: (msg: Message) => Promise<void> | ||
| private readonly types: Record<string, number> | ||
| private readonly maxDataSize: number | ||
@@ -38,21 +46,33 @@ constructor (init: MplexStreamInit) { | ||
| this.streamId = init.streamId | ||
| this.maxDataSize = init.maxDataSize | ||
| } | ||
| sendNewStream (): void { | ||
| this.send({ id: this.streamId, type: InitiatorMessageTypes.NEW_STREAM, data: new Uint8ArrayList(uint8ArrayFromString(this.name)) }) | ||
| async sendNewStream (): Promise<void> { | ||
| await this.send({ id: this.streamId, type: InitiatorMessageTypes.NEW_STREAM, data: new Uint8ArrayList(uint8ArrayFromString(this.name)) }) | ||
| } | ||
| sendData (data: Uint8ArrayList): void { | ||
| this.send({ id: this.streamId, type: this.types.MESSAGE, data }) | ||
| async sendData (data: Uint8ArrayList): Promise<void> { | ||
| data = data.sublist() | ||
| while (data.byteLength > 0) { | ||
| const toSend = Math.min(data.byteLength, this.maxDataSize) | ||
| await this.send({ | ||
| id: this.streamId, | ||
| type: this.types.MESSAGE, | ||
| data: data.sublist(0, toSend) | ||
| }) | ||
| data.consume(toSend) | ||
| } | ||
| } | ||
| sendReset (): void { | ||
| this.send({ id: this.streamId, type: this.types.RESET }) | ||
| async sendReset (): Promise<void> { | ||
| await this.send({ id: this.streamId, type: this.types.RESET }) | ||
| } | ||
| sendCloseWrite (): void { | ||
| this.send({ id: this.streamId, type: this.types.CLOSE }) | ||
| async sendCloseWrite (): Promise<void> { | ||
| await this.send({ id: this.streamId, type: this.types.CLOSE }) | ||
| } | ||
| sendCloseRead (): void { | ||
| async sendCloseRead (): Promise<void> { | ||
| // mplex does not support close read, only close write | ||
@@ -72,4 +92,5 @@ } | ||
| onEnd, | ||
| send | ||
| send, | ||
| log: logger(`libp2p:mplex:stream:${type}:${id}`) | ||
| }) | ||
| } |
Sorry, the diff of this file is too big to display
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
179020
4.68%11
-21.43%13
-7.14%1882
6.45%13
116.67%+ Added
+ Added
+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
Updated
Updated
Updated
Updated
Updated