-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhandler.ts
More file actions
32 lines (29 loc) · 1.4 KB
/
Copy pathhandler.ts
File metadata and controls
32 lines (29 loc) · 1.4 KB
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
import type { H3Event } from 'h3'
import type { ItdEnvelope } from '#shared/itd'
/**
* Обработчик роута, отдающий ответ библиотеки вместе с журналом вызовов.
*
* Внутри обработчика пишется ровно то, ради чего он существует: достать клиент, вызвать
* `itd.*`, вернуть результат. Конверт, сбор журнала и перевод ошибок в HTTP — здесь.
*
* @example
* export default defineItdHandler(async (event) => {
* const itd = await requireItd(event)
* return stripRaw(await itd.posts.list({ tab: FeedTab.Popular }))
* })
*/
export function defineItdHandler<T>(handler: (event: H3Event) => Promise<T>) {
return defineEventHandler(async (event): Promise<ItdEnvelope<T>> => {
// Журнал собирается только когда панель включена: без неё это лишняя работа на запрос.
if (!useRuntimeConfig(event).public.inspector) {
try {
return { response: await handler(event), meta: [] }
} catch (error) {
throw toH3Error(error)
}
}
const collected = await collectCalls(() => handler(event))
if (!collected.ok) throw toH3Error(collected.error, collected.meta)
return { response: collected.result, meta: collected.meta }
})
}