File size: 823 Bytes
1034ef4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import type { Request, Response } from 'express'

export type ApiOk<T> = { ok: true; data: T }
export type ApiErr = { ok: false; error: string }
export type ApiResponse<T> = ApiOk<T> | ApiErr

export function ok<T>(res: Response, data: T, status = 200) {
  res.status(status).json({ ok: true, data } satisfies ApiOk<T>)
}

export function err(res: Response, message: string, status = 400) {
  res.status(status).json({ ok: false, error: message } satisfies ApiErr)
}

export function getClientIp(req: Request) {
  const xff = req.headers['x-forwarded-for']
  if (typeof xff === 'string' && xff.length > 0) return xff.split(',')[0]?.trim() || null
  return req.socket.remoteAddress || null
}

export function getUserAgent(req: Request) {
  const ua = req.headers['user-agent']
  return typeof ua === 'string' ? ua : null
}