|                                                                 |  | const fs = require('fs');const is = require('is-type-of');const { isObject } = require('../utils/isObject');
const proto = exports;/** * get * @param {String} name - object name * @param {String | Stream | Object} file - file path or file stream or options * @param {Object} options * @param {{res}} */proto.get = async function get(name, file, options = {}) {  let writeStream = null;  let needDestroy = false;
  if (is.writableStream(file)) {    writeStream = file;  } else if (is.string(file)) {    writeStream = fs.createWriteStream(file);    needDestroy = true;  } else if (isObject(file)) {    // get(name, options)
    options = file;  }
  options = options || {};  const isBrowserEnv = process && process.browser;  const responseCacheControl = options.responseCacheControl === null ? '' : 'no-cache';  const defaultSubresOptions =    isBrowserEnv && responseCacheControl ? { 'response-cache-control': responseCacheControl } : {};  options.subres = Object.assign(defaultSubresOptions, options.subres);
  if (options.versionId) {    options.subres.versionId = options.versionId;  }  if (options.process) {    options.subres['x-oss-process'] = options.process;  }
  let result;  try {    const params = this._objectRequestParams('GET', name, options);    params.writeStream = writeStream;    params.successStatuses = [200, 206, 304];
    result = await this.request(params);
    if (needDestroy) {      writeStream.destroy();    }  } catch (err) {    if (needDestroy) {      writeStream.destroy();      // should delete the exists file before throw error
      await this._deleteFileSafe(file);    }    throw err;  }
  return {    res: result.res,    content: result.data  };};
 |