The recipes.blue monorepo
recipes.blue
recipes
appview
atproto
1import { XRPCError, XRPCRouter } from '@atcute/xrpc-server';
2import { cors } from '@atcute/xrpc-server/middlewares/cors';
3import { registerGetRecipes } from './xrpc/blue.recipes.feed.getRecipes.js';
4import { registerGetRecipe } from './xrpc/blue.recipes.feed.getRecipe.js';
5import { logMiddleware } from './logger.js';
6import pino from 'pino';
7import { RedisClient } from 'bun';
8import { registerGetProfile } from './xrpc/blue.recipes.actor.getProfile.js';
9import { Hono } from 'hono';
10import { mountXrpcRouter } from './util/hono.js';
11
12const logger = pino();
13const redis = new RedisClient(Bun.env.REDIS_URL ?? "redis://127.0.0.1:6379/0");
14
15const xrpcRouter = new XRPCRouter({
16 handleException: (err, _req) => {
17 if (err instanceof XRPCError) {
18 return err.toResponse();
19 } else if (err instanceof Response) {
20 return err;
21 } else {
22 logger.error({ err }, 'Exception thrown during request');
23 return Response.json(
24 { error: 'InternalServerError', message: 'an exception happened whilst processing this request' },
25 { status: 500 },
26 )
27 }
28 },
29 middlewares: [
30 logMiddleware(logger),
31 cors({
32 allowedHeaders: ['Content-Type', 'Accept'],
33 exposedHeaders: ['Content-Length'],
34 }),
35 ],
36});
37
38// actor
39registerGetProfile(xrpcRouter, logger, redis);
40
41// feed
42registerGetRecipes(xrpcRouter, logger, redis);
43registerGetRecipe(xrpcRouter, logger, redis);
44
45const app = new Hono();
46
47// mount xrpc router at /xrpc
48const xrpcApp = new Hono();
49mountXrpcRouter(xrpcApp, xrpcRouter);
50app.route('/xrpc', xrpcApp);
51
52const server = Bun.serve({
53 port: process.env.PORT || 3000,
54 fetch: app.fetch,
55});
56
57logger.info({ url: server.url.toString() }, `Recipes.blue API started up`);