import { ensureDir } from "@std/fs/ensure-dir"; import type { Router } from "../router.ts"; import { readDirDirs } from "../util/readDir.ts"; import { versionCompat } from "../util/versionCompat.ts"; import { readBlocks, readItems } from "./readers.ts"; export const createResourcesRoutes = (router: Router) => { router.route("/api/resources/:path*") .get(async (req, ctx) => { const path = ctx.params.path; if (!path) { return new Response("no path provided", { status: 400 }); } const format = ctx.url.searchParams.get("format"); if (!format) { return new Response("no format provided", { status: 400 }); } const packVersion = await Deno.readTextFile( "./pack_versions/" + format + ".json", ); const packVersionJson = JSON.parse(packVersion); const mcVersion = packVersionJson.mcVersion; await ensureDir("./resources"); const resourceVersions = await readDirDirs("./resources"); for (const resourceVersion of resourceVersions) { if (versionCompat(resourceVersion, mcVersion)) { const resourcePath = "./resources/" + resourceVersion; let items: BlockItem[] = []; const batch = ( controller: ReadableStreamDefaultController, res: BlockItem, ) => { items.push(res); if (items.length > 4) { controller.enqueue( new TextEncoder().encode(JSON.stringify(items) + "\n"), ); items = []; } }; const body = new ReadableStream({ async start(controller) { switch (path) { case "block": case "blocks": { await readBlocks(resourcePath, (res, i) => { console.log(i); batch(controller, res); }); controller.close(); break; } case "item": case "items": { await readItems(resourcePath, (res) => { batch(controller, res); }); controller.close(); break; } default: { controller.close(); break; } } }, }); return new Response(body, { headers: { "content-type": "application/json", "access-control-allow-origin": "*", }, }); // const resourcePath = "./resources/" + resourceVersion; // const splitPath = path.split("/"); // switch (splitPath[0]) { // case "block": // case "blocks": { // return new Response( // JSON.stringify(await readBlocks(resourcePath)), // ); // } // case "item": // case "items": { // return new Response( // JSON.stringify(await readBlocks(resourcePath)), // ); // } // default: { // return new Response("invalid path", { status: 400 }); // } // } } } }); };