Skip to content

Commit 07cbb50

Browse files
committed
add subscriptions for /northwind schema
1 parent 6736e70 commit 07cbb50

File tree

3 files changed

+94
-24
lines changed

3 files changed

+94
-24
lines changed

examples/northwind/schema.js

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ import { SupplierTC } from './models/supplier';
2020
import { addQueryToPayload } from './wrappers/addQueryToPayload';
2121
import { autoResetDataIn30min } from './wrappers/autoResetDataIn30min';
2222
import { seedByName } from '../../scripts/seedHelpers';
23+
import { PubSub } from 'apollo-server-express';
24+
25+
const pubsub = new PubSub();
2326

2427
const ViewerTC = schemaComposer.getOrCreateOTC('Viewer');
2528
schemaComposer.Query.addFields({
@@ -71,9 +74,27 @@ schemaComposer.Mutation.addFields({
7174
updateProduct: ProductTC.getResolver('updateById'),
7275
removeProduct: ProductTC.getResolver('removeOne'),
7376

74-
createOrder: OrderTC.getResolver('createOne'),
75-
updateOrder: OrderTC.getResolver('updateById'),
76-
removeOrder: OrderTC.getResolver('removeOne'),
77+
createOrder: OrderTC.getResolver('createOne', [
78+
async (next, s, a, c, i) => {
79+
const res = await next(s, a, c, i);
80+
pubsub.publish('ORDER_CREATED', res.record);
81+
return res;
82+
},
83+
]),
84+
updateOrder: OrderTC.getResolver('updateById', [
85+
async (next, s, a, c, i) => {
86+
const res = await next(s, a, c, i);
87+
pubsub.publish('ORDER_UPDATED', res.record);
88+
return res;
89+
},
90+
]),
91+
removeOrder: OrderTC.getResolver('removeOne', [
92+
async (next, s, a, c, i) => {
93+
const res = await next(s, a, c, i);
94+
pubsub.publish('ORDER_REMOVED', res.record);
95+
return res;
96+
},
97+
]),
7798

7899
updateEmployee: EmployeeTC.getResolver('updateById'),
79100
}),
@@ -89,4 +110,27 @@ schemaComposer.Mutation.addFields({
89110
},
90111
});
91112

113+
// About subscriptions you can reead here:
114+
// - https://www.apollographql.com/docs/apollo-server/data/subscriptions/
115+
// - https://github.com/apollographql/subscriptions-transport-ws
116+
// - https://github.com/apollographql/apollo-server/blob/master/packages/apollo-server-core/src/ApolloServer.ts
117+
// - https://github.com/graphql/graphql-js/blob/master/src/subscription/__tests__/subscribe-test.js
118+
schemaComposer.Subscription.addFields({
119+
orderCreated: {
120+
type: OrderTC,
121+
resolve: (record) => record,
122+
subscribe: () => pubsub.asyncIterator(['ORDER_CREATED']),
123+
},
124+
orderUpdated: {
125+
type: OrderTC,
126+
resolve: (record) => record,
127+
subscribe: () => pubsub.asyncIterator(['ORDER_UPDATED']),
128+
},
129+
orderRemoved: {
130+
type: 'MongoID',
131+
resolve: (record) => record,
132+
subscribe: () => pubsub.asyncIterator(['ORDER_REMOVED']),
133+
},
134+
});
135+
92136
export default schemaComposer.buildSchema();

index.js

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
1+
/* eslint-disable no-new */
12
/* @flow */
23

34
import express from 'express';
45
import cors from 'cors';
5-
import graphqlHTTP from 'express-graphql';
6-
import expressPlayground from 'graphql-playground-middleware-express';
6+
import { ApolloServer } from 'apollo-server-express';
77
import { altairExpress } from 'altair-express-middleware';
8+
import { express as voyagerMiddleware } from 'graphql-voyager/middleware';
9+
import http from 'http';
10+
import { SubscriptionServer } from 'subscriptions-transport-ws';
11+
import { execute, subscribe } from 'graphql';
812
import { mainPage, addToMainPage } from './mainPage';
913
import { expressPort, getExampleNames, resolveExamplePath } from './config';
1014
import './mongooseConnection';
1115

12-
const server = express();
13-
server.use(cors({ origin: true, credentials: true }));
16+
const app = express();
17+
const httpServer = http.createServer(app);
18+
app.use(cors({ origin: true, credentials: true }));
1419

1520
// scan `examples` directory and add
1621
// - graphql endpoint by uri /exampleDirName
@@ -25,28 +30,48 @@ for (const name of exampleNames) {
2530
}
2631

2732
// $FlowFixMe
28-
server.get('/', (req, res) => {
33+
app.get('/', (req, res) => {
2934
res.send(mainPage());
3035
});
3136

32-
server.listen(expressPort, () => {
37+
httpServer.listen(expressPort, () => {
3338
console.log(`🚀🚀🚀 The server is running at http://localhost:${expressPort}/`);
39+
40+
// https://www.apollographql.com/docs/graphql-subscriptions/setup/
41+
SubscriptionServer.create(
42+
{
43+
schema: require('./examples/northwind/schema').default,
44+
execute,
45+
subscribe,
46+
onConnect: (connectionParams, ws, context) => {
47+
console.log(`WS[connect][${context.request.connection.remoteAddress}]`, connectionParams);
48+
},
49+
onDisconnect: (ws, context) => {
50+
console.log(`WS[disconn][${context.request.connection.remoteAddress}]`);
51+
},
52+
},
53+
{
54+
server: httpServer,
55+
path: '/northwind',
56+
}
57+
);
3458
});
3559

3660
function addExample(example, uri) {
3761
example.uri = `/${uri}`; // eslint-disable-line
38-
server.use(
39-
example.uri,
40-
(graphqlHTTP(() => ({
41-
schema: example.schema,
42-
graphiql: true,
43-
customFormatErrorFn: (error) => ({
44-
message: error.message,
45-
stack: !error.message.match(/for security reason/i) ? error.stack.split('\n') : null,
46-
}),
47-
})): any)
62+
63+
const server = new ApolloServer({
64+
schema: example.schema,
65+
playground: {
66+
subscriptionEndpoint: example.uri,
67+
},
68+
});
69+
server.applyMiddleware({ app, path: example.uri });
70+
71+
app.use(
72+
`${example.uri}-altair`,
73+
altairExpress({ endpointURL: example.uri, subscriptionsEndpoint: example.uri })
4874
);
49-
server.get(`${example.uri}-playground`, expressPlayground({ endpoint: example.uri }));
50-
server.use(`${example.uri}-altair`, altairExpress({ endpointURL: example.uri }));
75+
app.use(`${example.uri}-voyager`, voyagerMiddleware({ endpointUrl: example.uri }));
5176
addToMainPage(example);
5277
}

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@
3535
"@babel/preset-env": "7.8.4",
3636
"@babel/preset-flow": "7.8.3",
3737
"altair-express-middleware": "^2.4.3",
38+
"apollo-server-express": "^2.10.1",
3839
"aws-sdk": "2.619.0",
3940
"cors": "2.8.5",
4041
"dedent": "^0.7.0",
4142
"elasticsearch": "16.6.0",
4243
"express": "4.17.1",
43-
"express-graphql": "0.9.0",
4444
"graphql": "14.6.0",
4545
"graphql-compose": "7.12.0",
4646
"graphql-compose-aws": "4.0.1",
@@ -49,8 +49,9 @@
4949
"graphql-compose-mongoose": "7.3.4",
5050
"graphql-compose-pagination": "6.0.3",
5151
"graphql-compose-relay": "5.0.3",
52-
"graphql-playground-middleware-express": "1.7.12",
53-
"mongoose": "5.9.1"
52+
"graphql-voyager": "^1.0.0-rc.29",
53+
"mongoose": "5.9.1",
54+
"subscriptions-transport-ws": "^0.9.16"
5455
},
5556
"devDependencies": {
5657
"babel-core": "7.0.0-bridge.0",

0 commit comments

Comments
 (0)