QUESTPIE

Realtime Infrastructure

Realtime adapters — pgNotify, Redis Streams, and Cloudflare Durable Objects.

QUESTPIE supports real-time data updates via POST /realtime multiplexed endpoint.

Adapters

pgNotifyAdapter

Uses PostgreSQL LISTEN/NOTIFY. Works for single-instance deployments:

questpie.config.ts
import { runtimeConfig } from "questpie/app";
import { pgNotifyAdapter } from "questpie/adapters/pg-notify";

export default runtimeConfig({
	realtime: {
		adapter: pgNotifyAdapter({
			connectionString: process.env.DATABASE_URL,
		}),
	},
});

redisStreamsAdapter

Uses Redis Streams. Required for multi-instance deployments:

import { runtimeConfig } from "questpie/app";
import { redisStreamsAdapter } from "questpie/adapters/redis-streams";

export default runtimeConfig({
	realtime: {
		adapter: redisStreamsAdapter({
			url: process.env.REDIS_URL,
		}),
	},
});

cloudflareRealtimeAdapter

Cloudflare Workers require an explicit Durable Object-backed realtime adapter. The Cloudflare Worker entrypoint validates that this adapter is present.

questpie.config.ts
import { runtimeConfig } from "questpie/app";
import {
	cloudflareRealtimeAdapter,
	type CloudflareDurableObjectNamespace,
} from "questpie/adapters/cloudflare";

async function getRealtimeNamespace(): Promise<CloudflareDurableObjectNamespace> {
	const { env } = await import("cloudflare:workers");
	return env.QUESTPIE_REALTIME as CloudflareDurableObjectNamespace;
}

export default runtimeConfig({
	realtime: {
		adapter: cloudflareRealtimeAdapter({
			namespace: getRealtimeNamespace,
		}),
	},
});

Export the Durable Object handler from your Worker:

worker.ts
import { app } from "#questpie";
import {
	createCloudflareRealtimeDurableObjectHandler,
	createCloudflareWorkerHandlers,
} from "questpie/adapters/cloudflare";

export default createCloudflareWorkerHandlers(app, { basePath: "/api" });

const realtimeDurableObject = createCloudflareRealtimeDurableObjectHandler(
	app,
	{
		basePath: "/api",
	},
);

export class QuestpieRealtimeDurableObject {
	fetch(request: Request) {
		return realtimeDurableObject(request);
	}
}

When to Use Which

AdapterUse case
pgNotifyAdapterSingle server, development, simple deployments
redisStreamsAdapterMultiple servers, horizontal scaling
cloudflareRealtimeAdapterCloudflare Workers + Durable Objects

On this page