diff --git a/packages/grpc-js/package.json b/packages/grpc-js/package.json index d56999bc..52667831 100644 --- a/packages/grpc-js/package.json +++ b/packages/grpc-js/package.json @@ -1,6 +1,6 @@ { "name": "@grpc/grpc-js", - "version": "0.6.17", + "version": "0.6.18", "description": "gRPC Library for Node - pure JS implementation", "homepage": "https://grpc.io/", "repository": "https://github.com/grpc/grpc-node/tree/master/packages/grpc-js", diff --git a/packages/grpc-js/src/channel.ts b/packages/grpc-js/src/channel.ts index e1db479c..8420b909 100644 --- a/packages/grpc-js/src/channel.ts +++ b/packages/grpc-js/src/channel.ts @@ -250,8 +250,11 @@ export class ChannelImplementation implements Channel { this.pickQueue.push({ callStream, callMetadata }); break; } + /* We need to clone the callMetadata here because the transparent + * retry code in the promise resolution handler use the same + * callMetadata object, so it needs to stay unmodified */ callStream.filterStack - .sendMetadata(Promise.resolve(callMetadata)) + .sendMetadata(Promise.resolve(callMetadata.clone())) .then( finalMetadata => { const subchannelState: ConnectivityState = pickResult.subchannel!.getConnectivityState(); @@ -280,6 +283,8 @@ export class ChannelImplementation implements Channel { 'channel', 'Failed to start call on picked subchannel ' + pickResult.subchannel!.getAddress() + + ' with error ' + + (error as Error).message + '. Retrying pick' ); this.tryPick(callStream, callMetadata);