1
1
require ( '@babel/polyfill' ) ;
2
+ const { createServer } = require ( 'http' ) ;
3
+
2
4
const express = require ( 'express' ) ;
3
5
const webpack = require ( 'webpack' ) ;
4
6
const webpackDevMiddleware = require ( 'webpack-dev-middleware' ) ;
5
- const { ApolloServer, gql } = require ( 'apollo-server-express' ) ;
7
+ const { ApolloServer, gql, PubSub } = require ( 'apollo-server-express' ) ;
6
8
7
9
const webpackConfig = require ( './webpack.config' ) ;
8
10
11
+ const pubsub = new PubSub ( ) ;
12
+
9
13
const app = express ( ) ;
10
14
11
15
app . use (
@@ -29,6 +33,8 @@ const books = [
29
33
} ,
30
34
] ;
31
35
36
+ let numberOfBookLikes = 0 ;
37
+
32
38
const typeDefs = gql `
33
39
type Book {
34
40
id: ID!
@@ -46,6 +52,7 @@ const typeDefs = gql`
46
52
type Query {
47
53
books: [Book!]!
48
54
book(id: ID!): Book
55
+ numberOfBookLikes: Int!
49
56
}
50
57
51
58
type Mutation {
@@ -55,14 +62,26 @@ const typeDefs = gql`
55
62
singleUpload(file: Upload!): File!
56
63
multipleUpload(files: [Upload!]!): [File!]!
57
64
}
65
+
66
+ type Subscription {
67
+ onBookLiked: Int!
68
+ }
58
69
` ;
59
70
60
71
const findBookById = id => books . find ( book => book . id === id ) ;
61
72
73
+ const ON_BOOK_LIKED = 'ON_BOOK_LIKED' ;
74
+
62
75
const resolvers = {
63
76
Query : {
64
77
books : ( ) => books ,
65
78
book : ( _ , args ) => findBookById ( args . id ) ,
79
+ numberOfBookLikes : ( ) => numberOfBookLikes ,
80
+ } ,
81
+ Subscription : {
82
+ onBookLiked : {
83
+ subscribe : ( ) => pubsub . asyncIterator ( [ ON_BOOK_LIKED ] ) ,
84
+ } ,
66
85
} ,
67
86
Mutation : {
68
87
deleteBook : ( _ , args ) => findBookById ( args . id ) ,
@@ -74,6 +93,8 @@ const resolvers = {
74
93
}
75
94
76
95
book . liked = true ;
96
+ numberOfBookLikes += 1 ;
97
+ pubsub . publish ( ON_BOOK_LIKED , { onBookLiked : numberOfBookLikes } ) ;
77
98
return book ;
78
99
} ,
79
100
unlikeBook : ( _ , args ) => {
@@ -99,13 +120,32 @@ const resolvers = {
99
120
} ,
100
121
} ;
101
122
123
+ // const sleep = () => new Promise(resolve => setTimeout(resolve, 50));
124
+
102
125
const server = new ApolloServer ( {
103
126
typeDefs,
104
127
resolvers,
128
+ subscriptions : {
129
+ // onConnect: async connectionParams => {
130
+ // if (connectionParams.token === 'pass') {
131
+ // await sleep();
132
+
133
+ // return {
134
+ // currentUser: 'user',
135
+ // };
136
+ // }
137
+
138
+ // throw new Error('Missing auth token!');
139
+ // },
140
+ keepAlive : 10000 ,
141
+ } ,
105
142
} ) ;
106
143
107
- server . applyMiddleware ( { app } ) ;
144
+ server . applyMiddleware ( { app, path : '/graphql' } ) ;
145
+
146
+ const httpServer = createServer ( app ) ;
147
+ server . installSubscriptionHandlers ( httpServer ) ;
108
148
109
- app . listen ( 3000 , ( ) => {
149
+ httpServer . listen ( 3000 , ( ) => {
110
150
console . log ( 'Listening on port 3000!' ) ;
111
151
} ) ;
0 commit comments