diff --git a/turbo/generators/templates/realtime/handler/handler.test.ts.hbs b/turbo/generators/templates/realtime/handler/handler.test.ts.hbs new file mode 100644 index 0000000..3576682 --- /dev/null +++ b/turbo/generators/templates/realtime/handler/handler.test.ts.hbs @@ -0,0 +1,17 @@ +// packages/{{kebabCase feature}}/src/realtime/handlers/on-{{kebabCase channelSlug}}.handler.test.ts +import { describe, it, expect } from "vitest"; +import { on{{pascalCase channelSlug}}Handler } from "@/realtime/handlers/on-{{kebabCase channelSlug}}.handler"; + +describe("on{{pascalCase channelSlug}}Handler", () => { + it("returns a function (factory shape)", () => { + const handler = on{{pascalCase channelSlug}}Handler(); + expect(typeof handler).toBe("function"); + }); + + it("does not throw on a valid stub input", async () => { + const handler = on{{pascalCase channelSlug}}Handler(); + await expect( + handler({} as never, { userId: "u1", roles: [] }), + ).resolves.toBeUndefined(); + }); +}); diff --git a/turbo/generators/templates/realtime/handler/handler.ts.hbs b/turbo/generators/templates/realtime/handler/handler.ts.hbs new file mode 100644 index 0000000..ad4646e --- /dev/null +++ b/turbo/generators/templates/realtime/handler/handler.ts.hbs @@ -0,0 +1,13 @@ +// packages/{{kebabCase feature}}/src/realtime/handlers/on-{{kebabCase channelSlug}}.handler.ts +import type { {{pascalCase channelSlug}}Payload } from "../{{kebabCase channelSlug}}.channel"; +import type { RealtimeContext } from "@repo/core-realtime"; + +export type IOn{{pascalCase channelSlug}}Handler = ReturnType; + +export const on{{pascalCase channelSlug}}Handler = + () => + async (_input: {{pascalCase channelSlug}}Payload, _ctx: RealtimeContext): Promise => { + // TODO: implement the reaction. Inject deps via the factory's constructor + // and use them here. The handler is wrapped in span+capture at bind time, + // so just throwing on failure is the right shape. + };