-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathserver.js
More file actions
44 lines (38 loc) · 1.27 KB
/
server.js
File metadata and controls
44 lines (38 loc) · 1.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { ApolloServer, PubSub, gql } from 'apollo-server-express';
import { readFileSync } from 'fs';
import { resolvers } from './resolvers/index.js';
import * as User from './models/user.js';
import * as Message from './models/message.js';
import { sessionParser } from './session.js';
const pubsub = new PubSub();
const typeDefs = gql(readFileSync(new URL('schema.graphql', import.meta.url), 'utf8'));
export const context = ({ req, res, connection, payload, ...rest }) => ({
pubsub,
user: req?.user,
models: {
Message,
User: {
...User,
login: user => new Promise((res, rej) =>
req.login(user, err => err ? rej(err) : (context.user = user, res(user)))),
logout: () => {
req.logout();
req.session.destroy();
},
},
},
});
export const server = new ApolloServer({ context, resolvers, typeDefs, subscriptions: {
onConnect: (connectionParams, websocket, context) => {
context.wsSessionReady = new Promise(resolve => {
sessionParser(context.request, {}, async () => {
if (context.request.session?.passport)
context.user ??= await User.getUser(context.request.session.passport.user);
resolve();
});
});
},
onDisconnect: (websocket, context) => {
context.user = null;
},
} });