Răsfoiți Sursa

fix parseZipFile method

Ryu Sato 2 ani în urmă
părinte
comite
8157290830
1 a modificat fișierele cu 17 adăugiri și 6 ștergeri
  1. 17 6
      apps/app/src/server/service/growi-bridge.ts

+ 17 - 6
apps/app/src/server/service/growi-bridge.ts

@@ -1,3 +1,5 @@
+import { Transform } from 'stream';
+
 import { Model } from 'mongoose';
 import { Model } from 'mongoose';
 import unzipStream, { Entry } from 'unzip-stream';
 import unzipStream, { Entry } from 'unzip-stream';
 
 
@@ -100,17 +102,25 @@ class GrowiBridgeService {
 
 
     const readStream = fs.createReadStream(zipFile);
     const readStream = fs.createReadStream(zipFile);
     const unzipStreamPipe = readStream.pipe(unzipStream.Parse());
     const unzipStreamPipe = readStream.pipe(unzipStream.Parse());
+    const entryStreams: Array<Promise<void>> = [];
 
 
-    unzipStreamPipe.on('entry', async(entry: Entry) => {
+    unzipStreamPipe.on('entry', (entry: Entry) => {
       const fileName = entry.path;
       const fileName = entry.path;
       const size = entry.size; // might be undefined in some archives
       const size = entry.size; // might be undefined in some archives
-
       if (fileName === this.getMetaFileName()) {
       if (fileName === this.getMetaFileName()) {
         const metaBuffers: Array<Buffer> = [];
         const metaBuffers: Array<Buffer> = [];
-        for await (const chunk of entry) {
-          metaBuffers.push(Buffer.from(chunk));
-        }
-        meta = JSON.parse(Buffer.concat(metaBuffers).toString());
+        const metaStream = new Transform({
+          transform: (chunk, _encoding, callback) => {
+            metaBuffers.push(Buffer.from(chunk));
+            callback();
+          },
+          final: (callback) => {
+            meta = JSON.parse(Buffer.concat(metaBuffers).toString());
+            callback();
+          },
+        });
+
+        entryStreams.push(streamToPromise(entry.pipe(metaStream)));
       }
       }
       else {
       else {
         innerFileStats.push({
         innerFileStats.push({
@@ -125,6 +135,7 @@ class GrowiBridgeService {
 
 
     try {
     try {
       await streamToPromise(unzipStreamPipe);
       await streamToPromise(unzipStreamPipe);
+      await Promise.all(entryStreams);
     }
     }
     // if zip is broken
     // if zip is broken
     catch (err) {
     catch (err) {