UNPKG

@universal-middleware/compress

Version:
131 lines (129 loc) 4.28 kB
// ../core/dist/index.js var knownUserAgents = { deno: "Deno", bun: "Bun", workerd: "Cloudflare-Workers", node: "Node.js" }; var _getRuntimeKey = () => { const global = globalThis; const userAgentSupported = typeof navigator !== "undefined" && typeof navigator.userAgent === "string"; if (userAgentSupported) { for (const [runtimeKey2, userAgent] of Object.entries(knownUserAgents)) { if (checkUserAgentEquals(userAgent)) { return runtimeKey2; } } } if (typeof global?.EdgeRuntime === "string") { return "edge-light"; } if (global?.fastly !== void 0) { return "fastly"; } if (global?.process?.release?.name === "node") { return "node"; } return "other"; }; var runtimeKey; var getRuntimeKey = () => { if (runtimeKey === void 0) { runtimeKey = _getRuntimeKey(); } return runtimeKey; }; var checkUserAgentEquals = (platform) => { const userAgent = navigator.userAgent; return userAgent.startsWith(platform); }; function getRuntime(args) { const key = getRuntimeKey(); return { runtime: key, ...args }; } function getAdapter(key, args) { return { adapter: key, ...args }; } function getAdapterRuntime(adapter, adapterArgs, runtimeArgs, request) { const a = getAdapter(adapter, adapterArgs); const r = getRuntime(runtimeArgs); const s = getSrvxNodeRuntime(request); return { ...r, ...a, ...s }; } function getSrvxNodeRuntime(request) { const ret = {}; if (request?.runtime?.node?.req) ret.req = request?.runtime.node.req; if (request?.runtime?.node?.res) ret.res = request?.runtime.node.res; return ret; } var universalSymbol = /* @__PURE__ */ Symbol.for("universal"); var unboundSymbol = /* @__PURE__ */ Symbol.for("unbound"); var contextSymbol = /* @__PURE__ */ Symbol.for("unContext"); function isBodyInit(value) { return value === null || typeof value === "string" || value instanceof Blob || value instanceof ArrayBuffer || ArrayBuffer.isView(value) || value instanceof FormData || value instanceof URLSearchParams || value instanceof ReadableStream; } function mergeHeadersInto(first, ...sources) { for (const source of sources) { const headers = new Headers(source); for (const [key, value] of headers.entries()) { if (key === "set-cookie") { if (!first.getSetCookie().includes(value)) first.append(key, value); } else { if (first.get(key) !== value) first.set(key, value); } } } return first; } function nodeHeadersToWeb(nodeHeaders) { const headers = []; const keys = Object.keys(nodeHeaders); for (const key of keys) { headers.push([key, normalizeHttpHeader(nodeHeaders[key])]); } return new Headers(headers); } function normalizeHttpHeader(value) { if (Array.isArray(value)) { return value.join(", "); } return value || ""; } function cloneRequest(request, fields) { if (!fields) { return request.clone(); } return new Request(fields?.url ?? request.url, { method: fields?.method ?? request.method, headers: fields?.headers ?? request.headers, body: fields?.body ?? request.body, mode: fields?.mode ?? request.mode, credentials: fields?.credentials ?? request.credentials, cache: fields?.cache ?? request.cache, redirect: fields?.redirect ?? request.redirect, referrer: fields?.referrer ?? request.referrer, integrity: fields?.integrity ?? request.integrity, keepalive: fields?.keepalive ?? request.keepalive, referrerPolicy: fields?.referrerPolicy ?? request.referrerPolicy, signal: fields?.signal ?? request.signal, // @ts-expect-error RequestInit: duplex option is required when sending a body duplex: "half" }); } function bindUniversal(universal, fn, wrapper) { const unboundFn = unboundSymbol in fn ? fn[unboundSymbol] : fn; const self = { [universalSymbol]: universal, [unboundSymbol]: unboundFn }; const boundFn = unboundFn.bind(self); Object.assign(boundFn, self); return wrapper ? wrapper(boundFn) : boundFn; } function attachUniversal(universal, subject) { return Object.assign(subject, { [universalSymbol]: universal }); } export { attachUniversal, bindUniversal, cloneRequest, contextSymbol, getAdapterRuntime, isBodyInit, mergeHeadersInto, nodeHeadersToWeb, universalSymbol };