| 1234567891011121314151617181920212223242526272829303132333435363738 |
- import SevenZip from "./7z-wasm/7zz.es6.js";
- let sevenZipInstance;
- self.onmessage = async (e) => {
- const { filename, arrayBuffer } = e.data;
- try {
- if (!sevenZipInstance) {
- sevenZipInstance = await SevenZip();
- }
- // 写入 WASM FS
- const data = new Uint8Array(arrayBuffer);
- const stream = sevenZipInstance.FS.open(filename, "w+");
- sevenZipInstance.FS.write(stream, data, 0, data.length);
- sevenZipInstance.FS.close(stream);
- // 调用 7z 解压命令
- // 解压到当前 FS 根目录
- sevenZipInstance.callMain(["x", filename]);
- // 获取解压后的文件列表
- const files = sevenZipInstance.FS.readdir("/").filter(f => f.indexOf('.bin')!=-1);
- const buffers = files.map(f => ({
- name: f,
- data: sevenZipInstance.FS.readFile(f)
- }));
- // 清理 FS,防止堆积
- sevenZipInstance.FS.unlink(filename);
- for (const f of files) sevenZipInstance.FS.unlink(f);
- self.postMessage({ type: "done", result: buffers });
- } catch (err) {
- console.error(`[Worker] 解压失败 ${filename}:`, err);
- self.postMessage({ type: "done", result: null });
- }
- };
|