- Node ^14.3
- Concurrent batched operations with graphql-batch-executor
- Server built as a Shimio middleware
- Client as an asyncIterator
npm install @hydre/shimio-graphql
import { readFileSync } from 'fs'
import { dirname, join } from 'path'
import { PassThrough } from 'stream'
import { fileURLToPath } from 'url'
import Server from '@hydre/shimio/server'
import Serve from '@hydre/shimio-graphql/serve'
import graphql from 'graphql'
import Koa from 'koa'
const directory = dirname(fileURLToPath(import.meta.url))
const WAIT = 150
const file = readFileSync(join(directory, 'schema.gql'), 'utf-8')
const server = Server({
koa: new Koa(),
// context here is an empty object created by Shimio server
on_upgrade: ({ context }) => {
context.through = new PassThrough({ objectMode: true })
return true
},
on_socket: Serve({
context: async ({
// the raw upgraded socket
socket,
// the raw connection context (in allow_upgrade)
context,
// the raw first http request
request
}) => ({
// put whatever you want here
// this is to build a per-operation context
// each batch of queries will have a clean context
}),
schema: graphql.buildSchema(file),
query : {
me() {
return { name: 'pepeg' }
},
ping() {
return 'ping pong chin chan'
},
},
mutation: {
sendMessage({ message }, { through }) {
through.write({ onMessage: message })
return 'message sent!'
},
},
subscription: {
async *onMessage(_, { through }) {
for await (const chunk of through) {
await new Promise(resolve =>
setTimeout(resolve, WAIT))
yield chunk
}
},
},
}),
})
await server.listen(3000)
console.log('running on :3000')
import debug from 'debug'
import casual from 'casual'
import { inspect } from 'util'
import Client from '@hydre/shimio/client'
import Query from '@hydre/shimio-graphql/query'
// || ===========================================
// || When running in nodejs you need to provide a ws polyfill
// || Browsers have it by default
// ||
import ws from 'ws'
globalThis.WebSocket = ws
// ||
// || ===========================================
// see options in @hydre/shimio
const client = Client({ host: 'ws://0.0.0.0:3000' })
const query = Query(client)
const END = 2000
await client.connect()
const {
listen, // an asyncIterator yielding updates
stop, // close the channel
once // promise of the first result only
} = await query(/* GraphQL */ `
query pang {
ping
}
mutation hello {
first: sendMessage(message: "howdy")
then: sendMessage(message: "pls sir show vagana")
}
subscription hey_listen {
onMessage
}
`)
setTimeout(() => {
stop() // unsubscribe from operation
}, END)
for await (const chunk of listen())
console.log('received', inspect(chunk, false, Infinity, true))
client.disconnect()