text: 'use strict';
  
  var fo = require('../../file-operations');
  var readStream = require('../../src/read-contents/read-stream');
  
  function writeStream(file, optResolver, onWritten) {
    var flags = fo.getFlags({
      overwrite: optResolver.resolve('overwrite', file),
      append: optResolver.resolve('append', file),
    });
    var opt = {
      mode: file.stat.mode,
      // TODO: need to test this
      flags: flags,
    };
  
    // TODO: is this the best API?
    var outStream = fo.createWriteStream(file.path, opt, onFlush);
  
    file.contents.once('error', onComplete);
    outStream.once('error', onComplete);
    outStream.once('finish', onComplete);
  
    // TODO: should this use a clone?
    file.contents.pipe(outStream);
  
    function onComplete(streamErr) {
      // Cleanup event handlers before closing
      file.contents.removeListener('error', onComplete);
      outStream.removeListener('error', onComplete);
      outStream.removeListener('finish', onComplete);
  
      // Need to guarantee the fd is closed before forwarding the error
      outStream.once('close', onClose);
      outStream.end();
  
      function onClose(closeErr) {
        onWritten(streamErr || closeErr);
      }
    }
  
    // Cleanup
    function onFlush(fd, callback) {
      // TODO: removing this before readStream because it replaces the stream
      file.contents.removeListener('error', onComplete);
  
      // TODO: this is doing sync stuff & the callback seems unnecessary
      // TODO: Replace the contents stream or use a clone?
      readStream(file, complete);
  
      function complete() {
        if (typeof fd !== 'number') {
          return callback();
        }
  
        fo.updateMetadata(fd, file, callback);
      }
    }
  
  }
  
  module.exports = writeStream;
  