API Reference: Drain HTTP server plugin


Using the plugin

This API reference documents the ApolloServerPluginDrainHttpServer plugin.

This plugin is designed for use with apollo-server-express and other framework-specific packages which are built on top of Node http.Servers . It is highly recommended that you use this plugin with packages like apollo-server-express if you want your server to shut down gracefully.

You do not need to explicitly use this plugin with the batteries-included apollo-server package: that package automatically uses this plugin internally.

When you use this plugin, Apollo Server will drain your HTTP server when you call the stop() method (which is also called for you when the SIGTERM and SIGINT signals are received, unless disabled with the stopOnTerminationSignals constructor option ). Specifically, it will:

  • Stop listening for new connections

  • Close idle connections (i.e., connections with no current HTTP request)

  • Close active connections whenever they become idle

  • Wait for all connections to be closed

  • After a grace period, if any connections remain active, forcefully close them.

This plugin is exported from the apollo-server-core package. It is tested with apollo-server-express, apollo-server-koa, and apollo-server-fastify. (If you're using Hapi, you should instead use the ApolloServerPluginStopHapiServer plugin exported from the apollo-server-hapi package.)

Here's a basic example of how to use it with Express. See the framework integrations docs for examples of how to use it with other frameworks.

TypeScript
index.ts
1const express = require('express');
2const { ApolloServer } = require('apollo-server-express');
3const {
4  ApolloServerPluginDrainHttpServer,
5  ApolloServerPluginLandingPageLocalDefault,
6} = require('apollo-server-core');
7const { typeDefs, resolvers } = require('./schema');
8const http = require('http');
9
10async function startApolloServer() {
11  const app = express();
12  // Our httpServer handles incoming requests to our Express app.
13  // Below, we tell Apollo Server to "drain" this httpServer,
14  // enabling our servers to shut down gracefully.
15  const httpServer = http.createServer(app);
16  const server = new ApolloServer({
17    typeDefs,
18    resolvers,
19    csrfPrevention: true,
20    cache: 'bounded',
21    plugins: [
22      ApolloServerPluginDrainHttpServer({ httpServer }),
23      ApolloServerPluginLandingPageLocalDefault({ embed: true }),
24    ],
25  });
26
27  await server.start();
28
29  // Mount Apollo middleware here.
30  server.applyMiddleware({ app });
31  await new Promise<void>(resolve => httpServer.listen({ port: 4000 }, resolve));
32  console.log(`🚀 Server ready at http://localhost:4000${server.graphqlPath}`);
33  return { server, app };
34}

Options

Name /
Type
Description
httpServer
http.Server
The server to drain; required.
stopGracePeriodMillis
number
How long to wait before forcefully closing non-idle connections. Defaults to 10_000 (ten seconds).