diff --git a/jsonrpc/src/common/messageWriter.ts b/jsonrpc/src/common/messageWriter.ts index 817527c5b..7b542ef4d 100644 --- a/jsonrpc/src/common/messageWriter.ts +++ b/jsonrpc/src/common/messageWriter.ts @@ -155,7 +155,7 @@ export class WriteableStreamMessageWriter extends AbstractMessageWriter implemen private async doWrite(msg: Message, headers: string[], data: Uint8Array): Promise { try { await this.writable.write(headers.join(''), 'ascii'); - return this.writable.write(data); + return await this.writable.write(data); } catch (error) { this.handleError(error, msg); return Promise.reject(error); diff --git a/jsonrpc/src/node/test/messages.test.ts b/jsonrpc/src/node/test/messages.test.ts index a457d74da..44b5f027f 100644 --- a/jsonrpc/src/node/test/messages.test.ts +++ b/jsonrpc/src/node/test/messages.test.ts @@ -90,6 +90,30 @@ const msgpackDecoder: FunctionContentTypeDecoder = { }; suite('Messages', () => { + for (const failingWrite of [1, 2]) { + test(`Reports rejected ${failingWrite === 1 ? 'header' : 'body'} writes with message and error count`, async () => { + let writes = 0; + const error = new Error('Write failed'); + const writable = new Writable({ + write(_chunk, _encoding, callback) { + writes++; + callback(writes === failingWrite ? error : undefined); + } + }); + const writer = new StreamMessageWriter(writable); + const errors: [Error, Message | undefined, number | undefined][] = []; + writer.onError((event) => errors.push(event)); + const request: RequestMessage = { jsonrpc: '2.0', id: 1, method: 'example' }; + try { + await assert.rejects(writer.write(request), (actual) => actual === error); + assert.ok(errors.some(([actual, message, count]) => actual === error && message === request && count === 1)); + } finally { + writer.dispose(); + writable.destroy(); + } + }); + } + test('Writing', async () => { const writable = new TestWritable(); const writer = new StreamMessageWriter(writable, 'ascii'); @@ -350,4 +374,4 @@ suite('Messages', () => { readable.push('Content-Length: NaN\r\n\r\n{"jsonrpc":"2.0","id":1,"method":"example"}'); readable.push(null); }); -}); \ No newline at end of file +});