UNPKG

miniflare

Version:

Fun, full-featured, fully-local simulator for Cloudflare Workers

123 lines (120 loc) 5.21 kB
// src/workers/core/outbound.worker.ts import { LogLevel, SharedHeaders } from "miniflare:shared"; // src/workers/core/constants.ts var CoreHeaders = { CUSTOM_FETCH_SERVICE: "MF-Custom-Fetch-Service", CUSTOM_NODE_SERVICE: "MF-Custom-Node-Service", ORIGINAL_URL: "MF-Original-URL", /** * Stores the original hostname when using the `upstream` option. * When requests are proxied to an upstream, the `Host` header is rewritten * to match the upstream. This header preserves the original hostname * so Workers can access it if needed. */ ORIGINAL_HOSTNAME: "MF-Original-Hostname", PROXY_SHARED_SECRET: "MF-Proxy-Shared-Secret", DISABLE_PRETTY_ERROR: "MF-Disable-Pretty-Error", ERROR_STACK: "MF-Experimental-Error-Stack", ROUTE_OVERRIDE: "MF-Route-Override", CF_BLOB: "MF-CF-Blob", /** Used by the Vite plugin to pass through the original `sec-fetch-mode` header */ SEC_FETCH_MODE: "MF-Sec-Fetch-Mode", // API Proxy OP_SECRET: "MF-Op-Secret", OP: "MF-Op", OP_TARGET: "MF-Op-Target", OP_KEY: "MF-Op-Key", OP_SYNC: "MF-Op-Sync", OP_STRINGIFIED_SIZE: "MF-Op-Stringified-Size", OP_RESULT_TYPE: "MF-Op-Result-Type", OP_ORIGINAL_URL: "MF-Op-Original-URL" }, CoreBindings = { SERVICE_LOOPBACK: "MINIFLARE_LOOPBACK", SERVICE_USER_ROUTE_PREFIX: "MINIFLARE_USER_ROUTE_", SERVICE_USER_FALLBACK: "MINIFLARE_USER_FALLBACK", TEXT_CUSTOM_SERVICE: "MINIFLARE_CUSTOM_SERVICE", // Backs the Images binding (`env.IMAGES`) — see imagesLocalFetcher. IMAGES_BINDING_SERVICE: "MINIFLARE_IMAGES_BINDING_SERVICE", // Backs `fetch(url, { cf: { image } })` transforms — see cfImageLocalFetcher. IMAGES_FETCH_SERVICE: "MINIFLARE_IMAGES_FETCH_SERVICE", TEXT_UPSTREAM_URL: "MINIFLARE_UPSTREAM_URL", JSON_CF_BLOB: "CF_BLOB", JSON_ROUTES: "MINIFLARE_ROUTES", JSON_LOG_LEVEL: "MINIFLARE_LOG_LEVEL", DATA_LIVE_RELOAD_SCRIPT: "MINIFLARE_LIVE_RELOAD_SCRIPT", DURABLE_OBJECT_NAMESPACE_PROXY: "MINIFLARE_PROXY", DATA_PROXY_SECRET: "MINIFLARE_PROXY_SECRET", DATA_PROXY_SHARED_SECRET: "MINIFLARE_PROXY_SHARED_SECRET", TRIGGER_HANDLERS: "TRIGGER_HANDLERS", LOG_REQUESTS: "LOG_REQUESTS", STRIP_DISABLE_PRETTY_ERROR: "STRIP_DISABLE_PRETTY_ERROR", SERVICE_LOCAL_EXPLORER: "MINIFLARE_LOCAL_EXPLORER", EXPLORER_DISK: "MINIFLARE_EXPLORER_DISK", JSON_LOCAL_EXPLORER_BINDING_MAP: "LOCAL_EXPLORER_BINDING_MAP", JSON_LOCAL_EXPLORER_WORKER_NAMES: "LOCAL_EXPLORER_WORKER_NAMES", JSON_EXPLORER_WORKER_OPTS: "MINIFLARE_EXPLORER_WORKER_OPTS", SERVICE_CACHE: "MINIFLARE_CACHE", SERVICE_DEV_REGISTRY_PROXY: "MINIFLARE_DEV_REGISTRY_PROXY", JSON_TELEMETRY_CONFIG: "MINIFLARE_TELEMETRY_CONFIG", DEV_REGISTRY_DEBUG_PORT: "DEV_REGISTRY_DEBUG_PORT", SERVICE_STREAM: "MINIFLARE_STREAM", SERVICE_IMAGES_DELIVERY: "MINIFLARE_IMAGES_DELIVERY", SERVICE_R2_PUBLIC: "MINIFLARE_R2_PUBLIC" }; // src/workers/core/outbound.worker.ts var RESIZING_VIA_TOKEN = "image-resizing", warnedLowFidelity = !1, outbound_worker_default = { async fetch(request, env) { let image = request.cf?.image; if (!(image != null && typeof image == "object" && Object.keys(image).length > 0)) { let headers = strippedHeaders(request, env); return headers ? fetch(request, { headers }) : fetch(request); } return resizeImage(request, env, image); } }; function strippedHeaders(request, env) { if (!env.STRIP_CF_CONNECTING_IP) return; let headers = new Headers(request.headers); return headers.delete("CF-Connecting-IP"), headers.set("CF-Worker", env.CF_WORKER_ZONE), headers; } async function resizeImage(request, env, image) { let headers = strippedHeaders(request, env) ?? new Headers(request.headers), via = headers.get("via"); headers.set( "via", via ? `${via}, ${RESIZING_VIA_TOKEN}` : RESIZING_VIA_TOKEN ); let originResponse = await fetch(request, { headers }); if (!originResponse.ok) return originResponse; let source = await originResponse.arrayBuffer(), form = new FormData(); form.append("image", new Blob([source])), form.append("options", JSON.stringify(image)); let transformRequest = new Request("http://localhost/cf-image", { method: "POST", body: form }); transformRequest.headers.set( CoreHeaders.CUSTOM_FETCH_SERVICE, CoreBindings.IMAGES_FETCH_SERVICE ); let transformed = await env[CoreBindings.SERVICE_LOOPBACK].fetch(transformRequest); if (!transformed.ok) { let headers2 = new Headers(originResponse.headers); return headers2.delete("content-encoding"), headers2.delete("content-length"), new Response(source, { status: originResponse.status, headers: headers2 }); } return await warnLowFidelityOnce(env), transformed; } async function warnLowFidelityOnce(env) { warnedLowFidelity || (warnedLowFidelity = !0, await env[CoreBindings.SERVICE_LOOPBACK].fetch("http://localhost/core/log", { method: "POST", headers: { [SharedHeaders.LOG_LEVEL]: LogLevel.WARN.toString() }, body: "Local cf.image transforms are a low-fidelity mock; only resize, rotate and format conversion are applied. Deploy to preview the full transformation." })); } export { outbound_worker_default as default }; //# sourceMappingURL=outbound.worker.js.map