7z-worker.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. import SevenZip from "./7z-wasm/7zz.es6.js";
  2. let sevenZipInstance;
  3. self.onmessage = async (e) => {
  4. const { filename, arrayBuffer } = e.data;
  5. try {
  6. if (!sevenZipInstance) {
  7. sevenZipInstance = await SevenZip();
  8. }
  9. // 写入 WASM FS
  10. const data = new Uint8Array(arrayBuffer);
  11. const stream = sevenZipInstance.FS.open(filename, "w+");
  12. sevenZipInstance.FS.write(stream, data, 0, data.length);
  13. sevenZipInstance.FS.close(stream);
  14. // 调用 7z 解压命令
  15. // 解压到当前 FS 根目录
  16. sevenZipInstance.callMain(["x", filename]);
  17. // 获取解压后的文件列表
  18. const files = sevenZipInstance.FS.readdir("/").filter(f => f.indexOf('.bin')!=-1);
  19. const buffers = files.map(f => ({
  20. name: f,
  21. data: sevenZipInstance.FS.readFile(f)
  22. }));
  23. // 清理 FS,防止堆积
  24. sevenZipInstance.FS.unlink(filename);
  25. for (const f of files) sevenZipInstance.FS.unlink(f);
  26. self.postMessage({ type: "done", result: buffers });
  27. } catch (err) {
  28. console.error(`[Worker] 解压失败 ${filename}:`, err);
  29. self.postMessage({ type: "done", result: null });
  30. }
  31. };