{
  "version": 3,
  "sources": ["../../../../src/workers/images/images.worker.ts", "../../../../src/workers/core/constants.ts"],
  "sourcesContent": ["// KV-backed mock for Images binding CRUD operations\n// Image data is stored as KV values, metadata as KV metadata\n// Transforms and info operations are handled via HTTP loopback to Node.js Sharp\n\nimport { RpcTarget, WorkerEntrypoint } from \"cloudflare:workers\";\nimport { getPublicUrl } from \"miniflare:shared\";\nimport { CoreBindings, CoreHeaders, CorePaths } from \"../core/constants\";\n\ninterface Env {\n\tIMAGES_STORE: KVNamespace;\n\t[CoreBindings.SERVICE_LOOPBACK]: Fetcher;\n}\n\nfunction buildVariantUrl(\n\tpublicUrl: URL,\n\timageId: string,\n\tvariant: string\n): string {\n\treturn new URL(\n\t\t`${CorePaths.IMAGE_DELIVERY}/${imageId}/${variant}`,\n\t\tpublicUrl\n\t).toString();\n}\n\n// Rewrites stored variant names (e.g. `[\"public\"]`) to absolute URLs.\nasync function withResolvedVariants(\n\tmetadata: ImageMetadata,\n\tenv: Env\n): Promise<ImageMetadata> {\n\tconst publicUrl = await getPublicUrl(env[CoreBindings.SERVICE_LOOPBACK]);\n\treturn {\n\t\t...metadata,\n\t\tvariants: metadata.variants.map((variant) =>\n\t\t\tbuildVariantUrl(publicUrl, metadata.id, variant)\n\t\t),\n\t};\n}\n\nfunction base64DecodeArrayBuffer(buffer: ArrayBuffer): ArrayBuffer {\n\tconst decoder = new TextDecoder();\n\tconst base64String = decoder.decode(buffer);\n\tconst binaryString = atob(base64String.trim());\n\tconst bytes = new Uint8Array(binaryString.length);\n\tfor (let i = 0; i < binaryString.length; i++) {\n\t\tbytes[i] = binaryString.charCodeAt(i);\n\t}\n\treturn bytes.buffer;\n}\n\nasync function base64DecodeStream(\n\tstream: ReadableStream<Uint8Array>\n): Promise<ArrayBuffer> {\n\tconst response = new Response(stream);\n\tconst buffer = await response.arrayBuffer();\n\treturn base64DecodeArrayBuffer(buffer);\n}\n\nclass ImageHandleImpl extends RpcTarget {\n\treadonly #imageId: string;\n\treadonly #env: Env;\n\n\tconstructor(imageId: string, env: Env) {\n\t\tsuper();\n\t\tthis.#imageId = imageId;\n\t\tthis.#env = env;\n\t}\n\n\tasync details(): Promise<ImageMetadata | null> {\n\t\tconst result = await this.#env.IMAGES_STORE.getWithMetadata<ImageMetadata>(\n\t\t\tthis.#imageId,\n\t\t\t\"arrayBuffer\"\n\t\t);\n\t\tif (result.metadata === null) {\n\t\t\treturn null;\n\t\t}\n\t\treturn withResolvedVariants(result.metadata, this.#env);\n\t}\n\n\tasync bytes(): Promise<ReadableStream<Uint8Array> | null> {\n\t\tconst data = await this.#env.IMAGES_STORE.get(this.#imageId, \"arrayBuffer\");\n\t\tif (data === null) {\n\t\t\treturn null;\n\t\t}\n\t\treturn new Blob([data]).stream();\n\t}\n\n\tasync update(options: ImageUpdateOptions): Promise<ImageMetadata> {\n\t\tconst existing =\n\t\t\tawait this.#env.IMAGES_STORE.getWithMetadata<ImageMetadata>(\n\t\t\t\tthis.#imageId,\n\t\t\t\t\"arrayBuffer\"\n\t\t\t);\n\t\tif (existing.value === null || existing.metadata === null) {\n\t\t\tthrow new Error(`Image not found: ${this.#imageId}`);\n\t\t}\n\n\t\tconst updatedMetadata: ImageMetadata = {\n\t\t\t...existing.metadata,\n\t\t\trequireSignedURLs:\n\t\t\t\toptions.requireSignedURLs ?? existing.metadata.requireSignedURLs,\n\t\t\tmeta: options.metadata ?? existing.metadata.meta,\n\t\t\tcreator: options.creator ?? existing.metadata.creator,\n\t\t};\n\n\t\tawait this.#env.IMAGES_STORE.put(this.#imageId, existing.value, {\n\t\t\tmetadata: updatedMetadata,\n\t\t});\n\t\treturn withResolvedVariants(updatedMetadata, this.#env);\n\t}\n\n\tasync delete(): Promise<boolean> {\n\t\tconst existing = await this.#env.IMAGES_STORE.get(\n\t\t\tthis.#imageId,\n\t\t\t\"arrayBuffer\"\n\t\t);\n\t\tif (existing === null) {\n\t\t\treturn false;\n\t\t}\n\t\tawait this.#env.IMAGES_STORE.delete(this.#imageId);\n\t\treturn true;\n\t}\n}\n\nexport default class ImagesService extends WorkerEntrypoint<Env> {\n\timage(imageId: string): ImageHandleImpl {\n\t\treturn new ImageHandleImpl(imageId, this.env);\n\t}\n\n\tasync upload(\n\t\timage: ReadableStream<Uint8Array> | ArrayBuffer,\n\t\toptions?: ImageUploadOptions\n\t): Promise<ImageMetadata> {\n\t\tlet imageData: ReadableStream<Uint8Array> | ArrayBuffer = image;\n\t\tif (options?.encoding === \"base64\") {\n\t\t\timageData =\n\t\t\t\timage instanceof ArrayBuffer\n\t\t\t\t\t? base64DecodeArrayBuffer(image)\n\t\t\t\t\t: await base64DecodeStream(image);\n\t\t}\n\n\t\tconst buffer =\n\t\t\timageData instanceof ArrayBuffer\n\t\t\t\t? imageData\n\t\t\t\t: await new Response(imageData).arrayBuffer();\n\n\t\tconst id = options?.id ?? crypto.randomUUID();\n\n\t\tconst metadata: ImageMetadata = {\n\t\t\tid,\n\t\t\tfilename: options?.filename ?? \"uploaded.jpg\",\n\t\t\tuploaded: new Date().toISOString(),\n\t\t\trequireSignedURLs: options?.requireSignedURLs ?? false,\n\t\t\tmeta: options?.metadata ?? {},\n\t\t\tvariants: [\"public\"],\n\t\t\tdraft: false,\n\t\t\tcreator: options?.creator,\n\t\t};\n\n\t\tawait this.env.IMAGES_STORE.put(id, buffer, { metadata });\n\t\treturn withResolvedVariants(metadata, this.env);\n\t}\n\n\tasync list(options?: ImageListOptions): Promise<ImageList> {\n\t\tconst limit = options?.limit ?? 50;\n\n\t\t// Fetch all keys so we can filter and sort accurately\n\t\tconst allImages: ImageMetadata[] = [];\n\t\tlet kvCursor: string | undefined;\n\t\tdo {\n\t\t\tconst kvResult = await this.env.IMAGES_STORE.list<ImageMetadata>({\n\t\t\t\tcursor: kvCursor,\n\t\t\t});\n\t\t\tfor (const key of kvResult.keys) {\n\t\t\t\tif (key.metadata) {\n\t\t\t\t\tallImages.push(key.metadata);\n\t\t\t\t}\n\t\t\t}\n\t\t\tkvCursor = kvResult.list_complete ? undefined : kvResult.cursor;\n\t\t} while (kvCursor);\n\n\t\tif (options?.creator) {\n\t\t\tallImages.splice(\n\t\t\t\t0,\n\t\t\t\tallImages.length,\n\t\t\t\t...allImages.filter((i) => i.creator === options.creator)\n\t\t\t);\n\t\t}\n\n\t\tallImages.sort((a, b) => {\n\t\t\tconst dateA = a.uploaded ?? \"\";\n\t\t\tconst dateB = b.uploaded ?? \"\";\n\t\t\tconst cmp = dateA.localeCompare(dateB) || a.id.localeCompare(b.id);\n\t\t\treturn options?.sortOrder === \"desc\" ? -cmp : cmp;\n\t\t});\n\n\t\t// Handle cursor-based pagination over the sorted/filtered results\n\t\tlet startIndex = 0;\n\t\tif (options?.cursor) {\n\t\t\tconst cursorIndex = allImages.findIndex((i) => i.id === options.cursor);\n\t\t\tif (cursorIndex >= 0) {\n\t\t\t\tstartIndex = cursorIndex + 1;\n\t\t\t}\n\t\t}\n\n\t\tconst page = allImages.slice(startIndex, startIndex + limit);\n\t\tconst hasMore = startIndex + limit < allImages.length;\n\t\tconst lastImage = page[page.length - 1];\n\n\t\tconst publicUrl = await getPublicUrl(\n\t\t\tthis.env[CoreBindings.SERVICE_LOOPBACK]\n\t\t);\n\t\tconst resolvedPage = page.map((metadata) => ({\n\t\t\t...metadata,\n\t\t\tvariants: metadata.variants.map((variant) =>\n\t\t\t\tbuildVariantUrl(publicUrl, metadata.id, variant)\n\t\t\t),\n\t\t}));\n\n\t\treturn {\n\t\t\timages: resolvedPage,\n\t\t\tcursor: hasMore && lastImage ? lastImage.id : undefined,\n\t\t\tlistComplete: !hasMore,\n\t\t};\n\t}\n\n\tasync #detectContentType(data: ArrayBuffer): Promise<string> {\n\t\tconst formData = new FormData();\n\t\tformData.append(\"image\", new Blob([data]));\n\n\t\tconst infoRequest = new Request(\"http://placeholder/info\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: formData,\n\t\t});\n\t\tinfoRequest.headers.set(\n\t\t\tCoreHeaders.CUSTOM_FETCH_SERVICE,\n\t\t\tCoreBindings.IMAGES_BINDING_SERVICE\n\t\t);\n\n\t\tconst response =\n\t\t\tawait this.env[CoreBindings.SERVICE_LOOPBACK].fetch(infoRequest);\n\t\tif (response.ok) {\n\t\t\tconst info = (await response.json()) as { format?: string };\n\t\t\tif (info.format) {\n\t\t\t\treturn info.format;\n\t\t\t}\n\t\t}\n\t\treturn \"application/octet-stream\";\n\t}\n\n\t// Handle HTTP requests for image delivery and transform operations\n\tasync fetch(request: Request): Promise<Response> {\n\t\tconst url = new URL(request.url);\n\n\t\t// Serve image bytes at /__cf_local/imagedelivery/<id>/<variant>\n\t\tif (url.pathname.startsWith(`${CorePaths.IMAGE_DELIVERY}/`)) {\n\t\t\tconst parts = url.pathname\n\t\t\t\t.slice(CorePaths.IMAGE_DELIVERY.length + 1)\n\t\t\t\t.split(\"/\");\n\t\t\tconst imageId = parts[0];\n\t\t\tif (!imageId) {\n\t\t\t\treturn new Response(\"Missing image ID\", { status: 400 });\n\t\t\t}\n\n\t\t\tconst data = await this.env.IMAGES_STORE.get(imageId, \"arrayBuffer\");\n\t\t\tif (data === null) {\n\t\t\t\treturn new Response(\"Image not found\", { status: 404 });\n\t\t\t}\n\n\t\t\tconst contentType = await this.#detectContentType(data);\n\t\t\treturn new Response(data, {\n\t\t\t\theaders: { \"Content-Type\": contentType },\n\t\t\t});\n\t\t}\n\n\t\t// Forward transform/info operations to Node.js via loopback where Sharp runs\n\t\tconst forwardRequest = new Request(request);\n\t\tforwardRequest.headers.set(\n\t\t\tCoreHeaders.CUSTOM_FETCH_SERVICE,\n\t\t\tCoreBindings.IMAGES_BINDING_SERVICE\n\t\t);\n\t\tforwardRequest.headers.set(CoreHeaders.ORIGINAL_URL, request.url);\n\t\treturn this.env[CoreBindings.SERVICE_LOOPBACK].fetch(forwardRequest);\n\t}\n}\n", "/**\n * Reserved paths for internal Miniflare endpoints.\n *\n * Paths under `/cdn-cgi/local/` are reserved by Cloudflare's network\n * and won't conflict with user routes. Paths under `/__cf_local/` live\n * outside `/cdn-cgi/` so they remain reachable over tunnels.\n */\nexport const CorePaths = {\n\t/** Magic proxy used by getPlatformProxy */\n\tPLATFORM_PROXY: \"/cdn-cgi/local/platform-proxy\",\n\t/** Trigger scheduled event handlers */\n\tSCHEDULED: \"/cdn-cgi/local/scheduled\",\n\t/** Trigger email event handlers */\n\tEMAIL: \"/cdn-cgi/local/email\",\n\t/** Local explorer UI and API */\n\tEXPLORER: \"/cdn-cgi/local/explorer\",\n\t/** Stream video serving endpoint (outside /cdn-cgi/ for tunnel access) */\n\tSTREAM_VIDEO: \"/__cf_local/stream\",\n\t/** Local image delivery endpoint (outside /cdn-cgi/ for tunnel access) */\n\tIMAGE_DELIVERY: \"/__cf_local/imagedelivery\",\n\t/** Public R2 bucket object serving endpoint */\n\tR2_PUBLIC: \"/cdn-cgi/local/r2/public\",\n\t/** S3-compatible API endpoint for local R2 buckets */\n\tR2_S3: \"/cdn-cgi/local/r2/s3\",\n} as const;\n\nexport const CoreHeaders = {\n\tCUSTOM_FETCH_SERVICE: \"MF-Custom-Fetch-Service\",\n\tCUSTOM_NODE_SERVICE: \"MF-Custom-Node-Service\",\n\tORIGINAL_URL: \"MF-Original-URL\",\n\t/**\n\t * Stores the original hostname when using the `upstream` option.\n\t * When requests are proxied to an upstream, the `Host` header is rewritten\n\t * to match the upstream. This header preserves the original hostname\n\t * so Workers can access it if needed.\n\t */\n\tORIGINAL_HOSTNAME: \"MF-Original-Hostname\",\n\tPROXY_SHARED_SECRET: \"MF-Proxy-Shared-Secret\",\n\tDISABLE_PRETTY_ERROR: \"MF-Disable-Pretty-Error\",\n\tERROR_STACK: \"MF-Experimental-Error-Stack\",\n\t/**\n\t * The serialised error, URI-encoded. `workerd` drops response bodies for\n\t * `HEAD` requests, so the body alone cannot carry the error out of the user\n\t * Worker. Producers set this in addition to the body; consumers fall back to\n\t * it whenever the body is unavailable.\n\t */\n\tERROR_STACK_PAYLOAD: \"MF-Experimental-Error-Stack-Payload\",\n\tROUTE_OVERRIDE: \"MF-Route-Override\",\n\tCF_BLOB: \"MF-CF-Blob\",\n\tACCESS_BLOB: \"MF-Access-Blob\",\n\t/** Used by the Vite plugin to pass through the original `sec-fetch-mode` header */\n\tSEC_FETCH_MODE: \"MF-Sec-Fetch-Mode\",\n\n\t// API Proxy\n\tOP_SECRET: \"MF-Op-Secret\",\n\tOP: \"MF-Op\",\n\tOP_TARGET: \"MF-Op-Target\",\n\tOP_KEY: \"MF-Op-Key\",\n\tOP_SYNC: \"MF-Op-Sync\",\n\tOP_STRINGIFIED_SIZE: \"MF-Op-Stringified-Size\",\n\tOP_RESULT_TYPE: \"MF-Op-Result-Type\",\n\tOP_ORIGINAL_URL: \"MF-Op-Original-URL\",\n} as const;\n\nexport const CoreBindings = {\n\tSERVICE_LOOPBACK: \"MINIFLARE_LOOPBACK\",\n\tSERVICE_USER_ROUTE_PREFIX: \"MINIFLARE_USER_ROUTE_\",\n\tSERVICE_USER_FALLBACK: \"MINIFLARE_USER_FALLBACK\",\n\tTEXT_CUSTOM_SERVICE: \"MINIFLARE_CUSTOM_SERVICE\",\n\t// Backs the Images binding (`env.IMAGES`) \u2014 see imagesLocalFetcher.\n\tIMAGES_BINDING_SERVICE: \"MINIFLARE_IMAGES_BINDING_SERVICE\",\n\t// Backs `fetch(url, { cf: { image } })` transforms \u2014 see cfImageLocalFetcher.\n\tIMAGES_FETCH_SERVICE: \"MINIFLARE_IMAGES_FETCH_SERVICE\",\n\tTEXT_UPSTREAM_URL: \"MINIFLARE_UPSTREAM_URL\",\n\tJSON_CF_BLOB: \"CF_BLOB\",\n\tJSON_ROUTES: \"MINIFLARE_ROUTES\",\n\tJSON_LOG_LEVEL: \"MINIFLARE_LOG_LEVEL\",\n\tDURABLE_OBJECT_NAMESPACE_PROXY: \"MINIFLARE_PROXY\",\n\tDATA_PROXY_SECRET: \"MINIFLARE_PROXY_SECRET\",\n\tDATA_PROXY_SHARED_SECRET: \"MINIFLARE_PROXY_SHARED_SECRET\",\n\tTRIGGER_HANDLERS: \"TRIGGER_HANDLERS\",\n\tLOG_REQUESTS: \"LOG_REQUESTS\",\n\tSTRIP_DISABLE_PRETTY_ERROR: \"STRIP_DISABLE_PRETTY_ERROR\",\n\tSERVICE_LOCAL_EXPLORER: \"MINIFLARE_LOCAL_EXPLORER\",\n\tEXPLORER_DISK: \"MINIFLARE_EXPLORER_DISK\",\n\tJSON_LOCAL_EXPLORER_BINDING_MAP: \"LOCAL_EXPLORER_BINDING_MAP\",\n\tJSON_LOCAL_EXPLORER_WORKER_NAMES: \"LOCAL_EXPLORER_WORKER_NAMES\",\n\tJSON_EXPLORER_WORKER_OPTS: \"MINIFLARE_EXPLORER_WORKER_OPTS\",\n\tSERVICE_CACHE: \"MINIFLARE_CACHE\",\n\tSERVICE_DEV_CONTROL: \"MINIFLARE_DEV_CONTROL\",\n\tSERVICE_DEV_REGISTRY_PROXY: \"MINIFLARE_DEV_REGISTRY_PROXY\",\n\tJSON_TELEMETRY_CONFIG: \"MINIFLARE_TELEMETRY_CONFIG\",\n\tDEV_REGISTRY_DEBUG_PORT: \"DEV_REGISTRY_DEBUG_PORT\",\n\tSERVICE_STREAM: \"MINIFLARE_STREAM\",\n\tSERVICE_IMAGES_DELIVERY: \"MINIFLARE_IMAGES_DELIVERY\",\n\tSERVICE_R2_PUBLIC: \"MINIFLARE_R2_PUBLIC\",\n\tSERVICE_R2_S3: \"MINIFLARE_R2_S3\",\n\tSERVICE_OBSERVABILITY_COLLECTOR: \"MINIFLARE_OBSERVABILITY_COLLECTOR\",\n\tJSON_ACCESS_BLOB_PREFIX: \"MINIFLARE_ACCESS_BLOB_\",\n\tTEXT_FALLBACK_WORKER_NAME: \"MINIFLARE_FALLBACK_WORKER_NAME\",\n} as const;\n\nexport const ProxyOps = {\n\t// Get the target or a property of the target\n\tGET: \"GET\",\n\t// Get the descriptor for a property of the target\n\tGET_OWN_DESCRIPTOR: \"GET_OWN_DESCRIPTOR\",\n\t// Get the target's own property names\n\tGET_OWN_KEYS: \"GET_OWN_KEYS\",\n\t// Call a method on the target\n\tCALL: \"CALL\",\n\t// Remove the strong reference to the target on the \"heap\", allowing it to be\n\t// garbage collected\n\tFREE: \"FREE\",\n} as const;\nexport const ProxyAddresses = {\n\tGLOBAL: 0, // globalThis\n\tENV: 1, // env\n\tUSER_START: 2,\n} as const;\n\n/**\n * Recovers the serialised error a Worker put in `ERROR_STACK_PAYLOAD`, for the\n * cases where the response body carrying it has been dropped (`HEAD` requests).\n * Returns `null` when the header is absent or malformed, so callers can fall\n * back rather than surfacing a decoding failure as the Worker's error.\n */\nexport function decodeErrorPayload(response: {\n\theaders: { get(name: string): string | null };\n}): string | null {\n\tconst payload = response.headers.get(CoreHeaders.ERROR_STACK_PAYLOAD);\n\tif (payload === null) {\n\t\treturn null;\n\t}\n\ttry {\n\t\treturn decodeURIComponent(payload);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n// ### Proxy Special Cases\n// The proxy supports serialising `Request`/`Response`s for the Cache API. It\n// doesn't support serialising `WebSocket`s though. Rather than attempting this,\n// we call `Fetcher#fetch()` using `dispatchFetch()` directly, using the passed\n// request. This gives us WebSocket support, and is much more efficient, since\n// there's no need to serialise the `Request`/`Response`: we just pass\n// everything to `dispatchFetch()` and return what that gives us.\nexport function isFetcherFetch(targetName: string, key: string) {\n\t// `DurableObject` and `WorkerRpc` are the internal names of `DurableObjectStub`:\n\t// https://github.com/cloudflare/workerd/blob/62b9ceee4c94d2b238692397dc4f604fef84f474/src/workerd/api/actor.h#L86\n\t// https://github.com/cloudflare/workerd/blob/62b9ceee4c94d2b238692397dc4f604fef84f474/src/workerd/api/worker-rpc.h#L30\n\treturn (\n\t\t(targetName === \"Fetcher\" ||\n\t\t\ttargetName === \"DurableObject\" ||\n\t\t\ttargetName === \"WorkerRpc\") &&\n\t\tkey === \"fetch\"\n\t);\n}\n// `R2Object#writeHttpMetadata()` is one of the few functions that mutates its\n// arguments. This would be proxied correctly if the argument were a native\n// target proxy itself, but `Headers` can be constructed in Node. Instead, we\n// respond with the updated headers in the proxy server, then copy them to the\n// original argument on the client.\nexport function isR2ObjectWriteHttpMetadata(targetName: string, key: string) {\n\t// `HeadResult` and `GetResult` are the internal names of `R2Object` and `R2ObjectBody` respectively:\n\t// https://github.com/cloudflare/workerd/blob/ae612f0563d864c82adbfa4c2e5ed78b547aa0a1/src/workerd/api/r2-bucket.h#L210\n\t// https://github.com/cloudflare/workerd/blob/ae612f0563d864c82adbfa4c2e5ed78b547aa0a1/src/workerd/api/r2-bucket.h#L263-L264\n\treturn (\n\t\t(targetName === \"HeadResult\" || targetName === \"GetResult\") &&\n\t\tkey === \"writeHttpMetadata\"\n\t);\n}\n\n/**\n * See #createMediaProxy() comment for why this is special\n */\nexport function isImagesInput(targetName: string, key: string) {\n\treturn targetName === \"ImagesBindingImpl\" && key === \"input\";\n}\n\n// Durable Object stub RPC calls should always be async to avoid blocking the\n// Node.js event loop. The internal names are \"DurableObject\" and \"WorkerRpc\".\n// https://github.com/cloudflare/workerd/blob/62b9ceee/src/workerd/api/actor.h#L86\n// https://github.com/cloudflare/workerd/blob/62b9ceee/src/workerd/api/worker-rpc.h#L30\nexport function isDurableObjectStub(targetName: string) {\n\treturn targetName === \"DurableObject\" || targetName === \"WorkerRpc\";\n}\n"],
  "mappings": "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",
  "names": []
}
