load.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. 'use strict';
  2. var utils = require('./utils');
  3. var external = require("./external");
  4. var utf8 = require('./utf8');
  5. var ZipEntries = require('./zipEntries');
  6. var Crc32Probe = require('./stream/Crc32Probe');
  7. var nodejsUtils = require("./nodejsUtils");
  8. /**
  9. * Check the CRC32 of an entry.
  10. * @param {ZipEntry} zipEntry the zip entry to check.
  11. * @return {Promise} the result.
  12. */
  13. function checkEntryCRC32(zipEntry) {
  14. return new external.Promise(function (resolve, reject) {
  15. var worker = zipEntry.decompressed.getContentWorker().pipe(new Crc32Probe());
  16. worker.on("error", function (e) {
  17. reject(e);
  18. })
  19. .on("end", function () {
  20. if (worker.streamInfo.crc32 !== zipEntry.decompressed.crc32) {
  21. reject(new Error("Corrupted zip : CRC32 mismatch"));
  22. } else {
  23. resolve();
  24. }
  25. })
  26. .resume();
  27. });
  28. }
  29. module.exports = function (data, options) {
  30. var zip = this;
  31. options = utils.extend(options || {}, {
  32. base64: false,
  33. checkCRC32: false,
  34. optimizedBinaryString: false,
  35. createFolders: false,
  36. decodeFileName: utf8.utf8decode
  37. });
  38. if (nodejsUtils.isNode && nodejsUtils.isStream(data)) {
  39. return external.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file."));
  40. }
  41. return utils.prepareContent("the loaded zip file", data, true, options.optimizedBinaryString, options.base64)
  42. .then(function (data) {
  43. var zipEntries = new ZipEntries(options);
  44. zipEntries.load(data);
  45. return zipEntries;
  46. }).then(function checkCRC32(zipEntries) {
  47. var promises = [external.Promise.resolve(zipEntries)];
  48. var files = zipEntries.files;
  49. if (options.checkCRC32) {
  50. for (var i = 0; i < files.length; i++) {
  51. promises.push(checkEntryCRC32(files[i]));
  52. }
  53. }
  54. return external.Promise.all(promises);
  55. }).then(function addFiles(results) {
  56. var zipEntries = results.shift();
  57. var files = zipEntries.files;
  58. for (var i = 0; i < files.length; i++) {
  59. var input = files[i];
  60. zip.file(input.fileNameStr, input.decompressed, {
  61. binary: true,
  62. optimizedBinaryString: true,
  63. date: input.date,
  64. dir: input.dir,
  65. comment: input.fileCommentStr.length ? input.fileCommentStr : null,
  66. unixPermissions: input.unixPermissions,
  67. dosPermissions: input.dosPermissions,
  68. createFolders: options.createFolders
  69. });
  70. }
  71. if (zipEntries.zipComment.length) {
  72. zip.comment = zipEntries.zipComment;
  73. }
  74. return zip;
  75. });
  76. };