diff options
author | Elizabeth Hunt <me@liz.coffee> | 2025-06-29 17:31:30 -0700 |
---|---|---|
committer | Elizabeth Hunt <me@liz.coffee> | 2025-06-29 17:31:30 -0700 |
commit | 58be1809c46cbe517a18d86d0af52179dcc5cbf6 (patch) | |
tree | 9ccc678b3fd48c1a52fe501600dd2c2051740a55 /u/server/response.ts | |
parent | d4791f3d357634daf506fb8f91cc5332a794c421 (diff) | |
download | ci-58be1809c46cbe517a18d86d0af52179dcc5cbf6.tar.gz ci-58be1809c46cbe517a18d86d0af52179dcc5cbf6.zip |
Move to nodejs and also lots of significant refactoring that should've been broken up but idgaf
Diffstat (limited to 'u/server/response.ts')
-rw-r--r-- | u/server/response.ts | 83 |
1 files changed, 0 insertions, 83 deletions
diff --git a/u/server/response.ts b/u/server/response.ts deleted file mode 100644 index 18d70b5..0000000 --- a/u/server/response.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { - type IEither, - isEither, - type ITraceable, - Metric, - type PenguenoRequest, - type ServerTrace, -} from '@emprespresso/pengueno'; - -export type BodyInit = - | ArrayBuffer - | AsyncIterable<Uint8Array> - | Blob - | FormData - | Iterable<Uint8Array> - | NodeJS.ArrayBufferView - | URLSearchParams - | null - | string; -export type ResponseBody = object | string; -export type TResponseInit = Omit<ResponseInit, 'headers'> & { - status: number; - headers?: Record<string, string>; -}; - -const getResponse = (req: PenguenoRequest, opts: TResponseInit): ResponseInit => { - const baseHeaders = req.baseResponseHeaders(); - const optHeaders = opts.headers || {}; - - return { - ...opts, - headers: { - ...baseHeaders, - ...optHeaders, - 'Content-Type': (optHeaders['Content-Type'] ?? 'text/plain') + '; charset=utf-8', - } as Record<string, string>, - }; -}; - -const ResponseCodeMetrics = [0, 1, 2, 3, 4, 5].map((x) => Metric.fromName(`response.${x}xx`)); -export const getResponseMetrics = (status: number) => { - const index = Math.floor(status / 100); - return ResponseCodeMetrics.map((metric, i) => metric.count.withValue(i === index ? 1.0 : 0.0)); -}; - -export class PenguenoResponse extends Response { - constructor(req: ITraceable<PenguenoRequest, ServerTrace>, msg: BodyInit, opts: TResponseInit) { - const responseOpts = getResponse(req.get(), opts); - for (const metric of getResponseMetrics(opts.status)) { - req.trace.trace(metric); - } - super(msg, responseOpts); - } -} - -export class JsonResponse extends PenguenoResponse { - constructor( - req: ITraceable<PenguenoRequest, ServerTrace>, - e: BodyInit | IEither<ResponseBody, ResponseBody>, - opts: TResponseInit, - ) { - const optsWithJsonContentType: TResponseInit = { - ...opts, - headers: { - ...opts.headers, - 'Content-Type': 'application/json', - }, - }; - if (isEither<ResponseBody, ResponseBody>(e)) { - super( - req, - JSON.stringify(e.fold(({ isLeft, value }) => (isLeft ? { error: value } : { ok: value }))), - optsWithJsonContentType, - ); - return; - } - super( - req, - JSON.stringify(Math.floor(opts.status / 100) > 4 ? { error: e } : { ok: e }), - optsWithJsonContentType, - ); - } -} |