@@ -266,54 +266,61 @@ Also, you can set `subscriptionsProtocol` in GraphiQL options to use WebSockets
266
266
` yoga-with-ws.ts `
267
267
268
268
``` ts
269
- import { createServer } from ' @graphql-yoga/node '
269
+ import { createServer } from ' http '
270
270
import { WebSocketServer } from ' ws'
271
+ import { createServer } from ' graphql-yoga'
271
272
import { useServer } from ' graphql-ws/lib/use/ws'
272
273
273
274
async function main() {
274
- const yogaApp = createServer ({
275
+ const yoga = createYoga ({
275
276
graphiql: {
276
277
// Use WebSockets in GraphiQL
277
278
subscriptionsProtocol: ' WS' ,
278
279
},
279
280
})
280
281
281
- // Get NodeJS Server from Yoga
282
- const httpServer = await yogaApp .start ()
282
+ // Create NodeJS Server from Yoga
283
+ const server = createServer (yoga )
284
+
283
285
// Create WebSocket server instance from our Node server
284
- const wsServer = new WebSocketServer ({
285
- server: httpServer ,
286
- path: yogaApp .getAddressInfo ().endpoint ,
286
+ const wss = new WebSocketServer ({
287
+ server ,
288
+ // Make sure WS is on the same endpoint
289
+ path: yoga .graphqlEndpoint ,
287
290
})
288
291
289
292
// Integrate Yoga's Envelop instance and NodeJS server with graphql-ws
290
293
useServer (
291
294
{
292
- execute : (args : any ) => args .rootValue . execute (args ),
293
- subscribe : (args : any ) => args .rootValue . subscribe (args ),
295
+ execute : (args : any ) => args .execute (args ),
296
+ subscribe : (args : any ) => args .subscribe (args ),
294
297
onSubscribe : async (ctx , msg ) => {
295
298
const { schema, execute, subscribe, contextFactory, parse, validate } =
296
- yogaApp .getEnveloped (ctx )
299
+ yoga .getEnveloped ({
300
+ ... ctx ,
301
+ req: ctx .extra .request ,
302
+ socket: ctx .extra .socket ,
303
+ })
297
304
298
305
const args = {
299
306
schema ,
300
307
operationName: msg .payload .operationName ,
301
308
document: parse (msg .payload .query ),
302
309
variableValues: msg .payload .variables ,
303
310
contextValue: await contextFactory (),
304
- rootValue: {
305
- execute ,
306
- subscribe ,
307
- },
311
+ execute ,
312
+ subscribe ,
308
313
}
309
314
310
315
const errors = validate (args .schema , args .document )
311
316
if (errors .length ) return errors
312
317
return args
313
318
},
314
319
},
315
- wsServer ,
320
+ wss ,
316
321
)
322
+
323
+ server .listen (4000 )
317
324
}
318
325
319
326
main ().catch ((e ) => {
0 commit comments