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
> = 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
implements ClientUnaryCall {
constructor(private readonly call: Call) {
@ -118,11 +132,7 @@ function setUpReadableStream<ResponseType>(
});
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;

View File

@ -25,6 +25,7 @@ import {
ClientWritableStream,
ClientWritableStreamImpl,
ServiceError,
callErrorFromStatus,
} from './call';
import { CallCredentials } from './call-credentials';
import { Call, Deadline, StatusObject, WriteObject } from './call-stream';
@ -151,11 +152,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));
}
});
}

View File

@ -160,7 +160,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();
});