writeStream.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. 'use strict';
  2. var fs = require('graceful-fs');
  3. var fo = require('../../fileOperations');
  4. var streamFile = require('../../src/getContents/streamFile');
  5. function writeStream(writePath, file, written) {
  6. var opt = {
  7. mode: file.stat.mode,
  8. flag: file.flag,
  9. };
  10. var outStream = fs.createWriteStream(writePath, opt);
  11. file.contents.once('error', complete);
  12. file.contents.once('end', readStreamEnd);
  13. outStream.once('error', complete);
  14. outStream.once('finish', complete);
  15. // Streams are piped with end disabled, this prevents the
  16. // WriteStream from closing the file descriptor after all
  17. // data is written.
  18. file.contents.pipe(outStream, { end: false });
  19. function readStreamEnd() {
  20. streamFile(file, complete);
  21. }
  22. function end(propagatedErr) {
  23. outStream.end(onEnd);
  24. function onEnd(endErr) {
  25. written(propagatedErr || endErr);
  26. }
  27. }
  28. // Cleanup
  29. function complete(streamErr) {
  30. file.contents.removeListener('error', complete);
  31. file.contents.removeListener('end', readStreamEnd);
  32. outStream.removeListener('error', complete);
  33. outStream.removeListener('finish', complete);
  34. if (streamErr) {
  35. return end(streamErr);
  36. }
  37. if (typeof outStream.fd !== 'number') {
  38. return end();
  39. }
  40. fo.updateMetadata(outStream.fd, file, end);
  41. }
  42. }
  43. module.exports = writeStream;