0.1.0-alpha.18 • Published 12h ago
@capixjs/transport-graphql
Licence
MIT
Version
0.1.0-alpha.18
Deps
2
Size
32 kB
Vulns
0
Weekly
0
@capixjs/transport-graphql
GraphQL transport for Capix. Serves a spec-compliant GraphQL endpoint and an optional GraphiQL playground from your Capix capability registry.
Install
npm install @capixjs/core @capixjs/transport-graphql zod
Usage
import { createServer } from '@capixjs/core';
import { graphqlTransport } from '@capixjs/transport-graphql';
import { buildContext, capabilities } from './capabilities.js';
createServer({
context: buildContext,
capabilities,
transports: [
graphqlTransport({ port: 4000 }),
],
}).start();
GraphQL endpoint: http://localhost:4000/graphql
Playground: http://localhost:4000/graphql/playground
Schema mapping
Capability registries are mapped to a GraphQL schema automatically:
| Capix | GraphQL |
|---|---|
intent: 'query' |
Query field |
| All other intents | Mutation field |
users.getUser |
users_getUser field |
z.string() input |
String! arg |
z.number() input |
Float! arg |
z.boolean() input |
Boolean! arg |
.output(schema) |
Named output type |
No .output() |
JSON scalar |
z.coerce.number().default(N) |
Optional Float arg |
Querying
# Named output type (capability uses .output())
{ users_getUser(id: "1") { id name email } }
# JSON scalar (no .output() — entire object returned as-is)
{ system_ping }
# Variables work for all argument types
query GetUser($id: String!) {
users_getUser(id: $id) { id name }
}
Options
| Option | Type | Default | Description |
|---|---|---|---|
port |
number |
— | Port to listen on |
host |
string |
'0.0.0.0' |
Host to bind to |
path |
string |
'/graphql' |
GraphQL endpoint path |
playground |
boolean |
true |
Serve GraphiQL at {path}/playground |
capabilities |
GroupTree |
server default | Per-transport capability registry |
Per-transport capabilities
createServer({
context: buildContext,
transports: [
graphqlTransport({
port: 4000,
capabilities: { users: { list, get } }, // only these capabilities on GraphQL
}),
],
});
Auth header forwarding
The GraphQL transport forwards Authorization and other request headers to buildContext unchanged. Use getHeader(req, 'authorization') inside your context builder to read them:
import { defineContext, getHeader } from '@capixjs/core';
const buildContext = defineContext(async (req) => ({
requestId: crypto.randomUUID(),
user: await verifyToken(getHeader(req, 'authorization')),
}));
Limitations
- No subscriptions: the GraphQL transport is request/response only. For real-time updates, use
wsTransportwith an event bus alongside the GraphQL transport. z.lazyfalls back to JSON scalar: recursive schemas defined withz.lazy()cannot be statically typed in the generated GraphQL schema and are represented as theJSONscalar.- No file uploads: multipart file uploads are not supported in the GraphQL transport. Use the REST transport for file upload capabilities.
- No batching: the transport handles one operation per request.
License
MIT