{"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,SAAS,uBAAuB;AAMzB,MAAM,QAA2C;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAA4B;AAAA,EAE5B,YAAY;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,GAUI;AACH,SAAK,KAAK;AACV,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,QAAQ,gBAAgB,KAAK;AAClC,SAAK,OAAY,OAAO,OAAO,gBAAgB,IAAI,GAAG,KAAK;AAAA,EAC5D;AAAA,EAEA,KAAK,QAAkB,OAA2G,CAAC,GAAG;AACrI,WAAO,IAAI,SAA8D,EAAE,GAAG,MAAM,OAAO,MAAM,MAAM,OAAO,CAAC;AAAA,EAChH;AAAA,EAEA,IAAI,QAAuD;AAC1D,WAAO,IAAI,SAAmB,EAAE,GAAG,QAAQ,OAAO,MAAM,CAAC;AAAA,EAC1D;AAAA,EAEA,MAQE,QAAqD;AACtD,WAAO,IAAI,SAAiB,EAAE,GAAG,QAAQ,OAAO,MAAM,CAAC;AAAA,EACxD;AACD;AAkBO,MAAM,SAA4C;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACS;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY;AAAA,IACX;AAAA,IACA,SAAc;AAAA,IACd,UAAe,CAAC;AAAA,IAChB,UAAe,CAAC;AAAA,IAChB,QAAQ;AAAA,IACR,cAAmB;AAAA,EACpB,GAAuB;AACtB,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,UAAU;AACf,SAAK,QAAQ;AAEb,QAAI,CAAC,KAAK,OAAO;AAEhB,WAAK,QAAQ,cAAc,IAAI;AAAA,IAChC;AAAA,EACD;AAAA,EAEA,IAAI,eAAe;AAClB,WAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,GAAG,CAAU,CAAC;AAAA,EAChG;AAAA,EAEA,IAAI,aAAa,QAAwB;AACxC,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,GAAG,MAAM;AAE9C,UAAI,KAAK,QAAQ,GAAG,EAAG,MAAK,QAAQ,GAAG,EAAE,QAAQ;AAAA,IAClD,CAAC;AAAA,EACF;AACD;","names":[]}