@sapphire/plugin-api
Version:
Plugin for @sapphire/framework to expose a REST API
1 lines • 8.94 kB
Source Map (JSON)
{"version":3,"sources":["../../../../../src/lib/utils/_body/RequestProxy.ts"],"names":["RequestURLProxy","RequestHeadersProxy","isNullish","arrayBuffer","ReadableStream","Blob","Response","isNullishOrEmpty"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,QAAA,EAAA,IAAA,EAAA,aAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,WAAA;AAqBO,IAAM,aAAA,GAAN,MAAM,aAAgC,CAAA;AAAA,EAwBrC,YAAY,OAAqB,EAAA;AAvBxC,IAAA,aAAA,CAAA,IAAA,EAAO,OAAsB,EAAA,SAAA,CAAA;AAC7B,IAAA,aAAA,CAAA,IAAA,EAAO,aAAkC,EAAA,aAAA,CAAA;AACzC,IAAA,aAAA,CAAA,IAAA,EAAO,aAAkC,EAAA,EAAA,CAAA;AACzC,IAAA,aAAA,CAAA,IAAA,EAAO,WAAoB,EAAA,EAAA,CAAA;AAC3B,IAAA,aAAA,CAAA,IAAA,EAAO,WAAqB,EAAA,KAAA,CAAA;AAE5B,IAAA,aAAA,CAAA,IAAA,EAAO,MAAoB,EAAA,MAAA,CAAA;AAC3B,IAAA,aAAA,CAAA,IAAA,EAAO,UAA4B,EAAA,QAAA,CAAA;AACnC,IAAA,aAAA,CAAA,IAAA,EAAO,UAAmB,EAAA,cAAA,CAAA;AAC1B,IAAA,aAAA,CAAA,IAAA,EAAO,gBAAiC,EAAA,EAAA,CAAA;AAExC,IAAO,aAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAEP,IAAA,aAAA,CAAA,IAAA,EAAO,UAAoB,EAAA,KAAA,CAAA;AAC3B,IAAA,aAAA,CAAA,IAAA,EAAO,QAAS,EAAA,MAAA,CAAA;AAEhB,IAAS,YAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AACT,IAAS,YAAA,CAAA,IAAA,EAAA,IAAA,CAAA;AACT,IAAmC,YAAA,CAAA,IAAA,EAAA,aAAA,EAAA,IAAA,CAAA;AACnC,IAAiC,YAAA,CAAA,IAAA,EAAA,cAAA,EAAA,IAAA,CAAA;AACjC,IAA2C,YAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,IAAA,CAAA;AAC3C,IAAiD,YAAA,CAAA,IAAA,EAAA,WAAA,EAAA,IAAA,CAAA;AAGhD,IAAA,YAAA,CAAA,IAAA,EAAK,QAAW,EAAA,OAAA,CAAA;AAChB,IAAK,YAAA,CAAA,IAAA,EAAA,IAAA,EAAO,IAAIA,mCAAA,CAAgB,OAAO,CAAA,CAAA;AACvC,IAAK,IAAA,CAAA,OAAA,GAAU,IAAIC,2CAAA,CAAoB,OAAO,CAAA;AAAA;AAC/C,EAEA,MAAa,KAA6B,GAAA;AACzC,IAAM,MAAA,EAAE,MAAS,GAAA,IAAA;AACjB,IAAA,OAAOC,mBAAU,CAAA,IAAI,CAAI,GAAA,IAAI,UAAW,CAAA,CAAC,CAAI,GAAA,IAAI,UAAW,CAAA,MAAMC,qBAAY,CAAA,IAAI,CAAC,CAAA;AAAA;AACpF,EAEA,IAAW,GAAc,GAAA;AACxB,IAAA,OAAO,mBAAK,IAAK,CAAA,CAAA,IAAA;AAAA;AAClB,EAEA,IAAW,MAAqB,GAAA;AAC/B,IAAA,YAAA,CAAA,IAAA,EAAK,kBAAL,YAAK,CAAA,IAAA,EAAA,aAAA,EAAmB,mBAAK,QAAS,CAAA,CAAA,MAAA,EAAQ,aAAiB,IAAA,KAAA,CAAA;AAC/D,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,aAAA,CAAA;AAAA;AACb,EAEA,IAAW,MAAsB,GAAA;AAChC,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAL,CAAA,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAqB,EAAA,IAAI,eAAgB,EAAA,CAAA;AAC9C,IAAA,OAAO,mBAAK,gBAAiB,CAAA,CAAA,MAAA;AAAA;AAC9B,EAEA,IAAW,IAA0C,GAAA;AACpD,IAAI,IAAA,CAAC,IAAK,CAAA,OAAA,EAAgB,OAAA,IAAA;AAE1B,IAAA,YAAA,CAAA,IAAA,EAAK,WAAL,CAAA,IAAA,YAAA,CAAA,IAAA,EAAK,WAAgB,EAAA,IAAIC,kBAA2B,CAAA;AAAA,MACnD,KAAA,0BAAQ,UAAe,KAAA;AACtB,QAAA,YAAA,CAAA,IAAA,EAAK,QACH,CAAA,CAAA,EAAA,CAAG,MAAQ,EAAA,CAAC,KAAU,KAAA,UAAA,CAAW,OAAQ,CAAA,KAAK,CAAC,CAAA,CAC/C,IAAK,CAAA,OAAA,EAAS,CAAC,KAAU,KAAA;AACzB,UAAA,UAAA,CAAW,MAAM,KAAK,CAAA;AACtB,UAAA,YAAA,CAAA,IAAA,EAAK,mBAAkB,KAAM,EAAA;AAAA,SAC7B,CAAA,CACA,IAAK,CAAA,OAAA,EAAS,MAAM;AACpB,UAAA,YAAA,CAAA,IAAA,EAAK,mBAAkB,KAAM,EAAA;AAAA,SAC7B,CAAA,CACA,IAAK,CAAA,KAAA,EAAO,MAAM;AAClB,UAAA,UAAA,CAAW,KAAM,EAAA;AAAA,SACjB,CAAA;AAAA,OAZI,EAAA,OAAA;AAAA,KAcP,CAAA,CAAA;AAED,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,WAAA,CAAA;AAAA;AACb,EAEA,MAAa,WAAoC,GAAA;AAChD,IAAM,MAAA,EAAE,MAAS,GAAA,IAAA;AACjB,IAAO,OAAAF,mBAAA,CAAU,IAAI,CAAI,GAAA,IAAI,YAAY,CAAC,CAAA,GAAIC,sBAAY,IAAI,CAAA;AAAA;AAC/D,EAEA,MAAa,IAAsB,GAAA;AAClC,IAAMA,MAAAA,YAAAA,GAAc,MAAM,IAAA,CAAK,WAAY,EAAA;AAC3C,IAAA,OAAO,IAAIE,WAAA,CAAK,CAACF,YAAW,CAAG,EAAA;AAAA,MAC9B,IAAM,EAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAI,cAAc,CAAK,IAAA;AAAA,KAC1C,CAAA;AAAA;AACF,EAEA,MAAa,QAA8B,GAAA;AAC1C,IAAO,OAAA,IAAIG,eAAS,CAAA,IAAA,CAAK,IAAM,EAAA,EAAE,SAAS,IAAK,CAAA,OAAA,EAAS,CAAA,CAAE,QAAS,EAAA;AAAA;AACpE,EAEA,MAAa,IAAyB,GAAA;AACrC,IAAA,OAAO,IAAK,CAAA,KAAA,CAAM,MAAM,IAAA,CAAK,MAAM,CAAA;AAAA;AACpC,EAEA,MAAa,IAAwB,GAAA;AACpC,IAAA,OAAO,IAAI,WAAY,EAAA,CAAE,OAAO,MAAM,IAAA,CAAK,aAAa,CAAA;AAAA;AACzD,EAEO,KAAiB,GAAA;AACvB,IAAO,OAAA,IAAI,aAAa,CAAA,YAAA,CAAA,IAAA,EAAK,QAAQ,CAAA,CAAA;AAAA;AACtC,EAEA,IAAY,OAAmB,GAAA;AAC9B,IAAA,IAAI,YAAK,CAAA,IAAA,EAAA,cAAA,CAAA,KAAmB,IAAM,EAAA,OAAO,YAAK,CAAA,IAAA,EAAA,cAAA,CAAA;AAE9C,IAAA,MAAM,mBAAsB,GAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAI,gBAAgB,CAAA;AAC7D,IAAA,MAAM,gBAAgBC,0BAAiB,CAAA,mBAAmB,CAAI,GAAA,CAAA,GAAI,OAAO,mBAAmB,CAAA;AAC5F,IAAA,IAAI,MAAO,CAAA,aAAA,CAAc,aAAa,CAAA,IAAK,gBAAgB,CAAG,EAAA;AAC7D,MAAA,YAAA,CAAA,IAAA,EAAK,cAAiB,EAAA,IAAA,CAAA;AACtB,MAAO,OAAA,IAAA;AAAA;AAGR,IAAA,MAAM,gBAAmB,GAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAI,mBAAmB,CAAA;AAC7D,IAAI,IAAA,gBAAA,EAAkB,QAAS,CAAA,SAAS,CAAG,EAAA;AAC1C,MAAA,YAAA,CAAA,IAAA,EAAK,cAAiB,EAAA,IAAA,CAAA;AACtB,MAAO,OAAA,IAAA;AAAA;AAGR,IAAA,YAAA,CAAA,IAAA,EAAK,cAAiB,EAAA,KAAA,CAAA;AACtB,IAAO,OAAA,KAAA;AAAA;AAET,CAAA;AAtGU,QAAA,GAAA,IAAA,OAAA,EAAA;AACA,IAAA,GAAA,IAAA,OAAA,EAAA;AACT,aAAA,GAAA,IAAA,OAAA,EAAA;AACA,cAAA,GAAA,IAAA,OAAA,EAAA;AACA,gBAAA,GAAA,IAAA,OAAA,EAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA;AAtB4C,MAAA,CAAA,aAAA,EAAA,cAAA,CAAA;AAAtC,IAAM,YAAN,GAAA","file":"RequestProxy.cjs","sourcesContent":["import { isNullish, isNullishOrEmpty } from '@sapphire/utilities';\nimport { Blob } from 'node:buffer';\nimport { arrayBuffer } from 'node:stream/consumers';\nimport { ReadableStream } from 'node:stream/web';\nimport {\n\tResponse,\n\ttype FormData,\n\ttype Headers,\n\ttype ReferrerPolicy,\n\ttype Request,\n\ttype RequestCache,\n\ttype RequestCredentials,\n\ttype RequestDestination,\n\ttype RequestMode,\n\ttype RequestRedirect\n} from 'undici';\nimport type { ApiRequest } from '../../structures/api/ApiRequest';\nimport type { MethodName } from '../../structures/http/HttpMethods';\nimport { RequestHeadersProxy } from './RequestHeadersProxy';\nimport { RequestURLProxy } from './RequestURLProxy';\n\nexport class RequestProxy implements Request {\n\tpublic cache: RequestCache = 'default';\n\tpublic credentials: RequestCredentials = 'same-origin';\n\tpublic destination: RequestDestination = '';\n\tpublic integrity: string = '';\n\tpublic keepalive: boolean = false;\n\n\tpublic mode: RequestMode = 'cors';\n\tpublic redirect: RequestRedirect = 'follow';\n\tpublic referrer: string = 'about:client';\n\tpublic referrerPolicy: ReferrerPolicy = '';\n\n\tpublic headers: Headers;\n\n\tpublic bodyUsed: boolean = false;\n\tpublic duplex = 'half' as const;\n\n\treadonly #request: ApiRequest;\n\treadonly #url: RequestURLProxy;\n\t#cachedMethod: MethodName | null = null;\n\t#cachedHasBody: boolean | null = null;\n\t#abortController: AbortController | null = null;\n\t#bodyStream: ReadableStream<Uint8Array> | null = null;\n\n\tpublic constructor(request: ApiRequest) {\n\t\tthis.#request = request;\n\t\tthis.#url = new RequestURLProxy(request);\n\t\tthis.headers = new RequestHeadersProxy(request);\n\t}\n\n\tpublic async bytes(): Promise<Uint8Array> {\n\t\tconst { body } = this;\n\t\treturn isNullish(body) ? new Uint8Array(0) : new Uint8Array(await arrayBuffer(body));\n\t}\n\n\tpublic get url(): string {\n\t\treturn this.#url.href;\n\t}\n\n\tpublic get method(): MethodName {\n\t\tthis.#cachedMethod ??= (this.#request.method?.toUpperCase() ?? 'GET') as MethodName;\n\t\treturn this.#cachedMethod;\n\t}\n\n\tpublic get signal(): AbortSignal {\n\t\tthis.#abortController ??= new AbortController();\n\t\treturn this.#abortController.signal;\n\t}\n\n\tpublic get body(): ReadableStream<Uint8Array> | null {\n\t\tif (!this.hasBody) return null;\n\n\t\tthis.#bodyStream ??= new ReadableStream<Uint8Array>({\n\t\t\tstart: (controller) => {\n\t\t\t\tthis.#request\n\t\t\t\t\t.on('data', (chunk) => controller.enqueue(chunk))\n\t\t\t\t\t.once('error', (error) => {\n\t\t\t\t\t\tcontroller.error(error);\n\t\t\t\t\t\tthis.#abortController?.abort();\n\t\t\t\t\t})\n\t\t\t\t\t.once('close', () => {\n\t\t\t\t\t\tthis.#abortController?.abort();\n\t\t\t\t\t})\n\t\t\t\t\t.once('end', () => {\n\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn this.#bodyStream;\n\t}\n\n\tpublic async arrayBuffer(): Promise<ArrayBuffer> {\n\t\tconst { body } = this;\n\t\treturn isNullish(body) ? new ArrayBuffer(0) : arrayBuffer(body);\n\t}\n\n\tpublic async blob(): Promise<Blob> {\n\t\tconst arrayBuffer = await this.arrayBuffer();\n\t\treturn new Blob([arrayBuffer], {\n\t\t\ttype: this.headers.get('content-type') ?? ''\n\t\t});\n\t}\n\n\tpublic async formData(): Promise<FormData> {\n\t\treturn new Response(this.body, { headers: this.headers }).formData(); // NOSONAR\n\t}\n\n\tpublic async json(): Promise<unknown> {\n\t\treturn JSON.parse(await this.text());\n\t}\n\n\tpublic async text(): Promise<string> {\n\t\treturn new TextDecoder().decode(await this.arrayBuffer());\n\t}\n\n\tpublic clone(): Request {\n\t\treturn new RequestProxy(this.#request);\n\t}\n\n\tprivate get hasBody(): boolean {\n\t\tif (this.#cachedHasBody !== null) return this.#cachedHasBody;\n\n\t\tconst contentLengthString = this.headers.get('content-length');\n\t\tconst contentLength = isNullishOrEmpty(contentLengthString) ? 0 : Number(contentLengthString);\n\t\tif (Number.isSafeInteger(contentLength) && contentLength > 0) {\n\t\t\tthis.#cachedHasBody = true;\n\t\t\treturn true;\n\t\t}\n\n\t\tconst transferEncoding = this.headers.get('transfer-encoding');\n\t\tif (transferEncoding?.includes('chunked')) {\n\t\t\tthis.#cachedHasBody = true;\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.#cachedHasBody = false;\n\t\treturn false;\n\t}\n}\n"]}