var JSZip = require("jszip"); var async = require("async"); function unpackzip(emitter) { return function(f) { if (!f) { var p = new Promise(function(resolve, reject) { reject("no file"); }) return p } var p = new Promise(function(resolve, reject) { JSZip.loadAsync(f) // 1) read the Blob .then(function(zip) { var obj = {}; if (zip.files["namespace.manifest"]) { zip.file("namespace.manifest").async("string") .then(function(data) { emitter.emit("namespace", JSON.parse(data), cont) }) } else { emitter.emit("nonamespace", cont) } function cont() { async.mapSeries(zip.files, function(z, next) { if (z.dir) {} else { zip.file(z.name).async("string") .then(function(data) { if (z.name.indexOf(".json") > -1) { emitter.emit("json", z.name, JSON.parse(data)) } else { if (z.name !== "namespace.manifest") { emitter.emit("file", z.name, (data)) } } next() }) } }, function(err, done) { emitter.emit("done") resolve(obj); }) } }, function(e) { reject(e) }); }) return p } } module.exports = unpackzip;