@libp2p/mplex 1.0.3 → 1.1.0
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 +22 -4
- 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 +5 -5
- package/src/mplex.ts +22 -4
- 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,EAAE,MAAM,oBAAoB,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,+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
@@ -9,6 +9,7 @@ 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 });
|
@@ -172,19 +186,23 @@ export class MplexStreamMuxer {
|
|
172
186
|
const list = (type & 1) === 1 ? this._streams.initiators : this._streams.receivers;
|
173
187
|
const stream = list.get(id);
|
174
188
|
if (stream == null) {
|
175
|
-
|
189
|
+
log('missing stream %s', id);
|
190
|
+
return;
|
176
191
|
}
|
177
192
|
switch (type) {
|
178
193
|
case MessageTypes.MESSAGE_INITIATOR:
|
179
194
|
case MessageTypes.MESSAGE_RECEIVER:
|
195
|
+
// We got data from the remote, push it into our local stream
|
180
196
|
stream.source.push(message.data.slice());
|
181
197
|
break;
|
182
198
|
case MessageTypes.CLOSE_INITIATOR:
|
183
199
|
case MessageTypes.CLOSE_RECEIVER:
|
184
|
-
|
200
|
+
// We should expect no more data from the remote, stop reading
|
201
|
+
stream.closeRead();
|
185
202
|
break;
|
186
203
|
case MessageTypes.RESET_INITIATOR:
|
187
204
|
case MessageTypes.RESET_RECEIVER:
|
205
|
+
// Stop reading and writing to the stream immediately
|
188
206
|
stream.reset();
|
189
207
|
break;
|
190
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,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;
|
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.0
|
3
|
+
"version": "1.1.0",
|
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",
|
@@ -149,11 +149,12 @@
|
|
149
149
|
"it-pushable": "^2.0.1",
|
150
150
|
"it-stream-types": "^1.0.4",
|
151
151
|
"uint8arraylist": "^1.4.0",
|
152
|
+
"uint8arrays": "^3.0.0",
|
152
153
|
"varint": "^6.0.0"
|
153
154
|
},
|
154
155
|
"devDependencies": {
|
155
|
-
"@libp2p/interface-compliance-tests": "^
|
156
|
-
"@libp2p/interfaces": "^
|
156
|
+
"@libp2p/interface-compliance-tests": "^2.0.1",
|
157
|
+
"@libp2p/interfaces": "^2.0.1",
|
157
158
|
"@types/varint": "^6.0.0",
|
158
159
|
"aegir": "^37.0.10",
|
159
160
|
"cborg": "^1.8.1",
|
@@ -163,7 +164,6 @@
|
|
163
164
|
"it-foreach": "^0.1.1",
|
164
165
|
"it-map": "^1.0.6",
|
165
166
|
"p-defer": "^4.0.0",
|
166
|
-
"random-int": "^3.0.0"
|
167
|
-
"uint8arrays": "^3.0.0"
|
167
|
+
"random-int": "^3.0.0"
|
168
168
|
}
|
169
169
|
}
|
package/src/mplex.ts
CHANGED
@@ -9,6 +9,7 @@ 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 })
|
@@ -233,20 +246,25 @@ export class MplexStreamMuxer implements StreamMuxer {
|
|
233
246
|
const stream = list.get(id)
|
234
247
|
|
235
248
|
if (stream == null) {
|
236
|
-
|
249
|
+
log('missing stream %s', id)
|
250
|
+
|
251
|
+
return
|
237
252
|
}
|
238
253
|
|
239
254
|
switch (type) {
|
240
255
|
case MessageTypes.MESSAGE_INITIATOR:
|
241
256
|
case MessageTypes.MESSAGE_RECEIVER:
|
257
|
+
// We got data from the remote, push it into our local stream
|
242
258
|
stream.source.push(message.data.slice())
|
243
259
|
break
|
244
260
|
case MessageTypes.CLOSE_INITIATOR:
|
245
261
|
case MessageTypes.CLOSE_RECEIVER:
|
246
|
-
|
262
|
+
// We should expect no more data from the remote, stop reading
|
263
|
+
stream.closeRead()
|
247
264
|
break
|
248
265
|
case MessageTypes.RESET_INITIATOR:
|
249
266
|
case MessageTypes.RESET_RECEIVER:
|
267
|
+
// Stop reading and writing to the stream immediately
|
250
268
|
stream.reset()
|
251
269
|
break
|
252
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
|
|