mirror of https://github.com/grpc/grpc-node.git
Merge pull request #1037 from murgatroid99/grpc-js_client_error_construction
Add function for creating errors from statuses
This commit is contained in:
commit
974cb30a27
|
@ -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;
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue