@universal-middleware/compress
Version:
Universal compress middleware
131 lines (129 loc) • 4.28 kB
JavaScript
// ../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 };