UNPKG

erebus-sdk

Version:

To install dependencies:

1 lines 11.7 kB
{"version":3,"sources":["../../src/internal/logger/consola.ts","../../src/server/app.ts","../../src/server/rpc.ts","../../src/server/adapter/next/createRouteHandler.ts"],"names":["logger","createConsola","createApp","sessionOrProvider","app","Hono","err","c","next","reqId","session","started","ms","routes","zValidator","z","token","error","startAuthServer","port","authorize","server","serve","createRpcClient","baseUrl","hc","createRouteHandler","req","channel","body","handle"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createConsola } from \"consola\";\n\nexport const logger = createConsola({\n level: 3,\n formatOptions: {\n colors: true,\n date: true,\n compact: false,\n columns:\n typeof process !== \"undefined\" && process.stdout && process.stdout.columns\n ? process.stdout.columns\n : 80,\n },\n defaults: {\n tag: \"Erebus\",\n },\n});\n","import { Hono } from \"hono\";\nimport { logger } from \"@/internal/logger/consola\";\n\nimport { serve } from \"@hono/node-server\";\nimport { ErebusSession } from \"@/service/session\";\nimport { zValidator } from \"@hono/zod-validator\";\nimport { z } from \"zod\";\n\nexport type AppVars = {\n reqId: string;\n session?: ErebusSession;\n};\n\ntype SessionProvider = (req: Request) => ErebusSession | Promise<ErebusSession>;\n\nexport function createApp(sessionOrProvider?: ErebusSession | SessionProvider) {\n const app = new Hono<{ Variables: AppVars }>();\n\n app.onError((err, c) => {\n logger.error(\"[unhandled]\", {\n reqId: c.get(\"reqId\"),\n err:\n err instanceof Error\n ? { name: err.name, message: err.message, stack: err.stack }\n : err,\n path: c.req.path,\n method: c.req.method,\n });\n return c.json({ error: \"internal_error\", reqId: c.get(\"reqId\") }, 500);\n });\n\n app.notFound((c) => {\n return c.json(\n { error: \"not_found\", path: c.req.path, reqId: c.get(\"reqId\") },\n 404,\n );\n });\n\n app.use(\"*\", async (c, next) => {\n /**\n * Generate a unique request id for the request to be identified by the logger\n */\n const reqId = crypto.randomUUID();\n c.set(\"reqId\", reqId);\n\n /**\n * Inject session if provided\n */\n if (sessionOrProvider) {\n if (typeof sessionOrProvider === \"function\") {\n // It's a session provider - call it per request\n const session = await sessionOrProvider(c.req.raw);\n c.set(\"session\", session);\n } else {\n // It's a static session (for route handler usage)\n c.set(\"session\", sessionOrProvider);\n }\n }\n\n /**\n * Log the request start time\n */\n const started = performance.now();\n try {\n await next();\n } finally {\n const ms = Math.round(performance.now() - started);\n logger.info(`[${reqId}] ${c.req.method} ${c.req.path} -> ${ms}ms`);\n }\n });\n\n // Add the routes using the shared routes function\n return app.route(\"/\", routes);\n}\n\n// Define routes separately for RPC type inference\nconst routes = new Hono<{ Variables: AppVars }>()\n /**\n * Health check route\n */\n .get(\"/api/health-not-meaningful\", (c) =>\n c.json({ ok: true, reqId: c.get(\"reqId\") }),\n )\n /**\n * Generate a token route test\n */\n .get(\"/api/generate-token-test\", (c) => {\n const session = c.get(\"session\");\n if (!session) {\n return c.json(\n {\n error: \"session_required, the server is not initialized properly\",\n reqId: c.get(\"reqId\"),\n },\n 400,\n );\n }\n\n console.log(session.__debugObject);\n\n logger.info(`[${c.get(\"reqId\")}] Generating token`);\n return c.json({\n token: \"test\",\n });\n })\n /**\n * This is the API to generate the token for the client\n * it calls Erebus service to generate the token\n */\n .post(\n \"/api/generate-token\",\n zValidator(\n \"json\",\n z.object({\n channel: z.string(),\n }),\n ),\n async (c) => {\n const session = c.get(\"session\");\n const reqId = c.get(\"reqId\");\n logger.info(`[${reqId}] Generating token`);\n\n if (!session) {\n return c.json(\n {\n error: \"session_required, the server is not initialized properly\",\n reqId,\n },\n 400,\n );\n }\n let token = \"\"; // default value to avoid undefined\n try {\n token = await session.authorize();\n } catch (error) {\n logger.error(\n `[${reqId}] Error generating token: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n return c.json(\n {\n error: \"error_generating_token\",\n reqId,\n message: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n\n return c.json({\n grant_jwt: token,\n });\n },\n );\n\n// Export the AppType for RPC client usage\nexport type AppType = typeof routes;\n\nexport type AuthorizeServer = (\n req: Request,\n) => ErebusSession | Promise<ErebusSession>;\n\nexport const startAuthServer = async (\n port: number,\n authorize: AuthorizeServer,\n) => {\n const app = createApp(authorize);\n logger.info(`Attempting to start server on port ${port}...`);\n const server = serve({\n fetch: app.fetch,\n port,\n });\n server.on(\"listening\", () => {\n logger.info(`Server successfully started and is running on port ${port}`);\n });\n server.on(\"error\", (err: Error) => {\n logger.error(`Server failed to start on port ${port}: ${err.message}`);\n });\n return server;\n};\n","import { hc } from \"hono/client\";\n\n// Import only the routes type, not the entire app with server dependencies\nimport type { AppType as ServerRoutes } from \"./app\";\n\n// Re-export the AppType for client usage\nexport type AppType = ServerRoutes;\n\n/**\n * Creates an RPC client for communicating with the Erebus server\n * This function can be safely imported by client-side code\n */\nexport const createRpcClient = (baseUrl: string) => {\n return hc<AppType>(baseUrl);\n};\n","import { handle } from \"hono/vercel\";\nimport { createApp } from \"@/server/app\";\nimport type { ErebusSession } from \"@/service/session\";\n\nexport type Authorize = (\n channel: string,\n ctx?: { req: Request },\n) => ErebusSession | Promise<ErebusSession>;\n\nexport function createRouteHandler({ authorize }: { authorize: Authorize }) {\n const createHandler = async (req: Request): Promise<Response> => {\n let channel = \"\";\n\n try {\n const body = (await req.clone().json()) as { channel?: unknown };\n if (typeof body.channel === \"string\") {\n channel = body.channel;\n }\n } catch {\n // If parsing fails, channel remains empty\n }\n\n const session = await authorize(channel, { req });\n\n // Create a new app instance with the session injected\n const app = createApp(session);\n\n const h = handle(app);\n return await h(req);\n };\n\n return {\n POST: createHandler,\n };\n}\n"]}