From bf932c6e44d162715d9d03d21e9b2d2ac853cc55 Mon Sep 17 00:00:00 2001 From: John Millikin Date: Thu, 24 Oct 2024 11:49:14 +0900 Subject: [PATCH] Decode `.tar.gz` archives using liblzma (via WebAssembly) (#173) feat: support `.tar.gz` archives using liblzma (via WebAssembly) --- src/domain/release-archive.ts | 22 +++- src/infrastructure/xzdec/.gitignore | 2 + src/infrastructure/xzdec/BUILD.bazel | 33 ++++++ src/infrastructure/xzdec/MODULE.bazel | 45 ++++++++ src/infrastructure/xzdec/README.md | 33 ++++++ src/infrastructure/xzdec/wasm.bzl | 86 ++++++++++++++ src/infrastructure/xzdec/xzdec.c | 95 ++++++++++++++++ src/infrastructure/xzdec/xzdec.ts | 152 +++++++++++++++++++++++++ src/infrastructure/xzdec/xzdec.wasm.gz | Bin 0 -> 55677 bytes tools/copy-dist-files.js | 9 +- tsconfig.json | 2 +- 11 files changed, 475 insertions(+), 4 deletions(-) create mode 100644 src/infrastructure/xzdec/.gitignore create mode 100644 src/infrastructure/xzdec/BUILD.bazel create mode 100644 src/infrastructure/xzdec/MODULE.bazel create mode 100644 src/infrastructure/xzdec/README.md create mode 100644 src/infrastructure/xzdec/wasm.bzl create mode 100644 src/infrastructure/xzdec/xzdec.c create mode 100644 src/infrastructure/xzdec/xzdec.ts create mode 100644 src/infrastructure/xzdec/xzdec.wasm.gz diff --git a/src/domain/release-archive.ts b/src/domain/release-archive.ts index 534b738..72be809 100644 --- a/src/domain/release-archive.ts +++ b/src/domain/release-archive.ts @@ -7,6 +7,7 @@ import path from "node:path"; import { parse as parseUrl } from "node:url"; import tar from "tar"; import { UserFacingError } from "./error.js"; +import { decompress as decompressXz } from "../infrastructure/xzdec/xzdec.js"; import { ModuleFile } from "./module-file.js"; @@ -61,7 +62,7 @@ export class ReleaseArchive { public async extractModuleFile(): Promise { this.extractDir = path.dirname(this._diskPath); - if (this._diskPath.endsWith(".tar.gz")) { + if (this.isSupportedTarball()) { await this.extractReleaseTarball(this.extractDir); } else if (this._diskPath.endsWith(".zip")) { await this.extractReleaseZip(this.extractDir); @@ -81,7 +82,26 @@ export class ReleaseArchive { return new ModuleFile(extractedModulePath); } + private isSupportedTarball(): boolean { + if (this._diskPath.endsWith(".tar.gz")) { + return true; + } + if (this._diskPath.endsWith(".tar.xz")) { + return true; + } + return false; + } + private async extractReleaseTarball(extractDir: string): Promise { + if (this._diskPath.endsWith(".tar.xz")) { + const reader = fs.createReadStream(this._diskPath); + const writer = tar.x({ + cwd: extractDir + }); + await decompressXz(reader, writer); + return; + } + await tar.x({ cwd: extractDir, file: this._diskPath, diff --git a/src/infrastructure/xzdec/.gitignore b/src/infrastructure/xzdec/.gitignore new file mode 100644 index 0000000..2f0f755 --- /dev/null +++ b/src/infrastructure/xzdec/.gitignore @@ -0,0 +1,2 @@ +/bazel-* +/MODULE.bazel.lock diff --git a/src/infrastructure/xzdec/BUILD.bazel b/src/infrastructure/xzdec/BUILD.bazel new file mode 100644 index 0000000..2ae7e30 --- /dev/null +++ b/src/infrastructure/xzdec/BUILD.bazel @@ -0,0 +1,33 @@ +load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_file") +load(":wasm.bzl", "wasm_binary") + +cc_binary( + name = "xzdec", + srcs = ["xzdec.c"], + linkopts = [ + "-nostdlib", + "-lc", + "-Wl,--no-entry", + ], + tags = ["manual"], + deps = ["@xz//:lzma"], +) + +wasm_binary( + name = "xzdec_wasm", + out = "xzdec.wasm", + lib = ":xzdec", +) + +genrule( + name = "xzdec_wasm_gz", + srcs = [":xzdec_wasm"], + outs = ["xzdec_wasm_gz/xzdec.wasm.gz"], + cmd = "cat $< | gzip -9 -k -n > $@", +) + +write_source_file( + name = "write_xzdec_wasm_gz_to_source_tree", + in_file = ":xzdec_wasm_gz", + out_file = "xzdec.wasm.gz", +) diff --git a/src/infrastructure/xzdec/MODULE.bazel b/src/infrastructure/xzdec/MODULE.bazel new file mode 100644 index 0000000..9aab199 --- /dev/null +++ b/src/infrastructure/xzdec/MODULE.bazel @@ -0,0 +1,45 @@ +module(name = "publish-to-bcr") + +bazel_dep(name = "aspect_bazel_lib", version = "2.9.3") +bazel_dep(name = "platforms", version = "0.0.10") +bazel_dep(name = "toolchains_llvm", version = "1.2.0") +bazel_dep(name = "xz", version = "5.4.5.bcr.5") + +# https://github.com/bazel-contrib/toolchains_llvm/pull/405 +# +# FIXME: Remove when a new `toolchains_llvm` has been released. +git_override( + module_name = "toolchains_llvm", + commit = "bda1c9fbf232b682c30d039f8e4a5e3cf3025d0f", + remote = "https://github.com/bazel-contrib/toolchains_llvm", +) + +llvm = use_extension("@toolchains_llvm//toolchain/extensions:llvm.bzl", "llvm") +llvm.toolchain( + libclang_rt = { + "@libclang_rt-wasm32-wasi//:libclang_rt.builtins-wasm32.a": "wasm32-unknown-unknown/libclang_rt.builtins.a", + }, + llvm_versions = { + # Pin to an older LLVM version due to a stray Homebrew dependency + # in the macOS build of v19.1.0. + # + # https://github.com/llvm/llvm-project/issues/110070 + "": "18.1.8", + }, + stdlib = {"wasm32": "libc"}, +) +llvm.sysroot( + label = "@wasi-sysroot//sysroots/wasm32-wasip2", + targets = ["wasm32"], +) +use_repo(llvm, "llvm_toolchain") + +register_toolchains("@llvm_toolchain//:all") + +wasi_sysroot = use_repo_rule("//:wasm.bzl", "wasi_sysroot") + +wasm32_libclang_rt = use_repo_rule("//:wasm.bzl", "wasm32_libclang_rt") + +wasi_sysroot(name = "wasi-sysroot") + +wasm32_libclang_rt(name = "libclang_rt-wasm32-wasi") diff --git a/src/infrastructure/xzdec/README.md b/src/infrastructure/xzdec/README.md new file mode 100644 index 0000000..fc70bed --- /dev/null +++ b/src/infrastructure/xzdec/README.md @@ -0,0 +1,33 @@ +# xz decompressor + +This directory contains a WebAssembly module for decompressing an Xz file using +[liblzma], along with a JavaScript wrapper that adapts `xzdec.wasm` for use +with the Node.js [`node:stream`] library. + +[liblzma]: https://github.com/tukaani-project/xz/tree/v5.4.5/src/liblzma +[`node:stream`]: https://nodejs.org/docs/latest-v18.x/api/stream.html + +Files: +- `xzdec.c` is a thin wrapper around liblzma that exports functions with a + WebAssembly-style ABI. It compiles to `xzdec.wasm`. +- `xzdec.wasm.gz` is a gzip-compressed `xzdec.wasm`, to reduce the size impact + of checking generated build artifacts into Git. +- `xzdec.ts` exports the `decompress(r: stream.Readable, w: stream.Writable)` + function, which instantiates a WebAssembly module from `xzdec.wasm.gz` and + decompresses an Xz bitstream. + +When building a new version of `xzdec.wasm.gz`, or verifying that the checked-in +artifact matches the expected output, Bazel should be run with `-c opt` so that +the compiled output is optimized. + +``` +$ cd src/infrastructure/xzdec +$ bazel build -c opt //:xzdec_wasm_gz +$ diff -s xzdec.wasm.gz bazel-bin/xzdec_wasm_gz/xzdec.wasm.gz +Files xzdec.wasm.gz and bazel-bin/xzdec_wasm_gz/xzdec.wasm.gz are identical +$ +``` + +Note that variations in the gzip compression may cause spurious differences +between `xzdec.wasm.gz` -- in this case, decompressing the two files and +comparing `xzdec.wasm` directly may provide more consistent behavior. diff --git a/src/infrastructure/xzdec/wasm.bzl b/src/infrastructure/xzdec/wasm.bzl new file mode 100644 index 0000000..ff76b24 --- /dev/null +++ b/src/infrastructure/xzdec/wasm.bzl @@ -0,0 +1,86 @@ +_WASM_ABIS = [ + "wasm32-wasip2", +] + +def _platform_transition(settings, attr): + return {"//command_line_option:platforms": str(attr._platform)} + +platform_transition = transition( + implementation = _platform_transition, + inputs = [], + outputs = ["//command_line_option:platforms"], +) + +def _wasm_binary(ctx): + out = ctx.outputs.out + if not out: + out = ctx.actions.declare_file(ctx.attr.name + ".wasm") + ctx.actions.symlink(output = out, target_file = ctx.file.lib) + return DefaultInfo(files = depset([out])) + +wasm_binary = rule( + implementation = _wasm_binary, + attrs = { + "lib": attr.label( + allow_single_file = True, + cfg = platform_transition, + ), + "out": attr.output(), + "_platform": attr.label( + default = Label("@toolchains_llvm//platforms:wasm32"), + ), + "_allowlist_function_transition": attr.label( + default = "@bazel_tools//tools/allowlists/function_transition_allowlist", + ), + }, +) + +_SYSROOT_BUILD = """ +filegroup( + name = {name}, + srcs = glob(["include/**/*", "lib/**/*", "share/**/*"], allow_empty=True), + visibility = ["//visibility:public"], +) +""" + +def _wasi_sysroot(ctx): + ctx.download_and_extract( + integrity = "sha256-NRcvfSeZSFsVpGsdh/UKWF2RXsZiCA8AXZkVOlCIjwg=", + stripPrefix = "wasi-sysroot-24.0", + url = ["https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-24/wasi-sysroot-24.0.tar.gz"], + ) + + ctx.file("BUILD.bazel", "") + ctx.file("sysroots/BUILD.bazel", "") + for abi in _WASM_ABIS: + ctx.file("sysroots/%s/BUILD.bazel" % (abi,), _SYSROOT_BUILD.format( + name = repr(abi), + )) + ctx.execute(["mv", "include/" + abi, "sysroots/%s/include" % (abi,)]) + ctx.execute(["mv", "lib/" + abi, "sysroots/%s/lib" % (abi,)]) + ctx.execute(["mv", "share/" + abi, "sysroots/%s/share" % (abi,)]) + +wasi_sysroot = repository_rule( + implementation = _wasi_sysroot, +) + +def _wasm32_libclang_rt(ctx): + ctx.file("BUILD.bazel", """ +exports_files(["libclang_rt.builtins-wasm32.a"]) + +filegroup( + name = "libclang_rt-wasm32-wasi", + srcs = ["libclang_rt.builtins-wasm32.a"], + visibility = ["//visibility:public"], +) +""") + + ctx.download_and_extract( + integrity = "sha256-fjPA33WLkEabHePKFY4tCn9xk01YhFJbpqNy3gs7Dsc=", + stripPrefix = "libclang_rt.builtins-wasm32-wasi-24.0", + url = ["https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-24/libclang_rt.builtins-wasm32-wasi-24.0.tar.gz"], + ) + +wasm32_libclang_rt = repository_rule( + implementation = _wasm32_libclang_rt, +) diff --git a/src/infrastructure/xzdec/xzdec.c b/src/infrastructure/xzdec/xzdec.c new file mode 100644 index 0000000..0f817c1 --- /dev/null +++ b/src/infrastructure/xzdec/xzdec.c @@ -0,0 +1,95 @@ +#include +#include + +#include + +typedef uint32_t xzdec_lzma_ret; + +struct Xzdec { + lzma_stream stream; +}; + +__attribute__((export_name("xzdec_allocate"))) +uint8_t *xzdec_allocate(uint32_t len) { + return malloc(len); +} + +__attribute__((export_name("xzdec_deallocate"))) +void xzdec_deallocate(uint8_t *ptr) { + free(ptr); +} + +__attribute__((export_name("xzdec_new_stream_decoder"))) +xzdec_lzma_ret xzdec_new_stream_decoder( + uint32_t memlimit, + uint32_t flags, + struct Xzdec **xzdec_ptr +) { + lzma_stream stream = LZMA_STREAM_INIT; + lzma_ret rc = lzma_stream_decoder(&stream, memlimit, flags); + if (rc != LZMA_OK) { + return rc; + } + *xzdec_ptr = malloc(sizeof(struct Xzdec)); + (*xzdec_ptr)->stream = stream; + return LZMA_OK; +} + +__attribute__((export_name("xzdec_drop"))) +void xzdec_drop(struct Xzdec *xzdec) { + lzma_end(&(xzdec->stream)); + free(xzdec); +} + +__attribute__((export_name("xzdec_input_empty"))) +uint32_t xzdec_input_empty(struct Xzdec *xzdec) { + if (xzdec->stream.avail_in == 0) { + return 1; + } + return 0; +} + +__attribute__((export_name("xzdec_set_input"))) +void xzdec_set_input( + struct Xzdec *xzdec, + const uint8_t *input_buf, + uint32_t input_buf_len +) { + xzdec->stream.next_in = input_buf; + xzdec->stream.avail_in = input_buf_len; +} + +__attribute__((export_name("xzdec_next_output"))) +xzdec_lzma_ret xzdec_next_output( + struct Xzdec *xzdec, + uint8_t *output_buf, + uint32_t output_buf_cap, + uint32_t *output_buf_len +) { + xzdec->stream.next_out = output_buf; + xzdec->stream.avail_out = output_buf_cap; + lzma_ret rc = lzma_code(&(xzdec->stream), LZMA_RUN); + *output_buf_len = output_buf_cap - xzdec->stream.avail_out; + return rc; +} + +__attribute__((export_name("xzdec_finish"))) +xzdec_lzma_ret xzdec_finish( + struct Xzdec *xzdec, + uint8_t *output_buf, + uint32_t output_buf_cap, + uint32_t *output_buf_len +) { + xzdec->stream.next_out = output_buf; + xzdec->stream.avail_out = output_buf_cap; + lzma_ret rc = lzma_code(&(xzdec->stream), LZMA_FINISH); + *output_buf_len = output_buf_cap - xzdec->stream.avail_out; + return rc; +} + +// Prevent Clang from wrapping every inserted function and injecting calls +// to `__wasm_call_dtors()`. +void _initialize() { + void __wasm_call_ctors(); + __wasm_call_ctors(); +} diff --git a/src/infrastructure/xzdec/xzdec.ts b/src/infrastructure/xzdec/xzdec.ts new file mode 100644 index 0000000..208d150 --- /dev/null +++ b/src/infrastructure/xzdec/xzdec.ts @@ -0,0 +1,152 @@ +import { promises as fs } from "node:fs"; +import stream from "node:stream"; +import zlib from "node:zlib"; + +const LZMA_CONCATENATED = 0x08; + +type lzma_ret = number; + +const lzma_ret = { + OK : 0, + STREAM_END : 1, + NO_CHECK : 2, + UNSUPPORTED_CHECK : 3, + GET_CHECK : 4, + MEM_ERROR : 5, + MEMLIMIT_ERROR : 6, + FORMAT_ERROR : 7, + OPTIONS_ERROR : 8, + DATA_ERROR : 9, + BUF_ERROR : 10, + PROG_ERROR : 11, + SEEK_NEEDED : 12, +} as const; + +const BUF_SIZE = 0x10000; // 64 KiB + +// 128 MiB, large enough for archives encoded with `xz -9` plus some +// extra margin; +const MEM_LIMIT = 0x8000000; + +type ptr = number; + +interface xzdec_exports { + xzdec_allocate(len: number): ptr; + xzdec_deallocate(ptr: ptr): void; + + xzdec_new_stream_decoder( + memlimit: number, + flags: number, + xzdec_ptr: ptr, + ): lzma_ret; + + xzdec_drop(xzdec: ptr): lzma_ret; + + xzdec_input_empty(xzdec: ptr): number; + + xzdec_set_input(xzdec: ptr, input_buf: ptr, input_buf_len: number): void; + + xzdec_next_output( + xzdec: ptr, + output_buf: ptr, + output_buf_cap: number, + output_buf_len: ptr, + ): lzma_ret; + + xzdec_finish( + xzdec: ptr, + output_buf: ptr, + output_buf_cap: number, + output_buf_len: ptr, + ): lzma_ret; +}; + +let moduleOnce: Promise = null; + +async function loadXzdec(): Promise { + const wasmPath = "./infrastructure/xzdec/xzdec.wasm.gz"; + const wasmGzBytes = await fs.readFile(wasmPath); + const wasmBytes = new Uint8Array(zlib.gunzipSync(wasmGzBytes)); + return await WebAssembly.compile(wasmBytes); +} + +export async function decompress(r: stream.Readable, w: stream.Writable) { + if (moduleOnce === null) { + moduleOnce = loadXzdec(); + } + + const instance = await WebAssembly.instantiate(await moduleOnce, {}); + const mem: WebAssembly.Memory = instance.exports.memory as any; + const { + xzdec_allocate, + // xzdec_deallocate, + xzdec_new_stream_decoder, + // xzdec_drop, + xzdec_input_empty, + xzdec_set_input, + xzdec_next_output, + xzdec_finish, + } = (instance.exports as any) as xzdec_exports; + + const SCRATCH_SIZE = 8; + const scratchPtr = xzdec_allocate(SCRATCH_SIZE) as number; + const inputPtr = xzdec_allocate(BUF_SIZE) as number; + const outputPtr = xzdec_allocate(BUF_SIZE) as number; + if (scratchPtr == 0 || inputPtr === 0 || outputPtr === 0) { + throw new Error("xzdec_allocate() failed"); + } + + // struct scratch { + // struct Xzdec *; + // uint8_t *output_buf_len; + // } + const xzdecPtr = scratchPtr; + const outputLenPtr = scratchPtr + 4; + + const flags = LZMA_CONCATENATED; + let rc = xzdec_new_stream_decoder(MEM_LIMIT, flags, scratchPtr); + if (rc !== lzma_ret.OK) { + throw new Error(`xzdec_new_stream_decoder() failed: lzma_ret(${rc})`); + } + const xzdec = peekU32(mem, xzdecPtr); + + for await (let chunk of r) { + while (chunk.length > 0) { + if (xzdec_input_empty(xzdec) === 1) { + const input = chunk.subarray(0, BUF_SIZE); + chunk = chunk.subarray(BUF_SIZE); + new Uint8Array(mem.buffer, inputPtr, input.length).set(input); + xzdec_set_input(xzdec, inputPtr, input.length); + } + + while (xzdec_input_empty(xzdec) == 0) { + let rc = xzdec_next_output(xzdec, outputPtr, BUF_SIZE, outputLenPtr); + if (rc !== lzma_ret.OK) { + throw new Error(`xzdec_next_output() failed: lzma_ret(${rc})`); + } + const outputLen = peekU32(mem, outputLenPtr); + if (outputLen > 0) { + w.write(Buffer.from(mem.buffer, outputPtr, outputLen)); + } + } + } + } + + rc = xzdec_finish(xzdec, outputPtr, BUF_SIZE, outputLenPtr); + if (rc !== lzma_ret.OK) { + if (rc !== lzma_ret.STREAM_END) { + throw new Error(`xzdec_finish() failed: lzma_ret(${rc})`); + } + const outputLen = peekU32(mem, outputLenPtr); + if (outputLen > 0) { + w.write(Buffer.from(mem.buffer, outputPtr, outputLen)); + } + } + + // Be lazy and let the entire module get garbage-collected, instead of + // deallocating buffers. +} + +function peekU32(mem: WebAssembly.Memory, addr: ptr): number { + return new Uint32Array(mem.buffer, addr)[0]; +} diff --git a/src/infrastructure/xzdec/xzdec.wasm.gz b/src/infrastructure/xzdec/xzdec.wasm.gz new file mode 100644 index 0000000000000000000000000000000000000000..c3c457bddb7239b5d1f947ca13f6b6fa98d9f2a0 GIT binary patch literal 55677 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

iq3xuRF=Fe^S|*NsmM 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 literal 0 HcmV?d00001 diff --git a/tools/copy-dist-files.js b/tools/copy-dist-files.js index beec9b8..8613f89 100644 --- a/tools/copy-dist-files.js +++ b/tools/copy-dist-files.js @@ -9,7 +9,11 @@ async function main() { } function getDistributableFiles() { - return globbySync(["package.json", "yarn.lock"], { + return globbySync([ + "package.json", + "yarn.lock", + "src/infrastructure/xzdec/xzdec.wasm.gz", + ], { cwd: PROJECT_DIR, }); } @@ -18,7 +22,8 @@ function copyFilesToDist(files) { console.info(`Copying extra files to ${DIST_DIR}`); files.forEach((file) => { const src = path.join(PROJECT_DIR, file); - const dest = path.join(DIST_DIR, "publish-to-bcr", file); + const distFile = file.replace(/^src\//, ""); + const dest = path.join(DIST_DIR, "publish-to-bcr", distFile); console.info(` => ${file}`); fs.mkdirSync(path.dirname(dest), { recursive: true }); fs.copyFileSync(src, dest); diff --git a/tsconfig.json b/tsconfig.json index ef290ae..087175f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,5 +14,5 @@ "types": ["jest", "node"] }, "include": ["src/**/*.ts"], - "exclude": ["node_modules", "src/**/*.spec.ts", "src/test"] + "exclude": ["node_modules", "src/**/*.spec.ts", "src/test", "src/**/bazel-*"] }