The recipes.blue monorepo recipes.blue
recipes appview atproto
at main 1.7 kB view raw
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`);