Probably was due to my wrong implementation of asNodeBuffer
and my lack of experience with JS, but I kept extracting the files wrongly.
I wanted to share what end up working for me, I tested it with a 250+ MB file.
...
fs.readFile(tmpFilePath, function (err, data) {
if (err) {
throw err;
}
logger.debug('[method] Before extracting file...');
JSZip.loadAsync(data).then(function (zip) {
var files = Object.keys(zip.files);
logger.debug('[method] files to be created ' + files.length);
// in my case, the folders where not being created while "inflating" the content. created the folders in a separated loop
// O(n) for those geeks on complexity.
createDirectories(files);
createFiles(files, zip, someOtherFunctionReference);
}).catch(function (err) {
deferred.reject(err);
});
});
...
/**
* Sync opperation to create the folders required for the files.
* @param files
*/
function createDirectories(files) {
files.forEach(function (filename) {
var dest = path.join(folderName, filename);
ensureDirectoryExistence(dest);
});
}
/**
* recursive create directory function
* @param filePath
* @returns {boolean}
*/
function ensureDirectoryExistence(filePath) {
var dirname = path.dirname(filePath);
if (fs.existsSync(dirname)) {
return true;
}
ensureDirectoryExistence(dirname);
fs.mkdirSync(dirname);
}
/**
* Create files sync or blocking
* @param files
* @param zip
* @param cb
*/
function createFiles(files, zip, cb) {
try {
var countFilesCreated = 0;
files.forEach(function (filename) {
var dest = path.join(folderName, filename);
// skip directories listed
if (dest.charAt(dest.length - 1) === '/') {
countFilesCreated++;
return;
}
return zip.file(filename).async('nodebuffer').then(function(content){
// var content = zip.files[filename].nodeStream();
fs.writeFileSync(dest, content);
countFilesCreated++;
// proably someone with more experience in JS can implement a promice like solution.
// I thought that in here instead of the counter we coud use an indexOf to return an error in case not all the elements where created correctly.
// but if a file throw an error, its handled by the catch ...
if (countFilesCreated >= files.length) {
logger.debug('All files created!!');
cb();
}
});
});
} catch (err) {
throw err;
}
}
I hope this helps.