Skip to content

createServer

Creates and configures a Socket.IO GraphQL server with live query support.

import { createServer } from '@requence/socketql/server'
function createServer<Context>(options: ServerOptions<Context>): {
server: IoServer
namespace: Namespace
liveQueryStore: ExtendedLiveQueryStore
attach: (baseServer: ServerInstance) => void
addSchema: (opts: { typeDefs: TypeSource; resolvers: IResolvers }) => void
httpHandler: (opts?) => (c) => Promise<Response>
generateIntrospection: () => Promise<IntrospectionQuery>
}
import { createServer } from '@requence/socketql/server/bun'
function createServer<Context>(options: ServerOptions<Context>): {
server: IoServer
namespace: Namespace
liveQueryStore: ExtendedLiveQueryStore
handler: () => { fetch, websocket, idleTimeout }
addSchema: (opts: { typeDefs: TypeSource; resolvers: IResolvers }) => void
httpHandler: (opts?) => (c) => Promise<Response>
generateIntrospection: () => Promise<IntrospectionQuery>
}
OptionTypeDefaultDescription
pathstring'/ws/'Socket.IO server path
transportsstring[]['websocket']Allowed transports
graphqlNamespacestring'graphql'Socket.IO namespace for GraphQL
extendContext(ctx) => Context() => ({})Extend GraphQL context per connection
onConnect(socket) => voidCalled when a client connects. Throw ConnectionRejectedError(message, data?) to reject.
onDisconnect(socket, reason) => voidCalled when a client disconnects
formatError(error) => GraphQLErrorTransform GraphQL errors before sending
maxUploadSizenumberMax upload size in bytes
transformSchemaSchemaTransformeridentityTransform the schema after creation
schemasSocketQLSchema<Context>[]Pre-register schemas at creation time
pingIntervalnumber25000Socket.IO ping interval (ms)
pingTimeoutnumber20000Socket.IO ping timeout (ms)
redisRedisAdapterRedis adapter from createRedisAdapter
wrapExecute(execute, context) => resultpassthroughWrap GraphQL execution (e.g. for tracing)

Shared across both entry points:

PropertyTypeDescription
serverIoServerThe raw Socket.IO server instance
namespaceNamespaceThe GraphQL namespace
liveQueryStoreExtendedLiveQueryStoreLive query store for invalidation
addSchema(opts) => voidRegister type definitions and resolvers
httpHandler(opts?) => (c) => Promise<Response>HTTP GraphQL endpoint handler
generateIntrospection() => Promise<...>Generate introspection result

Node.js only:

PropertyTypeDescription
attach(server) => voidAttach to a Node.js HTTP/HTTPS/HTTP2 server

Bun only:

PropertyTypeDescription
handler() => { fetch, websocket, idleTimeout }Returns Bun-ready config to spread into Bun.serve() or export default
handleRequest(req, server) => Promise<Response>Handle a single Socket.IO request directly
withServer(fallback) => (req, server) => ResponseIntercepts SocketQL requests, delegates the rest to the fallback

A schema object containing type definitions and resolvers:

interface SocketQLSchema<Context = any> {
typeDefs: TypeSource
resolvers: IResolvers<any, GraphQLContext & Context>
}

A type-safe helper for creating SocketQLSchema objects. It is a simple identity function that provides autocomplete and type checking:

import { defineSchema } from '@requence/socketql/server'
const mySchema = defineSchema({
typeDefs: /* GraphQL */ `
type Query {
hello: String!
}
`,
resolvers: {
Query: {
hello: () => 'world',
},
},
})

The context is a discriminated union on the transport field. Every resolver receives one of two context shapes depending on how the request arrived.

Available in both WebSocket and HTTP contexts:

PropertyTypeDescription
transport'websocket' | 'http'The transport used for the request
queriedFieldsQueriedFieldsParsed field selection helpers
unauthorized(msg) => neverThrow an unauthorized GraphQL error
loader(load, name?) => DataLoaderGet or create a batched DataLoader
liveQueryStoreExtendedLiveQueryStoreLive query invalidation

When transport is 'websocket', the context additionally includes:

PropertyTypeDescription
namespaceNamespaceThe Socket.IO namespace
socketSocketThe current client’s socket

When transport is 'http', socket and namespace are not part of the context.

if (context.transport === 'websocket') {
context.socket // ✅ Socket
context.namespace // ✅ Namespace
}
if (context.transport === 'http') {
// socket and namespace do not exist on this type
}

All three types are exported:

import type {
GraphQLContext,
WebSocketGraphQLContext,
HttpGraphQLContext,
} from '@requence/socketql/server'

Returns an HTTP-compatible handler for GraphQL queries and mutations.

httpHandler(opts?: {
extendContext?: (req: Request) => MaybePromise<Context>
mapSchema?: (schema: GraphQLSchema) => GraphQLSchema
})
OptionTypeDescription
extendContext(req: Request) => ContextExtend context per HTTP request (e.g. auth from headers)
mapSchema(schema: GraphQLSchema) => GraphQLSchemaTransform the schema for HTTP (cached after first call)

Imported from @requence/socketql/server/redis. Creates a Redis adapter that provides both Socket.IO multi-instance coordination and Redis-backed live query invalidation.

import { createRedisAdapter } from '@requence/socketql/server/redis'
function createRedisAdapter(options: RedisAdapterOptions): RedisAdapter
OptionTypeDefaultDescription
urlstringRedis connection URL (required)
liveQueryChannelstring'requence-socketql-sync'Redis pub/sub channel for live query invalidation
PropertyTypeDescription
adapterRedisAdapterSocket.IO Redis adapter for multi-instance coordination
liveQueryStoreExtendedLiveQueryStoreRedis-backed live query store
import { createServer } from '@requence/socketql/server'
import { createRedisAdapter } from '@requence/socketql/server/redis'
const redis = createRedisAdapter({ url: 'redis://localhost:6379' })
const { attach } = createServer({
redis,
schemas: [mySchema],
})