diff --git a/packages/grpc/src/comsumer/clients.ts b/packages/grpc/src/comsumer/clients.ts index 2650cfb3d1e..81acb80f8c4 100644 --- a/packages/grpc/src/comsumer/clients.ts +++ b/packages/grpc/src/comsumer/clients.ts @@ -9,7 +9,7 @@ import { Utils, ILogger, } from '@midwayjs/core'; -import { credentials, loadPackageDefinition } from '@grpc/grpc-js'; +import { credentials, loadPackageDefinition, Metadata } from '@grpc/grpc-js'; import { DefaultConfig, IClientOptions, @@ -71,6 +71,17 @@ export class GRPCClients extends Map { connectionService[methodName] = ( clientOptions: IClientOptions = {} ) => { + if (clientOptions.metadata) { + const meta = new Metadata(); + meta.merge(clientOptions.metadata); + clientOptions.metadata = meta; + } + else { + clientOptions.metadata = new Metadata(); + } + clientOptions.metadata.set('rpc.definition', definition); + clientOptions.metadata.set('rpc.method', methodName); + return this.getClientRequestImpl( connectionService, originMethod, @@ -89,14 +100,23 @@ export class GRPCClients extends Map { return this.get(serviceName); } - getClientRequestImpl(client, originalFunction, options = {}) { + getClientRequestImpl(client, originalFunction, options: IClientOptions = {}) { const genericFunctionSelector = (originalFunction.requestStream ? 2 : 0) | (originalFunction.responseStream ? 1 : 0); + if (options.metadata) { + const meta = new Metadata(); + meta.merge(options.metadata); + options.metadata = meta; + } else { + options.metadata = new Metadata(); + } + let genericFunctionName; switch (genericFunctionSelector) { case 0: + options.metadata.set('rpc.method.type', 'unary'); genericFunctionName = new ClientUnaryRequest( client, originalFunction, @@ -104,6 +124,7 @@ export class GRPCClients extends Map { ); break; case 1: + options.metadata.set('rpc.method.type', 'server'); // server streaming genericFunctionName = new ClientReadableRequest( client, originalFunction, @@ -111,6 +132,7 @@ export class GRPCClients extends Map { ); break; case 2: + options.metadata.set('rpc.method.type', 'client'); // client streaming genericFunctionName = new ClientWritableRequest( client, originalFunction, @@ -118,6 +140,7 @@ export class GRPCClients extends Map { ); break; case 3: + options.metadata.set('rpc.method.type', 'bidi'); // bidirectional streaming genericFunctionName = new ClientDuplexStreamRequest( client, originalFunction,