@libp2p/mplex 1.0.4 → 1.1.1
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/mplex.d.ts.map +1 -1
- package/dist/src/mplex.js +21 -7
- package/dist/src/mplex.js.map +1 -1
- package/dist/src/stream.d.ts.map +1 -1
- package/dist/src/stream.js +37 -3
- package/dist/src/stream.js.map +1 -1
- package/package.json +3 -3
- package/src/mplex.ts +20 -8
- package/src/stream.ts +55 -5
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,
|
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,+BAA+B,CAAA;AAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACnF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAqB3D,MAAM,WAAW,WAAY,SAAQ,MAAM;IACzC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;CAC7B;AAED,MAAM,WAAW,SAAU,SAAQ,eAAe;IAChD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,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,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8D;gBAEzE,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,SAAS;IA6BrD,IAAI,CAAE,UAAU,EAAE,UAAU;IAI5B;;OAEG;IACH,IAAI,OAAO,aAUV;IAED;;;OAGG;IACH,SAAS,CAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAOjC;;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;IA4BX;;;OAGG;IACH,aAAa;;;;;;;IA4Bb,eAAe,CAAE,OAAO,EAAE,OAAO;CA+ClC"}
|
package/dist/src/mplex.js
CHANGED
@@ -4,11 +4,12 @@ import { abortableSource } from 'abortable-iterator';
|
|
4
4
|
import { encode } from './encode.js';
|
5
5
|
import { decode } from './decode.js';
|
6
6
|
import { restrictSize } from './restrict-size.js';
|
7
|
-
import { MessageTypes, MessageTypeNames
|
7
|
+
import { MessageTypes, MessageTypeNames } from './message-types.js';
|
8
8
|
import { createStream } from './stream.js';
|
9
9
|
import { toString as uint8ArrayToString } from 'uint8arrays';
|
10
10
|
import { trackedMap } from '@libp2p/tracked-map';
|
11
11
|
import { logger } from '@libp2p/logger';
|
12
|
+
import errCode from 'err-code';
|
12
13
|
const log = logger('libp2p:mplex');
|
13
14
|
function printMessage(msg) {
|
14
15
|
const output = {
|
@@ -91,6 +92,9 @@ export class MplexStreamMuxer {
|
|
91
92
|
throw new Error(`${type} stream ${id} already exists!`);
|
92
93
|
}
|
93
94
|
const send = (msg) => {
|
95
|
+
if (!registry.has(id)) {
|
96
|
+
throw errCode(new Error('the stream is not in the muxer registry, it may have already been closed'), 'ERR_STREAM_DOESNT_EXIST');
|
97
|
+
}
|
94
98
|
if (log.enabled) {
|
95
99
|
log.trace('%s stream %s send', type, id, printMessage(msg));
|
96
100
|
}
|
@@ -143,10 +147,20 @@ export class MplexStreamMuxer {
|
|
143
147
|
const { initiators, receivers } = this._streams;
|
144
148
|
// Abort all the things!
|
145
149
|
for (const s of initiators.values()) {
|
146
|
-
|
150
|
+
if (err != null) {
|
151
|
+
s.abort(err);
|
152
|
+
}
|
153
|
+
else {
|
154
|
+
s.close();
|
155
|
+
}
|
147
156
|
}
|
148
157
|
for (const s of receivers.values()) {
|
149
|
-
|
158
|
+
if (err != null) {
|
159
|
+
s.abort(err);
|
160
|
+
}
|
161
|
+
else {
|
162
|
+
s.close();
|
163
|
+
}
|
150
164
|
}
|
151
165
|
};
|
152
166
|
const source = pushableV({ onEnd });
|
@@ -173,22 +187,22 @@ export class MplexStreamMuxer {
|
|
173
187
|
const stream = list.get(id);
|
174
188
|
if (stream == null) {
|
175
189
|
log('missing stream %s', id);
|
176
|
-
// send a reset
|
177
|
-
this._source.push({ id, type: InitiatorMessageTypes.RESET });
|
178
|
-
this._source.push({ id, type: ReceiverMessageTypes.RESET });
|
179
190
|
return;
|
180
191
|
}
|
181
192
|
switch (type) {
|
182
193
|
case MessageTypes.MESSAGE_INITIATOR:
|
183
194
|
case MessageTypes.MESSAGE_RECEIVER:
|
195
|
+
// We got data from the remote, push it into our local stream
|
184
196
|
stream.source.push(message.data.slice());
|
185
197
|
break;
|
186
198
|
case MessageTypes.CLOSE_INITIATOR:
|
187
199
|
case MessageTypes.CLOSE_RECEIVER:
|
188
|
-
|
200
|
+
// We should expect no more data from the remote, stop reading
|
201
|
+
stream.closeRead();
|
189
202
|
break;
|
190
203
|
case MessageTypes.RESET_INITIATOR:
|
191
204
|
case MessageTypes.RESET_RECEIVER:
|
205
|
+
// Stop reading and writing to the stream immediately
|
192
206
|
stream.reset();
|
193
207
|
break;
|
194
208
|
default:
|
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,
|
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;AAQ7C,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,CA0M3D"}
|
package/dist/src/stream.js
CHANGED
@@ -10,10 +10,12 @@ import { logger } from '@libp2p/logger';
|
|
10
10
|
const log = logger('libp2p:mplex:stream');
|
11
11
|
const ERR_MPLEX_STREAM_RESET = 'ERR_MPLEX_STREAM_RESET';
|
12
12
|
const ERR_MPLEX_STREAM_ABORT = 'ERR_MPLEX_STREAM_ABORT';
|
13
|
+
const ERR_MPLEX_SINK_ENDED = 'ERR_MPLEX_SINK_ENDED';
|
13
14
|
export function createStream(options) {
|
14
15
|
const { id, name, send, onEnd, type = 'initiator', maxMsgSize = MAX_MSG_SIZE } = options;
|
15
16
|
const abortController = new AbortController();
|
16
17
|
const resetController = new AbortController();
|
18
|
+
const closeController = new AbortController();
|
17
19
|
const Types = type === 'initiator' ? InitiatorMessageTypes : ReceiverMessageTypes;
|
18
20
|
const externalId = type === 'initiator' ? (`i${id}`) : `r${id}`;
|
19
21
|
const streamName = `${name == null ? id : name}`;
|
@@ -28,7 +30,7 @@ export function createStream(options) {
|
|
28
30
|
return;
|
29
31
|
}
|
30
32
|
sourceEnded = true;
|
31
|
-
log.trace('%s stream %s source end', type, streamName, err);
|
33
|
+
log.trace('%s stream %s source end - err: %o', type, streamName, err);
|
32
34
|
if (err != null && endErr == null) {
|
33
35
|
endErr = err;
|
34
36
|
}
|
@@ -56,10 +58,35 @@ export function createStream(options) {
|
|
56
58
|
}
|
57
59
|
};
|
58
60
|
const stream = {
|
59
|
-
// Close for
|
61
|
+
// Close for both Reading and Writing
|
60
62
|
close: () => {
|
63
|
+
log.trace('%s stream %s close', type, streamName);
|
64
|
+
stream.closeRead();
|
65
|
+
stream.closeWrite();
|
66
|
+
},
|
67
|
+
// Close for reading
|
68
|
+
closeRead: () => {
|
69
|
+
log.trace('%s stream %s closeRead', type, streamName);
|
70
|
+
if (sourceEnded) {
|
71
|
+
return;
|
72
|
+
}
|
61
73
|
stream.source.end();
|
62
74
|
},
|
75
|
+
// Close for writing
|
76
|
+
closeWrite: () => {
|
77
|
+
log.trace('%s stream %s closeWrite', type, streamName);
|
78
|
+
if (sinkEnded) {
|
79
|
+
return;
|
80
|
+
}
|
81
|
+
closeController.abort();
|
82
|
+
try {
|
83
|
+
send({ id, type: Types.CLOSE });
|
84
|
+
}
|
85
|
+
catch (err) {
|
86
|
+
log.trace('%s stream %s error sending close', type, name, err);
|
87
|
+
}
|
88
|
+
onSinkEnd();
|
89
|
+
},
|
63
90
|
// Close for reading and writing (local error)
|
64
91
|
abort: (err) => {
|
65
92
|
log.trace('%s stream %s abort', type, streamName, err);
|
@@ -76,9 +103,13 @@ export function createStream(options) {
|
|
76
103
|
onSinkEnd(err);
|
77
104
|
},
|
78
105
|
sink: async (source) => {
|
106
|
+
if (sinkEnded) {
|
107
|
+
throw errCode(new Error('stream closed for writing'), ERR_MPLEX_SINK_ENDED);
|
108
|
+
}
|
79
109
|
source = abortableSource(source, anySignal([
|
80
110
|
abortController.signal,
|
81
|
-
resetController.signal
|
111
|
+
resetController.signal,
|
112
|
+
closeController.signal
|
82
113
|
]));
|
83
114
|
try {
|
84
115
|
if (type === 'initiator') { // If initiator, open a new stream
|
@@ -101,6 +132,9 @@ export function createStream(options) {
|
|
101
132
|
}
|
102
133
|
catch (err) {
|
103
134
|
if (err.type === 'aborted' && err.message === 'The operation was aborted') {
|
135
|
+
if (closeController.signal.aborted) {
|
136
|
+
return;
|
137
|
+
}
|
104
138
|
if (resetController.signal.aborted) {
|
105
139
|
err.message = 'stream reset';
|
106
140
|
err.code = ERR_MPLEX_STREAM_RESET;
|
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,sBAAsB,GAAG,wBAAwB,CAAA;AACvD,MAAM,sBAAsB,GAAG,wBAAwB,CAAA;
|
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": "1.
|
3
|
+
"version": "1.1.1",
|
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",
|
@@ -153,8 +153,8 @@
|
|
153
153
|
"varint": "^6.0.0"
|
154
154
|
},
|
155
155
|
"devDependencies": {
|
156
|
-
"@libp2p/interface-compliance-tests": "^
|
157
|
-
"@libp2p/interfaces": "^
|
156
|
+
"@libp2p/interface-compliance-tests": "^2.0.1",
|
157
|
+
"@libp2p/interfaces": "^2.0.1",
|
158
158
|
"@types/varint": "^6.0.0",
|
159
159
|
"aegir": "^37.0.10",
|
160
160
|
"cborg": "^1.8.1",
|
package/src/mplex.ts
CHANGED
@@ -4,11 +4,12 @@ import { abortableSource } from 'abortable-iterator'
|
|
4
4
|
import { encode } from './encode.js'
|
5
5
|
import { decode } from './decode.js'
|
6
6
|
import { restrictSize } from './restrict-size.js'
|
7
|
-
import { MessageTypes, MessageTypeNames, Message
|
7
|
+
import { MessageTypes, MessageTypeNames, Message } from './message-types.js'
|
8
8
|
import { createStream } from './stream.js'
|
9
9
|
import { toString as uint8ArrayToString } from 'uint8arrays'
|
10
10
|
import { trackedMap } from '@libp2p/tracked-map'
|
11
11
|
import { logger } from '@libp2p/logger'
|
12
|
+
import errCode from 'err-code'
|
12
13
|
import type { Components } from '@libp2p/interfaces/components'
|
13
14
|
import type { Sink } from 'it-stream-types'
|
14
15
|
import type { StreamMuxer, StreamMuxerInit } from '@libp2p/interfaces/stream-muxer'
|
@@ -130,6 +131,10 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
130
131
|
}
|
131
132
|
|
132
133
|
const send = (msg: Message) => {
|
134
|
+
if (!registry.has(id)) {
|
135
|
+
throw errCode(new Error('the stream is not in the muxer registry, it may have already been closed'), 'ERR_STREAM_DOESNT_EXIST')
|
136
|
+
}
|
137
|
+
|
133
138
|
if (log.enabled) {
|
134
139
|
log.trace('%s stream %s send', type, id, printMessage(msg))
|
135
140
|
}
|
@@ -196,10 +201,18 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
196
201
|
const { initiators, receivers } = this._streams
|
197
202
|
// Abort all the things!
|
198
203
|
for (const s of initiators.values()) {
|
199
|
-
|
204
|
+
if (err != null) {
|
205
|
+
s.abort(err)
|
206
|
+
} else {
|
207
|
+
s.close()
|
208
|
+
}
|
200
209
|
}
|
201
210
|
for (const s of receivers.values()) {
|
202
|
-
|
211
|
+
if (err != null) {
|
212
|
+
s.abort(err)
|
213
|
+
} else {
|
214
|
+
s.close()
|
215
|
+
}
|
203
216
|
}
|
204
217
|
}
|
205
218
|
const source = pushableV<Message>({ onEnd })
|
@@ -235,24 +248,23 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
235
248
|
if (stream == null) {
|
236
249
|
log('missing stream %s', id)
|
237
250
|
|
238
|
-
// send a reset
|
239
|
-
this._source.push({ id, type: InitiatorMessageTypes.RESET })
|
240
|
-
this._source.push({ id, type: ReceiverMessageTypes.RESET })
|
241
|
-
|
242
251
|
return
|
243
252
|
}
|
244
253
|
|
245
254
|
switch (type) {
|
246
255
|
case MessageTypes.MESSAGE_INITIATOR:
|
247
256
|
case MessageTypes.MESSAGE_RECEIVER:
|
257
|
+
// We got data from the remote, push it into our local stream
|
248
258
|
stream.source.push(message.data.slice())
|
249
259
|
break
|
250
260
|
case MessageTypes.CLOSE_INITIATOR:
|
251
261
|
case MessageTypes.CLOSE_RECEIVER:
|
252
|
-
|
262
|
+
// We should expect no more data from the remote, stop reading
|
263
|
+
stream.closeRead()
|
253
264
|
break
|
254
265
|
case MessageTypes.RESET_INITIATOR:
|
255
266
|
case MessageTypes.RESET_RECEIVER:
|
267
|
+
// Stop reading and writing to the stream immediately
|
256
268
|
stream.reset()
|
257
269
|
break
|
258
270
|
default:
|
package/src/stream.ts
CHANGED
@@ -16,6 +16,7 @@ const log = logger('libp2p:mplex:stream')
|
|
16
16
|
|
17
17
|
const ERR_MPLEX_STREAM_RESET = 'ERR_MPLEX_STREAM_RESET'
|
18
18
|
const ERR_MPLEX_STREAM_ABORT = 'ERR_MPLEX_STREAM_ABORT'
|
19
|
+
const ERR_MPLEX_SINK_ENDED = 'ERR_MPLEX_SINK_ENDED'
|
19
20
|
|
20
21
|
export interface Options {
|
21
22
|
id: number
|
@@ -31,6 +32,7 @@ export function createStream (options: Options): MplexStream {
|
|
31
32
|
|
32
33
|
const abortController = new AbortController()
|
33
34
|
const resetController = new AbortController()
|
35
|
+
const closeController = new AbortController()
|
34
36
|
const Types = type === 'initiator' ? InitiatorMessageTypes : ReceiverMessageTypes
|
35
37
|
const externalId = type === 'initiator' ? (`i${id}`) : `r${id}`
|
36
38
|
const streamName = `${name == null ? id : name}`
|
@@ -49,7 +51,7 @@ export function createStream (options: Options): MplexStream {
|
|
49
51
|
}
|
50
52
|
|
51
53
|
sourceEnded = true
|
52
|
-
log.trace('%s stream %s source end', type, streamName, err)
|
54
|
+
log.trace('%s stream %s source end - err: %o', type, streamName, err)
|
53
55
|
|
54
56
|
if (err != null && endErr == null) {
|
55
57
|
endErr = err
|
@@ -85,19 +87,54 @@ export function createStream (options: Options): MplexStream {
|
|
85
87
|
}
|
86
88
|
}
|
87
89
|
|
88
|
-
const stream = {
|
89
|
-
// Close for
|
90
|
+
const stream: MplexStream = {
|
91
|
+
// Close for both Reading and Writing
|
90
92
|
close: () => {
|
93
|
+
log.trace('%s stream %s close', type, streamName)
|
94
|
+
|
95
|
+
stream.closeRead()
|
96
|
+
stream.closeWrite()
|
97
|
+
},
|
98
|
+
|
99
|
+
// Close for reading
|
100
|
+
closeRead: () => {
|
101
|
+
log.trace('%s stream %s closeRead', type, streamName)
|
102
|
+
|
103
|
+
if (sourceEnded) {
|
104
|
+
return
|
105
|
+
}
|
106
|
+
|
91
107
|
stream.source.end()
|
92
108
|
},
|
109
|
+
|
110
|
+
// Close for writing
|
111
|
+
closeWrite: () => {
|
112
|
+
log.trace('%s stream %s closeWrite', type, streamName)
|
113
|
+
|
114
|
+
if (sinkEnded) {
|
115
|
+
return
|
116
|
+
}
|
117
|
+
|
118
|
+
closeController.abort()
|
119
|
+
|
120
|
+
try {
|
121
|
+
send({ id, type: Types.CLOSE })
|
122
|
+
} catch (err) {
|
123
|
+
log.trace('%s stream %s error sending close', type, name, err)
|
124
|
+
}
|
125
|
+
|
126
|
+
onSinkEnd()
|
127
|
+
},
|
128
|
+
|
93
129
|
// Close for reading and writing (local error)
|
94
|
-
abort: (err
|
130
|
+
abort: (err: Error) => {
|
95
131
|
log.trace('%s stream %s abort', type, streamName, err)
|
96
132
|
// End the source with the passed error
|
97
133
|
stream.source.end(err)
|
98
134
|
abortController.abort()
|
99
135
|
onSinkEnd(err)
|
100
136
|
},
|
137
|
+
|
101
138
|
// Close immediately for reading and writing (remote error)
|
102
139
|
reset: () => {
|
103
140
|
const err = errCode(new Error('stream reset'), ERR_MPLEX_STREAM_RESET)
|
@@ -105,10 +142,16 @@ export function createStream (options: Options): MplexStream {
|
|
105
142
|
stream.source.end(err)
|
106
143
|
onSinkEnd(err)
|
107
144
|
},
|
145
|
+
|
108
146
|
sink: async (source: Source<Uint8Array>) => {
|
147
|
+
if (sinkEnded) {
|
148
|
+
throw errCode(new Error('stream closed for writing'), ERR_MPLEX_SINK_ENDED)
|
149
|
+
}
|
150
|
+
|
109
151
|
source = abortableSource(source, anySignal([
|
110
152
|
abortController.signal,
|
111
|
-
resetController.signal
|
153
|
+
resetController.signal,
|
154
|
+
closeController.signal
|
112
155
|
]))
|
113
156
|
|
114
157
|
try {
|
@@ -135,6 +178,10 @@ export function createStream (options: Options): MplexStream {
|
|
135
178
|
}
|
136
179
|
} catch (err: any) {
|
137
180
|
if (err.type === 'aborted' && err.message === 'The operation was aborted') {
|
181
|
+
if (closeController.signal.aborted) {
|
182
|
+
return
|
183
|
+
}
|
184
|
+
|
138
185
|
if (resetController.signal.aborted) {
|
139
186
|
err.message = 'stream reset'
|
140
187
|
err.code = ERR_MPLEX_STREAM_RESET
|
@@ -171,10 +218,13 @@ export function createStream (options: Options): MplexStream {
|
|
171
218
|
|
172
219
|
onSinkEnd()
|
173
220
|
},
|
221
|
+
|
174
222
|
source: pushable<Uint8Array>({
|
175
223
|
onEnd: onSourceEnd
|
176
224
|
}),
|
225
|
+
|
177
226
|
timeline,
|
227
|
+
|
178
228
|
id: externalId
|
179
229
|
}
|
180
230
|
|