deno.land / x / hono@v4.2.5 / compose.ts

نووسراو ببینە
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { Context } from './context.ts'import type { ParamIndexMap, Params } from './router.ts'import type { Env, NotFoundHandler, ErrorHandler } from './types.ts'
interface ComposeContext { finalized: boolean res: unknown}
// Based on the code in the MIT licensed `koa-compose` package.export const compose = <C extends ComposeContext, E extends Env = Env>( middleware: [[Function, unknown], ParamIndexMap | Params][], onError?: ErrorHandler<E>, onNotFound?: NotFoundHandler<E>) => { return (context: C, next?: Function) => { let index = -1 return dispatch(0)
async function dispatch(i: number): Promise<C> { if (i <= index) { throw new Error('next() called multiple times') } index = i
let res let isError = false let handler
if (middleware[i]) { handler = middleware[i][0][0] if (context instanceof Context) { context.req.routeIndex = i } } else { handler = (i === middleware.length && next) || undefined }
if (!handler) { if (context instanceof Context && context.finalized === false && onNotFound) { res = await onNotFound(context) } } else { try { res = await handler(context, () => { return dispatch(i + 1) }) } catch (err) { if (err instanceof Error && context instanceof Context && onError) { context.error = err res = await onError(err, context) isError = true } else { throw err } } }
if (res && (context.finalized === false || isError)) { context.res = res } return context } }}
hono

Version Info

Tagged at
a week ago