From b003aa14d4a13e1fc1e446ced124649706d9138e Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Thu, 19 Sep 2019 17:14:38 -0700 Subject: [PATCH 1/3] Add function for creating errors from statuses --- packages/grpc-js/src/call.ts | 19 ++++++++++++++----- packages/grpc-js/src/client.ts | 7 ++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/grpc-js/src/call.ts b/packages/grpc-js/src/call.ts index 2f45b82f..e6127faa 100644 --- a/packages/grpc-js/src/call.ts +++ b/packages/grpc-js/src/call.ts @@ -68,6 +68,19 @@ export type ClientDuplexStream< ResponseType > = ClientWritableStream & ClientReadableStream; +/** + * Construct a ServiceError from a StatusObject. This function exists primarily + * as an attempt to make the error stack trace clearly communicate that the + * error is not necessarily a problem in gRPC itself. + * @param status + */ +export function callErrorFromStatus(status: StatusObject): ServiceError { + return Object.assign( + new Error(status.details), + status + ); +} + export class ClientUnaryCallImpl extends EventEmitter implements ClientUnaryCall { constructor(private readonly call: Call) { @@ -118,11 +131,7 @@ function setUpReadableStream( }); call.on('status', (status: StatusObject) => { if (status.code !== Status.OK) { - const error: ServiceError = Object.assign( - new Error(status.details), - status - ); - stream.emit('error', error); + stream.emit('error', callErrorFromStatus(status)); } stream.emit('status', status); statusEmitted = true; diff --git a/packages/grpc-js/src/client.ts b/packages/grpc-js/src/client.ts index a092e61d..fc145942 100644 --- a/packages/grpc-js/src/client.ts +++ b/packages/grpc-js/src/client.ts @@ -25,6 +25,7 @@ import { ClientWritableStream, ClientWritableStreamImpl, ServiceError, + callErrorFromStatus, } from './call'; import { CallCredentials } from './call-credentials'; import { Call, Deadline, StatusObject, WriteObject } from './call-stream'; @@ -147,11 +148,7 @@ export class Client { if (status.code === Status.OK) { callback(null, responseMessage as ResponseType); } else { - const error: ServiceError = Object.assign( - new Error(status.details), - status - ); - callback(error); + callback(callErrorFromStatus(status)); } }); } From f29c983851c355e0f49f4c0076301b510c1cfb4d Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 9 Oct 2019 12:46:25 -0700 Subject: [PATCH 2/3] Make error message match other library --- packages/grpc-js/src/call.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/grpc-js/src/call.ts b/packages/grpc-js/src/call.ts index e6127faa..5734bc3d 100644 --- a/packages/grpc-js/src/call.ts +++ b/packages/grpc-js/src/call.ts @@ -75,8 +75,9 @@ export type ClientDuplexStream< * @param status */ export function callErrorFromStatus(status: StatusObject): ServiceError { + const message = `${status.code} ${Status[status.code]}: ${status.details}`; return Object.assign( - new Error(status.details), + new Error(message), status ); } From 50a3ead062121536305d6fb871bc0da627ae599c Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Wed, 9 Oct 2019 13:14:30 -0700 Subject: [PATCH 3/3] Don't test value of error.message --- packages/grpc-js/test/test-server-deadlines.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/grpc-js/test/test-server-deadlines.ts b/packages/grpc-js/test/test-server-deadlines.ts index 2a1d3df9..4e39f787 100644 --- a/packages/grpc-js/test/test-server-deadlines.ts +++ b/packages/grpc-js/test/test-server-deadlines.ts @@ -85,7 +85,6 @@ describe('Server deadlines', () => { (error: any, response: any) => { assert.strictEqual(error.code, grpc.status.DEADLINE_EXCEEDED); assert.strictEqual(error.details, 'Deadline exceeded'); - assert.strictEqual(error.message, 'Deadline exceeded'); done(); } ); @@ -110,7 +109,6 @@ describe('Server deadlines', () => { (error: any, response: any) => { assert.strictEqual(error.code, grpc.status.OUT_OF_RANGE); assert.strictEqual(error.details, 'Invalid deadline'); - assert.strictEqual(error.message, 'Invalid deadline'); done(); } ); @@ -160,7 +158,6 @@ describe('Cancellation', () => { call.on('error', (error: ServiceError) => { assert.strictEqual(error.code, grpc.status.CANCELLED); assert.strictEqual(error.details, 'Cancelled on client'); - assert.strictEqual(error.message, 'Cancelled on client'); waitForServerCancel(); });