105 lines
3.3 KiB
TypeScript

import { ensureDir } from "@std/fs/ensure-dir";
import type { Router } from "@bearmetal/router";
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 });
// }
// }
}
}
return new Response("no path provided", { status: 400 });
});
};