Skip to content

Commit 2588025

Browse files
committed
grpc-js-core: in unary calls, don't invoke callback before end event
1 parent da73a0f commit 2588025

1 file changed

Lines changed: 8 additions & 1 deletion

File tree

packages/grpc-js-core/src/client.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export class Client {
5959
call: CallStream, deserialize: (value: Buffer) => ResponseType,
6060
callback: UnaryCallback<ResponseType>): void {
6161
let responseMessage: ResponseType|null = null;
62+
let statusEmitted = false;
6263
call.on('data', (data: Buffer) => {
6364
if (responseMessage != null) {
6465
call.cancelWithStatus(Status.INTERNAL, 'Too many responses received');
@@ -73,6 +74,8 @@ export class Client {
7374
call.on('end', () => {
7475
if (responseMessage == null) {
7576
call.cancelWithStatus(Status.INTERNAL, 'Not enough responses received');
77+
} else if (statusEmitted) {
78+
callback(null, responseMessage as ResponseType);
7679
}
7780
});
7881
call.on('status', (status: StatusObject) => {
@@ -81,7 +84,11 @@ export class Client {
8184
* Therefore, considering the above event handlers, status.code should be
8285
* OK if and only if we have a non-null responseMessage */
8386
if (status.code === Status.OK) {
84-
callback(null, responseMessage as ResponseType);
87+
if (responseMessage !== null) {
88+
callback(null, responseMessage as ResponseType);
89+
} else {
90+
statusEmitted = true;
91+
}
8592
} else {
8693
const error = new ServiceErrorImpl(status.details);
8794
error.code = status.code;

0 commit comments

Comments
 (0)