This Events package gives you a type-safe, Redis-backed pub/sub layer that streams events from your server to the browser over Server-Sent Events (SSE).
It is part of Rubric's architecture for Generative UI when used with:
bun add @rubriclab/events
@rubriclab scope packages are not built, they are all raw typescript. If using in a next.js app, make sure to transpile.
// next.config.ts
import type { NextConfig } from 'next'
export default {
transpilePackages: ['@rubriclab/events'],
reactStrictMode: true
} satisfies NextConfig
If using inside the monorepo (@rubric), simply add
{"@rubriclab/events": "*"}
to dependencies and then runbun i
export const eventTypes = createEventTypes({
ping: z.literal('ping'),
})
import { createEventsServer } from '@rubriclab/events/server'
import env from '~/env'
import { eventTypes } from './types'
export const { publish, GET, maxDuration } = createEventsServer({
eventTypes,
redisURL: env.UPSTASH_REDIS_URL
})
// app/api/events/route.ts
export { GET, maxDuration } from './server'
import { createEventsClient } from '@rubriclab/events/client'
import { eventTypes } from './types'
export const { useEvents } = createEventsClient({
url: '/api/events', // The url of the server
eventTypes
})
await publish({
channel: '123',
eventType: 'ping',
payload: 'ping'
})
useEvents({
id: '123',
on: {
ping: (payload) => {
console.log('ping', payload)
}
}
})
Commits to main will automatically publish a new version to npm.