summaryrefslogtreecommitdiff
path: root/packages/webapi/src/lib/fetch.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/webapi/src/lib/fetch.ts')
-rw-r--r--packages/webapi/src/lib/fetch.ts75
1 files changed, 75 insertions, 0 deletions
diff --git a/packages/webapi/src/lib/fetch.ts b/packages/webapi/src/lib/fetch.ts
new file mode 100644
index 000000000..8ab1358e7
--- /dev/null
+++ b/packages/webapi/src/lib/fetch.ts
@@ -0,0 +1,75 @@
+import { default as nodeFetch, Headers, Request, Response } from 'node-fetch/src/index.js'
+import Stream from 'node:stream'
+import * as _ from './utils'
+
+export { Headers, Request, Response }
+
+export const fetch = {
+ fetch(resource: string | URL | Request, init?: Partial<FetchInit>): Promise<Response> {
+ const resourceURL = new URL(
+ _.__object_isPrototypeOf(Request.prototype, resource)
+ ? (resource as Request).url
+ : _.pathToPosix(resource),
+ typeof Object(globalThis.process).cwd === 'function' ? 'file:' + _.pathToPosix(process.cwd()) + '/' : 'file:'
+ )
+
+ if (resourceURL.protocol.toLowerCase() === 'file:') {
+ return import('node:fs').then(
+ fs => {
+ try {
+ const stats = fs.statSync(resourceURL)
+ const body = fs.createReadStream(resourceURL)
+
+ return new Response(
+ body,
+ {
+ status: 200,
+ statusText: '',
+ headers: {
+ 'content-length': String(stats.size),
+ 'date': new Date().toUTCString(),
+ 'last-modified': new Date(stats.mtimeMs).toUTCString(),
+ }
+ }
+ )
+ } catch (error) {
+ const body = new Stream.Readable()
+
+ body._read = () => {}
+ body.push(null)
+
+ return new Response(
+ body,
+ {
+ status: 404,
+ statusText: '',
+ headers: {
+ 'date': new Date().toUTCString(),
+ }
+ }
+ )
+ }
+ }
+ )
+ } else {
+ return nodeFetch(resource, init)
+ }
+ }
+}.fetch
+
+type USVString = ({} & string)
+
+interface FetchInit {
+ body: Blob | BufferSource | FormData | URLSearchParams | ReadableStream | USVString
+ cache: 'default' | 'no-store' | 'reload' | 'no-cache' | 'force-cache' | 'only-if-cached'
+ credentials: 'omit' | 'same-origin' | 'include'
+ headers: Headers | Record<string, string>
+ method: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'CONNECT' | 'OPTIONS' | 'TRACE' | 'PATCH' | USVString
+ mode: 'cors' | 'no-cors' | 'same-origin' | USVString
+ redirect: 'follow' | 'manual' | 'error'
+ referrer: USVString
+ referrerPolicy: 'no-referrer' | 'no-referrer-when-downgrade' | 'same-origin' | 'origin' | 'strict-origin' | 'origin-when-cross-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url'
+ integrity: USVString
+ keepalive: boolean
+ signal: AbortSignal
+}