v1
Source Handlers
gRPC / Protobuf

gRPC / Protobuf

image

This Handler allows you to load gRPC definition files (.proto).

npm i @omnigraph/grpc

Then you can use it in your Mesh configuration:

mesh.config.ts
import loadGRPCSubgraph from '@omnigraph/grpc'
import { defineConfig } from '@graphql-mesh/compose-cli'
 
export const composeConfig = defineConfig({
  subgraphs: [
    {
      sourceHandler: loadGRPCSubgraph('MyGrpcApi', {
        // gRPC Endpoint
        endpoint: 'localhost:50051',
        // Path to the proto file
        source: 'grpc/proto/Example.proto',
        // or
        source: {
          file: 'grpc/proto/Example.proto',
          load: {
            defaults: true,
            includeDirs: ['grpc/proto']
          }
        }
 
        // Request timeout in milliseconds
        requestTimeout: 200_000,
 
        // Use HTTPS instead HTTP for gRPC connection
        useHTTPS: false,
 
        // Use SSL credentials for gRPC connection
        credentialsSsl: {
          rootCA: 'path/to/rootCA.pem',
          certChain: 'path/to/certChain.pem',
        },
 
        // Prefix to collect Query method default: list, get
        prefixQueryMethod: ['list', 'get'],
 
        // Headers for the protobuf if URL is provided
        schemaHeaders: {
          'x-api-key': 'my-api-key'
        }
      })
    }
  ]
})

Use Reflection instead of proto files

If you have configured reflection in your gRPC server, you don’t need to provide source.

mesh.config.ts
import { defineConfig } from '@graphql-mesh/compose-cli'
import loadGRPCSubgraph from '@omnigraph/grpc'
 
export const composeConfig = defineConfig({
  subgraphs: [
    {
      sourceHandler: loadGRPCSubgraph('MyGrpcApi', {
        endpoint: 'localhost:50051'
      })
    }
  ]
})

Custom Metadata for Authorization

Here you can use metaData field to pass some custom metadata from the context.

mesh.config.ts
import { defineConfig } from '@graphql-mesh/compose-cli'
import loadGRPCSubgraph from '@omnigraph/grpc'
 
export const composeConfig = defineConfig({
  subgraphs: [
    {
      sourceHandler: loadGRPCSubgraph('MyGrpcApi', {
        endpoint: 'localhost:50051',
        metaData: {
          authorization: "Bearer {context.headers['x-my-token']}",
          someStaticValue: 'MyStaticValue'
        }
      })
    }
  ]
})