Integration with Hapi

Hapi allows you to build powerful, scalable applications, with minimal overhead and full out-of-the-box functionality.

Hive Gateway can be integrated easily as a route to the existing Hapi application with a few lines of code.

Example

import http from "node:http";
import { Readable } from "node:stream";
import { createGatewayRuntime } from "@graphql-hive/gateway-runtime";
import Hapi from "@hapi/hapi";
import { schema } from "./my-graphql-schema";

interface ServerContext {
  req: Hapi.Request;
  h: Hapi.ResponseToolkit;
}

const hiveGateway =
  createGatewayRuntime<ServerContext>(/* Your configuration */);

const server = Hapi.server({ port: 4000 });

server.route({
  method: "*",
  path: hiveGateway.graphqlEndpoint,
  options: {
    payload: {
      // let hiveGateway handle the parsing
      output: "stream",
    },
  },
  handler: async (req, h) => {
    const { status, headers, body } =
      await hiveGateway.handleNodeRequestAndResponse(req.raw.req, req.raw.res, {
        req,
        h,
      });

    const res = h.response(
      Readable.from(body, {
        // hapi needs the stream not to be in object mode
        objectMode: false,
      }),
    );

    for (const [key, val] of headers) {
      res.header(key, val);
    }

    return res.code(status);
  },
});

server.start();

Hive Gateway should now be available at http://localhost:4000/graphql.

On this page

View on GitHub