bunderstack 0.16.0 → 0.17.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/handler.ts CHANGED
@@ -1,58 +1,30 @@
1
1
  // src/handler.ts
2
- import { Hono } from 'hono'
3
-
4
2
  import { createRateLimiter, type RateLimitConfig } from './rate-limit'
5
3
 
6
4
  interface HandlerParts {
7
- customRouter?: Hono
8
- crudRouter: Hono
9
5
  authHandler?: (req: Request) => Promise<Response>
10
- storageRouter?: Hono
11
- realtimeRouter?: Hono
12
- trpcHandler?: (req: Request) => Promise<Response>
6
+ apiHandler?: (req: Request) => Promise<Response | null>
13
7
  rateLimit?: boolean | RateLimitConfig
14
8
  }
15
9
 
16
- export function buildHandler(parts: HandlerParts): {
17
- handler: (req: Request) => Promise<Response>
18
- router: Hono
19
- } {
20
- const app = new Hono()
10
+ export function buildHandler(parts: HandlerParts): (req: Request) => Promise<Response> {
21
11
  const checkRateLimit = createRateLimiter(parts.rateLimit)
22
12
 
23
- // Registered ahead of everything so custom routes can sit in front of the
24
- // core app. Collisions are rejected at construction, not silently shadowed.
25
- if (parts.customRouter) app.route('/', parts.customRouter)
26
-
27
- const health = (c: { json: (data: unknown) => Response }) =>
28
- c.json({ status: 'ok' })
29
- app.get('/health', health)
30
- app.get('/api/health', health)
31
- app.route('/api', parts.crudRouter)
32
-
33
- if (parts.authHandler) {
34
- app.all('/api/auth/*', (c) => parts.authHandler!(c.req.raw))
35
- }
36
-
37
- if (parts.storageRouter) {
38
- app.route('/api/files', parts.storageRouter)
39
- app.route('/files', parts.storageRouter)
40
- }
41
-
42
- if (parts.realtimeRouter) {
43
- app.route('/api', parts.realtimeRouter)
44
- }
45
-
46
- if (parts.trpcHandler) {
47
- app.all('/api/trpc/*', (c) => parts.trpcHandler!(c.req.raw))
48
- }
49
-
50
- const inner = (req: Request): Promise<Response> =>
51
- Promise.resolve(app.fetch(req))
52
- const handler = async (req: Request): Promise<Response> => {
13
+ return async (req: Request): Promise<Response> => {
53
14
  const limited = await checkRateLimit(req)
54
15
  if (limited) return limited
55
- return inner(req)
16
+
17
+ const pathname = new URL(req.url).pathname
18
+ if (
19
+ parts.authHandler &&
20
+ (pathname === '/api/auth' || pathname.startsWith('/api/auth/'))
21
+ ) {
22
+ return parts.authHandler(req)
23
+ }
24
+ if (parts.apiHandler) {
25
+ const apiRes = await parts.apiHandler(req)
26
+ if (apiRes) return apiRes
27
+ }
28
+ return new Response('Not Found', { status: 404 })
56
29
  }
57
- return { handler, router: app }
58
30
  }