@libp2p/utils 6.7.2 → 7.0.0-55b7e5fea
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -1
- package/dist/index.min.js +7 -1
- package/dist/index.min.js.map +4 -4
- package/dist/src/abstract-message-stream.d.ts +129 -0
- package/dist/src/abstract-message-stream.d.ts.map +1 -0
- package/dist/src/abstract-message-stream.js +393 -0
- package/dist/src/abstract-message-stream.js.map +1 -0
- package/dist/src/abstract-multiaddr-connection.d.ts +26 -0
- package/dist/src/abstract-multiaddr-connection.d.ts.map +1 -0
- package/dist/src/abstract-multiaddr-connection.js +66 -0
- package/dist/src/abstract-multiaddr-connection.js.map +1 -0
- package/dist/src/abstract-stream-muxer.d.ts +53 -0
- package/dist/src/abstract-stream-muxer.d.ts.map +1 -0
- package/dist/src/abstract-stream-muxer.js +169 -0
- package/dist/src/abstract-stream-muxer.js.map +1 -0
- package/dist/src/abstract-stream.d.ts +14 -130
- package/dist/src/abstract-stream.d.ts.map +1 -1
- package/dist/src/abstract-stream.js +39 -321
- package/dist/src/abstract-stream.js.map +1 -1
- package/dist/src/errors.d.ts +8 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +8 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/get-thin-waist-addresses.browser.d.ts +1 -1
- package/dist/src/get-thin-waist-addresses.browser.d.ts.map +1 -1
- package/dist/src/get-thin-waist-addresses.browser.js +4 -3
- package/dist/src/get-thin-waist-addresses.browser.js.map +1 -1
- package/dist/src/get-thin-waist-addresses.d.ts +1 -1
- package/dist/src/get-thin-waist-addresses.d.ts.map +1 -1
- package/dist/src/get-thin-waist-addresses.js +7 -9
- package/dist/src/get-thin-waist-addresses.js.map +1 -1
- package/dist/src/index.d.ts +31 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +31 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/length-prefixed-decoder.d.ts +37 -0
- package/dist/src/length-prefixed-decoder.d.ts.map +1 -0
- package/dist/src/length-prefixed-decoder.js +64 -0
- package/dist/src/length-prefixed-decoder.js.map +1 -0
- package/dist/src/message-queue.d.ts +61 -0
- package/dist/src/message-queue.d.ts.map +1 -0
- package/dist/src/message-queue.js +93 -0
- package/dist/src/message-queue.js.map +1 -0
- package/dist/src/mock-muxer.d.ts +57 -0
- package/dist/src/mock-muxer.d.ts.map +1 -0
- package/dist/src/mock-muxer.js +204 -0
- package/dist/src/mock-muxer.js.map +1 -0
- package/dist/src/mock-stream.d.ts +31 -0
- package/dist/src/mock-stream.d.ts.map +1 -0
- package/dist/src/mock-stream.js +69 -0
- package/dist/src/mock-stream.js.map +1 -0
- package/dist/src/multiaddr/get-net-config.d.ts +55 -0
- package/dist/src/multiaddr/get-net-config.d.ts.map +1 -0
- package/dist/src/multiaddr/get-net-config.js +54 -0
- package/dist/src/multiaddr/get-net-config.js.map +1 -0
- package/dist/src/multiaddr/index.d.ts +7 -0
- package/dist/src/multiaddr/index.d.ts.map +1 -0
- package/dist/src/multiaddr/index.js +7 -0
- package/dist/src/multiaddr/index.js.map +1 -0
- package/dist/src/multiaddr/is-global-unicast.d.ts.map +1 -1
- package/dist/src/multiaddr/is-global-unicast.js +8 -9
- package/dist/src/multiaddr/is-global-unicast.js.map +1 -1
- package/dist/src/multiaddr/is-link-local.d.ts.map +1 -1
- package/dist/src/multiaddr/is-link-local.js +11 -16
- package/dist/src/multiaddr/is-link-local.js.map +1 -1
- package/dist/src/multiaddr/is-loopback.d.ts.map +1 -1
- package/dist/src/multiaddr/is-loopback.js +12 -5
- package/dist/src/multiaddr/is-loopback.js.map +1 -1
- package/dist/src/multiaddr/is-network-address.d.ts.map +1 -1
- package/dist/src/multiaddr/is-network-address.js +4 -16
- package/dist/src/multiaddr/is-network-address.js.map +1 -1
- package/dist/src/multiaddr/is-private.d.ts.map +1 -1
- package/dist/src/multiaddr/is-private.js +9 -10
- package/dist/src/multiaddr/is-private.js.map +1 -1
- package/dist/src/multiaddr/utils.d.ts +5 -0
- package/dist/src/multiaddr/utils.d.ts.map +1 -0
- package/dist/src/multiaddr/utils.js +32 -0
- package/dist/src/multiaddr/utils.js.map +1 -0
- package/dist/src/multiaddr-connection-pair.d.ts +25 -0
- package/dist/src/multiaddr-connection-pair.d.ts.map +1 -0
- package/dist/src/multiaddr-connection-pair.js +103 -0
- package/dist/src/multiaddr-connection-pair.js.map +1 -0
- package/dist/src/queue/index.d.ts +3 -6
- package/dist/src/queue/index.d.ts.map +1 -1
- package/dist/src/queue/index.js +20 -4
- package/dist/src/queue/index.js.map +1 -1
- package/dist/src/rate-limiter.d.ts +1 -15
- package/dist/src/rate-limiter.d.ts.map +1 -1
- package/dist/src/rate-limiter.js +1 -14
- package/dist/src/rate-limiter.js.map +1 -1
- package/dist/src/stream-pair.d.ts +42 -0
- package/dist/src/stream-pair.d.ts.map +1 -0
- package/dist/src/stream-pair.js +40 -0
- package/dist/src/stream-pair.js.map +1 -0
- package/dist/src/stream-utils.d.ts +191 -0
- package/dist/src/stream-utils.d.ts.map +1 -0
- package/dist/src/stream-utils.js +371 -0
- package/dist/src/stream-utils.js.map +1 -0
- package/package.json +15 -162
- package/src/abstract-message-stream.ts +553 -0
- package/src/abstract-multiaddr-connection.ts +93 -0
- package/src/abstract-stream-muxer.ts +239 -0
- package/src/abstract-stream.ts +51 -464
- package/src/errors.ts +10 -0
- package/src/get-thin-waist-addresses.browser.ts +5 -4
- package/src/get-thin-waist-addresses.ts +8 -12
- package/src/index.ts +31 -1
- package/src/length-prefixed-decoder.ts +98 -0
- package/src/message-queue.ts +156 -0
- package/src/mock-muxer.ts +304 -0
- package/src/mock-stream.ts +101 -0
- package/src/multiaddr/get-net-config.ts +112 -0
- package/src/multiaddr/index.ts +6 -0
- package/src/multiaddr/is-global-unicast.ts +8 -11
- package/src/multiaddr/is-link-local.ts +11 -20
- package/src/multiaddr/is-loopback.ts +12 -7
- package/src/multiaddr/is-network-address.ts +4 -19
- package/src/multiaddr/is-private.ts +9 -14
- package/src/multiaddr/utils.ts +46 -0
- package/src/multiaddr-connection-pair.ts +147 -0
- package/src/queue/index.ts +24 -11
- package/src/rate-limiter.ts +3 -30
- package/src/stream-pair.ts +90 -0
- package/src/stream-utils.ts +866 -0
- package/dist/src/abort-options.d.ts +0 -7
- package/dist/src/abort-options.d.ts.map +0 -1
- package/dist/src/abort-options.js +0 -14
- package/dist/src/abort-options.js.map +0 -1
- package/dist/src/array-equals.d.ts +0 -24
- package/dist/src/array-equals.d.ts.map +0 -1
- package/dist/src/array-equals.js +0 -31
- package/dist/src/array-equals.js.map +0 -1
- package/dist/src/close-source.d.ts +0 -4
- package/dist/src/close-source.d.ts.map +0 -1
- package/dist/src/close-source.js +0 -11
- package/dist/src/close-source.js.map +0 -1
- package/dist/src/close.d.ts +0 -21
- package/dist/src/close.d.ts.map +0 -1
- package/dist/src/close.js +0 -49
- package/dist/src/close.js.map +0 -1
- package/dist/src/merge-options.d.ts +0 -7
- package/dist/src/merge-options.d.ts.map +0 -1
- package/dist/src/merge-options.js +0 -128
- package/dist/src/merge-options.js.map +0 -1
- package/dist/src/multiaddr/is-ip-based.d.ts +0 -6
- package/dist/src/multiaddr/is-ip-based.d.ts.map +0 -1
- package/dist/src/multiaddr/is-ip-based.js +0 -18
- package/dist/src/multiaddr/is-ip-based.js.map +0 -1
- package/dist/src/stream-to-ma-conn.d.ts +0 -23
- package/dist/src/stream-to-ma-conn.d.ts.map +0 -1
- package/dist/src/stream-to-ma-conn.js +0 -75
- package/dist/src/stream-to-ma-conn.js.map +0 -1
- package/dist/typedoc-urls.json +0 -147
- package/src/abort-options.ts +0 -20
- package/src/array-equals.ts +0 -34
- package/src/close-source.ts +0 -14
- package/src/close.ts +0 -65
- package/src/merge-options.ts +0 -161
- package/src/multiaddr/is-ip-based.ts +0 -21
- package/src/stream-to-ma-conn.ts +0 -106
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { TypedEventEmitter } from '@libp2p/interface';
|
|
2
|
+
import type { AbstractStream } from './abstract-stream.ts';
|
|
3
|
+
import type { AbortOptions, CounterGroup, CreateStreamOptions, EventHandler, Logger, MessageStream, StreamMuxer, StreamMuxerEvents, StreamMuxerOptions, StreamMuxerStatus, StreamOptions } from '@libp2p/interface';
|
|
4
|
+
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
5
|
+
export interface AbstractStreamMuxerInit extends StreamMuxerOptions {
|
|
6
|
+
/**
|
|
7
|
+
* The protocol name for the muxer
|
|
8
|
+
*/
|
|
9
|
+
protocol: string;
|
|
10
|
+
/**
|
|
11
|
+
* The name of the muxer, used to create a new logging scope from the passed
|
|
12
|
+
* connection's logger
|
|
13
|
+
*/
|
|
14
|
+
name: string;
|
|
15
|
+
/**
|
|
16
|
+
* A counter for muxer metrics
|
|
17
|
+
*/
|
|
18
|
+
metrics?: CounterGroup;
|
|
19
|
+
}
|
|
20
|
+
export declare abstract class AbstractStreamMuxer<MuxedStream extends AbstractStream = AbstractStream> extends TypedEventEmitter<StreamMuxerEvents<MuxedStream>> implements StreamMuxer<MuxedStream> {
|
|
21
|
+
streams: MuxedStream[];
|
|
22
|
+
protocol: string;
|
|
23
|
+
status: StreamMuxerStatus;
|
|
24
|
+
protected log: Logger;
|
|
25
|
+
protected maConn: MessageStream;
|
|
26
|
+
protected streamOptions?: StreamOptions;
|
|
27
|
+
protected earlyStreams: MuxedStream[];
|
|
28
|
+
protected maxEarlyStreams: number;
|
|
29
|
+
private readonly metrics?;
|
|
30
|
+
constructor(maConn: MessageStream, init: AbstractStreamMuxerInit);
|
|
31
|
+
send(data: Uint8Array | Uint8ArrayList): boolean;
|
|
32
|
+
close(options?: AbortOptions): Promise<void>;
|
|
33
|
+
abort(err: Error): void;
|
|
34
|
+
onTransportClosed(err?: Error): void;
|
|
35
|
+
createStream(options?: CreateStreamOptions): Promise<MuxedStream>;
|
|
36
|
+
/**
|
|
37
|
+
* Extending classes should invoke this method when a new stream was created
|
|
38
|
+
* by the remote muxer
|
|
39
|
+
*/
|
|
40
|
+
onRemoteStream(stream: MuxedStream): void;
|
|
41
|
+
private cleanUpStream;
|
|
42
|
+
addEventListener<K extends keyof StreamMuxerEvents<MuxedStream>>(type: K, listener: EventHandler<StreamMuxerEvents<MuxedStream>[K]> | null, options?: boolean | AddEventListenerOptions): void;
|
|
43
|
+
addEventListener(type: string, listener: EventHandler<Event>, options?: boolean | AddEventListenerOptions): void;
|
|
44
|
+
/**
|
|
45
|
+
* A new outgoing stream needs to be created
|
|
46
|
+
*/
|
|
47
|
+
abstract onCreateStream(options: CreateStreamOptions): MuxedStream | Promise<MuxedStream>;
|
|
48
|
+
/**
|
|
49
|
+
* Multiplexed data was received from the remote muxer
|
|
50
|
+
*/
|
|
51
|
+
abstract onData(data: Uint8Array | Uint8ArrayList): void;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=abstract-stream-muxer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract-stream-muxer.d.ts","sourceRoot":"","sources":["../../src/abstract-stream-muxer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAIvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAgD,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjQ,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,OAAO,CAAC,EAAE,YAAY,CAAA;CACvB;AAED,8BAAsB,mBAAmB,CAAE,WAAW,SAAS,cAAc,GAAG,cAAc,CAAE,SAAQ,iBAAiB,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAE,YAAW,WAAW,CAAC,WAAW,CAAC;IACpL,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,iBAAiB,CAAA;IAEhC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,MAAM,EAAE,aAAa,CAAA;IAC/B,SAAS,CAAC,aAAa,CAAC,EAAE,aAAa,CAAA;IACvC,SAAS,CAAC,YAAY,EAAE,WAAW,EAAE,CAAA;IACrC,SAAS,CAAC,eAAe,EAAE,MAAM,CAAA;IAEjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAc;gBAE1B,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,uBAAuB;IAyCjE,IAAI,CAAE,IAAI,EAAE,UAAU,GAAG,cAAc,GAAG,OAAO;IAc3C,KAAK,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBnD,KAAK,CAAE,GAAG,EAAE,KAAK,GAAG,IAAI;IAcxB,iBAAiB,CAAE,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI;IAc/B,YAAY,CAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBxE;;;OAGG;IACH,cAAc,CAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAqB1C,OAAO,CAAC,aAAa;IAuBrB,gBAAgB,CAAC,CAAC,SAAS,MAAM,iBAAiB,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAAG,IAAI;IAC9L,gBAAgB,CAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAAG,IAAI;IAsBjH;;OAEG;IACH,QAAQ,CAAC,cAAc,CAAE,OAAO,EAAE,mBAAmB,GAAG,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAE1F;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAE,IAAI,EAAE,UAAU,GAAG,cAAc,GAAG,IAAI;CAC1D"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { MuxerClosedError, TypedEventEmitter } from '@libp2p/interface';
|
|
2
|
+
import { raceSignal } from 'race-signal';
|
|
3
|
+
import { MaxEarlyStreamsError } from "./errors.js";
|
|
4
|
+
import { isPromise } from "./is-promise.js";
|
|
5
|
+
export class AbstractStreamMuxer extends TypedEventEmitter {
|
|
6
|
+
streams;
|
|
7
|
+
protocol;
|
|
8
|
+
status;
|
|
9
|
+
log;
|
|
10
|
+
maConn;
|
|
11
|
+
streamOptions;
|
|
12
|
+
earlyStreams;
|
|
13
|
+
maxEarlyStreams;
|
|
14
|
+
metrics;
|
|
15
|
+
constructor(maConn, init) {
|
|
16
|
+
super();
|
|
17
|
+
this.maConn = maConn;
|
|
18
|
+
this.protocol = init.protocol;
|
|
19
|
+
this.streams = [];
|
|
20
|
+
this.earlyStreams = [];
|
|
21
|
+
this.status = 'open';
|
|
22
|
+
this.log = maConn.log.newScope(init.name);
|
|
23
|
+
this.streamOptions = init.streamOptions;
|
|
24
|
+
this.maxEarlyStreams = init.maxEarlyStreams ?? 10;
|
|
25
|
+
this.metrics = init.metrics;
|
|
26
|
+
// read/write all data from/to underlying maConn
|
|
27
|
+
const muxerMaConnOnMessage = (evt) => {
|
|
28
|
+
try {
|
|
29
|
+
this.onData(evt.data);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
this.abort(err);
|
|
33
|
+
this.maConn.abort(err);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
this.maConn.addEventListener('message', muxerMaConnOnMessage);
|
|
37
|
+
// signal stream writers when the underlying connection can accept more data
|
|
38
|
+
const muxerMaConnOnDrain = () => {
|
|
39
|
+
this.log('underlying stream drained, signal %d streams to continue writing', this.streams.length);
|
|
40
|
+
this.streams.forEach(stream => {
|
|
41
|
+
stream.onMuxerDrain();
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
this.maConn.addEventListener('drain', muxerMaConnOnDrain);
|
|
45
|
+
const muxerOnMaConnClose = () => {
|
|
46
|
+
this.log('underlying stream closed with status %s and %d streams', this.status, this.streams.length);
|
|
47
|
+
this.onTransportClosed();
|
|
48
|
+
};
|
|
49
|
+
this.maConn.addEventListener('close', muxerOnMaConnClose);
|
|
50
|
+
}
|
|
51
|
+
send(data) {
|
|
52
|
+
const result = this.maConn.send(data);
|
|
53
|
+
if (result === false) {
|
|
54
|
+
this.log('underlying stream saturated, signal %d streams to pause writing', this.streams.length);
|
|
55
|
+
this.streams.forEach(stream => {
|
|
56
|
+
stream.onMuxerNeedsDrain();
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
async close(options) {
|
|
62
|
+
if (this.status === 'closed' || this.status === 'closing') {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.status = 'closing';
|
|
66
|
+
await raceSignal(Promise.all([...this.streams].map(async (s) => {
|
|
67
|
+
await s.close(options);
|
|
68
|
+
})), options?.signal);
|
|
69
|
+
this.status = 'closed';
|
|
70
|
+
}
|
|
71
|
+
abort(err) {
|
|
72
|
+
if (this.status === 'closed') {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this.status = 'closing';
|
|
76
|
+
[...this.streams].forEach(s => {
|
|
77
|
+
s.abort(err);
|
|
78
|
+
});
|
|
79
|
+
this.status = 'closed';
|
|
80
|
+
}
|
|
81
|
+
onTransportClosed(err) {
|
|
82
|
+
this.status = 'closing';
|
|
83
|
+
try {
|
|
84
|
+
[...this.streams].forEach(stream => {
|
|
85
|
+
stream.onTransportClosed(err);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
this.abort(err);
|
|
90
|
+
}
|
|
91
|
+
this.status = 'closed';
|
|
92
|
+
}
|
|
93
|
+
async createStream(options) {
|
|
94
|
+
if (this.status !== 'open') {
|
|
95
|
+
throw new MuxerClosedError();
|
|
96
|
+
}
|
|
97
|
+
let stream = this.onCreateStream({
|
|
98
|
+
...this.streamOptions,
|
|
99
|
+
...options
|
|
100
|
+
});
|
|
101
|
+
if (isPromise(stream)) {
|
|
102
|
+
stream = await stream;
|
|
103
|
+
}
|
|
104
|
+
this.streams.push(stream);
|
|
105
|
+
this.cleanUpStream(stream);
|
|
106
|
+
return stream;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Extending classes should invoke this method when a new stream was created
|
|
110
|
+
* by the remote muxer
|
|
111
|
+
*/
|
|
112
|
+
onRemoteStream(stream) {
|
|
113
|
+
this.streams.push(stream);
|
|
114
|
+
this.cleanUpStream(stream);
|
|
115
|
+
if (this.listenerCount('stream') === 0) {
|
|
116
|
+
// no listener has been added for the stream event yet, store the stream
|
|
117
|
+
// to emit it later
|
|
118
|
+
this.earlyStreams.push(stream);
|
|
119
|
+
if (this.earlyStreams.length > this.maxEarlyStreams) {
|
|
120
|
+
this.abort(new MaxEarlyStreamsError(`Too many early streams were opened - ${this.earlyStreams.length}/${this.maxEarlyStreams}`));
|
|
121
|
+
}
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
this.safeDispatchEvent('stream', {
|
|
125
|
+
detail: stream
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
cleanUpStream(stream) {
|
|
129
|
+
const muxerOnStreamEnd = (evt) => {
|
|
130
|
+
const index = this.streams.findIndex(s => s === stream);
|
|
131
|
+
if (index !== -1) {
|
|
132
|
+
this.streams.splice(index, 1);
|
|
133
|
+
}
|
|
134
|
+
if (evt.error != null) {
|
|
135
|
+
if (evt.local) {
|
|
136
|
+
this.metrics?.increment({ [`${stream.direction}_stream_reset`]: true });
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
this.metrics?.increment({ [`${stream.direction}_stream_abort`]: true });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
this.metrics?.increment({ [`${stream.direction}_stream_end`]: true });
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
stream.addEventListener('close', muxerOnStreamEnd);
|
|
147
|
+
this.metrics?.increment({ [`${stream.direction}_stream`]: true });
|
|
148
|
+
}
|
|
149
|
+
addEventListener(...args) {
|
|
150
|
+
// @ts-expect-error cannot ensure args has enough members
|
|
151
|
+
super.addEventListener.apply(this, args);
|
|
152
|
+
// if a 'stream' listener is being added and we have early streams, emit
|
|
153
|
+
// them
|
|
154
|
+
if (args[0] === 'stream' && this.earlyStreams.length > 0) {
|
|
155
|
+
// event listeners can be added in constructors and often use object
|
|
156
|
+
// properties - if this the case we can access a class member before it
|
|
157
|
+
// has been initialized so dispatch the message in the microtask queue
|
|
158
|
+
queueMicrotask(() => {
|
|
159
|
+
this.earlyStreams.forEach(stream => {
|
|
160
|
+
this.safeDispatchEvent('stream', {
|
|
161
|
+
detail: stream
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
this.earlyStreams = [];
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=abstract-stream-muxer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract-stream-muxer.js","sourceRoot":"","sources":["../../src/abstract-stream-muxer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,147 +1,31 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
4
|
-
|
|
5
|
-
export interface AbstractStreamInit {
|
|
1
|
+
import { AbstractMessageStream } from './abstract-message-stream.js';
|
|
2
|
+
import type { MessageStreamInit } from './abstract-message-stream.js';
|
|
3
|
+
import type { AbortOptions, Stream } from '@libp2p/interface';
|
|
4
|
+
export interface AbstractStreamInit extends MessageStreamInit {
|
|
6
5
|
/**
|
|
7
6
|
* A unique identifier for this stream
|
|
8
7
|
*/
|
|
9
8
|
id: string;
|
|
10
9
|
/**
|
|
11
|
-
* The stream
|
|
10
|
+
* The protocol name for the stream, if it is known
|
|
12
11
|
*/
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* A Logger implementation used to log stream-specific information
|
|
16
|
-
*/
|
|
17
|
-
log: Logger;
|
|
18
|
-
/**
|
|
19
|
-
* User specific stream metadata
|
|
20
|
-
*/
|
|
21
|
-
metadata?: Record<string, unknown>;
|
|
22
|
-
/**
|
|
23
|
-
* Invoked when the stream ends
|
|
24
|
-
*/
|
|
25
|
-
onEnd?(err?: Error): void;
|
|
26
|
-
/**
|
|
27
|
-
* Invoked when the readable end of the stream is closed
|
|
28
|
-
*/
|
|
29
|
-
onCloseRead?(): void;
|
|
30
|
-
/**
|
|
31
|
-
* Invoked when the writable end of the stream is closed
|
|
32
|
-
*/
|
|
33
|
-
onCloseWrite?(): void;
|
|
34
|
-
/**
|
|
35
|
-
* Invoked when the stream has been reset by the remote
|
|
36
|
-
*/
|
|
37
|
-
onReset?(): void;
|
|
38
|
-
/**
|
|
39
|
-
* Invoked when the stream has errored
|
|
40
|
-
*/
|
|
41
|
-
onAbort?(err: Error): void;
|
|
42
|
-
/**
|
|
43
|
-
* How long to wait in ms for stream data to be written to the underlying
|
|
44
|
-
* connection when closing the writable end of the stream.
|
|
45
|
-
*
|
|
46
|
-
* @default 500
|
|
47
|
-
*/
|
|
48
|
-
closeTimeout?: number;
|
|
49
|
-
/**
|
|
50
|
-
* After the stream sink has closed, a limit on how long it takes to send
|
|
51
|
-
* a close-write message to the remote peer.
|
|
52
|
-
*/
|
|
53
|
-
sendCloseWriteTimeout?: number;
|
|
12
|
+
protocol?: string;
|
|
54
13
|
}
|
|
55
|
-
export declare abstract class AbstractStream implements Stream {
|
|
14
|
+
export declare abstract class AbstractStream extends AbstractMessageStream implements Stream {
|
|
56
15
|
id: string;
|
|
57
|
-
|
|
58
|
-
timeline: StreamTimeline;
|
|
59
|
-
protocol?: string;
|
|
60
|
-
metadata: Record<string, unknown>;
|
|
61
|
-
source: AsyncGenerator<Uint8ArrayList, void, unknown>;
|
|
62
|
-
status: StreamStatus;
|
|
63
|
-
readStatus: ReadStatus;
|
|
64
|
-
writeStatus: WriteStatus;
|
|
65
|
-
readonly log: Logger;
|
|
66
|
-
private readonly sinkController;
|
|
67
|
-
private readonly sinkEnd;
|
|
68
|
-
private readonly closed;
|
|
69
|
-
private endErr;
|
|
70
|
-
private readonly streamSource;
|
|
71
|
-
private readonly onEnd?;
|
|
72
|
-
private readonly onCloseRead?;
|
|
73
|
-
private readonly onCloseWrite?;
|
|
74
|
-
private readonly onReset?;
|
|
75
|
-
private readonly onAbort?;
|
|
76
|
-
private readonly sendCloseWriteTimeout;
|
|
77
|
-
private sendingData?;
|
|
16
|
+
protocol: string;
|
|
78
17
|
constructor(init: AbstractStreamInit);
|
|
79
|
-
sink(source: Source<Uint8ArrayList | Uint8Array>): Promise<void>;
|
|
80
|
-
protected onSourceEnd(err?: Error): void;
|
|
81
|
-
protected onSinkEnd(err?: Error): void;
|
|
82
18
|
close(options?: AbortOptions): Promise<void>;
|
|
83
19
|
closeRead(options?: AbortOptions): Promise<void>;
|
|
84
|
-
closeWrite(options?: AbortOptions): Promise<void>;
|
|
85
|
-
/**
|
|
86
|
-
* Close immediately for reading and writing and send a reset message (local
|
|
87
|
-
* error)
|
|
88
|
-
*/
|
|
89
|
-
abort(err: Error): void;
|
|
90
|
-
/**
|
|
91
|
-
* Receive a reset message - close immediately for reading and writing (remote
|
|
92
|
-
* error)
|
|
93
|
-
*/
|
|
94
|
-
reset(): void;
|
|
95
|
-
_closeSinkAndSource(err?: Error): void;
|
|
96
|
-
_closeSink(err?: Error): void;
|
|
97
|
-
_closeSource(err?: Error): void;
|
|
98
|
-
/**
|
|
99
|
-
* The remote closed for writing so we should expect to receive no more
|
|
100
|
-
* messages
|
|
101
|
-
*/
|
|
102
|
-
remoteCloseWrite(): void;
|
|
103
|
-
/**
|
|
104
|
-
* The remote closed for reading so we should not send any more
|
|
105
|
-
* messages
|
|
106
|
-
*/
|
|
107
|
-
remoteCloseRead(): void;
|
|
108
|
-
/**
|
|
109
|
-
* The underlying muxer has closed, no more messages can be sent or will
|
|
110
|
-
* be received, close immediately to free up resources
|
|
111
|
-
*/
|
|
112
|
-
destroy(): void;
|
|
113
|
-
/**
|
|
114
|
-
* When an extending class reads data from it's implementation-specific source,
|
|
115
|
-
* call this method to allow the stream consumer to read the data.
|
|
116
|
-
*/
|
|
117
|
-
sourcePush(data: Uint8ArrayList): void;
|
|
118
|
-
/**
|
|
119
|
-
* Returns the amount of unread data - can be used to prevent large amounts of
|
|
120
|
-
* data building up when the stream consumer is too slow.
|
|
121
|
-
*/
|
|
122
|
-
sourceReadableLength(): number;
|
|
123
|
-
/**
|
|
124
|
-
* Send a message to the remote muxer informing them a new stream is being
|
|
125
|
-
* opened
|
|
126
|
-
*/
|
|
127
|
-
abstract sendNewStream(options?: AbortOptions): void | Promise<void>;
|
|
128
|
-
/**
|
|
129
|
-
* Send a data message to the remote muxer
|
|
130
|
-
*/
|
|
131
|
-
abstract sendData(buf: Uint8ArrayList, options?: AbortOptions): void | Promise<void>;
|
|
132
|
-
/**
|
|
133
|
-
* Send a reset message to the remote muxer
|
|
134
|
-
*/
|
|
135
|
-
abstract sendReset(options?: AbortOptions): void | Promise<void>;
|
|
136
20
|
/**
|
|
137
|
-
* Send a message to the remote
|
|
138
|
-
*
|
|
21
|
+
* Send a message to the remote end of the stream, informing them that we will
|
|
22
|
+
* send no more data messages.
|
|
139
23
|
*/
|
|
140
|
-
abstract sendCloseWrite(options?: AbortOptions):
|
|
24
|
+
abstract sendCloseWrite(options?: AbortOptions): Promise<void>;
|
|
141
25
|
/**
|
|
142
|
-
*
|
|
143
|
-
*
|
|
26
|
+
* If supported, send a message to the remote end of the stream, informing
|
|
27
|
+
* them that we will read no more data messages.
|
|
144
28
|
*/
|
|
145
|
-
abstract sendCloseRead(options?: AbortOptions):
|
|
29
|
+
abstract sendCloseRead(options?: AbortOptions): Promise<void>;
|
|
146
30
|
}
|
|
147
31
|
//# sourceMappingURL=abstract-stream.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"abstract-stream.d.ts","sourceRoot":"","sources":["../../src/abstract-stream.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"abstract-stream.d.ts","sourceRoot":"","sources":["../../src/abstract-stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE7D,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D;;OAEG;IACH,EAAE,EAAE,MAAM,CAAA;IAEV;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,8BAAsB,cAAe,SAAQ,qBAAsB,YAAW,MAAM;IAC3E,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;gBAEV,IAAI,EAAE,kBAAkB;IAO/B,KAAK,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA2C7C,SAAS,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBvD;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAE/D;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAC/D"}
|