From b003aa14d4a13e1fc1e446ced124649706d9138e Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Thu, 19 Sep 2019 17:14:38 -0700 Subject: [PATCH] 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)); } }); }