@@ -5,7 +5,7 @@ import { CodeError } from '@libp2p/interfaces/errors'
5
5
import { abortableSource } from 'abortable-iterator'
6
6
import type { Uint8ArrayList } from 'uint8arraylist'
7
7
import { Flag , FrameHeader , FrameType , HEADER_LENGTH } from './frame.js'
8
- import { ERR_RECV_WINDOW_EXCEEDED , ERR_STREAM_ABORT , ERR_STREAM_RESET , INITIAL_STREAM_WINDOW } from './constants.js'
8
+ import { ERR_DOUBLE_SINK , ERR_RECV_WINDOW_EXCEEDED , ERR_SINK_ENDED , ERR_STREAM_ABORT , ERR_STREAM_RESET , INITIAL_STREAM_WINDOW } from './constants.js'
9
9
import type { Logger } from '@libp2p/logger'
10
10
import type { Config } from './config.js'
11
11
import { anySignal } from 'any-signal'
@@ -85,6 +85,7 @@ export class YamuxStream implements Stream {
85
85
86
86
private sourceEnd : boolean
87
87
private sinkEnd : boolean
88
+ private sinkSunk : boolean
88
89
89
90
private readonly sendFrame : ( header : FrameHeader , body ?: Uint8Array ) => void
90
91
private readonly onStreamEnd : ( ) => void
@@ -122,6 +123,7 @@ export class YamuxStream implements Stream {
122
123
123
124
this . sourceEnd = false
124
125
this . sinkEnd = false
126
+ this . sinkSunk = false
125
127
126
128
this . sourceInput = pushable < Uint8ArrayList > ( {
127
129
onEnd : ( err ?: Error ) => {
@@ -140,8 +142,14 @@ export class YamuxStream implements Stream {
140
142
this . source = this . createSource ( )
141
143
142
144
this . sink = async ( source : Source < Uint8Array | Uint8ArrayList > ) : Promise < void > => {
145
+ if ( this . sinkSunk ) {
146
+ throw new CodeError ( 'sink already called on stream' , ERR_DOUBLE_SINK )
147
+ }
148
+
149
+ this . sinkSunk = true
150
+
143
151
if ( this . writeState !== HalfStreamState . Open ) {
144
- throw new Error ( 'stream closed for writing' )
152
+ throw new CodeError ( 'stream closed for writing' , ERR_SINK_ENDED )
145
153
}
146
154
147
155
const signal = anySignal ( [ this . abortController . signal , this . resetController . signal , this . closeController . signal ] )
@@ -292,7 +300,7 @@ export class YamuxStream implements Stream {
292
300
}
293
301
}
294
302
295
- abort ( err ? : Error ) : void {
303
+ abort ( err : Error ) : void {
296
304
switch ( this . state ) {
297
305
case StreamState . Finished :
298
306
return
0 commit comments