@@ -11,6 +11,7 @@ import { Message } from './messages';
11
11
import { ContentDecoder , ContentTypeDecoder } from './encoding' ;
12
12
import { Disposable } from './api' ;
13
13
import { Semaphore } from './semaphore' ;
14
+ import { DisposableStore } from './disposable' ;
14
15
15
16
/**
16
17
* A callback that receives each incoming JSON-RPC message.
@@ -170,7 +171,7 @@ export class ReadableStreamMessageReader extends AbstractMessageReader {
170
171
171
172
private readable : RAL . ReadableStream ;
172
173
private options : ResolvedMessageReaderOptions ;
173
- private callback ! : DataCallback ;
174
+ private callback : DataCallback | undefined ;
174
175
175
176
private nextMessageLength : number ;
176
177
private messageToken : number ;
@@ -199,16 +200,20 @@ export class ReadableStreamMessageReader extends AbstractMessageReader {
199
200
}
200
201
201
202
public listen ( callback : DataCallback ) : Disposable {
203
+ if ( this . callback !== undefined ) {
204
+ throw new Error ( 'Reader can only listen once.' ) ;
205
+ }
202
206
this . nextMessageLength = - 1 ;
203
207
this . messageToken = 0 ;
204
208
this . partialMessageTimer = undefined ;
205
209
this . callback = callback ;
206
- const result = this . readable . onData ( ( data : Uint8Array ) => {
210
+ const disposables = new DisposableStore ( ) ;
211
+ disposables . add ( this . readable . onData ( ( data : Uint8Array ) => {
207
212
this . onData ( data ) ;
208
- } ) ;
209
- this . readable . onError ( ( error : any ) => this . fireError ( error ) ) ;
210
- this . readable . onClose ( ( ) => this . fireClose ( ) ) ;
211
- return result ;
213
+ } ) ) ;
214
+ disposables . add ( this . readable . onError ( ( error : any ) => this . fireError ( error ) ) ) ;
215
+ disposables . add ( this . readable . onClose ( ( ) => this . fireClose ( ) ) ) ;
216
+ return disposables ;
212
217
}
213
218
214
219
private onData ( data : Uint8Array ) : void {
@@ -250,7 +255,7 @@ export class ReadableStreamMessageReader extends AbstractMessageReader {
250
255
? await this . options . contentDecoder . decode ( body )
251
256
: body ;
252
257
const message = await this . options . contentTypeDecoder . decode ( bytes , this . options ) ;
253
- this . callback ( message ) ;
258
+ this . callback ! ( message ) ;
254
259
} ) . catch ( ( error ) => {
255
260
this . fireError ( error ) ;
256
261
} ) ;
0 commit comments