Prenumerationer / WebSockets
Inofficiell Beta-översättning
Denna sida har översatts av PageTurner AI (beta). Inte officiellt godkänd av projektet. Hittade du ett fel? Rapportera problem →
Använda prenumerationer
tips
- Se ett fullständigt exempel i /examples/next-prisma-starter-websockets.
- Ett minimalt Node.js-exempel finns i /examples/standalone-server.
Lägga till en prenumerationsprocedur
server/router.tstsximport { EventEmitter } from 'events';import * as trpc from '@trpc/server';// create a global event emitter (could be replaced by redis, etc)const ee = new EventEmitter();export const appRouter = trpc.router().subscription('onAdd', {resolve({ ctx }) {// `resolve()` is triggered for each client when they start subscribing `onAdd`// return a `Subscription` with a callback which is triggered immediatelyreturn new trpc.Subscription<Post>((emit) => {const onAdd = (data: Post) => {// emit data to clientemit.data(data);};// trigger `onAdd()` when `add` is triggered in our event emitteree.on('add', onAdd);// unsubscribe function when client disconnects or stops subscribingreturn () => {ee.off('add', onAdd);};});},}).mutation('add', {input: z.object({id: z.string().uuid().optional(),text: z.string().min(1),}),async resolve({ ctx, input }) {const post = { ...input }; /* [..] add to db */ee.emit('add', post);return post;},});
server/router.tstsximport { EventEmitter } from 'events';import * as trpc from '@trpc/server';// create a global event emitter (could be replaced by redis, etc)const ee = new EventEmitter();export const appRouter = trpc.router().subscription('onAdd', {resolve({ ctx }) {// `resolve()` is triggered for each client when they start subscribing `onAdd`// return a `Subscription` with a callback which is triggered immediatelyreturn new trpc.Subscription<Post>((emit) => {const onAdd = (data: Post) => {// emit data to clientemit.data(data);};// trigger `onAdd()` when `add` is triggered in our event emitteree.on('add', onAdd);// unsubscribe function when client disconnects or stops subscribingreturn () => {ee.off('add', onAdd);};});},}).mutation('add', {input: z.object({id: z.string().uuid().optional(),text: z.string().min(1),}),async resolve({ ctx, input }) {const post = { ...input }; /* [..] add to db */ee.emit('add', post);return post;},});
Skapa en WebSocket-server
bashyarn add ws
bashyarn add ws
server/wsServer.tstsimport { applyWSSHandler } from '@trpc/server/adapters/ws';import ws from 'ws';import { appRouter } from './routers/app';import { createContext } from './trpc';const wss = new ws.Server({port: 3001,});const handler = applyWSSHandler({ wss, router: appRouter, createContext });wss.on('connection', (ws) => {console.log(`➕➕ Connection (${wss.clients.size})`);ws.once('close', () => {console.log(`➖➖ Connection (${wss.clients.size})`);});});console.log('✅ WebSocket Server listening on ws://localhost:3001');process.on('SIGTERM', () => {console.log('SIGTERM');handler.broadcastReconnectNotification();wss.close();});
server/wsServer.tstsimport { applyWSSHandler } from '@trpc/server/adapters/ws';import ws from 'ws';import { appRouter } from './routers/app';import { createContext } from './trpc';const wss = new ws.Server({port: 3001,});const handler = applyWSSHandler({ wss, router: appRouter, createContext });wss.on('connection', (ws) => {console.log(`➕➕ Connection (${wss.clients.size})`);ws.once('close', () => {console.log(`➖➖ Connection (${wss.clients.size})`);});});console.log('✅ WebSocket Server listening on ws://localhost:3001');process.on('SIGTERM', () => {console.log('SIGTERM');handler.broadcastReconnectNotification();wss.close();});
Konfigurera TRPCClient för WebSockets
tips
Du kan använda Länkar för att dirigera queries och/eller mutations till HTTP-transport och prenumerationer över WebSockets.
client.tstsximport { httpBatchLink } from '@trpc/client/links/httpBatchLink';import { createWSClient, wsLink } from '@trpc/client/links/wsLink';// create persistent WebSocket connectionconst wsClient = createWSClient({url: `ws://localhost:3001`,});// configure TRPCClient to use WebSockets transportconst client = createTRPCClient<AppRouter>({links: [wsLink({client: wsClient,}),],});
client.tstsximport { httpBatchLink } from '@trpc/client/links/httpBatchLink';import { createWSClient, wsLink } from '@trpc/client/links/wsLink';// create persistent WebSocket connectionconst wsClient = createWSClient({url: `ws://localhost:3001`,});// configure TRPCClient to use WebSockets transportconst client = createTRPCClient<AppRouter>({links: [wsLink({client: wsClient,}),],});
Använda React
Se /examples/next-prisma-starter-websockets.
WebSockets RPC-specifikation
Mer detaljer finns i TypeScript-definitionerna:
query / mutation
Förfrågan
ts{id: number | string;jsonrpc?: '2.0';method: 'query' | 'mutation';params: {path: string;input?: unknown; // <-- pass input of procedure, serialized by transformer};}
ts{id: number | string;jsonrpc?: '2.0';method: 'query' | 'mutation';params: {path: string;input?: unknown; // <-- pass input of procedure, serialized by transformer};}
Svar
... nedan, eller ett felmeddelande.
ts{id: number | string;jsonrpc: '2.0';result: {type: 'data'; // always 'data' for mutation / queriesdata: TOutput; // output from procedure}}
ts{id: number | string;jsonrpc: '2.0';result: {type: 'data'; // always 'data' for mutation / queriesdata: TOutput; // output from procedure}}
subscription / subscription.stop
Starta en prenumeration
ts{id: number | string;jsonrpc?: '2.0';method: 'subscription';params: {path: string;input?: unknown; // <-- pass input of procedure, serialized by transformer};}
ts{id: number | string;jsonrpc?: '2.0';method: 'subscription';params: {path: string;input?: unknown; // <-- pass input of procedure, serialized by transformer};}
Avbryt en prenumeration med subscription.stop
ts{id: number | string; // <-- id of your created subscriptionjsonrpc?: '2.0';method: 'subscription.stop';}
ts{id: number | string; // <-- id of your created subscriptionjsonrpc?: '2.0';method: 'subscription.stop';}
Prenumerationssvarsformat
... nedan, eller ett felmeddelande.
ts{id: number | string;jsonrpc: '2.0';result: (| {type: 'data';data: TData; // subscription emitted data}| {type: 'started'; // sub started}| {type: 'stopped'; // sub stopped})}
ts{id: number | string;jsonrpc: '2.0';result: (| {type: 'data';data: TData; // subscription emitted data}| {type: 'started'; // sub started}| {type: 'stopped'; // sub stopped})}
Felmeddelanden
Se https://www.jsonrpc.org/specification#error_object eller Felformatering.
Notifieringar från server till klient
{id: null, type: 'reconnect' }
Informerar klienter att återansluta innan servern stängs ner. Anropas av wssHandler.broadcastReconnectNotification().