|
1 | | -export default eventHandler(async (event) => { |
2 | | - console.log('eventHandler:', event.path) |
3 | | - console.log('eventHandler:', event.context.httpClientHintsOptions) |
4 | | - console.log('eventHandler:', event.context.httpClientHints) |
| 1 | +import { useAppConfig } from 'nitropack/runtime' |
| 2 | +import { parseUserAgent } from 'detect-browser-es' |
| 3 | +import type { |
| 4 | + HttpClientHintsState, |
| 5 | + ResolvedHttpClientHintsOptions, |
| 6 | + ServerHttpClientHintsOptions, |
| 7 | +} from '../../src/runtime/shared-types/types' |
| 8 | +import { extractBrowser } from '../../src/runtime/utils/detect' |
| 9 | +import { extractDeviceHints } from '../../src/runtime/utils/device' |
| 10 | +import { extractNetworkHints } from '../../src/runtime/utils/network' |
| 11 | +import { extractCriticalHints } from '../../src/runtime/utils/critical' |
| 12 | + |
| 13 | +export default defineEventHandler(async (event) => { |
| 14 | + console.log('request', useAppConfig().httpClientHints) |
| 15 | + const { |
| 16 | + serverImages, |
| 17 | + ...rest |
| 18 | + } = useAppConfig().httpClientHints as ServerHttpClientHintsOptions |
| 19 | + const options: ResolvedHttpClientHintsOptions = { |
| 20 | + ...rest, |
| 21 | + serverImages: serverImages.map(r => new RegExp(r)), |
| 22 | + } |
| 23 | + const critical = !!options.critical |
| 24 | + const device = options.device.length > 0 |
| 25 | + const network = options.network.length > 0 |
| 26 | + const detect = options.detectOS || options.detectBrowser || options.userAgent.length > 0 |
| 27 | + |
| 28 | + try { |
| 29 | + // expose the client hints in the context |
| 30 | + const url = event.path |
| 31 | + console.log('request', { url, match: options.serverImages?.some(r => url.match(r)) }) |
| 32 | + if (options.serverImages?.some(r => url.match(r))) { |
| 33 | + const userAgentHeader = event.headers.get('user-agent') |
| 34 | + const requestHeaders: { [key in Lowercase<string>]?: string } = {} |
| 35 | + for (const [key, value] of event.headers.entries()) { |
| 36 | + requestHeaders[key.toLowerCase() as Lowercase<string>] = value |
| 37 | + } |
| 38 | + const userAgent = userAgentHeader |
| 39 | + ? parseUserAgent(userAgentHeader) |
| 40 | + : null |
| 41 | + const clientHints: HttpClientHintsState = {} |
| 42 | + if (detect) { |
| 43 | + clientHints.browser = await extractBrowser(options, requestHeaders as Record<string, string>, userAgentHeader ?? undefined) |
| 44 | + } |
| 45 | + if (device) { |
| 46 | + clientHints.device = extractDeviceHints(options, requestHeaders, userAgent) |
| 47 | + } |
| 48 | + if (network) { |
| 49 | + clientHints.network = extractNetworkHints(options, requestHeaders, userAgent) |
| 50 | + } |
| 51 | + if (critical) { |
| 52 | + clientHints.critical = extractCriticalHints(options, requestHeaders, userAgent) |
| 53 | + } |
| 54 | + event.context.httpClientHintsOptions = options |
| 55 | + event.context.httpClientHints = clientHints |
| 56 | + } |
| 57 | + } |
| 58 | + catch (err) { |
| 59 | + console.error(err) |
| 60 | + } |
5 | 61 | }) |
0 commit comments