test-parallel-writes-auto-buffered.js 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /* global Blob, FileReader, setTimeout */
  2. import * as zip from "../../index.js";
  3. const KB = 1024;
  4. const ENTRIES_DATA = [
  5. { name: "entry #1", blob: getBlob(8.5 * KB) }, { name: "entry #2", blob: getBlob(5.2 * KB) }, { name: "entry #3", blob: getBlob(4.7 * KB) },
  6. { name: "entry #4", blob: getBlob(2.8 * KB) }, { name: "entry #5", blob: getBlob(1.9 * KB) }, { name: "entry #6", blob: getBlob(2.2 * KB) },
  7. { name: "entry #7", blob: getBlob(5.1 * KB) }, { name: "entry #8", blob: getBlob(2.6 * KB) }, { name: "entry #9", blob: getBlob(3.1 * KB) }];
  8. const ENTRIES_DATA_PASS2 = [
  9. { name: "entry #1 (pass #2)", blob: getBlob(3.5 * KB) }, { name: "entry #2 (pass #2)", blob: getBlob(2.2 * KB) }, { name: "entry #3 (pass #2)", blob: getBlob(7.7 * KB) },
  10. { name: "entry #4 (pass #2)", blob: getBlob(1.3 * KB) }, { name: "entry #5 (pass #2)", blob: getBlob(5.2 * KB) }, { name: "entry #6 (pass #2)", blob: getBlob(4.1 * KB) },
  11. { name: "entry #7 (pass #2)", blob: getBlob(1.0 * KB) }, { name: "entry #8 (pass #2)", blob: getBlob(6.2 * KB) }, { name: "entry #9 (pass #2)", blob: getBlob(8.4 * KB) }];
  12. export { test };
  13. async function test() {
  14. zip.configure({ chunkSize: 512 });
  15. const blobWriter = new zip.BlobWriter("application/zip");
  16. const zipWriter = new zip.ZipWriter(blobWriter);
  17. await Promise.all(ENTRIES_DATA.map(entryData => zipWriter.add(entryData.name, new zip.BlobReader(entryData.blob), { level: Math.random() > .5 ? 5 : 0 })));
  18. await Promise.all(ENTRIES_DATA_PASS2.map((entryData, indexEntry) =>
  19. new Promise((resolve, reject) => {
  20. setTimeout(async () => {
  21. try {
  22. resolve(await zipWriter.add(entryData.name, new zip.BlobReader(entryData.blob), { useWebWorkers: Math.random() > .5 }));
  23. } catch (error) {
  24. reject(error);
  25. }
  26. }, Math.random() * 250 + (indexEntry * 100));
  27. })
  28. ));
  29. await zipWriter.close();
  30. const zipReader = new zip.ZipReader(new zip.BlobReader(blobWriter.getData()));
  31. const entries = await zipReader.getEntries();
  32. const results = await Promise.all(entries.slice(0, ENTRIES_DATA.length).map(async (entry, indexEntry) => {
  33. const blob = await entry.getData(new zip.BlobWriter("application/octet-stream"));
  34. return compareResult(blob, ENTRIES_DATA[indexEntry].blob);
  35. }));
  36. const results2 = await Promise.all(entries.slice(ENTRIES_DATA.length).map(async entry => {
  37. const blob = await entry.getData(new zip.BlobWriter("application/octet-stream"));
  38. return compareResult(blob, ENTRIES_DATA_PASS2.find(otherEntry => otherEntry.name == entry.filename).blob);
  39. }));
  40. zip.terminateWorkers();
  41. return !results.includes(false) && !results2.includes(false);
  42. }
  43. function compareResult(result, value) {
  44. return new Promise(resolve => {
  45. const fileReaderInput = new FileReader();
  46. const fileReaderOutput = new FileReader();
  47. let loadCount = 0;
  48. fileReaderInput.readAsArrayBuffer(value);
  49. fileReaderOutput.readAsArrayBuffer(result);
  50. fileReaderInput.onload = fileReaderOutput.onload = () => {
  51. loadCount++;
  52. if (loadCount == 2) {
  53. const valueInput = new Float64Array(fileReaderInput.result);
  54. const valueOutput = new Float64Array(fileReaderOutput.result);
  55. if (valueInput.length != valueOutput.length) {
  56. resolve(false);
  57. return;
  58. }
  59. for (let indexValue = 0, n = valueInput.length; indexValue < n; indexValue++) {
  60. if (valueInput[indexValue] != valueOutput[indexValue]) {
  61. resolve(false);
  62. return;
  63. }
  64. }
  65. resolve(true);
  66. }
  67. };
  68. });
  69. }
  70. function getBlob(size) {
  71. const data = new Float64Array(Math.floor(size / 8));
  72. for (let indexData = 0; indexData < data.length; indexData++) {
  73. data[indexData] = Math.random();
  74. }
  75. return new Blob([data]);
  76. }