title: Using promises with streams in node.js
body: <p>I've refactored a simple utility to use promises. It fetches a pdf from the web and saves it to disk. It should then open the file in a pdf viewer once saved to disk. The file appears on disk and is valid, the shell command opens the OSX Preview application, but a dialog pops up complaining that the file is empty.</p>
  
  <p>What's the best way to execute the shell function once the filestream has been written to disk?</p>
  
  <pre><code>// download a pdf and save to disk
  // open pdf in osx preview for example
  download_pdf()
    .then(function(path) {
      shell.exec('open ' + path).code !== 0);
    });
  
  function download_pdf() {
    const path = '/local/some.pdf';
    const url = 'http://somewebsite/some.pdf';
    const stream = request(url);
    const write = stream.pipe(fs.createWriteStream(path))
    return streamToPromise(stream);
  }
  
  function streamToPromise(stream) {
    return new Promise(function(resolve, reject) {
      // resolve with location of saved file
      stream.on("end", resolve(stream.dests[0].path));
      stream.on("error", reject);
    })
  }
  </code></pre>