diff --git a/.gitignore b/.gitignore
index 30deff9..5378575 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,5 @@ transpiled
worker
wrangler.toml
!wrangler.toml.sample
+.wrangler/tmp/dev-76tGCa/index.js.map
+.wrangler/tmp/dev-76tGCa/index.js
diff --git a/.wrangler/tmp/dev-76tGCa/index.js b/.wrangler/tmp/dev-76tGCa/index.js
index 61ff281..d3aa4de 100644
--- a/.wrangler/tmp/dev-76tGCa/index.js
+++ b/.wrangler/tmp/dev-76tGCa/index.js
@@ -377,6 +377,7 @@
CZL Docker\u955C\u50CF\u670D\u52A1(\u4EC5\u5185\u90E8\u7528)
+
\r\n \r\n \r\n \r\n
\u5FEB\u6377\u547D\u4EE4
\r\n
\r\n \u63D0\u793A\uFF0C\u652F\u6301docker.io, ghcr,quay,k8sgcr,gcr, \u975Edocker.io\u9700\u52A0\u4E0A\u57DF\u540D\u524D\u7F00\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n `;\r\n}\r\n\r\nimport { TokenProvider } from './token'\r\nimport { Backend } from './backend'\r\n\r\nconst PROXY_HEADER_ALLOW_LIST: string[] = [\"accept\", \"user-agent\", \"accept-encoding\"]\r\n\r\nconst validActionNames = new Set([\"manifests\", \"blobs\", \"tags\", \"referrers\"])\r\n\r\nconst ORG_NAME_BACKEND:{ [key: string]: string; } = {\r\n \"gcr\": \"https://gcr.io\",\r\n \"k8sgcr\": \"https://k8s.gcr.io\",\r\n \"quay\": \"https://quay.io\",\r\n \"ghcr\": \"https://ghcr.io\"\r\n}\r\n\r\nconst DEFAULT_BACKEND_HOST: string = \"https://registry-1.docker.io\"\r\n\r\nexport async function handleRequest(request: Request): Promise {\r\n const url = new URL(request.url)\r\n\r\n if (url.pathname === '/') {\r\n return new Response(getHomePageHtml(), {\r\n headers: { 'content-type': 'text/html;charset=UTF-8' },\r\n })\r\n }\r\n\r\n return handleRegistryRequest(request)\r\n}\r\n\r\nfunction copyProxyHeaders(inputHeaders: Headers) : Headers {\r\n const headers = new Headers;\r\n for(const pair of inputHeaders.entries()) {\r\n if (PROXY_HEADER_ALLOW_LIST.includes(pair[0].toLowerCase())) {\r\n headers.append(pair[0], pair[1])\r\n }\r\n }\r\n return headers;\r\n}\r\n\r\nfunction orgNameFromPath(pathname: string): string|null {\r\n const splitedPath: string[] = pathname.split(\"/\", 3)\r\n if (splitedPath.length === 3 && splitedPath[0] === \"\" && splitedPath[1] === \"v2\") {\r\n return splitedPath[2].toLowerCase()\r\n }\r\n return null\r\n}\r\n\r\nfunction hostByOrgName(orgName: string|null): string {\r\n if (orgName !== null && orgName in ORG_NAME_BACKEND) {\r\n return ORG_NAME_BACKEND[orgName]\r\n }\r\n return DEFAULT_BACKEND_HOST\r\n}\r\n\r\nfunction rewritePath(orgName: string | null, pathname: string): string {\r\n let splitedPath = pathname.split(\"/\");\r\n\r\n // /v2/repo/manifests/xxx -> /v2/library/repo/manifests/xxx\r\n // /v2/repo/blobs/xxx -> /v2/library/repo/blobs/xxx\r\n if (orgName === null && splitedPath.length === 5 && validActionNames.has(splitedPath[3])) {\r\n splitedPath = [splitedPath[0], splitedPath[1], \"library\", splitedPath[2], splitedPath[3], splitedPath[4]]\r\n }\r\n\r\n if (orgName === null || !(orgName in ORG_NAME_BACKEND)) {\r\n return pathname\r\n }\r\n \r\n const cleanSplitedPath = splitedPath.filter(function(value: string, index: number) {\r\n return value !== orgName || index !== 2;\r\n })\r\n return cleanSplitedPath.join(\"/\")\r\n}\r\n\r\nasync function handleRegistryRequest(request: Request): Promise {\r\n const reqURL = new URL(request.url)\r\n const orgName = orgNameFromPath(reqURL.pathname)\r\n const pathname = rewritePath(orgName, reqURL.pathname)\r\n const host = hostByOrgName(orgName)\r\n const tokenProvider = new TokenProvider()\r\n const backend = new Backend(host, tokenProvider)\r\n const headers = copyProxyHeaders(request.headers)\r\n return backend.proxy(pathname, {headers: request.headers})\r\n}\r\n", "import { handleRequest } from './handler'\r\n\r\ndeclare global {\r\n const HAMMAL_CACHE: KVNamespace\r\n}\r\n\r\naddEventListener('fetch', (event) => {\r\n event.respondWith(handleRequest(event.request))\r\n})\r\n"],
- "mappings": "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",
+ "sourcesContent": ["const urls = new Set();\n\nfunction checkURL(request, init) {\n\tconst url =\n\t\trequest instanceof URL\n\t\t\t? request\n\t\t\t: new URL(\n\t\t\t\t\t(typeof request === \"string\"\n\t\t\t\t\t\t? new Request(request, init)\n\t\t\t\t\t\t: request\n\t\t\t\t\t).url\n\t\t\t\t);\n\tif (url.port && url.port !== \"443\" && url.protocol === \"https:\") {\n\t\tif (!urls.has(url.toString())) {\n\t\t\turls.add(url.toString());\n\t\t\tconsole.warn(\n\t\t\t\t`WARNING: known issue with \\`fetch()\\` requests to custom HTTPS ports in published Workers:\\n` +\n\t\t\t\t\t` - ${url.toString()} - the custom port will be ignored when the Worker is published using the \\`wrangler deploy\\` command.\\n`\n\t\t\t);\n\t\t}\n\t}\n}\n\nglobalThis.fetch = new Proxy(globalThis.fetch, {\n\tapply(target, thisArg, argArray) {\n\t\tconst [request, init] = argArray;\n\t\tcheckURL(request, init);\n\t\treturn Reflect.apply(target, thisArg, argArray);\n\t},\n});\n", "export type Awaitable = T | Promise;\n// TODO: allow dispatching more events?\nexport type Dispatcher = (\n\ttype: \"scheduled\",\n\tinit: { cron?: string }\n) => Awaitable;\n\nexport type IncomingRequest = Request<\n\tunknown,\n\tIncomingRequestCfProperties\n>;\n\nexport interface MiddlewareContext {\n\tdispatch: Dispatcher;\n\tnext(request: IncomingRequest, env: any): Awaitable;\n}\n\nexport type Middleware = (\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tmiddlewareCtx: MiddlewareContext\n) => Awaitable;\n\nconst __facade_middleware__: Middleware[] = [];\n\n// The register functions allow for the insertion of one or many middleware,\n// We register internal middleware first in the stack, but have no way of controlling\n// the order that addMiddleware is run in service workers so need an internal function.\nexport function __facade_register__(...args: (Middleware | Middleware[])[]) {\n\t__facade_middleware__.push(...args.flat());\n}\nexport function __facade_registerInternal__(\n\t...args: (Middleware | Middleware[])[]\n) {\n\t__facade_middleware__.unshift(...args.flat());\n}\n\nfunction __facade_invokeChain__(\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tdispatch: Dispatcher,\n\tmiddlewareChain: Middleware[]\n): Awaitable {\n\tconst [head, ...tail] = middlewareChain;\n\tconst middlewareCtx: MiddlewareContext = {\n\t\tdispatch,\n\t\tnext(newRequest, newEnv) {\n\t\t\treturn __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail);\n\t\t},\n\t};\n\treturn head(request, env, ctx, middlewareCtx);\n}\n\nexport function __facade_invoke__(\n\trequest: IncomingRequest,\n\tenv: any,\n\tctx: ExecutionContext,\n\tdispatch: Dispatcher,\n\tfinalMiddleware: Middleware\n): Awaitable {\n\treturn __facade_invokeChain__(request, env, ctx, dispatch, [\n\t\t...__facade_middleware__,\n\t\tfinalMiddleware,\n\t]);\n}\n", "import {\n\t__facade_invoke__,\n\t__facade_register__,\n\t__facade_registerInternal__,\n\tAwaitable,\n\tDispatcher,\n\tIncomingRequest,\n\tMiddleware,\n} from \"./common\";\n\nexport { __facade_register__, __facade_registerInternal__ };\n\n// Miniflare 2's `EventTarget` follows the spec and doesn't allow exceptions to\n// be caught by `dispatchEvent`. Instead it has a custom `ThrowingEventTarget`\n// class that rethrows errors from event listeners in `dispatchEvent`.\n// We'd like errors to be propagated to the top-level `addEventListener`, so\n// we'd like to use `ThrowingEventTarget`. Unfortunately, `ThrowingEventTarget`\n// isn't exposed on the global scope, but `WorkerGlobalScope` (which extends\n// `ThrowingEventTarget`) is. Therefore, we get at it in this nasty way.\nlet __FACADE_EVENT_TARGET__: EventTarget;\nif ((globalThis as any).MINIFLARE) {\n\t__FACADE_EVENT_TARGET__ = new (Object.getPrototypeOf(WorkerGlobalScope))();\n} else {\n\t__FACADE_EVENT_TARGET__ = new EventTarget();\n}\n\nfunction __facade_isSpecialEvent__(\n\ttype: string\n): type is \"fetch\" | \"scheduled\" {\n\treturn type === \"fetch\" || type === \"scheduled\";\n}\nconst __facade__originalAddEventListener__ = globalThis.addEventListener;\nconst __facade__originalRemoveEventListener__ = globalThis.removeEventListener;\nconst __facade__originalDispatchEvent__ = globalThis.dispatchEvent;\n\nglobalThis.addEventListener = function (type, listener, options) {\n\tif (__facade_isSpecialEvent__(type)) {\n\t\t__FACADE_EVENT_TARGET__.addEventListener(\n\t\t\ttype,\n\t\t\tlistener as EventListenerOrEventListenerObject,\n\t\t\toptions\n\t\t);\n\t} else {\n\t\t__facade__originalAddEventListener__(type, listener, options);\n\t}\n};\nglobalThis.removeEventListener = function (type, listener, options) {\n\tif (__facade_isSpecialEvent__(type)) {\n\t\t__FACADE_EVENT_TARGET__.removeEventListener(\n\t\t\ttype,\n\t\t\tlistener as EventListenerOrEventListenerObject,\n\t\t\toptions\n\t\t);\n\t} else {\n\t\t__facade__originalRemoveEventListener__(type, listener, options);\n\t}\n};\nglobalThis.dispatchEvent = function (event) {\n\tif (__facade_isSpecialEvent__(event.type)) {\n\t\treturn __FACADE_EVENT_TARGET__.dispatchEvent(event);\n\t} else {\n\t\treturn __facade__originalDispatchEvent__(event);\n\t}\n};\n\ndeclare global {\n\tvar addMiddleware: typeof __facade_register__;\n\tvar addMiddlewareInternal: typeof __facade_registerInternal__;\n}\nglobalThis.addMiddleware = __facade_register__;\nglobalThis.addMiddlewareInternal = __facade_registerInternal__;\n\nconst __facade_waitUntil__ = Symbol(\"__facade_waitUntil__\");\nconst __facade_response__ = Symbol(\"__facade_response__\");\nconst __facade_dispatched__ = Symbol(\"__facade_dispatched__\");\n\nclass __Facade_ExtendableEvent__ extends Event {\n\t[__facade_waitUntil__]: Awaitable[] = [];\n\n\twaitUntil(promise: Awaitable) {\n\t\tif (!(this instanceof __Facade_ExtendableEvent__)) {\n\t\t\tthrow new TypeError(\"Illegal invocation\");\n\t\t}\n\t\tthis[__facade_waitUntil__].push(promise);\n\t}\n}\n\ninterface FetchEventInit extends EventInit {\n\trequest: Request;\n\tpassThroughOnException: FetchEvent[\"passThroughOnException\"];\n}\n\nclass __Facade_FetchEvent__ extends __Facade_ExtendableEvent__ {\n\t#request: Request;\n\t#passThroughOnException: FetchEvent[\"passThroughOnException\"];\n\t[__facade_response__]?: Awaitable;\n\t[__facade_dispatched__] = false;\n\n\tconstructor(type: \"fetch\", init: FetchEventInit) {\n\t\tsuper(type);\n\t\tthis.#request = init.request;\n\t\tthis.#passThroughOnException = init.passThroughOnException;\n\t}\n\n\tget request() {\n\t\treturn this.#request;\n\t}\n\n\trespondWith(response: Awaitable) {\n\t\tif (!(this instanceof __Facade_FetchEvent__)) {\n\t\t\tthrow new TypeError(\"Illegal invocation\");\n\t\t}\n\t\tif (this[__facade_response__] !== undefined) {\n\t\t\tthrow new DOMException(\n\t\t\t\t\"FetchEvent.respondWith() has already been called; it can only be called once.\",\n\t\t\t\t\"InvalidStateError\"\n\t\t\t);\n\t\t}\n\t\tif (this[__facade_dispatched__]) {\n\t\t\tthrow new DOMException(\n\t\t\t\t\"Too late to call FetchEvent.respondWith(). It must be called synchronously in the event handler.\",\n\t\t\t\t\"InvalidStateError\"\n\t\t\t);\n\t\t}\n\t\tthis.stopImmediatePropagation();\n\t\tthis[__facade_response__] = response;\n\t}\n\n\tpassThroughOnException() {\n\t\tif (!(this instanceof __Facade_FetchEvent__)) {\n\t\t\tthrow new TypeError(\"Illegal invocation\");\n\t\t}\n\t\t// Need to call native method immediately in case uncaught error thrown\n\t\tthis.#passThroughOnException();\n\t}\n}\n\ninterface ScheduledEventInit extends EventInit {\n\tscheduledTime: number;\n\tcron: string;\n\tnoRetry: ScheduledEvent[\"noRetry\"];\n}\n\nclass __Facade_ScheduledEvent__ extends __Facade_ExtendableEvent__ {\n\t#scheduledTime: number;\n\t#cron: string;\n\t#noRetry: ScheduledEvent[\"noRetry\"];\n\n\tconstructor(type: \"scheduled\", init: ScheduledEventInit) {\n\t\tsuper(type);\n\t\tthis.#scheduledTime = init.scheduledTime;\n\t\tthis.#cron = init.cron;\n\t\tthis.#noRetry = init.noRetry;\n\t}\n\n\tget scheduledTime() {\n\t\treturn this.#scheduledTime;\n\t}\n\n\tget cron() {\n\t\treturn this.#cron;\n\t}\n\n\tnoRetry() {\n\t\tif (!(this instanceof __Facade_ScheduledEvent__)) {\n\t\t\tthrow new TypeError(\"Illegal invocation\");\n\t\t}\n\t\t// Need to call native method immediately in case uncaught error thrown\n\t\tthis.#noRetry();\n\t}\n}\n\n__facade__originalAddEventListener__(\"fetch\", (event) => {\n\tconst ctx: ExecutionContext = {\n\t\twaitUntil: event.waitUntil.bind(event),\n\t\tpassThroughOnException: event.passThroughOnException.bind(event),\n\t};\n\n\tconst __facade_sw_dispatch__: Dispatcher = function (type, init) {\n\t\tif (type === \"scheduled\") {\n\t\t\tconst facadeEvent = new __Facade_ScheduledEvent__(\"scheduled\", {\n\t\t\t\tscheduledTime: Date.now(),\n\t\t\t\tcron: init.cron ?? \"\",\n\t\t\t\tnoRetry() {},\n\t\t\t});\n\n\t\t\t__FACADE_EVENT_TARGET__.dispatchEvent(facadeEvent);\n\t\t\tevent.waitUntil(Promise.all(facadeEvent[__facade_waitUntil__]));\n\t\t}\n\t};\n\n\tconst __facade_sw_fetch__: Middleware = function (request, _env, ctx) {\n\t\tconst facadeEvent = new __Facade_FetchEvent__(\"fetch\", {\n\t\t\trequest,\n\t\t\tpassThroughOnException: ctx.passThroughOnException,\n\t\t});\n\n\t\t__FACADE_EVENT_TARGET__.dispatchEvent(facadeEvent);\n\t\tfacadeEvent[__facade_dispatched__] = true;\n\t\tevent.waitUntil(Promise.all(facadeEvent[__facade_waitUntil__]));\n\n\t\tconst response = facadeEvent[__facade_response__];\n\t\tif (response === undefined) {\n\t\t\tthrow new Error(\"No response!\"); // TODO: proper error message\n\t\t}\n\t\treturn response;\n\t};\n\n\tevent.respondWith(\n\t\t__facade_invoke__(\n\t\t\tevent.request as IncomingRequest,\n\t\t\tglobalThis,\n\t\t\tctx,\n\t\t\t__facade_sw_dispatch__,\n\t\t\t__facade_sw_fetch__\n\t\t)\n\t);\n});\n\n__facade__originalAddEventListener__(\"scheduled\", (event) => {\n\tconst facadeEvent = new __Facade_ScheduledEvent__(\"scheduled\", {\n\t\tscheduledTime: event.scheduledTime,\n\t\tcron: event.cron,\n\t\tnoRetry: event.noRetry.bind(event),\n\t});\n\n\t__FACADE_EVENT_TARGET__.dispatchEvent(facadeEvent);\n\tevent.waitUntil(Promise.all(facadeEvent[__facade_waitUntil__]));\n});\n", "import type { Middleware } from \"./common\";\n\nconst drainBody: Middleware = async (request, env, _ctx, middlewareCtx) => {\n\ttry {\n\t\treturn await middlewareCtx.next(request, env);\n\t} finally {\n\t\ttry {\n\t\t\tif (request.body !== null && !request.bodyUsed) {\n\t\t\t\tconst reader = request.body.getReader();\n\t\t\t\twhile (!(await reader.read()).done) {}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Failed to drain the unused request body.\", e);\n\t\t}\n\t}\n};\n\nexport default drainBody;\n", "import type { Middleware } from \"./common\";\n\ninterface JsonError {\n\tmessage?: string;\n\tname?: string;\n\tstack?: string;\n\tcause?: JsonError;\n}\n\nfunction reduceError(e: any): JsonError {\n\treturn {\n\t\tname: e?.name,\n\t\tmessage: e?.message ?? String(e),\n\t\tstack: e?.stack,\n\t\tcause: e?.cause === undefined ? undefined : reduceError(e.cause),\n\t};\n}\n\n// See comment in `bundle.ts` for details on why this is needed\nconst jsonError: Middleware = async (request, env, _ctx, middlewareCtx) => {\n\ttry {\n\t\treturn await middlewareCtx.next(request, env);\n\t} catch (e: any) {\n\t\tconst error = reduceError(e);\n\t\treturn Response.json(error, {\n\t\t\tstatus: 500,\n\t\t\theaders: { \"MF-Experimental-Error-Stack\": \"true\" },\n\t\t});\n\t}\n};\n\nexport default jsonError;\n", "\t\t\t\timport { __facade_registerInternal__ } from \"C:\\\\Users\\\\wood\\\\codespace\\\\hammal\\\\node_modules\\\\.pnpm\\\\wrangler@3.60.0_@cloudflare+workers-types@2.0.0\\\\node_modules\\\\wrangler\\\\templates\\\\middleware\\\\loader-sw.ts\";\n\t\t\t\timport * as __MIDDLEWARE_0__ from \"C:\\\\Users\\\\wood\\\\codespace\\\\hammal\\\\node_modules\\\\.pnpm\\\\wrangler@3.60.0_@cloudflare+workers-types@2.0.0\\\\node_modules\\\\wrangler\\\\templates\\\\middleware\\\\middleware-ensure-req-body-drained.ts\";\nimport * as __MIDDLEWARE_1__ from \"C:\\\\Users\\\\wood\\\\codespace\\\\hammal\\\\node_modules\\\\.pnpm\\\\wrangler@3.60.0_@cloudflare+workers-types@2.0.0\\\\node_modules\\\\wrangler\\\\templates\\\\middleware\\\\middleware-miniflare3-json-error.ts\";\n\t\t\t\t__facade_registerInternal__([__MIDDLEWARE_0__.default,__MIDDLEWARE_1__.default])", "interface WwwAuthenticate {\r\n realm: string\r\n service: string\r\n scope: string\r\n}\r\n\r\ninterface Token {\r\n token: string\r\n expires_in: number\r\n}\r\n\r\nfunction parseAuthenticateStr(authenticateStr: string): WwwAuthenticate {\r\n const bearer = authenticateStr.split(/\\s+/, 2)\r\n if (bearer.length != 2 && bearer[0].toLowerCase() !== \"bearer\") {\r\n throw new Error(`Invalid Www-Authenticate ${authenticateStr}`)\r\n }\r\n const params = bearer[1].split(\",\")\r\n let get_param = function(name: string): string {\r\n for(const param of params) {\r\n const kvPair = param.split(\"=\", 2)\r\n if (kvPair.length !== 2 || kvPair[0] !== name) {\r\n continue\r\n }\r\n return kvPair[1].replace(/['\"]+/g, '')\r\n }\r\n return \"\"\r\n }\r\n return {\r\n realm: get_param(\"realm\"),\r\n service: get_param(\"service\"),\r\n scope: get_param(\"scope\"),\r\n };\r\n}\r\n\r\nclass TokenProvider {\r\n private username: string|undefined;\r\n private password: string|undefined;\r\n\r\n constructor(username?: string, password?: string) {\r\n this.username = username;\r\n this.password = password;\r\n }\r\n\r\n private async authenticateCacheKey(wwwAuthenticate: WwwAuthenticate): Promise {\r\n const keyStr = `${this.username}:${this.password}/${wwwAuthenticate.realm}/${wwwAuthenticate.service}/${wwwAuthenticate.scope}`\r\n const keyStrText = new TextEncoder().encode(keyStr)\r\n const digestArray = await crypto.subtle.digest({name: \"SHA-256\"}, keyStrText)\r\n const digestUint8Array = new Uint8Array(digestArray);\r\n let hexArray = []\r\n for(const num of digestUint8Array) {\r\n hexArray.push(num.toString(16))\r\n }\r\n const digestHex = hexArray.join('')\r\n return `token/${digestHex}`\r\n }\r\n\r\n private async tokenFromCache(cacheKey: string): Promise {\r\n const value = await HAMMAL_CACHE.get(cacheKey)\r\n if (value === null) {\r\n return null\r\n }\r\n return JSON.parse(value)\r\n }\r\n\r\n private async tokenToCache(cacheKey: string, token: Token) {\r\n await HAMMAL_CACHE.put(cacheKey, JSON.stringify(token), {expirationTtl: token.expires_in})\r\n }\r\n\r\n private async fetchToken(wwwAuthenticate: WwwAuthenticate): Promise {\r\n const url = new URL(wwwAuthenticate.realm)\r\n if (wwwAuthenticate.service.length) {\r\n url.searchParams.set(\"service\", wwwAuthenticate.service)\r\n }\r\n if (wwwAuthenticate.scope.length) {\r\n url.searchParams.set(\"scope\", wwwAuthenticate.scope)\r\n }\r\n // TODO: support basic auth\r\n const response = await fetch(url.toString(), {method: \"GET\", headers: {}})\r\n if (response.status !== 200) {\r\n throw new Error(`Unable to fetch token from ${url.toString()} status code ${response.status}`)\r\n }\r\n const body = await response.json()\r\n return {token: body.token, expires_in: body.expires_in}\r\n }\r\n\r\n async token(authenticateStr: string): Promise {\r\n const wwwAuthenticate: WwwAuthenticate = parseAuthenticateStr(authenticateStr)\r\n const cacheKey = await this.authenticateCacheKey(wwwAuthenticate)\r\n const cachedToken: Token|null = await this.tokenFromCache(cacheKey)\r\n if (cachedToken !== null) {\r\n return cachedToken\r\n }\r\n const token: Token = await this.fetchToken(wwwAuthenticate)\r\n await this.tokenToCache(cacheKey, token)\r\n return token\r\n }\r\n}\r\n\r\nexport { TokenProvider, Token }\r\n", "import { TokenProvider, Token } from './token'\r\n\r\ninterface ProxyArgs {\r\n headers: Headers\r\n}\r\n\r\nclass Backend {\r\n private host: string;\r\n private tokenProvider: TokenProvider|undefined;\r\n\r\n constructor(host: string, tokenProvider?: TokenProvider) {\r\n this.host = host;\r\n this.tokenProvider = tokenProvider\r\n }\r\n\r\n async proxy(pathname: string, args: ProxyArgs): Promise {\r\n const url = new URL(this.host)\r\n url.pathname = pathname\r\n const response = await fetch(url.toString(), {method: \"GET\", headers:args.headers, redirect: \"follow\"})\r\n if (this.tokenProvider === undefined) {\r\n return response\r\n }\r\n if (response.status !== 401) {\r\n return response\r\n }\r\n\r\n const authenticateStr = response.headers.get(\"Www-Authenticate\")\r\n if (authenticateStr === null || this.tokenProvider === undefined) {\r\n return response\r\n }\r\n const token: Token = await this.tokenProvider.token(authenticateStr)\r\n const authenticatedHeaders = new Headers(args.headers)\r\n authenticatedHeaders.append(\"Authorization\", `Bearer ${token.token}`)\r\n return await fetch(url.toString(), {method: \"GET\", headers:authenticatedHeaders, redirect: \"follow\"})\r\n }\r\n}\r\n\r\nexport {Backend}\r\n", "function getHomePageHtml(): string {\r\n return `\r\n \r\n \r\n CZL Docker\u955C\u50CF\u670D\u52A1(\u4EC5\u5185\u90E8\u7528)\r\n \r\n \r\n \r\n \r\n \r\n
\u5FEB\u6377\u547D\u4EE4
\r\n
\r\n \u63D0\u793A\uFF0C\u652F\u6301docker.io, ghcr,quay,k8sgcr,gcr, \u975Edocker.io\u9700\u52A0\u4E0A\u57DF\u540D\u524D\u7F00\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n `;\r\n}\r\n\r\nimport { TokenProvider } from './token'\r\nimport { Backend } from './backend'\r\n\r\nconst PROXY_HEADER_ALLOW_LIST: string[] = [\"accept\", \"user-agent\", \"accept-encoding\"]\r\n\r\nconst validActionNames = new Set([\"manifests\", \"blobs\", \"tags\", \"referrers\"])\r\n\r\nconst ORG_NAME_BACKEND:{ [key: string]: string; } = {\r\n \"gcr\": \"https://gcr.io\",\r\n \"k8sgcr\": \"https://k8s.gcr.io\",\r\n \"quay\": \"https://quay.io\",\r\n \"ghcr\": \"https://ghcr.io\"\r\n}\r\n\r\nconst DEFAULT_BACKEND_HOST: string = \"https://registry-1.docker.io\"\r\n\r\nexport async function handleRequest(request: Request): Promise {\r\n const url = new URL(request.url)\r\n\r\n if (url.pathname === '/') {\r\n return new Response(getHomePageHtml(), {\r\n headers: { 'content-type': 'text/html;charset=UTF-8' },\r\n })\r\n }\r\n\r\n return handleRegistryRequest(request)\r\n}\r\n\r\nfunction copyProxyHeaders(inputHeaders: Headers) : Headers {\r\n const headers = new Headers;\r\n for(const pair of inputHeaders.entries()) {\r\n if (PROXY_HEADER_ALLOW_LIST.includes(pair[0].toLowerCase())) {\r\n headers.append(pair[0], pair[1])\r\n }\r\n }\r\n return headers;\r\n}\r\n\r\nfunction orgNameFromPath(pathname: string): string|null {\r\n const splitedPath: string[] = pathname.split(\"/\", 3)\r\n if (splitedPath.length === 3 && splitedPath[0] === \"\" && splitedPath[1] === \"v2\") {\r\n return splitedPath[2].toLowerCase()\r\n }\r\n return null\r\n}\r\n\r\nfunction hostByOrgName(orgName: string|null): string {\r\n if (orgName !== null && orgName in ORG_NAME_BACKEND) {\r\n return ORG_NAME_BACKEND[orgName]\r\n }\r\n return DEFAULT_BACKEND_HOST\r\n}\r\n\r\nfunction rewritePath(orgName: string | null, pathname: string): string {\r\n let splitedPath = pathname.split(\"/\");\r\n\r\n // /v2/repo/manifests/xxx -> /v2/library/repo/manifests/xxx\r\n // /v2/repo/blobs/xxx -> /v2/library/repo/blobs/xxx\r\n if (orgName === null && splitedPath.length === 5 && validActionNames.has(splitedPath[3])) {\r\n splitedPath = [splitedPath[0], splitedPath[1], \"library\", splitedPath[2], splitedPath[3], splitedPath[4]]\r\n }\r\n\r\n if (orgName === null || !(orgName in ORG_NAME_BACKEND)) {\r\n return pathname\r\n }\r\n \r\n const cleanSplitedPath = splitedPath.filter(function(value: string, index: number) {\r\n return value !== orgName || index !== 2;\r\n })\r\n return cleanSplitedPath.join(\"/\")\r\n}\r\n\r\nasync function handleRegistryRequest(request: Request): Promise {\r\n const reqURL = new URL(request.url)\r\n const orgName = orgNameFromPath(reqURL.pathname)\r\n const pathname = rewritePath(orgName, reqURL.pathname)\r\n const host = hostByOrgName(orgName)\r\n const tokenProvider = new TokenProvider()\r\n const backend = new Backend(host, tokenProvider)\r\n const headers = copyProxyHeaders(request.headers)\r\n return backend.proxy(pathname, {headers: request.headers})\r\n}\r\n", "import { handleRequest } from './handler'\r\n\r\ndeclare global {\r\n const HAMMAL_CACHE: KVNamespace\r\n}\r\n\r\naddEventListener('fetch', (event) => {\r\n event.respondWith(handleRequest(event.request))\r\n})\r\n"],
+ "mappings": "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",
"names": ["ctx"]
}
diff --git a/src/handler.ts b/src/handler.ts
index 8c616c9..23a25fc 100644
--- a/src/handler.ts
+++ b/src/handler.ts
@@ -3,6 +3,7 @@ function getHomePageHtml(): string {
CZL Docker镜像服务(仅内部用)
+