Skip to main content
Version: Next (2.x)

Context

Baeta allows you to define a shared context that's available throughout your resolvers and middlewares.

Define Context Type

First, define your context type:

// src/types/context.ts
import type { PubSub } from "graphql-yoga";
import type { PubSubMap } from "../lib/pubsub.ts";

export type Context = {
userId?: string;
pubsub: PubSub<PubSubMap>;
};

// biome-ignore lint/complexity/noBannedTypes: Empty context
export type ServerContext = {};

Configuration

The context type is picked up through the Ctx type alias in src/modules/types.ts. Update this alias to point to your context type:

// src/modules/types.ts
import type { Context } from "../types/context.ts";

export type Ctx = Context;

For more details on the types file, see Custom Types.

Usage in Resolvers

The context is automatically typed in your resolvers:

const { Query } = UserModule;

const userQuery = Query.user.resolve(({ args, ctx }) => {
// ctx is typed as Context
return db.user.findUnique({
where: args.where,
});
});

Usage in Middlewares

Middlewares also get the typed context:

const updateUserMutation = Mutation.updateUser
.$use(async (next, { ctx }) => {
// ctx is typed as Context
const result = await next();
ctx.pubsub.publish("user-updated", result);
return result;
})
.resolve(async ({ args }) => {
return db.user.update({ where: args.where, data: args.data });
});