kalempster
kalempster
TtRPC
Created by kalempster on 6/9/2024 in #❓-help
Subscription example not behaving like it should
Hey, I've recently wanted to make a subscription route and I've stumbled upon a problem. In the documentation it's said that you should return an observable with a callback that is triggered immediately. That however is not happening. I don't know if I don't understand this correctly of if the example is broken. I'm using bun@1.1.10 with @trpc/server@11.0.0-rc.396.
import { EventEmitter } from "events";
import { initTRPC } from "@trpc/server";
import { observable } from "@trpc/server/observable";
import { z } from "zod";

// create a global event emitter (could be replaced by redis, etc)
const ee = new EventEmitter();

const t = initTRPC.create();

export const appRouter = t.router({
onAdd: t.procedure.subscription(() => {
// return an `observable` with a callback which is triggered immediately
return observable((emit) => {
console.log("running");

const onAdd = (data: any) => {
// emit data to client
emit.next(data);
};

// trigger `onAdd()` when `add` is triggered in our event emitter
ee.on("add", onAdd);

// unsubscribe function when client disconnects or stops subscribing
return () => {
ee.off("add", onAdd);
};
});
}),
add: t.procedure
.input(
z.object({
id: z.string().uuid().optional(),
text: z.string().min(1),
})
)
.mutation(async (opts) => {
const post = { ...opts.input }; /* [..] add to db */

ee.emit("add", post);
return post;
}),
});

console.log(ee.listeners("add"));
import { EventEmitter } from "events";
import { initTRPC } from "@trpc/server";
import { observable } from "@trpc/server/observable";
import { z } from "zod";

// create a global event emitter (could be replaced by redis, etc)
const ee = new EventEmitter();

const t = initTRPC.create();

export const appRouter = t.router({
onAdd: t.procedure.subscription(() => {
// return an `observable` with a callback which is triggered immediately
return observable((emit) => {
console.log("running");

const onAdd = (data: any) => {
// emit data to client
emit.next(data);
};

// trigger `onAdd()` when `add` is triggered in our event emitter
ee.on("add", onAdd);

// unsubscribe function when client disconnects or stops subscribing
return () => {
ee.off("add", onAdd);
};
});
}),
add: t.procedure
.input(
z.object({
id: z.string().uuid().optional(),
text: z.string().min(1),
})
)
.mutation(async (opts) => {
const post = { ...opts.input }; /* [..] add to db */

ee.emit("add", post);
return post;
}),
});

console.log(ee.listeners("add"));
The console.log at the end prints [] and I thought the callback is triggered immediately. Any help would be appreciated.
4 replies
TtRPC
Created by kalempster on 3/4/2023 in #❓-help
Error types in catch block
Hey! I have a mutation that I want to catch if the procedure throws an error, I'd like to get the code of the error ("UNAUTHORIZED", "FORBIDDEN" etc.) but TRCPClientError doesn't have full types (basically I can't access the code property). I saw a generic that you can pass to the error but I don't know what to pass as the generic to get the types.
try {
await mutateAsync(id);
} catch (error) {
if(error instanceof TRPCClientError<>){
//Process the error here if unauthorized regenerate accessToken and retry
}
}
try {
await mutateAsync(id);
} catch (error) {
if(error instanceof TRPCClientError<>){
//Process the error here if unauthorized regenerate accessToken and retry
}
}
Is there any way to do so?
3 replies