docs: function extract(src, dst, opts) {
      var extractor;
      var promise;
  
      opts = opts || {};
      extractor = getExtractor(src);
  
      // Try to get extractor from mime type
      if (!extractor && opts.mimeType) {
          extractor = getExtractor(opts.mimeType);
      }
  
      // If extractor is null, then the archive type is unknown
      if (!extractor) {
          return Q.reject(createError('File ' + src + ' is not a known archive', 'ENOTARCHIVE'));
      }
  
      // Check archive file size
      promise = Q.nfcall(fs.stat, src)
      .then(function (stat) {
          if (stat.size <= 8) {
              throw createError('File ' + src + ' is an invalid archive', 'ENOTARCHIVE');
          }
  
          // Extract archive
          return extractor(src, dst);
      });
  
      // TODO: There's an issue here if the src and dst are the same and
      //       The zip name is the same as some of the zip file contents
      //       Maybe create a temp directory inside dst, unzip it there,
      //       unlink zip and then move contents
  
      // Remove archive
      if (!opts.keepArchive) {
          promise = promise
          .then(function () {
              return Q.nfcall(fs.unlink, src);
          });
      }
  
      // Move contents if a single directory was extracted
      if (!opts.keepStructure) {
          promise = promise
          .then(function () {
              return isSingleDir(dst);
          })
          .then(function (singleDir) {
              return singleDir ? moveSingleDirContents(singleDir) : null;
          });
      }
  
      // Resolve promise to the dst dir
      return promise.then(function () {
          return dst;
      });
  }