My setup:
import { ApolloServer } from "apollo-server-express";
import { WebApp } from "meteor/webapp";
import { makeExecutableSchema } from "@graphql-tools/schema";
import { WebSocketServer } from "ws";
import { useServer } from "graphql-ws/lib/use/ws";
// create and use the websocket server to listen subscriptions
const wsServer = new WebSocketServer({
noServer: true,
path: "/graphql",
});
WebApp.httpServer.on("upgrade", function upgrade(request, socket, head) {
if (!request.url) {
return;
}
switch (request.url) {
case "/graphql":
return wsServer.handleUpgrade(request, socket, head, function done(ws) {
wsServer.emit("connection", ws, request);
});
default:
break;
}
});
useServer(
{
context: async (ctx, msg, args) => {
const req = ctx.extra.request;
const loginToken = ctx.connectionParams?.authorization;
const userAgent = req.headers["user-agent"];
const clientAddress = getIpAddressFromRequestHeader(req.headers);
const user =
typeof loginToken === "string" ? getUserByToken(loginToken) : null;
const device =
typeof loginToken === "string"
? getDeviceByLoginToken(user?.devices, loginToken)
: undefined;
return {
loginToken,
user: user || null,
device,
userAgent,
clientAddress,
};
},
schema,
},
wsServer
);