The problem#
Previously, I figured out how to extract Tametsi's puzzles,
but I wanted to make something user-friendly that made use of those
puzzles, so I didn't want to require people to install something
or run console commands. I had also figured out how to get Java
programs running in a browser, so I figured it would be
straightforward to combine the two. As you may have guessed from this
paragraph being in the "the problem" section, it was not. Specifically,
while the Java command-line will read tametsi.exe
as a JAR
file, Doppio gives the error
Invalid Zip file: Central directory record has invalid signature
The solution#
As a workaround, use a different library to unzip
tametsi.exe
. There's no need to present it as a JAR file instead of a
directory, so no need to rezip it:
var fs = BrowserFS.BFSRequire("fs");
async function unzipToDirectory(zipfile, dir) {
const z = new zip.fs.FS();
await z.importBlob(zipfile);
async function extract(z, dir) {
fs.mkdir(dir, true)
if (z.directory) {
const childDir = z.name
? `${dir}/${z.name}`
: dir;
for (const child of z.children) {
await extract(child, childDir);
}
} else {
fs.writeFileSync(
`${dir}/${z.name}`,
new buffer(await (await z.getBlob()).arrayBuffer()));
}
}
await extract(z.root, dir);
}
To call that, in the uploadFile()
function, replace the
reader.onload
with
await unzipToDirectory(f, process.cwd() + '/tametsi');