Merge pull request #1037 from murgatroid99/grpc-js_client_error_construction

Add function for creating errors from statuses
This commit is contained in:
Michael Lumish 2019-10-09 14:43:32 -07:00 committed by GitHub
commit 974cb30a27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 17 additions and 11 deletions

View File

@ -68,6 +68,20 @@ export type ClientDuplexStream<
ResponseType ResponseType
> = ClientWritableStream<RequestType> & ClientReadableStream<ResponseType>; > = ClientWritableStream<RequestType> & ClientReadableStream<ResponseType>;
/**
* 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 {
const message = `${status.code} ${Status[status.code]}: ${status.details}`;
return Object.assign(
new Error(message),
status
);
}
export class ClientUnaryCallImpl extends EventEmitter export class ClientUnaryCallImpl extends EventEmitter
implements ClientUnaryCall { implements ClientUnaryCall {
constructor(private readonly call: Call) { constructor(private readonly call: Call) {
@ -118,11 +132,7 @@ function setUpReadableStream<ResponseType>(
}); });
call.on('status', (status: StatusObject) => { call.on('status', (status: StatusObject) => {
if (status.code !== Status.OK) { if (status.code !== Status.OK) {
const error: ServiceError = Object.assign( stream.emit('error', callErrorFromStatus(status));
new Error(status.details),
status
);
stream.emit('error', error);
} }
stream.emit('status', status); stream.emit('status', status);
statusEmitted = true; statusEmitted = true;

View File

@ -25,6 +25,7 @@ import {
ClientWritableStream, ClientWritableStream,
ClientWritableStreamImpl, ClientWritableStreamImpl,
ServiceError, ServiceError,
callErrorFromStatus,
} from './call'; } from './call';
import { CallCredentials } from './call-credentials'; import { CallCredentials } from './call-credentials';
import { Call, Deadline, StatusObject, WriteObject } from './call-stream'; import { Call, Deadline, StatusObject, WriteObject } from './call-stream';
@ -151,11 +152,7 @@ export class Client {
if (status.code === Status.OK) { if (status.code === Status.OK) {
callback(null, responseMessage as ResponseType); callback(null, responseMessage as ResponseType);
} else { } else {
const error: ServiceError = Object.assign( callback(callErrorFromStatus(status));
new Error(status.details),
status
);
callback(error);
} }
}); });
} }

View File

@ -160,7 +160,6 @@ describe('Cancellation', () => {
call.on('error', (error: ServiceError) => { call.on('error', (error: ServiceError) => {
assert.strictEqual(error.code, grpc.status.CANCELLED); assert.strictEqual(error.code, grpc.status.CANCELLED);
assert.strictEqual(error.details, 'Cancelled on client'); assert.strictEqual(error.details, 'Cancelled on client');
assert.strictEqual(error.message, 'Cancelled on client');
waitForServerCancel(); waitForServerCancel();
}); });