@libp2p/mplex 3.0.0 → 4.0.2
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/dist/src/alloc-unsafe-browser.d.ts +2 -0
- package/dist/src/alloc-unsafe-browser.d.ts.map +1 -0
- package/dist/src/alloc-unsafe-browser.js +4 -0
- package/dist/src/alloc-unsafe-browser.js.map +1 -0
- package/dist/src/alloc-unsafe.d.ts +3 -0
- package/dist/src/alloc-unsafe.d.ts.map +1 -0
- package/dist/src/alloc-unsafe.js +4 -0
- package/dist/src/alloc-unsafe.js.map +1 -0
- package/dist/src/encode.d.ts +1 -1
- package/dist/src/encode.d.ts.map +1 -1
- package/dist/src/encode.js +1 -6
- package/dist/src/encode.js.map +1 -1
- package/dist/src/mplex.d.ts +5 -0
- package/dist/src/mplex.d.ts.map +1 -1
- package/dist/src/mplex.js +43 -32
- package/dist/src/mplex.js.map +1 -1
- package/dist/src/stream.d.ts.map +1 -1
- package/dist/src/stream.js +14 -8
- package/dist/src/stream.js.map +1 -1
- package/package.json +10 -6
- package/src/alloc-unsafe-browser.ts +3 -0
- package/src/alloc-unsafe.ts +3 -0
- package/src/encode.ts +2 -9
- package/src/mplex.ts +50 -34
- package/src/stream.ts +16 -8
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"alloc-unsafe-browser.d.ts","sourceRoot":"","sources":["../../src/alloc-unsafe-browser.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAE,IAAI,EAAE,MAAM,cAExC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"alloc-unsafe-browser.js","sourceRoot":"","sources":["../../src/alloc-unsafe-browser.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAE,IAAY;IACvC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"alloc-unsafe.d.ts","sourceRoot":"","sources":["../../src/alloc-unsafe.ts"],"names":[],"mappings":";AAAA,wBAAgB,WAAW,CAAE,IAAI,EAAE,MAAM,UAExC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"alloc-unsafe.js","sourceRoot":"","sources":["../../src/alloc-unsafe.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAE,IAAY;IACvC,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;AACjC,CAAC"}
|
package/dist/src/encode.d.ts
CHANGED
package/dist/src/encode.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,EAAE,OAAO,EAAgB,MAAM,oBAAoB,CAAA;AAuD1D;;GAEG;AACH,wBAAwB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC,+CAUlE"}
|
package/dist/src/encode.js
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
import varint from 'varint';
|
2
|
+
import { allocUnsafe } from './alloc-unsafe.js';
|
2
3
|
import { MessageTypes } from './message-types.js';
|
3
4
|
const POOL_SIZE = 10 * 1024;
|
4
|
-
function allocUnsafe(size) {
|
5
|
-
if (globalThis.Buffer != null) {
|
6
|
-
return Buffer.allocUnsafe(size);
|
7
|
-
}
|
8
|
-
return new Uint8Array(size);
|
9
|
-
}
|
10
5
|
class Encoder {
|
11
6
|
constructor() {
|
12
7
|
this._pool = allocUnsafe(POOL_SIZE);
|
package/dist/src/encode.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"encode.js","sourceRoot":"","sources":["../../src/encode.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAW,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAE1D,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAA;AAE3B,MAAM,OAAO;IAIX;QACE,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;QACnC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAA;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAE,GAAY;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAA;QACvB,IAAI,MAAM,GAAG,IAAI,CAAC,WAAW,CAAA;QAE7B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QACnD,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAA;QAE7B,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,iBAAiB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE;YAC3J,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;SAC7C;aAAM;YACL,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;SAC/B;QAED,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAA;QAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;QAEnD,IAAI,SAAS,GAAG,MAAM,GAAG,GAAG,EAAE;YAC5B,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;YACnC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAA;SACrB;aAAM;YACL,IAAI,CAAC,WAAW,GAAG,MAAM,CAAA;SAC1B;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,iBAAiB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE;YAC3J,OAAO;gBACL,MAAM;gBACN,GAAG,CAAC,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE;aAC7D,CAAA;SACF;QAED,OAAO;YACL,MAAM;SACP,CAAA;IACH,CAAC;CACF;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B;;GAEG;AACH,MAAM,CAAC,KAAK,SAAU,CAAC,CAAC,MAAM,CAAE,MAAmC;IACjE,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,MAAM,EAAE;QAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACtB,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE;gBACnB,KAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;aACzB;SACF;aAAM;YACL,KAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;SAC3B;KACF;AACH,CAAC"}
|
package/dist/src/mplex.d.ts
CHANGED
@@ -18,6 +18,7 @@ export declare class MplexStreamMuxer implements StreamMuxer {
|
|
18
18
|
private readonly _streams;
|
19
19
|
private readonly _init;
|
20
20
|
private readonly _source;
|
21
|
+
private readonly closeController;
|
21
22
|
constructor(components: Components, init?: MplexStreamMuxerInit);
|
22
23
|
init(components: Components): void;
|
23
24
|
/**
|
@@ -29,6 +30,10 @@ export declare class MplexStreamMuxer implements StreamMuxer {
|
|
29
30
|
* provided, the id of the stream will be used.
|
30
31
|
*/
|
31
32
|
newStream(name?: string): Stream;
|
33
|
+
/**
|
34
|
+
* Close or abort all tracked streams and stop the muxer
|
35
|
+
*/
|
36
|
+
close(err?: Error | undefined): void;
|
32
37
|
/**
|
33
38
|
* Called whenever an inbound stream is created
|
34
39
|
*/
|
package/dist/src/mplex.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mplex.d.ts","sourceRoot":"","sources":["../../src/mplex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAa,MAAM,aAAa,CAAA;AAKjD,OAAO,EAAkC,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAM5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;
|
1
|
+
{"version":3,"file":"mplex.d.ts","sourceRoot":"","sources":["../../src/mplex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAa,MAAM,aAAa,CAAA;AAKjD,OAAO,EAAkC,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAM5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AA0B3C,MAAM,WAAW,WAAY,SAAQ,MAAM;IACzC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;CAC7B;AAED,UAAU,oBAAqB,SAAQ,SAAS,EAAE,eAAe;CAAG;AAEpE,qBAAa,gBAAiB,YAAW,WAAW;IAC3C,QAAQ,SAAiB;IAEzB,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;IACtB,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IAExC,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;gBAEpC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,oBAAoB;IAkChE,IAAI,CAAE,UAAU,EAAE,UAAU;IAE5B;;OAEG;IACH,IAAI,OAAO,aAUV;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;IAMzD,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;IAuCrH;;;OAGG;IACH,WAAW;IA+BX;;;OAGG;IACH,aAAa;;;;;;;IAgBb,eAAe,CAAE,OAAO,EAAE,OAAO;CA6ElC"}
|
package/dist/src/mplex.js
CHANGED
@@ -10,6 +10,7 @@ import { toString as uint8ArrayToString } from 'uint8arrays';
|
|
10
10
|
import { trackedMap } from '@libp2p/tracked-map';
|
11
11
|
import { logger } from '@libp2p/logger';
|
12
12
|
import errCode from 'err-code';
|
13
|
+
import anySignal from 'any-signal';
|
13
14
|
const log = logger('libp2p:mplex');
|
14
15
|
const MAX_STREAMS_INBOUND_STREAMS_PER_CONNECTION = 1024;
|
15
16
|
const MAX_STREAMS_OUTBOUND_STREAMS_PER_CONNECTION = 1024;
|
@@ -53,9 +54,12 @@ export class MplexStreamMuxer {
|
|
53
54
|
const source = this._createSource();
|
54
55
|
this._source = source;
|
55
56
|
this.source = source;
|
57
|
+
/**
|
58
|
+
* Close controller
|
59
|
+
*/
|
60
|
+
this.closeController = new AbortController();
|
56
61
|
}
|
57
|
-
init(components) {
|
58
|
-
}
|
62
|
+
init(components) { }
|
59
63
|
/**
|
60
64
|
* Returns a Map of streams and their ids
|
61
65
|
*/
|
@@ -75,11 +79,28 @@ export class MplexStreamMuxer {
|
|
75
79
|
* provided, the id of the stream will be used.
|
76
80
|
*/
|
77
81
|
newStream(name) {
|
82
|
+
if (this.closeController.signal.aborted) {
|
83
|
+
throw new Error('Muxer already closed');
|
84
|
+
}
|
78
85
|
const id = this._streamId++;
|
79
86
|
name = name == null ? id.toString() : name.toString();
|
80
87
|
const registry = this._streams.initiators;
|
81
88
|
return this._newStream({ id, name, type: 'initiator', registry });
|
82
89
|
}
|
90
|
+
/**
|
91
|
+
* Close or abort all tracked streams and stop the muxer
|
92
|
+
*/
|
93
|
+
close(err) {
|
94
|
+
if (this.closeController.signal.aborted)
|
95
|
+
return;
|
96
|
+
if (err != null) {
|
97
|
+
this.streams.forEach(s => s.abort(err));
|
98
|
+
}
|
99
|
+
else {
|
100
|
+
this.streams.forEach(s => s.close());
|
101
|
+
}
|
102
|
+
this.closeController.abort();
|
103
|
+
}
|
83
104
|
/**
|
84
105
|
* Called whenever an inbound stream is created
|
85
106
|
*/
|
@@ -89,21 +110,15 @@ export class MplexStreamMuxer {
|
|
89
110
|
return this._newStream({ id, name, type: 'receiver', registry });
|
90
111
|
}
|
91
112
|
_newStream(options) {
|
92
|
-
if (this._streams.initiators.size === (this._init.maxOutboundStreams ?? MAX_STREAMS_OUTBOUND_STREAMS_PER_CONNECTION)) {
|
93
|
-
throw errCode(new Error('To many outgoing streams open'), 'ERR_TOO_MANY_OUTBOUND_STREAMS');
|
94
|
-
}
|
95
|
-
if (this._streams.receivers.size === (this._init.maxInboundStreams ?? MAX_STREAMS_INBOUND_STREAMS_PER_CONNECTION)) {
|
96
|
-
throw errCode(new Error('To many incoming streams open'), 'ERR_TOO_MANY_INBOUND_STREAMS');
|
97
|
-
}
|
98
113
|
const { id, name, type, registry } = options;
|
99
114
|
log('new %s stream %s %s', type, id, name);
|
115
|
+
if (type === 'initiator' && this._streams.initiators.size === (this._init.maxOutboundStreams ?? MAX_STREAMS_OUTBOUND_STREAMS_PER_CONNECTION)) {
|
116
|
+
throw errCode(new Error('Too many outbound streams open'), 'ERR_TOO_MANY_OUTBOUND_STREAMS');
|
117
|
+
}
|
100
118
|
if (registry.has(id)) {
|
101
119
|
throw new Error(`${type} stream ${id} already exists!`);
|
102
120
|
}
|
103
121
|
const send = (msg) => {
|
104
|
-
if (!registry.has(id)) {
|
105
|
-
throw errCode(new Error('the stream is not in the muxer registry, it may have already been closed'), 'ERR_STREAM_DOESNT_EXIST');
|
106
|
-
}
|
107
122
|
if (log.enabled) {
|
108
123
|
log.trace('%s stream %s send', type, id, printMessage(msg));
|
109
124
|
}
|
@@ -113,7 +128,7 @@ export class MplexStreamMuxer {
|
|
113
128
|
this._source.push(msg);
|
114
129
|
};
|
115
130
|
const onEnd = () => {
|
116
|
-
log('%s stream %s
|
131
|
+
log('%s stream %s ended', type, id, name);
|
117
132
|
registry.delete(id);
|
118
133
|
if (this._init.onStreamEnd != null) {
|
119
134
|
this._init.onStreamEnd(stream);
|
@@ -129,9 +144,12 @@ export class MplexStreamMuxer {
|
|
129
144
|
*/
|
130
145
|
_createSink() {
|
131
146
|
const sink = async (source) => {
|
147
|
+
// see: https://github.com/jacobheun/any-signal/pull/18
|
148
|
+
const abortSignals = [this.closeController.signal];
|
132
149
|
if (this._init.signal != null) {
|
133
|
-
|
150
|
+
abortSignals.push(this._init.signal);
|
134
151
|
}
|
152
|
+
source = abortableSource(source, anySignal(abortSignals));
|
135
153
|
try {
|
136
154
|
await pipe(source, decode, restrictSize(this._init.maxMsgSize), async (source) => {
|
137
155
|
for await (const msg of source) {
|
@@ -153,24 +171,7 @@ export class MplexStreamMuxer {
|
|
153
171
|
*/
|
154
172
|
_createSource() {
|
155
173
|
const onEnd = (err) => {
|
156
|
-
|
157
|
-
// Abort all the things!
|
158
|
-
for (const s of initiators.values()) {
|
159
|
-
if (err != null) {
|
160
|
-
s.abort(err);
|
161
|
-
}
|
162
|
-
else {
|
163
|
-
s.close();
|
164
|
-
}
|
165
|
-
}
|
166
|
-
for (const s of receivers.values()) {
|
167
|
-
if (err != null) {
|
168
|
-
s.abort(err);
|
169
|
-
}
|
170
|
-
else {
|
171
|
-
s.close();
|
172
|
-
}
|
173
|
-
}
|
174
|
+
this.close(err);
|
174
175
|
};
|
175
176
|
const source = pushableV({
|
176
177
|
objectMode: true,
|
@@ -189,6 +190,16 @@ export class MplexStreamMuxer {
|
|
189
190
|
}
|
190
191
|
// Create a new stream?
|
191
192
|
if (message.type === MessageTypes.NEW_STREAM) {
|
193
|
+
if (this._streams.receivers.size === (this._init.maxInboundStreams ?? MAX_STREAMS_INBOUND_STREAMS_PER_CONNECTION)) {
|
194
|
+
log.error('Too many inbound streams open');
|
195
|
+
// not going to allow this stream, send the reset message manually
|
196
|
+
// instead of setting it up just to tear it down
|
197
|
+
this._source.push({
|
198
|
+
id,
|
199
|
+
type: MessageTypes.RESET_RECEIVER
|
200
|
+
});
|
201
|
+
return;
|
202
|
+
}
|
192
203
|
const stream = this._newReceiverStream({ id, name: uint8ArrayToString(message.data instanceof Uint8Array ? message.data : message.data.slice()) });
|
193
204
|
if (this._init.onIncomingStream != null) {
|
194
205
|
this._init.onIncomingStream(stream);
|
@@ -212,7 +223,7 @@ export class MplexStreamMuxer {
|
|
212
223
|
type: type === MessageTypes.MESSAGE_INITIATOR ? MessageTypes.RESET_RECEIVER : MessageTypes.RESET_INITIATOR
|
213
224
|
});
|
214
225
|
// Inform the stream consumer they are not fast enough
|
215
|
-
const error = errCode(new Error('Input buffer full - increase Mplex maxBufferSize to
|
226
|
+
const error = errCode(new Error('Input buffer full - increase Mplex maxBufferSize to accommodate slow consumers'), 'ERR_STREAM_INPUT_BUFFER_FULL');
|
216
227
|
stream.abort(error);
|
217
228
|
return;
|
218
229
|
}
|
package/dist/src/mplex.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mplex.js","sourceRoot":"","sources":["../../src/mplex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAC9B,OAAO,EAAY,SAAS,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAW,MAAM,oBAAoB,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,OAAO,MAAM,UAAU,CAAA;
|
1
|
+
{"version":3,"file":"mplex.js","sourceRoot":"","sources":["../../src/mplex.ts"],"names":[],"mappings":"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"}
|
package/dist/src/stream.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAGjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAGjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAS7C,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,wBAAgB,YAAY,CAAE,OAAO,EAAE,OAAO,GAAG,WAAW,CAsN3D"}
|
package/dist/src/stream.js
CHANGED
@@ -8,9 +8,10 @@ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
8
8
|
import { Uint8ArrayList } from 'uint8arraylist';
|
9
9
|
import { logger } from '@libp2p/logger';
|
10
10
|
const log = logger('libp2p:mplex:stream');
|
11
|
-
const
|
12
|
-
const
|
13
|
-
const
|
11
|
+
const ERR_STREAM_RESET = 'ERR_STREAM_RESET';
|
12
|
+
const ERR_STREAM_ABORT = 'ERR_STREAM_ABORT';
|
13
|
+
const ERR_SINK_ENDED = 'ERR_SINK_ENDED';
|
14
|
+
const ERR_DOUBLE_SINK = 'ERR_DOUBLE_SINK';
|
14
15
|
export function createStream(options) {
|
15
16
|
const { id, name, send, onEnd, type = 'initiator', maxMsgSize = MAX_MSG_SIZE } = options;
|
16
17
|
const abortController = new AbortController();
|
@@ -21,6 +22,7 @@ export function createStream(options) {
|
|
21
22
|
const streamName = `${name == null ? id : name}`;
|
22
23
|
let sourceEnded = false;
|
23
24
|
let sinkEnded = false;
|
25
|
+
let sinkSunk = false;
|
24
26
|
let endErr;
|
25
27
|
const timeline = {
|
26
28
|
open: Date.now()
|
@@ -97,14 +99,18 @@ export function createStream(options) {
|
|
97
99
|
},
|
98
100
|
// Close immediately for reading and writing (remote error)
|
99
101
|
reset: () => {
|
100
|
-
const err = errCode(new Error('stream reset'),
|
102
|
+
const err = errCode(new Error('stream reset'), ERR_STREAM_RESET);
|
101
103
|
resetController.abort();
|
102
104
|
stream.source.end(err);
|
103
105
|
onSinkEnd(err);
|
104
106
|
},
|
105
107
|
sink: async (source) => {
|
108
|
+
if (sinkSunk) {
|
109
|
+
throw errCode(new Error('sink already called on stream'), ERR_DOUBLE_SINK);
|
110
|
+
}
|
111
|
+
sinkSunk = true;
|
106
112
|
if (sinkEnded) {
|
107
|
-
throw errCode(new Error('stream closed for writing'),
|
113
|
+
throw errCode(new Error('stream closed for writing'), ERR_SINK_ENDED);
|
108
114
|
}
|
109
115
|
source = abortableSource(source, anySignal([
|
110
116
|
abortController.signal,
|
@@ -137,15 +143,15 @@ export function createStream(options) {
|
|
137
143
|
}
|
138
144
|
if (resetController.signal.aborted) {
|
139
145
|
err.message = 'stream reset';
|
140
|
-
err.code =
|
146
|
+
err.code = ERR_STREAM_RESET;
|
141
147
|
}
|
142
148
|
if (abortController.signal.aborted) {
|
143
149
|
err.message = 'stream aborted';
|
144
|
-
err.code =
|
150
|
+
err.code = ERR_STREAM_ABORT;
|
145
151
|
}
|
146
152
|
}
|
147
153
|
// Send no more data if this stream was remotely reset
|
148
|
-
if (err.code ===
|
154
|
+
if (err.code === ERR_STREAM_RESET) {
|
149
155
|
log.trace('%s stream %s reset', type, name);
|
150
156
|
}
|
151
157
|
else {
|
package/dist/src/stream.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAChF,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAMvC,MAAM,GAAG,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA;AAEzC,MAAM,
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@libp2p/mplex",
|
3
|
-
"version": "
|
3
|
+
"version": "4.0.2",
|
4
4
|
"description": "JavaScript implementation of https://github.com/libp2p/mplex",
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
6
6
|
"homepage": "https://github.com/libp2p/js-libp2p-mplex#readme",
|
@@ -35,7 +35,7 @@
|
|
35
35
|
],
|
36
36
|
"exports": {
|
37
37
|
".": {
|
38
|
-
"types": "./src/index.d.ts",
|
38
|
+
"types": "./dist/src/index.d.ts",
|
39
39
|
"import": "./dist/src/index.js"
|
40
40
|
}
|
41
41
|
},
|
@@ -143,9 +143,9 @@
|
|
143
143
|
"dependencies": {
|
144
144
|
"@libp2p/components": "^2.0.0",
|
145
145
|
"@libp2p/interface-connection": "^2.0.0",
|
146
|
-
"@libp2p/interface-stream-muxer": "^
|
146
|
+
"@libp2p/interface-stream-muxer": "^2.0.0",
|
147
147
|
"@libp2p/logger": "^2.0.0",
|
148
|
-
"@libp2p/tracked-map": "^
|
148
|
+
"@libp2p/tracked-map": "^2.0.0",
|
149
149
|
"abortable-iterator": "^4.0.2",
|
150
150
|
"any-signal": "^3.0.0",
|
151
151
|
"err-code": "^3.0.1",
|
@@ -157,7 +157,7 @@
|
|
157
157
|
"varint": "^6.0.0"
|
158
158
|
},
|
159
159
|
"devDependencies": {
|
160
|
-
"@libp2p/interface-stream-muxer-compliance-tests": "^
|
160
|
+
"@libp2p/interface-stream-muxer-compliance-tests": "^3.0.1",
|
161
161
|
"@types/varint": "^6.0.0",
|
162
162
|
"aegir": "^37.2.0",
|
163
163
|
"cborg": "^1.8.1",
|
@@ -168,6 +168,10 @@
|
|
168
168
|
"it-foreach": "^0.1.1",
|
169
169
|
"it-map": "^1.0.6",
|
170
170
|
"p-defer": "^4.0.0",
|
171
|
-
"random-int": "^3.0.0"
|
171
|
+
"random-int": "^3.0.0",
|
172
|
+
"typescript": "^4.7.4"
|
173
|
+
},
|
174
|
+
"browser": {
|
175
|
+
"./dist/src/alloc-unsafe.js": "./dist/src/alloc-unsafe-browser.js"
|
172
176
|
}
|
173
177
|
}
|
package/src/encode.ts
CHANGED
@@ -1,17 +1,10 @@
|
|
1
|
+
import type { Source } from 'it-stream-types'
|
1
2
|
import varint from 'varint'
|
3
|
+
import { allocUnsafe } from './alloc-unsafe.js'
|
2
4
|
import { Message, MessageTypes } from './message-types.js'
|
3
|
-
import type { Source } from 'it-stream-types'
|
4
5
|
|
5
6
|
const POOL_SIZE = 10 * 1024
|
6
7
|
|
7
|
-
function allocUnsafe (size: number) {
|
8
|
-
if (globalThis.Buffer != null) {
|
9
|
-
return Buffer.allocUnsafe(size)
|
10
|
-
}
|
11
|
-
|
12
|
-
return new Uint8Array(size)
|
13
|
-
}
|
14
|
-
|
15
8
|
class Encoder {
|
16
9
|
private _pool: Uint8Array
|
17
10
|
private _poolOffset: number
|
package/src/mplex.ts
CHANGED
@@ -15,6 +15,7 @@ import type { Sink } from 'it-stream-types'
|
|
15
15
|
import type { StreamMuxer, StreamMuxerInit } from '@libp2p/interface-stream-muxer'
|
16
16
|
import type { Stream } from '@libp2p/interface-connection'
|
17
17
|
import type { MplexInit } from './index.js'
|
18
|
+
import anySignal from 'any-signal'
|
18
19
|
|
19
20
|
const log = logger('libp2p:mplex')
|
20
21
|
|
@@ -55,6 +56,7 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
55
56
|
private readonly _streams: { initiators: Map<number, MplexStream>, receivers: Map<number, MplexStream> }
|
56
57
|
private readonly _init: MplexStreamMuxerInit
|
57
58
|
private readonly _source: { push: (val: Message) => void, end: (err?: Error) => void }
|
59
|
+
private readonly closeController: AbortController
|
58
60
|
|
59
61
|
constructor (components: Components, init?: MplexStreamMuxerInit) {
|
60
62
|
init = init ?? {}
|
@@ -83,12 +85,15 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
83
85
|
const source = this._createSource()
|
84
86
|
this._source = source
|
85
87
|
this.source = source
|
86
|
-
}
|
87
|
-
|
88
|
-
init (components: Components) {
|
89
88
|
|
89
|
+
/**
|
90
|
+
* Close controller
|
91
|
+
*/
|
92
|
+
this.closeController = new AbortController()
|
90
93
|
}
|
91
94
|
|
95
|
+
init (components: Components) {}
|
96
|
+
|
92
97
|
/**
|
93
98
|
* Returns a Map of streams and their ids
|
94
99
|
*/
|
@@ -109,12 +114,29 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
109
114
|
* provided, the id of the stream will be used.
|
110
115
|
*/
|
111
116
|
newStream (name?: string): Stream {
|
117
|
+
if (this.closeController.signal.aborted) {
|
118
|
+
throw new Error('Muxer already closed')
|
119
|
+
}
|
112
120
|
const id = this._streamId++
|
113
121
|
name = name == null ? id.toString() : name.toString()
|
114
122
|
const registry = this._streams.initiators
|
115
123
|
return this._newStream({ id, name, type: 'initiator', registry })
|
116
124
|
}
|
117
125
|
|
126
|
+
/**
|
127
|
+
* Close or abort all tracked streams and stop the muxer
|
128
|
+
*/
|
129
|
+
close (err?: Error | undefined): void {
|
130
|
+
if (this.closeController.signal.aborted) return
|
131
|
+
|
132
|
+
if (err != null) {
|
133
|
+
this.streams.forEach(s => s.abort(err))
|
134
|
+
} else {
|
135
|
+
this.streams.forEach(s => s.close())
|
136
|
+
}
|
137
|
+
this.closeController.abort()
|
138
|
+
}
|
139
|
+
|
118
140
|
/**
|
119
141
|
* Called whenever an inbound stream is created
|
120
142
|
*/
|
@@ -125,27 +147,19 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
125
147
|
}
|
126
148
|
|
127
149
|
_newStream (options: { id: number, name: string, type: 'initiator' | 'receiver', registry: Map<number, MplexStream> }) {
|
128
|
-
if (this._streams.initiators.size === (this._init.maxOutboundStreams ?? MAX_STREAMS_OUTBOUND_STREAMS_PER_CONNECTION)) {
|
129
|
-
throw errCode(new Error('To many outgoing streams open'), 'ERR_TOO_MANY_OUTBOUND_STREAMS')
|
130
|
-
}
|
131
|
-
|
132
|
-
if (this._streams.receivers.size === (this._init.maxInboundStreams ?? MAX_STREAMS_INBOUND_STREAMS_PER_CONNECTION)) {
|
133
|
-
throw errCode(new Error('To many incoming streams open'), 'ERR_TOO_MANY_INBOUND_STREAMS')
|
134
|
-
}
|
135
|
-
|
136
150
|
const { id, name, type, registry } = options
|
137
151
|
|
138
152
|
log('new %s stream %s %s', type, id, name)
|
139
153
|
|
154
|
+
if (type === 'initiator' && this._streams.initiators.size === (this._init.maxOutboundStreams ?? MAX_STREAMS_OUTBOUND_STREAMS_PER_CONNECTION)) {
|
155
|
+
throw errCode(new Error('Too many outbound streams open'), 'ERR_TOO_MANY_OUTBOUND_STREAMS')
|
156
|
+
}
|
157
|
+
|
140
158
|
if (registry.has(id)) {
|
141
159
|
throw new Error(`${type} stream ${id} already exists!`)
|
142
160
|
}
|
143
161
|
|
144
162
|
const send = (msg: Message) => {
|
145
|
-
if (!registry.has(id)) {
|
146
|
-
throw errCode(new Error('the stream is not in the muxer registry, it may have already been closed'), 'ERR_STREAM_DOESNT_EXIST')
|
147
|
-
}
|
148
|
-
|
149
163
|
if (log.enabled) {
|
150
164
|
log.trace('%s stream %s send', type, id, printMessage(msg))
|
151
165
|
}
|
@@ -158,7 +172,7 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
158
172
|
}
|
159
173
|
|
160
174
|
const onEnd = () => {
|
161
|
-
log('%s stream %s
|
175
|
+
log('%s stream %s ended', type, id, name)
|
162
176
|
registry.delete(id)
|
163
177
|
|
164
178
|
if (this._init.onStreamEnd != null) {
|
@@ -177,9 +191,12 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
177
191
|
*/
|
178
192
|
_createSink () {
|
179
193
|
const sink: Sink<Uint8Array> = async source => {
|
194
|
+
// see: https://github.com/jacobheun/any-signal/pull/18
|
195
|
+
const abortSignals = [this.closeController.signal]
|
180
196
|
if (this._init.signal != null) {
|
181
|
-
|
197
|
+
abortSignals.push(this._init.signal)
|
182
198
|
}
|
199
|
+
source = abortableSource(source, anySignal(abortSignals))
|
183
200
|
|
184
201
|
try {
|
185
202
|
await pipe(
|
@@ -209,22 +226,7 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
209
226
|
*/
|
210
227
|
_createSource () {
|
211
228
|
const onEnd = (err?: Error) => {
|
212
|
-
|
213
|
-
// Abort all the things!
|
214
|
-
for (const s of initiators.values()) {
|
215
|
-
if (err != null) {
|
216
|
-
s.abort(err)
|
217
|
-
} else {
|
218
|
-
s.close()
|
219
|
-
}
|
220
|
-
}
|
221
|
-
for (const s of receivers.values()) {
|
222
|
-
if (err != null) {
|
223
|
-
s.abort(err)
|
224
|
-
} else {
|
225
|
-
s.close()
|
226
|
-
}
|
227
|
-
}
|
229
|
+
this.close(err)
|
228
230
|
}
|
229
231
|
const source = pushableV<Message>({
|
230
232
|
objectMode: true,
|
@@ -247,6 +249,20 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
247
249
|
|
248
250
|
// Create a new stream?
|
249
251
|
if (message.type === MessageTypes.NEW_STREAM) {
|
252
|
+
if (this._streams.receivers.size === (this._init.maxInboundStreams ?? MAX_STREAMS_INBOUND_STREAMS_PER_CONNECTION)) {
|
253
|
+
log.error('Too many inbound streams open')
|
254
|
+
|
255
|
+
// not going to allow this stream, send the reset message manually
|
256
|
+
// instead of setting it up just to tear it down
|
257
|
+
|
258
|
+
this._source.push({
|
259
|
+
id,
|
260
|
+
type: MessageTypes.RESET_RECEIVER
|
261
|
+
})
|
262
|
+
|
263
|
+
return
|
264
|
+
}
|
265
|
+
|
250
266
|
const stream = this._newReceiverStream({ id, name: uint8ArrayToString(message.data instanceof Uint8Array ? message.data : message.data.slice()) })
|
251
267
|
|
252
268
|
if (this._init.onIncomingStream != null) {
|
@@ -278,7 +294,7 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
278
294
|
})
|
279
295
|
|
280
296
|
// Inform the stream consumer they are not fast enough
|
281
|
-
const error = errCode(new Error('Input buffer full - increase Mplex maxBufferSize to
|
297
|
+
const error = errCode(new Error('Input buffer full - increase Mplex maxBufferSize to accommodate slow consumers'), 'ERR_STREAM_INPUT_BUFFER_FULL')
|
282
298
|
stream.abort(error)
|
283
299
|
|
284
300
|
return
|
package/src/stream.ts
CHANGED
@@ -14,9 +14,10 @@ import type { MplexStream } from './mplex.js'
|
|
14
14
|
|
15
15
|
const log = logger('libp2p:mplex:stream')
|
16
16
|
|
17
|
-
const
|
18
|
-
const
|
19
|
-
const
|
17
|
+
const ERR_STREAM_RESET = 'ERR_STREAM_RESET'
|
18
|
+
const ERR_STREAM_ABORT = 'ERR_STREAM_ABORT'
|
19
|
+
const ERR_SINK_ENDED = 'ERR_SINK_ENDED'
|
20
|
+
const ERR_DOUBLE_SINK = 'ERR_DOUBLE_SINK'
|
20
21
|
|
21
22
|
export interface Options {
|
22
23
|
id: number
|
@@ -39,6 +40,7 @@ export function createStream (options: Options): MplexStream {
|
|
39
40
|
|
40
41
|
let sourceEnded = false
|
41
42
|
let sinkEnded = false
|
43
|
+
let sinkSunk = false
|
42
44
|
let endErr: Error | undefined
|
43
45
|
|
44
46
|
const timeline: StreamTimeline = {
|
@@ -137,15 +139,21 @@ export function createStream (options: Options): MplexStream {
|
|
137
139
|
|
138
140
|
// Close immediately for reading and writing (remote error)
|
139
141
|
reset: () => {
|
140
|
-
const err = errCode(new Error('stream reset'),
|
142
|
+
const err = errCode(new Error('stream reset'), ERR_STREAM_RESET)
|
141
143
|
resetController.abort()
|
142
144
|
stream.source.end(err)
|
143
145
|
onSinkEnd(err)
|
144
146
|
},
|
145
147
|
|
146
148
|
sink: async (source: Source<Uint8Array>) => {
|
149
|
+
if (sinkSunk) {
|
150
|
+
throw errCode(new Error('sink already called on stream'), ERR_DOUBLE_SINK)
|
151
|
+
}
|
152
|
+
|
153
|
+
sinkSunk = true
|
154
|
+
|
147
155
|
if (sinkEnded) {
|
148
|
-
throw errCode(new Error('stream closed for writing'),
|
156
|
+
throw errCode(new Error('stream closed for writing'), ERR_SINK_ENDED)
|
149
157
|
}
|
150
158
|
|
151
159
|
source = abortableSource(source, anySignal([
|
@@ -184,17 +192,17 @@ export function createStream (options: Options): MplexStream {
|
|
184
192
|
|
185
193
|
if (resetController.signal.aborted) {
|
186
194
|
err.message = 'stream reset'
|
187
|
-
err.code =
|
195
|
+
err.code = ERR_STREAM_RESET
|
188
196
|
}
|
189
197
|
|
190
198
|
if (abortController.signal.aborted) {
|
191
199
|
err.message = 'stream aborted'
|
192
|
-
err.code =
|
200
|
+
err.code = ERR_STREAM_ABORT
|
193
201
|
}
|
194
202
|
}
|
195
203
|
|
196
204
|
// Send no more data if this stream was remotely reset
|
197
|
-
if (err.code ===
|
205
|
+
if (err.code === ERR_STREAM_RESET) {
|
198
206
|
log.trace('%s stream %s reset', type, name)
|
199
207
|
} else {
|
200
208
|
log.trace('%s stream %s error', type, name, err)
|