Add WebSocket support to Next.js API routes
/api
pageyarn add next-plugin-websocket
Export a socket
handler function from a Next.js API route. The first argument will be the WebSocket
client instance and the second argument will be the original request object.
import { NextApiHandler } from "next";
import { NextWebSocketHandler } from "next-plugin-websocket";
export const socket: NextWebSocketHandler = (client, req) => {
console.log("Client connected");
client.on("message", (msg) => {
client.send(msg);
});
client.on("close", () => {
console.log("Client disconnected");
});
};
// You still need to expose a regular HTTP handler, even if you only intend to
// use this API route for WebSocket connections.
const handler: NextApiHandler = (req, res) => {
res.status(426).send("Upgrade Required");
};
export default handler;
import { appRouter } from "@/server/routers/_app";
import { createNextApiHandler } from "@trpc/server/adapters/next";
import { applyWSSHandler } from "@trpc/server/adapters/ws";
import { NextWebSocketHandler } from "next-plugin-websocket";
import { WebSocketServer } from "ws";
export const socket: NextWebSocketHandler = (client, req) => {
const wss = new WebSocketServer({ noServer: true });
applyWSSHandler({ wss, router: appRouter });
wss.emit("connection", client, req);
};
export default createNextApiHandler({
router: appRouter,
});
This plugin works by injecting a couple of micro-patches into the Next.js core in node_modules
. It also uses a syntax tree parser to ensure that it ends up in exactly the right place, which makes it more resilient to changes over time. However, there are a couple of things to be aware of when using this module:
node_modules
folder won't work, as that's how the patch is applied. This means no Yarn PnP support (yet)server.js
file generated in the standalone
output mode, or next start
). This means that serverless environments might be hit or miss depending on whether or not they provide an instance of http.Server
to Next.js