Files
landscape-template/api/functions/graphql/index.js

54 lines
1.2 KiB
JavaScript

const { ApolloServer } = require("apollo-server-lambda");
const schema = require('./schema')
const cookie = require('cookie')
const jose = require('jose');
const { createExpressApp } = require("../../modules");
const { JWT_SECRET } = require("../../utils/consts");
const extractKey = async (cookieHeader) => {
const cookies = cookie.parse(cookieHeader ?? '');
const token = cookies.Authorization;
if (token) {
const { payload } = await jose.jwtVerify(token, Buffer.from(JWT_SECRET), {
algorithms: ['HS256'],
})
return payload.pubKey
}
return null;
}
const server = new ApolloServer({
schema,
context: async ({ event }) => {
const userPubKey = await extractKey(event.headers.cookie ?? event.headers.Cookie)
return { userPubKey }
},
});
const apolloHandler = server.createHandler({
expressGetMiddlewareOptions: {
cors: {
origin: ['http://localhost:3000', 'https://studio.apollographql.com'],
credentials: true,
}
}
});
// https://github.com/vendia/serverless-express/issues/427#issuecomment-924580007
const handler = (event, context, ...args) => {
return apolloHandler(
{
...event,
requestContext: context,
},
context,
...args
);
};
exports.handler = handler;