{"version":3,"sources":["../../../src/server/requests.ts"],"sourcesContent":["import type { IncomingHttpHeaders } from 'node:http2'\nimport type { Readable } from 'node:stream'\n\nimport type { SerializeOptions } from '@fastify/cookie'\nimport type { DistributiveOmit, IsInTypeList } from 'valleyed'\n\nimport type { RequestError } from '../errors'\nimport type { DefaultCookies, DefaultHeaders, IncomingFile, MethodsEnum, RouteDef, RouteDefToReqRes } from './types'\nimport type { AuthUser } from '../types'\nimport { parseJSONObject } from '../utilities'\n\nexport type CookieVal<C extends DefaultCookies> = {\n\t[K in keyof C]: SerializeOptions & { value: C[K] }\n}\n\nexport class Request<Def extends RouteDefToReqRes<any>> {\n\treadonly ip: string | undefined\n\treadonly method: MethodsEnum\n\treadonly path: string\n\tbody: Def['body']\n\tparams: Def['params']\n\tquery: Def['query']\n\theaders: IncomingHttpHeaders & Def['requestHeaders']\n\tcookies: Record<string, string | undefined> & Def['requestCookies']\n\tauthUser: AuthUser | null = null\n\n\tconstructor({\n\t\tip,\n\t\tbody,\n\t\tcookies,\n\t\tparams,\n\t\tquery,\n\t\tmethod,\n\t\tpath,\n\t\theaders,\n\t\tfiles,\n\t}: {\n\t\tip: string | undefined\n\t\tbody: Def['body']\n\t\tparams: Def['params']\n\t\tquery: Def['query']\n\t\tcookies: Record<string, string | undefined> & Def['requestCookies']\n\t\theaders: IncomingHttpHeaders\n\t\tfiles: Record<string, IncomingFile[]>\n\t\tmethod: MethodsEnum\n\t\tpath: string\n\t\t}) {\n\t\tthis.ip = ip\n\t\tthis.method = method\n\t\tthis.path = path\n\t\tthis.params = params\n\t\tthis.cookies = cookies\n\t\tthis.headers = headers\n\t\tthis.query = parseJSONObject(query)\n\t\tthis.body = <any>Object.assign(parseJSONObject(body), files)\n\t}\n\n\tpipe(stream: Readable, opts: { headers?: Def['responseHeaders']; cookies?: Def['responseCookies']; status?: Def['statusCode'] } = {}) {\n\t\treturn new Response<Omit<Def, 'response'> & { response: Readable }>(<any>{ ...opts, piped: true, body: stream })\n\t}\n\n\tres(params: DistributiveOmit<RequestParams<Def>, 'piped'>) {\n\t\treturn new Response<Def>(<any>{ ...params, piped: false })\n\t}\n\n\terror<\n\t\tT extends Omit<Def, 'response' | 'statusCode' | 'responseHeaders' | 'responseCookies' | 'contentType'> & {\n\t\t\tresponse: RequestError['serializedErrors']\n\t\t\tstatusCode: RequestError['statusCode']\n\t\t\tresponseHeaders: DefaultHeaders\n\t\t\tresponseCookies: DefaultCookies\n\t\t\tcontentType: 'application/json'\n\t\t},\n\t>(params: DistributiveOmit<RequestParams<T>, 'piped'>) {\n\t\treturn new Response<T>(<any>{ ...params, piped: false })\n\t}\n}\n\ntype RequestParams<Def extends RouteDefToReqRes<any>, T = Def['response']> = { body: T; piped?: boolean } & (IsInTypeList<\n\tDef['statusCode'],\n\t[NonNullable<RouteDef['defaultStatusCode']>, 200]\n> extends true\n\t? { status?: Def['statusCode'] }\n\t: { status: Def['statusCode'] }) &\n\t(IsInTypeList<Def['contentType'], [NonNullable<RouteDef['defaultContentType']>, 'application/json']> extends true\n\t\t? { contentType?: Def['contentType'] }\n\t\t: { contentType: Def['contentType'] }) &\n\t(IsInTypeList<Def['responseHeaders'], [DefaultHeaders]> extends true\n\t\t? { headers?: Def['responseHeaders'] }\n\t\t: { headers: Def['responseHeaders'] }) &\n\t(IsInTypeList<Def['responseCookies'], [DefaultCookies]> extends true\n\t\t? { cookies?: CookieVal<Def['responseCookies']> }\n\t\t: { cookies: CookieVal<Def['responseCookies']> })\n\nexport class Response<Def extends RouteDefToReqRes<any>> {\n\tbody: Def['response'] | undefined\n\theaders: Def['responseHeaders']\n\tcookies: CookieVal<Def['responseCookies']>\n\treadonly status: Def['statusCode']\n\treadonly contentType: Def['contentType']\n\treadonly piped: boolean\n\n\tconstructor({\n\t\tbody,\n\t\tstatus = <any>200,\n\t\theaders = <any>{},\n\t\tcookies = <any>{},\n\t\tpiped = false,\n\t\tcontentType = <any>'application/json',\n\t}: RequestParams<Def>) {\n\t\tthis.body = body\n\t\tthis.status = status\n\t\tthis.contentType = contentType\n\t\tthis.headers = headers\n\t\tthis.cookies = cookies\n\t\tthis.piped = piped\n\n\t\tif (!this.piped) {\n\t\t\t// @ts-expect-error indexing on generic\n\t\t\tthis.headers['Content-Type'] = contentType\n\t\t}\n\t}\n\n\tget cookieValues() {\n\t\treturn Object.fromEntries(Object.entries(this.cookies).map(([key, val]) => [key, val] as const))\n\t}\n\n\tset cookieValues(values: DefaultCookies) {\n\t\tObject.entries(values).forEach(([key, val]) => {\n\t\t\t// @ts-expect-error indexing on generic\n\t\t\tif (this.cookies[key]) this.cookies[key].value = val\n\t\t})\n\t}\n}\n"],"mappings":"AASA,OAAS,mBAAAA,MAAuB,eAMzB,MAAMC,CAA2C,CAC9C,GACA,OACA,KACT,KACA,OACA,MACA,QACA,QACA,SAA4B,KAE5B,YAAY,CACX,GAAAC,EACA,KAAAC,EACA,QAAAC,EACA,OAAAC,EACA,MAAAC,EACA,OAAAC,EACA,KAAAC,EACA,QAAAC,EACA,MAAAC,CACD,EAUI,CACH,KAAK,GAAKR,EACV,KAAK,OAASK,EACd,KAAK,KAAOC,EACZ,KAAK,OAASH,EACd,KAAK,QAAUD,EACf,KAAK,QAAUK,EACf,KAAK,MAAQT,EAAgBM,CAAK,EAClC,KAAK,KAAY,OAAO,OAAON,EAAgBG,CAAI,EAAGO,CAAK,CAC5D,CAEA,KAAKC,EAAkBC,EAA2G,CAAC,EAAG,CACrI,OAAO,IAAIC,EAA8D,CAAE,GAAGD,EAAM,MAAO,GAAM,KAAMD,CAAO,CAAC,CAChH,CAEA,IAAIN,EAAuD,CAC1D,OAAO,IAAIQ,EAAmB,CAAE,GAAGR,EAAQ,MAAO,EAAM,CAAC,CAC1D,CAEA,MAQEA,EAAqD,CACtD,OAAO,IAAIQ,EAAiB,CAAE,GAAGR,EAAQ,MAAO,EAAM,CAAC,CACxD,CACD,CAkBO,MAAMQ,CAA4C,CACxD,KACA,QACA,QACS,OACA,YACA,MAET,YAAY,CACX,KAAAV,EACA,OAAAW,EAAc,IACd,QAAAL,EAAe,CAAC,EAChB,QAAAL,EAAe,CAAC,EAChB,MAAAW,EAAQ,GACR,YAAAC,EAAmB,kBACpB,EAAuB,CACtB,KAAK,KAAOb,EACZ,KAAK,OAASW,EACd,KAAK,YAAcE,EACnB,KAAK,QAAUP,EACf,KAAK,QAAUL,EACf,KAAK,MAAQW,EAER,KAAK,QAET,KAAK,QAAQ,cAAc,EAAIC,EAEjC,CAEA,IAAI,cAAe,CAClB,OAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,OAAO,EAAE,IAAI,CAAC,CAACC,EAAKC,CAAG,IAAM,CAACD,EAAKC,CAAG,CAAU,CAAC,CAChG,CAEA,IAAI,aAAaC,EAAwB,CACxC,OAAO,QAAQA,CAAM,EAAE,QAAQ,CAAC,CAACF,EAAKC,CAAG,IAAM,CAE1C,KAAK,QAAQD,CAAG,IAAG,KAAK,QAAQA,CAAG,EAAE,MAAQC,EAClD,CAAC,CACF,CACD","names":["parseJSONObject","Request","ip","body","cookies","params","query","method","path","headers","files","stream","opts","Response","status","piped","contentType","key","val","values"]}