diff --git a/.wrangler/tmp/bundle-9gm8ka/checked-fetch.js b/.wrangler/tmp/bundle-9gm8ka/checked-fetch.js new file mode 100644 index 0000000..8c007fd --- /dev/null +++ b/.wrangler/tmp/bundle-9gm8ka/checked-fetch.js @@ -0,0 +1,30 @@ +const urls = new Set(); + +function checkURL(request, init) { + const url = + request instanceof URL + ? request + : new URL( + (typeof request === "string" + ? new Request(request, init) + : request + ).url + ); + if (url.port && url.port !== "443" && url.protocol === "https:") { + if (!urls.has(url.toString())) { + urls.add(url.toString()); + console.warn( + `WARNING: known issue with \`fetch()\` requests to custom HTTPS ports in published Workers:\n` + + ` - ${url.toString()} - the custom port will be ignored when the Worker is published using the \`wrangler deploy\` command.\n` + ); + } + } +} + +globalThis.fetch = new Proxy(globalThis.fetch, { + apply(target, thisArg, argArray) { + const [request, init] = argArray; + checkURL(request, init); + return Reflect.apply(target, thisArg, argArray); + }, +}); diff --git a/.wrangler/tmp/bundle-9gm8ka/middleware-insertion-facade.js b/.wrangler/tmp/bundle-9gm8ka/middleware-insertion-facade.js new file mode 100644 index 0000000..c36331c --- /dev/null +++ b/.wrangler/tmp/bundle-9gm8ka/middleware-insertion-facade.js @@ -0,0 +1,11 @@ + import worker, * as OTHER_EXPORTS from "C:\\Users\\mdtah\\OneDrive\\Desktop\\AnimepaheApi\\worker.js"; + import * as __MIDDLEWARE_0__ from "C:\\Users\\mdtah\\AppData\\Roaming\\npm\\node_modules\\wrangler\\templates\\middleware\\middleware-ensure-req-body-drained.ts"; +import * as __MIDDLEWARE_1__ from "C:\\Users\\mdtah\\AppData\\Roaming\\npm\\node_modules\\wrangler\\templates\\middleware\\middleware-miniflare3-json-error.ts"; + + export * from "C:\\Users\\mdtah\\OneDrive\\Desktop\\AnimepaheApi\\worker.js"; + const MIDDLEWARE_TEST_INJECT = "__INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__"; + export const __INTERNAL_WRANGLER_MIDDLEWARE__ = [ + + __MIDDLEWARE_0__.default,__MIDDLEWARE_1__.default + ] + export default worker; \ No newline at end of file diff --git a/.wrangler/tmp/bundle-9gm8ka/middleware-loader.entry.ts b/.wrangler/tmp/bundle-9gm8ka/middleware-loader.entry.ts new file mode 100644 index 0000000..d9ef355 --- /dev/null +++ b/.wrangler/tmp/bundle-9gm8ka/middleware-loader.entry.ts @@ -0,0 +1,134 @@ +// This loads all middlewares exposed on the middleware object and then starts +// the invocation chain. The big idea is that we can add these to the middleware +// export dynamically through wrangler, or we can potentially let users directly +// add them as a sort of "plugin" system. + +import ENTRY, { __INTERNAL_WRANGLER_MIDDLEWARE__ } from "C:\\Users\\mdtah\\OneDrive\\Desktop\\AnimepaheApi\\.wrangler\\tmp\\bundle-9gm8ka\\middleware-insertion-facade.js"; +import { __facade_invoke__, __facade_register__, Dispatcher } from "C:\\Users\\mdtah\\AppData\\Roaming\\npm\\node_modules\\wrangler\\templates\\middleware\\common.ts"; +import type { WorkerEntrypointConstructor } from "C:\\Users\\mdtah\\OneDrive\\Desktop\\AnimepaheApi\\.wrangler\\tmp\\bundle-9gm8ka\\middleware-insertion-facade.js"; + +// Preserve all the exports from the worker +export * from "C:\\Users\\mdtah\\OneDrive\\Desktop\\AnimepaheApi\\.wrangler\\tmp\\bundle-9gm8ka\\middleware-insertion-facade.js"; + +class __Facade_ScheduledController__ implements ScheduledController { + readonly #noRetry: ScheduledController["noRetry"]; + + constructor( + readonly scheduledTime: number, + readonly cron: string, + noRetry: ScheduledController["noRetry"] + ) { + this.#noRetry = noRetry; + } + + noRetry() { + if (!(this instanceof __Facade_ScheduledController__)) { + throw new TypeError("Illegal invocation"); + } + // Need to call native method immediately in case uncaught error thrown + this.#noRetry(); + } +} + +function wrapExportedHandler(worker: ExportedHandler): ExportedHandler { + // If we don't have any middleware defined, just return the handler as is + if ( + __INTERNAL_WRANGLER_MIDDLEWARE__ === undefined || + __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0 + ) { + return worker; + } + // Otherwise, register all middleware once + for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) { + __facade_register__(middleware); + } + + const fetchDispatcher: ExportedHandlerFetchHandler = function ( + request, + env, + ctx + ) { + if (worker.fetch === undefined) { + throw new Error("Handler does not export a fetch() function."); + } + return worker.fetch(request, env, ctx); + }; + + return { + ...worker, + fetch(request, env, ctx) { + const dispatcher: Dispatcher = function (type, init) { + if (type === "scheduled" && worker.scheduled !== undefined) { + const controller = new __Facade_ScheduledController__( + Date.now(), + init.cron ?? "", + () => {} + ); + return worker.scheduled(controller, env, ctx); + } + }; + return __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher); + }, + }; +} + +function wrapWorkerEntrypoint( + klass: WorkerEntrypointConstructor +): WorkerEntrypointConstructor { + // If we don't have any middleware defined, just return the handler as is + if ( + __INTERNAL_WRANGLER_MIDDLEWARE__ === undefined || + __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0 + ) { + return klass; + } + // Otherwise, register all middleware once + for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) { + __facade_register__(middleware); + } + + // `extend`ing `klass` here so other RPC methods remain callable + return class extends klass { + #fetchDispatcher: ExportedHandlerFetchHandler> = ( + request, + env, + ctx + ) => { + this.env = env; + this.ctx = ctx; + if (super.fetch === undefined) { + throw new Error("Entrypoint class does not define a fetch() function."); + } + return super.fetch(request); + }; + + #dispatcher: Dispatcher = (type, init) => { + if (type === "scheduled" && super.scheduled !== undefined) { + const controller = new __Facade_ScheduledController__( + Date.now(), + init.cron ?? "", + () => {} + ); + return super.scheduled(controller); + } + }; + + fetch(request: Request) { + return __facade_invoke__( + request, + this.env, + this.ctx, + this.#dispatcher, + this.#fetchDispatcher + ); + } + }; +} + +let WRAPPED_ENTRY: ExportedHandler | WorkerEntrypointConstructor | undefined; +if (typeof ENTRY === "object") { + WRAPPED_ENTRY = wrapExportedHandler(ENTRY); +} else if (typeof ENTRY === "function") { + WRAPPED_ENTRY = wrapWorkerEntrypoint(ENTRY); +} +export default WRAPPED_ENTRY; diff --git a/.wrangler/tmp/dev-G7IXcD/worker.js b/.wrangler/tmp/dev-G7IXcD/worker.js new file mode 100644 index 0000000..7df5bce --- /dev/null +++ b/.wrangler/tmp/dev-G7IXcD/worker.js @@ -0,0 +1,386 @@ +var __defProp = Object.defineProperty; +var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); + +// .wrangler/tmp/bundle-9gm8ka/checked-fetch.js +var urls = /* @__PURE__ */ new Set(); +function checkURL(request, init) { + const url = request instanceof URL ? request : new URL( + (typeof request === "string" ? new Request(request, init) : request).url + ); + if (url.port && url.port !== "443" && url.protocol === "https:") { + if (!urls.has(url.toString())) { + urls.add(url.toString()); + console.warn( + `WARNING: known issue with \`fetch()\` requests to custom HTTPS ports in published Workers: + - ${url.toString()} - the custom port will be ignored when the Worker is published using the \`wrangler deploy\` command. +` + ); + } + } +} +__name(checkURL, "checkURL"); +globalThis.fetch = new Proxy(globalThis.fetch, { + apply(target, thisArg, argArray) { + const [request, init] = argArray; + checkURL(request, init); + return Reflect.apply(target, thisArg, argArray); + } +}); + +// worker.js +var worker_default = { + async fetch(request, env, ctx) { + const url = new URL(request.url); + if (request.method === "OPTIONS") { + return new Response(null, { + headers: { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Methods": "GET, OPTIONS", + "Access-Control-Allow-Headers": "Range, Content-Type" + } + }); + } + if (url.pathname === "/proxy") { + const targetUrl = url.searchParams.get("url"); + const customReferer = url.searchParams.get("referer"); + if (!targetUrl) { + return new Response(JSON.stringify({ + error: 'Query parameter "url" is required', + usage: "GET /proxy?url=&referer=" + }), { + status: 400, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*" + } + }); + } + if (targetUrl.includes("kwik.cx/e/") || targetUrl.includes("kwik.si/e/") || targetUrl.match(/kwik\.[a-z]+\/e\//)) { + try { + const fetchResponse = await fetch(targetUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Referer": "https://animepahe.com/" + } + }); + if (!fetchResponse.ok) { + throw new Error(`Kwik returned status ${fetchResponse.status}`); + } + const html = await fetchResponse.text(); + let m3u8Url = null; + const packerRegex = /eval\(function\(p,a,c,k,e,d\).*?return p}\('(.*?)',(\d+),(\d+),'([^']+)'\.split\('\|'\)/g; + let match; + const unpack = /* @__PURE__ */ __name((p, a, c, k) => { + const e = /* @__PURE__ */ __name((c2) => { + return (c2 < a ? "" : e(parseInt(c2 / a))) + ((c2 = c2 % a) > 35 ? String.fromCharCode(c2 + 29) : c2.toString(36)); + }, "e"); + while (c--) { + if (k[c]) { + p = p.replace(new RegExp("\\b" + e(c) + "\\b", "g"), k[c]); + } + } + return p; + }, "unpack"); + while ((match = packerRegex.exec(html)) !== null) { + const dict = match[4]; + if (dict.includes("m3u8")) { + const p = match[1].replace(/\\'/g, "'").replace(/\\\\/g, "\\"); + const a = parseInt(match[2], 10); + const c = parseInt(match[3], 10); + const k = dict.split("|"); + const unpacked = unpack(p, a, c, k); + const m3u8Match = unpacked.match(/(https?:\/\/[^'"\s]+\.m3u8[^'"\s]*)/); + if (m3u8Match) { + m3u8Url = m3u8Match[1]; + break; + } + } + } + if (!m3u8Url) { + const dataSrcMatch = html.match(/data-src="([^"]+\.m3u8[^"]*)"/); + if (dataSrcMatch) m3u8Url = dataSrcMatch[1]; + } + if (m3u8Url) { + const redirectUrl = `/proxy?url=${encodeURIComponent(m3u8Url)}&referer=${encodeURIComponent(targetUrl)}`; + return Response.redirect(new URL(redirectUrl, request.url).href, 302); + } else { + throw new Error("Could not extract m3u8 link from Kwik source"); + } + } catch (e) { + return new Response(JSON.stringify({ + error: "Failed to resolve Kwik URL inside Worker", + details: e.message + }), { + status: 500, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*" + } + }); + } + } + const targetUrlObj = new URL(targetUrl); + const referer = customReferer || `${targetUrlObj.protocol}//${targetUrlObj.host}/`; + try { + const fetchResponse = await fetch(targetUrl, { + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Referer": referer, + "Origin": referer.slice(0, -1), + "Accept": "*/*", + "Accept-Language": "en-US,en;q=0.9", + "Accept-Encoding": "gzip, deflate, br", + "Connection": "keep-alive", + "Sec-Fetch-Dest": "empty", + "Sec-Fetch-Mode": "cors", + "Sec-Fetch-Site": "cross-site" + } + }); + if (fetchResponse.status === 403) { + return new Response(JSON.stringify({ error: "Access forbidden - CDN blocked the request" }), { + status: 403, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*" + } + }); + } + const contentType = fetchResponse.headers.get("content-type") || (targetUrl.includes(".m3u8") ? "application/vnd.apple.mpegurl" : targetUrl.includes(".ts") ? "video/mp2t" : "application/octet-stream"); + if (contentType.includes("mpegurl") || targetUrl.includes(".m3u8")) { + const content = await fetchResponse.text(); + const baseUrl = targetUrl.substring(0, targetUrl.lastIndexOf("/") + 1); + const refererParam = customReferer ? `&referer=${encodeURIComponent(customReferer)}` : ""; + const modified = content.split("\n").map((line) => { + const t = line.trim(); + if (t.startsWith("#")) { + if (t.includes('URI="')) { + return t.replace(/URI="([^"]+)"/, (match, uri) => { + let fullUrl = uri; + if (!uri.startsWith("http")) { + fullUrl = baseUrl + uri; + } + return `URI="/proxy?url=${encodeURIComponent(fullUrl)}${refererParam}"`; + }); + } + return line; + } else if (t && !t.startsWith("http")) { + return `/proxy?url=${encodeURIComponent(baseUrl + t)}${refererParam}`; + } else if (t.startsWith("http")) { + return `/proxy?url=${encodeURIComponent(t)}${refererParam}`; + } + return line; + }).join("\n"); + return new Response(modified, { + headers: { + "Content-Type": contentType, + "Access-Control-Allow-Origin": "*" + } + }); + } else { + const headers = new Headers(); + headers.set("Content-Type", contentType); + headers.set("Access-Control-Allow-Origin", "*"); + headers.set("Accept-Ranges", "bytes"); + const contentLength = fetchResponse.headers.get("content-length"); + if (contentLength) headers.set("Content-Length", contentLength); + const contentRange = fetchResponse.headers.get("content-range"); + if (contentRange) headers.set("Content-Range", contentRange); + return new Response(fetchResponse.body, { + status: fetchResponse.status, + headers + }); + } + } catch (err) { + return new Response(JSON.stringify({ error: err.message }), { + status: 500, + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*" + } + }); + } + } + return new Response("Animepahe Proxy is running on Cloudflare Workers! Use /proxy?url=...", { + status: 200, + headers: { + "Content-Type": "text/plain", + "Access-Control-Allow-Origin": "*" + } + }); + } +}; + +// ../../../AppData/Roaming/npm/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts +var drainBody = /* @__PURE__ */ __name(async (request, env, _ctx, middlewareCtx) => { + try { + return await middlewareCtx.next(request, env); + } finally { + try { + if (request.body !== null && !request.bodyUsed) { + const reader = request.body.getReader(); + while (!(await reader.read()).done) { + } + } + } catch (e) { + console.error("Failed to drain the unused request body.", e); + } + } +}, "drainBody"); +var middleware_ensure_req_body_drained_default = drainBody; + +// ../../../AppData/Roaming/npm/node_modules/wrangler/templates/middleware/middleware-miniflare3-json-error.ts +function reduceError(e) { + return { + name: e?.name, + message: e?.message ?? String(e), + stack: e?.stack, + cause: e?.cause === void 0 ? void 0 : reduceError(e.cause) + }; +} +__name(reduceError, "reduceError"); +var jsonError = /* @__PURE__ */ __name(async (request, env, _ctx, middlewareCtx) => { + try { + return await middlewareCtx.next(request, env); + } catch (e) { + const error = reduceError(e); + return Response.json(error, { + status: 500, + headers: { "MF-Experimental-Error-Stack": "true" } + }); + } +}, "jsonError"); +var middleware_miniflare3_json_error_default = jsonError; + +// .wrangler/tmp/bundle-9gm8ka/middleware-insertion-facade.js +var __INTERNAL_WRANGLER_MIDDLEWARE__ = [ + middleware_ensure_req_body_drained_default, + middleware_miniflare3_json_error_default +]; +var middleware_insertion_facade_default = worker_default; + +// ../../../AppData/Roaming/npm/node_modules/wrangler/templates/middleware/common.ts +var __facade_middleware__ = []; +function __facade_register__(...args) { + __facade_middleware__.push(...args.flat()); +} +__name(__facade_register__, "__facade_register__"); +function __facade_invokeChain__(request, env, ctx, dispatch, middlewareChain) { + const [head, ...tail] = middlewareChain; + const middlewareCtx = { + dispatch, + next(newRequest, newEnv) { + return __facade_invokeChain__(newRequest, newEnv, ctx, dispatch, tail); + } + }; + return head(request, env, ctx, middlewareCtx); +} +__name(__facade_invokeChain__, "__facade_invokeChain__"); +function __facade_invoke__(request, env, ctx, dispatch, finalMiddleware) { + return __facade_invokeChain__(request, env, ctx, dispatch, [ + ...__facade_middleware__, + finalMiddleware + ]); +} +__name(__facade_invoke__, "__facade_invoke__"); + +// .wrangler/tmp/bundle-9gm8ka/middleware-loader.entry.ts +var __Facade_ScheduledController__ = class ___Facade_ScheduledController__ { + constructor(scheduledTime, cron, noRetry) { + this.scheduledTime = scheduledTime; + this.cron = cron; + this.#noRetry = noRetry; + } + static { + __name(this, "__Facade_ScheduledController__"); + } + #noRetry; + noRetry() { + if (!(this instanceof ___Facade_ScheduledController__)) { + throw new TypeError("Illegal invocation"); + } + this.#noRetry(); + } +}; +function wrapExportedHandler(worker) { + if (__INTERNAL_WRANGLER_MIDDLEWARE__ === void 0 || __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0) { + return worker; + } + for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) { + __facade_register__(middleware); + } + const fetchDispatcher = /* @__PURE__ */ __name(function(request, env, ctx) { + if (worker.fetch === void 0) { + throw new Error("Handler does not export a fetch() function."); + } + return worker.fetch(request, env, ctx); + }, "fetchDispatcher"); + return { + ...worker, + fetch(request, env, ctx) { + const dispatcher = /* @__PURE__ */ __name(function(type, init) { + if (type === "scheduled" && worker.scheduled !== void 0) { + const controller = new __Facade_ScheduledController__( + Date.now(), + init.cron ?? "", + () => { + } + ); + return worker.scheduled(controller, env, ctx); + } + }, "dispatcher"); + return __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher); + } + }; +} +__name(wrapExportedHandler, "wrapExportedHandler"); +function wrapWorkerEntrypoint(klass) { + if (__INTERNAL_WRANGLER_MIDDLEWARE__ === void 0 || __INTERNAL_WRANGLER_MIDDLEWARE__.length === 0) { + return klass; + } + for (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) { + __facade_register__(middleware); + } + return class extends klass { + #fetchDispatcher = /* @__PURE__ */ __name((request, env, ctx) => { + this.env = env; + this.ctx = ctx; + if (super.fetch === void 0) { + throw new Error("Entrypoint class does not define a fetch() function."); + } + return super.fetch(request); + }, "#fetchDispatcher"); + #dispatcher = /* @__PURE__ */ __name((type, init) => { + if (type === "scheduled" && super.scheduled !== void 0) { + const controller = new __Facade_ScheduledController__( + Date.now(), + init.cron ?? "", + () => { + } + ); + return super.scheduled(controller); + } + }, "#dispatcher"); + fetch(request) { + return __facade_invoke__( + request, + this.env, + this.ctx, + this.#dispatcher, + this.#fetchDispatcher + ); + } + }; +} +__name(wrapWorkerEntrypoint, "wrapWorkerEntrypoint"); +var WRAPPED_ENTRY; +if (typeof middleware_insertion_facade_default === "object") { + WRAPPED_ENTRY = wrapExportedHandler(middleware_insertion_facade_default); +} else if (typeof middleware_insertion_facade_default === "function") { + WRAPPED_ENTRY = wrapWorkerEntrypoint(middleware_insertion_facade_default); +} +var middleware_loader_entry_default = WRAPPED_ENTRY; +export { + __INTERNAL_WRANGLER_MIDDLEWARE__, + middleware_loader_entry_default as default +}; +//# sourceMappingURL=worker.js.map diff --git a/.wrangler/tmp/dev-G7IXcD/worker.js.map b/.wrangler/tmp/dev-G7IXcD/worker.js.map new file mode 100644 index 0000000..4cacc63 --- /dev/null +++ b/.wrangler/tmp/dev-G7IXcD/worker.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": ["../bundle-9gm8ka/checked-fetch.js", "../../../worker.js", "../../../../../../AppData/Roaming/npm/node_modules/wrangler/templates/middleware/middleware-ensure-req-body-drained.ts", "../../../../../../AppData/Roaming/npm/node_modules/wrangler/templates/middleware/middleware-miniflare3-json-error.ts", "../bundle-9gm8ka/middleware-insertion-facade.js", "../../../../../../AppData/Roaming/npm/node_modules/wrangler/templates/middleware/common.ts", "../bundle-9gm8ka/middleware-loader.entry.ts"], + "sourceRoot": "C:\\Users\\mdtah\\OneDrive\\Desktop\\AnimepaheApi\\.wrangler\\tmp\\dev-G7IXcD", + "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 default {\n async fetch(request, env, ctx) {\n const url = new URL(request.url);\n \n // Handle CORS Preflight requests\n if (request.method === 'OPTIONS') {\n return new Response(null, {\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, OPTIONS',\n 'Access-Control-Allow-Headers': 'Range, Content-Type',\n }\n });\n }\n\n // Proxy Endpoint\n if (url.pathname === '/proxy') {\n const targetUrl = url.searchParams.get('url');\n const customReferer = url.searchParams.get('referer');\n\n if (!targetUrl) {\n return new Response(JSON.stringify({ \n error: 'Query parameter \"url\" is required',\n usage: 'GET /proxy?url=&referer='\n }), {\n status: 400,\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*'\n }\n });\n }\n\n // Automatically resolve Kwik URLs in the Worker\n if (targetUrl.includes('kwik.cx/e/') || targetUrl.includes('kwik.si/e/') || targetUrl.match(/kwik\\.[a-z]+\\/e\\//)) {\n try {\n const fetchResponse = await fetch(targetUrl, {\n headers: {\n 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',\n 'Referer': 'https://animepahe.com/'\n }\n });\n \n if (!fetchResponse.ok) {\n throw new Error(`Kwik returned status ${fetchResponse.status}`);\n }\n \n const html = await fetchResponse.text();\n let m3u8Url = null;\n \n // Pure JS unpacker for Dean Edwards p.a.c.k.e.r\n const packerRegex = /eval\\(function\\(p,a,c,k,e,d\\).*?return p}\\('(.*?)',(\\d+),(\\d+),'([^']+)'\\.split\\('\\|'\\)/g;\n let match;\n \n const unpack = (p, a, c, k) => {\n const e = (c) => {\n return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36));\n };\n while (c--) {\n if (k[c]) {\n p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]);\n }\n }\n return p;\n };\n\n while ((match = packerRegex.exec(html)) !== null) {\n const dict = match[4];\n if (dict.includes('m3u8')) {\n // Unescape quotes that were escaped for the eval string\n const p = match[1].replace(/\\\\'/g, \"'\").replace(/\\\\\\\\/g, \"\\\\\");\n const a = parseInt(match[2], 10);\n const c = parseInt(match[3], 10);\n const k = dict.split('|');\n \n const unpacked = unpack(p, a, c, k);\n const m3u8Match = unpacked.match(/(https?:\\/\\/[^'\"\\s]+\\.m3u8[^'\"\\s]*)/);\n if (m3u8Match) {\n m3u8Url = m3u8Match[1];\n break;\n }\n }\n }\n \n if (!m3u8Url) {\n const dataSrcMatch = html.match(/data-src=\"([^\"]+\\.m3u8[^\"]*)\"/);\n if (dataSrcMatch) m3u8Url = dataSrcMatch[1];\n }\n\n if (m3u8Url) {\n // Redirect to the proxy with the resolved M3U8 url\n const redirectUrl = `/proxy?url=${encodeURIComponent(m3u8Url)}&referer=${encodeURIComponent(targetUrl)}`;\n return Response.redirect(new URL(redirectUrl, request.url).href, 302);\n } else {\n throw new Error('Could not extract m3u8 link from Kwik source');\n }\n } catch (e) {\n return new Response(JSON.stringify({ \n error: 'Failed to resolve Kwik URL inside Worker',\n details: e.message \n }), {\n status: 500,\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*'\n }\n });\n }\n }\n\n const targetUrlObj = new URL(targetUrl);\n const referer = customReferer || `${targetUrlObj.protocol}//${targetUrlObj.host}/`;\n \n try {\n // Fetch from target (Animepahe CDN)\n const fetchResponse = await fetch(targetUrl, {\n headers: {\n 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',\n 'Referer': referer,\n 'Origin': referer.slice(0, -1),\n 'Accept': '*/*',\n 'Accept-Language': 'en-US,en;q=0.9',\n 'Accept-Encoding': 'gzip, deflate, br',\n 'Connection': 'keep-alive',\n 'Sec-Fetch-Dest': 'empty',\n 'Sec-Fetch-Mode': 'cors',\n 'Sec-Fetch-Site': 'cross-site'\n }\n });\n\n if (fetchResponse.status === 403) {\n return new Response(JSON.stringify({ error: 'Access forbidden - CDN blocked the request' }), { \n status: 403,\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*'\n }\n });\n }\n\n const contentType = fetchResponse.headers.get('content-type') || \n (targetUrl.includes('.m3u8') ? 'application/vnd.apple.mpegurl' : \n targetUrl.includes('.ts') ? 'video/mp2t' : 'application/octet-stream');\n\n // Rewrite M3U8 Playlists\n if (contentType.includes('mpegurl') || targetUrl.includes('.m3u8')) {\n const content = await fetchResponse.text();\n const baseUrl = targetUrl.substring(0, targetUrl.lastIndexOf('/') + 1);\n const refererParam = customReferer ? `&referer=${encodeURIComponent(customReferer)}` : '';\n \n const modified = content.split('\\n').map(line => {\n const t = line.trim();\n if (t.startsWith('#')) {\n // Rewrite URIs in tags like #EXT-X-KEY:METHOD=AES-128,URI=\"...\"\n if (t.includes('URI=\"')) {\n return t.replace(/URI=\"([^\"]+)\"/, (match, uri) => {\n let fullUrl = uri;\n if (!uri.startsWith('http')) {\n fullUrl = baseUrl + uri;\n }\n return `URI=\"/proxy?url=${encodeURIComponent(fullUrl)}${refererParam}\"`;\n });\n }\n return line;\n } else if (t && !t.startsWith('http')) {\n return `/proxy?url=${encodeURIComponent(baseUrl + t)}${refererParam}`;\n } else if (t.startsWith('http')) {\n return `/proxy?url=${encodeURIComponent(t)}${refererParam}`;\n }\n return line;\n }).join('\\n');\n\n return new Response(modified, {\n headers: {\n 'Content-Type': contentType,\n 'Access-Control-Allow-Origin': '*'\n }\n });\n } \n \n // Proxy Binary Media (Video Segments / TS / Keys)\n else {\n const headers = new Headers();\n headers.set('Content-Type', contentType);\n headers.set('Access-Control-Allow-Origin', '*');\n headers.set('Accept-Ranges', 'bytes');\n \n const contentLength = fetchResponse.headers.get('content-length');\n if (contentLength) headers.set('Content-Length', contentLength);\n \n const contentRange = fetchResponse.headers.get('content-range');\n if (contentRange) headers.set('Content-Range', contentRange);\n\n return new Response(fetchResponse.body, {\n status: fetchResponse.status,\n headers: headers\n });\n }\n } catch (err) {\n return new Response(JSON.stringify({ error: err.message }), { \n status: 500,\n headers: {\n 'Content-Type': 'application/json',\n 'Access-Control-Allow-Origin': '*'\n }\n });\n }\n }\n\n // Default route\n return new Response('Animepahe Proxy is running on Cloudflare Workers! Use /proxy?url=...', { \n status: 200,\n headers: {\n 'Content-Type': 'text/plain',\n 'Access-Control-Allow-Origin': '*'\n }\n });\n }\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 worker, * as OTHER_EXPORTS from \"C:\\\\Users\\\\mdtah\\\\OneDrive\\\\Desktop\\\\AnimepaheApi\\\\worker.js\";\n\t\t\t\timport * as __MIDDLEWARE_0__ from \"C:\\\\Users\\\\mdtah\\\\AppData\\\\Roaming\\\\npm\\\\node_modules\\\\wrangler\\\\templates\\\\middleware\\\\middleware-ensure-req-body-drained.ts\";\nimport * as __MIDDLEWARE_1__ from \"C:\\\\Users\\\\mdtah\\\\AppData\\\\Roaming\\\\npm\\\\node_modules\\\\wrangler\\\\templates\\\\middleware\\\\middleware-miniflare3-json-error.ts\";\n\n\t\t\t\texport * from \"C:\\\\Users\\\\mdtah\\\\OneDrive\\\\Desktop\\\\AnimepaheApi\\\\worker.js\";\n\t\t\t\tconst MIDDLEWARE_TEST_INJECT = \"__INJECT_FOR_TESTING_WRANGLER_MIDDLEWARE__\";\n\t\t\t\texport const __INTERNAL_WRANGLER_MIDDLEWARE__ = [\n\t\t\t\t\t\n\t\t\t\t\t__MIDDLEWARE_0__.default,__MIDDLEWARE_1__.default\n\t\t\t\t]\n\t\t\t\texport default worker;", "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", "// This loads all middlewares exposed on the middleware object and then starts\n// the invocation chain. The big idea is that we can add these to the middleware\n// export dynamically through wrangler, or we can potentially let users directly\n// add them as a sort of \"plugin\" system.\n\nimport ENTRY, { __INTERNAL_WRANGLER_MIDDLEWARE__ } from \"C:\\\\Users\\\\mdtah\\\\OneDrive\\\\Desktop\\\\AnimepaheApi\\\\.wrangler\\\\tmp\\\\bundle-9gm8ka\\\\middleware-insertion-facade.js\";\nimport { __facade_invoke__, __facade_register__, Dispatcher } from \"C:\\\\Users\\\\mdtah\\\\AppData\\\\Roaming\\\\npm\\\\node_modules\\\\wrangler\\\\templates\\\\middleware\\\\common.ts\";\nimport type { WorkerEntrypointConstructor } from \"C:\\\\Users\\\\mdtah\\\\OneDrive\\\\Desktop\\\\AnimepaheApi\\\\.wrangler\\\\tmp\\\\bundle-9gm8ka\\\\middleware-insertion-facade.js\";\n\n// Preserve all the exports from the worker\nexport * from \"C:\\\\Users\\\\mdtah\\\\OneDrive\\\\Desktop\\\\AnimepaheApi\\\\.wrangler\\\\tmp\\\\bundle-9gm8ka\\\\middleware-insertion-facade.js\";\n\nclass __Facade_ScheduledController__ implements ScheduledController {\n\treadonly #noRetry: ScheduledController[\"noRetry\"];\n\n\tconstructor(\n\t\treadonly scheduledTime: number,\n\t\treadonly cron: string,\n\t\tnoRetry: ScheduledController[\"noRetry\"]\n\t) {\n\t\tthis.#noRetry = noRetry;\n\t}\n\n\tnoRetry() {\n\t\tif (!(this instanceof __Facade_ScheduledController__)) {\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\nfunction wrapExportedHandler(worker: ExportedHandler): ExportedHandler {\n\t// If we don't have any middleware defined, just return the handler as is\n\tif (\n\t\t__INTERNAL_WRANGLER_MIDDLEWARE__ === undefined ||\n\t\t__INTERNAL_WRANGLER_MIDDLEWARE__.length === 0\n\t) {\n\t\treturn worker;\n\t}\n\t// Otherwise, register all middleware once\n\tfor (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {\n\t\t__facade_register__(middleware);\n\t}\n\n\tconst fetchDispatcher: ExportedHandlerFetchHandler = function (\n\t\trequest,\n\t\tenv,\n\t\tctx\n\t) {\n\t\tif (worker.fetch === undefined) {\n\t\t\tthrow new Error(\"Handler does not export a fetch() function.\");\n\t\t}\n\t\treturn worker.fetch(request, env, ctx);\n\t};\n\n\treturn {\n\t\t...worker,\n\t\tfetch(request, env, ctx) {\n\t\t\tconst dispatcher: Dispatcher = function (type, init) {\n\t\t\t\tif (type === \"scheduled\" && worker.scheduled !== undefined) {\n\t\t\t\t\tconst controller = new __Facade_ScheduledController__(\n\t\t\t\t\t\tDate.now(),\n\t\t\t\t\t\tinit.cron ?? \"\",\n\t\t\t\t\t\t() => {}\n\t\t\t\t\t);\n\t\t\t\t\treturn worker.scheduled(controller, env, ctx);\n\t\t\t\t}\n\t\t\t};\n\t\t\treturn __facade_invoke__(request, env, ctx, dispatcher, fetchDispatcher);\n\t\t},\n\t};\n}\n\nfunction wrapWorkerEntrypoint(\n\tklass: WorkerEntrypointConstructor\n): WorkerEntrypointConstructor {\n\t// If we don't have any middleware defined, just return the handler as is\n\tif (\n\t\t__INTERNAL_WRANGLER_MIDDLEWARE__ === undefined ||\n\t\t__INTERNAL_WRANGLER_MIDDLEWARE__.length === 0\n\t) {\n\t\treturn klass;\n\t}\n\t// Otherwise, register all middleware once\n\tfor (const middleware of __INTERNAL_WRANGLER_MIDDLEWARE__) {\n\t\t__facade_register__(middleware);\n\t}\n\n\t// `extend`ing `klass` here so other RPC methods remain callable\n\treturn class extends klass {\n\t\t#fetchDispatcher: ExportedHandlerFetchHandler> = (\n\t\t\trequest,\n\t\t\tenv,\n\t\t\tctx\n\t\t) => {\n\t\t\tthis.env = env;\n\t\t\tthis.ctx = ctx;\n\t\t\tif (super.fetch === undefined) {\n\t\t\t\tthrow new Error(\"Entrypoint class does not define a fetch() function.\");\n\t\t\t}\n\t\t\treturn super.fetch(request);\n\t\t};\n\n\t\t#dispatcher: Dispatcher = (type, init) => {\n\t\t\tif (type === \"scheduled\" && super.scheduled !== undefined) {\n\t\t\t\tconst controller = new __Facade_ScheduledController__(\n\t\t\t\t\tDate.now(),\n\t\t\t\t\tinit.cron ?? \"\",\n\t\t\t\t\t() => {}\n\t\t\t\t);\n\t\t\t\treturn super.scheduled(controller);\n\t\t\t}\n\t\t};\n\n\t\tfetch(request: Request) {\n\t\t\treturn __facade_invoke__(\n\t\t\t\trequest,\n\t\t\t\tthis.env,\n\t\t\t\tthis.ctx,\n\t\t\t\tthis.#dispatcher,\n\t\t\t\tthis.#fetchDispatcher\n\t\t\t);\n\t\t}\n\t};\n}\n\nlet WRAPPED_ENTRY: ExportedHandler | WorkerEntrypointConstructor | undefined;\nif (typeof ENTRY === \"object\") {\n\tWRAPPED_ENTRY = wrapExportedHandler(ENTRY);\n} else if (typeof ENTRY === \"function\") {\n\tWRAPPED_ENTRY = wrapWorkerEntrypoint(ENTRY);\n}\nexport default WRAPPED_ENTRY;\n"], + "mappings": "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", + "names": ["c"] +} diff --git a/index.js b/index.js index 06f5838..83df1b8 100644 --- a/index.js +++ b/index.js @@ -142,9 +142,19 @@ app.get('/proxy', async (req, res) => { }); } + // Automatically resolve Kwik URLs + if (url.includes('kwik.cx/e/') || url.includes('kwik.si/e/') || url.match(/kwik\.[a-z]+\/e\//)) { + try { + const result = await pahe.resolveKwikWithNode(url); + const redirectUrl = `/proxy?url=${encodeURIComponent(result.m3u8)}&referer=${encodeURIComponent(result.referer)}`; + return res.redirect(302, redirectUrl); + } catch (e) { + console.error('Failed to auto-resolve Kwik URL:', e); + return res.status(500).json({ error: 'Failed to resolve Kwik URL', details: e.message }); + } + } + const axios = require('axios'); - - // Use custom referer if provided, otherwise extract from URL const urlObj = new URL(url); const referer = customReferer || `${urlObj.protocol}//${urlObj.host}/`; @@ -162,83 +172,72 @@ app.get('/proxy', async (req, res) => { 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'cross-site' }, - responseType: 'arraybuffer', + responseType: 'stream', timeout: 30000, maxRedirects: 5, validateStatus: function (status) { - return status >= 200 && status < 500; // Accept 4xx errors to handle them + return status >= 200 && status < 500; } }); - // Check if we got blocked if (response.status === 403) { return res.status(403).json({ error: 'Access forbidden - CDN blocked the request', - suggestion: 'The video CDN is blocking server requests. Try using a browser extension or different source.', url: url }); } - // Determine content type const contentType = response.headers['content-type'] || (url.includes('.m3u8') ? 'application/vnd.apple.mpegurl' : url.includes('.ts') ? 'video/mp2t' : 'application/octet-stream'); - // If it's an m3u8 playlist, modify URLs to go through proxy if (contentType.includes('mpegurl') || url.includes('.m3u8')) { - let content = response.data.toString('utf-8'); - - // Replace relative URLs with proxied absolute URLs - const baseUrl = url.substring(0, url.lastIndexOf('/') + 1); - const refererParam = customReferer ? `&referer=${encodeURIComponent(customReferer)}` : ''; - content = content.split('\n').map(line => { - line = line.trim(); - if (line && !line.startsWith('#') && !line.startsWith('http')) { - // Relative URL - make it absolute and proxy it - const absoluteUrl = baseUrl + line; - return `/proxy?url=${encodeURIComponent(absoluteUrl)}${refererParam}`; - } else if (line.startsWith('http')) { - // Absolute URL - proxy it - return `/proxy?url=${encodeURIComponent(line)}${refererParam}`; - } - return line; - }).join('\n'); + let content = ''; + response.data.on('data', chunk => { content += chunk.toString(); }); + response.data.on('end', () => { + const baseUrl = url.substring(0, url.lastIndexOf('/') + 1); + const refererParam = customReferer ? `&referer=${encodeURIComponent(customReferer)}` : ''; + const modified = content.split('\n').map(line => { + const t = line.trim(); + if (t.startsWith('#')) { + // Rewrite URIs in tags like #EXT-X-KEY:METHOD=AES-128,URI="..." + if (t.includes('URI="')) { + return t.replace(/URI="([^"]+)"/, (match, uri) => { + let fullUrl = uri; + if (!uri.startsWith('http')) { + fullUrl = baseUrl + uri; + } + return `URI="/proxy?url=${encodeURIComponent(fullUrl)}${refererParam}"`; + }); + } + return line; + } else if (t && !t.startsWith('http')) { + return `/proxy?url=${encodeURIComponent(baseUrl + t)}${refererParam}`; + } else if (t.startsWith('http')) { + return `/proxy?url=${encodeURIComponent(t)}${refererParam}`; + } + return line; + }).join('\n'); - res.setHeader('Content-Type', contentType); - res.setHeader('Access-Control-Allow-Origin', '*'); - res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS'); - res.setHeader('Access-Control-Allow-Headers', 'Range, Content-Type'); - res.send(content); + res.setHeader('Content-Type', contentType); + res.setHeader('Access-Control-Allow-Origin', '*'); + res.send(modified); + }); } else { - // Video segment or other binary content res.setHeader('Content-Type', contentType); res.setHeader('Access-Control-Allow-Origin', '*'); - res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS'); - res.setHeader('Access-Control-Allow-Headers', 'Range, Content-Type'); res.setHeader('Accept-Ranges', 'bytes'); + if (response.headers['content-length']) res.setHeader('Content-Length', response.headers['content-length']); + if (response.headers['content-range']) res.setHeader('Content-Range', response.headers['content-range']); - if (response.headers['content-length']) { - res.setHeader('Content-Length', response.headers['content-length']); - } - - res.send(Buffer.from(response.data)); + res.status(response.status); + response.data.pipe(res); } } catch (error) { - console.error('Proxy error:', error.message); - if (error.response && error.response.status === 403) { - return res.status(403).json({ - error: 'Access forbidden - CDN blocked the request', - suggestion: 'The video CDN has Cloudflare protection. You may need to use a CORS proxy service or browser extension.', - url: req.query.url - }); + return res.status(403).json({ error: 'Access forbidden - CDN blocked the request' }); } - - res.status(500).json({ - error: error.message, - url: req.query.url, - suggestion: 'Try accessing the M3U8 URL directly in your browser or use a CORS proxy service' - }); + res.status(500).json({ error: error.message }); } }); @@ -268,3 +267,8 @@ if (require.main === module) { console.log(`Animepahe API server running on port ${PORT}`); }); } + + + + + diff --git a/lib/animepahe.js b/lib/animepahe.js index 3a67ea9..e383825 100644 --- a/lib/animepahe.js +++ b/lib/animepahe.js @@ -501,6 +501,7 @@ ${transformedScript} }); }); } + } module.exports = AnimePahe; diff --git a/package-lock.json b/package-lock.json index b7508ee..5601e51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,8 @@ "cheerio": "^1.0.0-rc.12", "cloudscraper": "^4.6.0", "cors": "^2.8.5", - "express": "^4.18.2" + "express": "^4.18.2", + "jsdom": "^29.0.2" }, "devDependencies": { "fast-check": "^3.15.0", @@ -24,6 +25,42 @@ "node": ">=18.0.0" } }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.8.tgz", + "integrity": "sha512-OISPR9c2uPo23rUdvfEQiLPjoMLOpEeLNnP5iGkxr6tDDxJd3NjD+6fxY0mdaMbIPUjFGL4HFOJqLvow5q4aqQ==", + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^3.1.1", + "@csstools/css-color-parser": "^4.0.2", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.0.8.tgz", + "integrity": "sha512-erMO6FgtM02dC24NGm0xufMzWz5OF0wXKR7BpvGD973bq/GbmR8/DbxNZbj0YevQ5hlToJaWSVK/G9/NDgGEVw==", + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "license": "MIT" + }, "node_modules/@babel/code-frame": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", @@ -570,6 +607,169 @@ "dev": true, "license": "MIT" }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz", + "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz", + "integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.1.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.2.tgz", + "integrity": "sha512-5GkLzz4prTIpoyeUiIu3iV6CSG3Plo7xRVOFPKI7FVEJ3mZ0A8SwK0XU3Gl7xAkiQ+mDyam+NNp875/C5y+jSA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1402,6 +1602,15 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -1917,6 +2126,19 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/css-what": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", @@ -1942,6 +2164,28 @@ "node": ">=0.10" } }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1951,6 +2195,12 @@ "ms": "2.0.0" } }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, "node_modules/dedent": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", @@ -2779,6 +3029,18 @@ "node": ">= 0.4" } }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -2985,6 +3247,12 @@ "node": ">=0.12.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -3752,6 +4020,100 @@ "license": "MIT", "peer": true }, + "node_modules/jsdom": { + "version": "29.0.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.2.tgz", + "integrity": "sha512-9VnGEBosc/ZpwyOsJBCQ/3I5p7Q5ngOY14a9bf5btenAORmZfDse1ZEheMiWcJ3h81+Fv7HmJFdS0szo/waF2w==", + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.1.5", + "@asamuzakjp/dom-selector": "^7.0.6", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.1", + "@exodus/bytes": "^1.15.0", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.7", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.1", + "undici": "^7.24.5", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.1", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/lru-cache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.3.tgz", + "integrity": "sha512-JvNw9Y81y33E+BEYPr0U7omo+U9AySnsMsEiXgwT6yqd31VQWTLNQqmT4ou5eqPFUrTfIDFta2wKhB1hyohtAQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/jsdom/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -3925,6 +4287,12 @@ "node": ">= 0.4" } }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "license": "CC0-1.0" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -4703,6 +5071,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -4783,6 +5160,18 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4973,6 +5362,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", @@ -5149,6 +5547,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -5164,6 +5568,24 @@ "node": ">=8" } }, + "node_modules/tldts": { + "version": "7.0.28", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.28.tgz", + "integrity": "sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==", + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.28" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.28", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.28.tgz", + "integrity": "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==", + "license": "MIT" + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -5206,6 +5628,18 @@ "node": ">=0.8" } }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -5263,9 +5697,9 @@ } }, "node_modules/undici": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", - "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.7.tgz", + "integrity": "sha512-H/nlJ/h0ggGC+uRL3ovD+G0i4bqhvsDOpbDv7At5eFLlj2b41L8QliGbnl2H7SnDiYhENphh1tQFJZf+MyfLsQ==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -5387,6 +5821,18 @@ "extsprintf": "^1.2.0" } }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -5397,6 +5843,15 @@ "makeerror": "1.0.12" } }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -5419,6 +5874,20 @@ "node": ">=18" } }, + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5474,6 +5943,21 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/test_unpacker.js b/test_unpacker.js new file mode 100644 index 0000000..66bb8e2 --- /dev/null +++ b/test_unpacker.js @@ -0,0 +1,25 @@ +const html = ``; + +function unpack(p, a, c, k) { + const e = function (c) { + return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36)); + }; + while (c--) { + if (k[c]) { + p = p.replace(new RegExp('\\\\b' + e(c) + '\\\\b', 'g'), k[c]); + } + } + return p; +} + +const match = html.match(/eval\(function\(p,a,c,k,e,d\).*?return p}\('(.*?)',(\d+),(\d+),'([^']+)'\.split\('\|'\)/); +if (match) { + const p = match[1]; + const a = parseInt(match[2], 10); + const c = parseInt(match[3], 10); + const k = match[4].split('|'); + const unpacked = unpack(p, a, c, k); + console.log(unpacked); +} else { + console.log("No match"); +}