prepare_binaries.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. "use strict";
  2. const request = require("request");
  3. const decompress = require("decompress");
  4. const fs = require("fs");
  5. const EventEmitter = require("events").EventEmitter;
  6. function isBinaryFileRequired(flashSpecification, fileName) {
  7. return flashSpecification.map(binary => binary.path).indexOf(fileName) !== -1;
  8. }
  9. function addBufferToBinary(flashSpecification, fileName, buffer) {
  10. flashSpecification.forEach((element, index) => {
  11. if (flashSpecification[index].path === fileName) {
  12. flashSpecification[index].buffer = buffer;
  13. }
  14. });
  15. }
  16. function prepareBinaries(manifest) {
  17. const eventEmitter = new EventEmitter();
  18. const flashContents = manifest.flash;
  19. let body;
  20. let contentLength;
  21. request(manifest.download)
  22. .on("response", response => {
  23. contentLength = Number(response.headers["content-length"]);
  24. })
  25. .on("data", data => {
  26. if(body) {
  27. body = Buffer.concat([body, data]);
  28. } else {
  29. body = data;
  30. }
  31. const progress = {
  32. details: {
  33. downloadedBytes: body.length,
  34. downloadSize: contentLength
  35. },
  36. display: "Downloading"
  37. };
  38. eventEmitter.emit("progress", progress);
  39. })
  40. .on("complete", () => {
  41. decompress(body, {
  42. filter: file => isBinaryFileRequired(flashContents, file.path)
  43. })
  44. .then(files => {
  45. files.forEach(
  46. file => addBufferToBinary(flashContents, file.path, file.data)
  47. );
  48. eventEmitter.emit("complete", flashContents);
  49. })
  50. .catch(err => eventEmitter.emit("error", err));
  51. })
  52. .on("error", err => eventEmitter.emit("error", err));
  53. return eventEmitter;
  54. }
  55. module.exports = prepareBinaries;