#!/bin/env -S deno run -A const promises = [] as Promise[]; const target = Deno.cwd() + "/target"; const in_flight = new Set(); function wait(ms: number): Promise { return new Promise((res) => setTimeout(() => res(), ms)); } async function block_while(l: () => boolean) { while (l()) await wait(100); } await Deno.mkdir("target", { recursive: true }); await Deno.remove("target", { recursive: true }); await Deno.mkdir("target"); await Deno.mkdir("target/pdf"); await Deno.mkdir("target/png"); for (const set of ["club", "diamond", "heart", "spade"]) { for (let i = 1; i <= 14; i += 1) { const id = `${set}-${i}`; await block_while(() => (in_flight.size >= 8)); promises.push( (async () => { const tmp_path = `/tmp/models-${ Date.now() + Math.floor(Math.random() * 100000) }`; await Deno.mkdir(tmp_path + "/base", { recursive: true }); const [html, pdf, png] = [ `${tmp_path}/base/page.html`, `${target}/pdf/${id}.pdf`, `${target}/png/${id}.png`, ]; await Deno.writeTextFile( html, Deno.readTextFileSync("./models/base/card.html").split("\n").map(( l, ) => l.startsWith(" ` : l ).join("\n"), ); const script = ` cp -r ./models/* "${tmp_path}" cd "${tmp_path}/base" chromium --headless --disable-gpu --run-all-compositor-stages-before-draw --no-pdf-header-footer --print-to-pdf="${pdf}" "${html}" `; await Deno.run({ cmd: ["sh", "-c", script] }).status(); await Deno.run({ cmd: [ "convert", ["-density", "900"], [pdf], ["-quality", "100"], png, ].flat(), }) .status(); console.log(`[gen.ts] completed '${id}'`); in_flight.delete(id); await Deno.remove(tmp_path, { recursive: true }); })(), ); in_flight.add(id); console.log(`[gen.ts] launched '${id}'`); } } await Promise.all(promises); console.log("[gen.ts] done"); if (in_flight.size > 0) { console.log(`[gen.ts] failed '${Array.from(in_flight.keys()).join()}'`); }