104 lines
3.2 KiB
TypeScript
104 lines
3.2 KiB
TypeScript
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 });
|
|
// }
|
|
// }
|
|
}
|
|
}
|
|
});
|
|
};
|