Skip to content

Commit b4129f6

Browse files
Merge pull request #2 from fishjam-cloud/trpc
Trpc
2 parents 406ea51 + 7482924 commit b4129f6

32 files changed

+898
-1256
lines changed

deep-sea-stories/packages/backend/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@
55
"type": "module",
66
"dependencies": {
77
"@fishjam-cloud/js-server-sdk": "^0.21.0",
8+
"@trpc/server": "^11.6.0",
89
"dotenv": "^17.2.3",
910
"fastify": "^5.6.1",
10-
"fastify-plugin": "^5.1.0",
11-
"fastify-type-provider-zod": "^6.0.0",
1211
"pino-pretty": "^13.1.1",
1312
"zod": "^4.1.11"
1413
},
Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,13 @@
11
import dotenv from 'dotenv';
2-
import type { FastifyInstance } from 'fastify';
3-
import fp from 'fastify-plugin';
42
import z from 'zod';
53

64
dotenv.config();
75

8-
declare module 'fastify' {
9-
interface FastifyInstance {
10-
config: ConfigSchema;
11-
}
12-
}
13-
146
export const configSchema = z.object({
157
PORT: z.coerce.number().int().default(8000),
168
FISHJAM_ID: z.string(),
179
FISHJAM_URL: z.string().optional(),
1810
FISHJAM_MANAGEMENT_TOKEN: z.string(),
1911
});
2012

21-
type ConfigSchema = z.infer<typeof configSchema>;
22-
23-
export const fastifyConfig = fp((fastify: FastifyInstance) => {
24-
fastify.decorate('config', configSchema.parse(process.env));
25-
});
13+
export const CONFIG = configSchema.parse(process.env);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { FishjamClient } from '@fishjam-cloud/js-server-sdk';
2+
import type { CreateFastifyContextOptions } from '@trpc/server/adapters/fastify';
3+
import { CONFIG } from './config.js';
4+
5+
const fishjam = new FishjamClient({
6+
fishjamId: CONFIG.FISHJAM_ID,
7+
fishjamUrl: CONFIG.FISHJAM_URL,
8+
managementToken: CONFIG.FISHJAM_MANAGEMENT_TOKEN,
9+
});
10+
11+
export function createContext({ req, res }: CreateFastifyContextOptions) {
12+
return { req, res, fishjam };
13+
}
14+
15+
export type Context = Awaited<ReturnType<typeof createContext>>;
Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1-
import type { FishjamClient, RoomId } from '@fishjam-cloud/js-server-sdk';
1+
import type { RoomId } from '@fishjam-cloud/js-server-sdk';
2+
import { getRoomInputSchema } from '../schemas.js';
3+
import { publicProcedure } from '../trpc.js';
24

3-
export async function createRoom(fishjam: FishjamClient) {
4-
return await fishjam.createRoom();
5-
}
5+
export const createRoom = publicProcedure.mutation(async ({ ctx }) => {
6+
return await ctx.fishjam.createRoom();
7+
});
68

7-
export async function getRoom(fishjam: FishjamClient, roomId: RoomId) {
8-
return await fishjam.getRoom(roomId);
9-
}
9+
export const getRoom = publicProcedure
10+
.input(getRoomInputSchema)
11+
.query(async ({ ctx, input }) => {
12+
return await ctx.fishjam.getRoom(input.roomId as RoomId);
13+
});
Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,33 @@
1-
import Fastify from 'fastify';
21
import {
3-
serializerCompiler,
4-
validatorCompiler,
5-
type ZodTypeProvider,
6-
} from 'fastify-type-provider-zod';
7-
import { fastifyConfig } from './config.js';
8-
import { fishjamPlugin } from './plugins/fishjam.js';
9-
import routes from './routes/index.js';
2+
type FastifyTRPCPluginOptions,
3+
fastifyTRPCPlugin,
4+
} from '@trpc/server/adapters/fastify';
5+
import Fastify from 'fastify';
6+
import { CONFIG } from './config.js';
7+
import { createContext } from './context.js';
8+
import { type AppRouter, appRouter } from './router.js';
109

1110
const fastify = Fastify({
1211
logger: { transport: { target: 'pino-pretty' } },
13-
}).withTypeProvider<ZodTypeProvider>();
14-
15-
fastify.setValidatorCompiler(validatorCompiler);
16-
fastify.setSerializerCompiler(serializerCompiler);
12+
});
1713

18-
fastify.register(fastifyConfig);
19-
fastify.register(fishjamPlugin);
20-
21-
fastify.register(routes, { prefix: '/api/v1' });
14+
fastify.register(fastifyTRPCPlugin, {
15+
prefix: '/api/v1',
16+
trpcOptions: {
17+
router: appRouter,
18+
createContext,
19+
onError({ path, error }) {
20+
fastify.log.error('Error in tRPC handler on path %s: %O', path, error);
21+
},
22+
} satisfies FastifyTRPCPluginOptions<AppRouter>['trpcOptions'],
23+
});
2224

2325
try {
2426
await fastify.ready();
25-
await fastify.listen({ port: fastify.config.PORT });
27+
await fastify.listen({ port: CONFIG.PORT });
2628
} catch (err) {
2729
fastify.log.error(err);
2830
process.exit(1);
2931
}
32+
33+
export type { AppRouter };

deep-sea-stories/packages/backend/src/plugins/fishjam.ts

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { createRoom, getRoom } from './controllers/rooms.js';
2+
import { router } from './trpc.js';
3+
4+
export const appRouter = router({
5+
createRoom,
6+
getRoom,
7+
});
8+
9+
export type AppRouter = typeof appRouter;

deep-sea-stories/packages/backend/src/routes/index.ts

Lines changed: 0 additions & 6 deletions
This file was deleted.

deep-sea-stories/packages/backend/src/routes/rooms.ts

Lines changed: 0 additions & 38 deletions
This file was deleted.
Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,3 @@
11
import z from 'zod';
22

3-
export const peerSchema = z.object({
4-
id: z.string(),
5-
});
6-
7-
export const roomSchema = z.object({
8-
id: z.string(),
9-
peers: peerSchema.array(),
10-
});
3+
export const getRoomInputSchema = z.object({ roomId: z.string() });

0 commit comments

Comments
 (0)