| 
						 | 
						- const assert = require('assert');
 - const { isArray } = require('./common/utils/isArray');
 - const { checkBucketName: _checkBucketName } = require('../lib/common/utils/checkBucketName');
 - const { formatTag } = require('../lib/common/utils/formatTag');
 - 
 - const proto = exports;
 - 
 - function toArray(obj) {
 -   if (!obj) return [];
 -   if (isArray(obj)) return obj;
 -   return [obj];
 - }
 - 
 - /**
 -  * Bucket opertaions
 -  */
 - 
 - proto.listBuckets = async function listBuckets(query = {}, options = {}) {
 -   // prefix, marker, max-keys
 - 
 -   const { subres = {} } = query;
 -   const rest = {};
 -   for (const key in query) {
 -     if (key !== 'subres') {
 -       rest[key] = query[key];
 -     }
 -   }
 -   const params = this._bucketRequestParams('GET', '', Object.assign(subres, options.subres), options);
 - 
 -   params.query = rest;
 - 
 -   const result = await this.request(params);
 - 
 -   if (result.status === 200) {
 -     const data = await this.parseXML(result.data);
 -     let buckets = data.Buckets || null;
 -     if (buckets) {
 -       if (buckets.Bucket) {
 -         buckets = buckets.Bucket;
 -       }
 -       if (!isArray(buckets)) {
 -         buckets = [buckets];
 -       }
 -       buckets = buckets.map(item => ({
 -         name: item.Name,
 -         region: item.Location,
 -         creationDate: item.CreationDate,
 -         storageClass: item.StorageClass,
 -         StorageClass: item.StorageClass,
 -         tag: formatTag(item)
 -       }));
 -     }
 -     return {
 -       buckets,
 -       owner: {
 -         id: data.Owner.ID,
 -         displayName: data.Owner.DisplayName
 -       },
 -       isTruncated: data.IsTruncated === 'true',
 -       nextMarker: data.NextMarker || null,
 -       res: result.res
 -     };
 -   }
 - 
 -   throw await this.requestError(result);
 - };
 - 
 - proto.useBucket = function useBucket(name) {
 -   _checkBucketName(name);
 -   return this.setBucket(name);
 - };
 - 
 - proto.setBucket = function useBucket(name) {
 -   _checkBucketName(name);
 -   this.options.bucket = name;
 -   return this;
 - };
 - 
 - proto.getBucket = function getBucket() {
 -   return this.options.bucket;
 - };
 - 
 - proto.getBucketLocation = async function getBucketLocation(name, options) {
 -   _checkBucketName(name);
 -   name = name || this.getBucket();
 -   const params = this._bucketRequestParams('GET', name, 'location', options);
 -   params.successStatuses = [200];
 -   params.xmlResponse = true;
 -   const result = await this.request(params);
 -   return {
 -     location: result.data,
 -     res: result.res
 -   };
 - };
 - 
 - proto.getBucketInfo = async function getBucketInfo(name, options) {
 -   _checkBucketName(name);
 -   name = name || this.getBucket();
 -   const params = this._bucketRequestParams('GET', name, 'bucketInfo', options);
 -   params.successStatuses = [200];
 -   params.xmlResponse = true;
 -   const result = await this.request(params);
 -   return {
 -     bucket: result.data.Bucket,
 -     res: result.res
 -   };
 - };
 - 
 - proto.deleteBucket = async function deleteBucket(name, options) {
 -   _checkBucketName(name);
 -   const params = this._bucketRequestParams('DELETE', name, '', options);
 -   const result = await this.request(params);
 -   if (result.status === 200 || result.status === 204) {
 -     return {
 -       res: result.res
 -     };
 -   }
 -   throw await this.requestError(result);
 - };
 - 
 - // acl
 - 
 - proto.putBucketACL = async function putBucketACL(name, acl, options) {
 -   _checkBucketName(name);
 -   const params = this._bucketRequestParams('PUT', name, 'acl', options);
 -   params.headers = {
 -     'x-oss-acl': acl
 -   };
 -   params.successStatuses = [200];
 -   const result = await this.request(params);
 -   return {
 -     bucket: (result.headers.location && result.headers.location.substring(1)) || null,
 -     res: result.res
 -   };
 - };
 - 
 - proto.getBucketACL = async function getBucketACL(name, options) {
 -   _checkBucketName(name);
 -   const params = this._bucketRequestParams('GET', name, 'acl', options);
 -   params.successStatuses = [200];
 -   params.xmlResponse = true;
 -   const result = await this.request(params);
 -   return {
 -     acl: result.data.AccessControlList.Grant,
 -     owner: {
 -       id: result.data.Owner.ID,
 -       displayName: result.data.Owner.DisplayName
 -     },
 -     res: result.res
 -   };
 - };
 - 
 - // logging
 - 
 - proto.putBucketLogging = async function putBucketLogging(name, prefix, options) {
 -   _checkBucketName(name);
 -   const params = this._bucketRequestParams('PUT', name, 'logging', options);
 -   let xml = `${'<?xml version="1.0" encoding="UTF-8"?>\n<BucketLoggingStatus>\n<LoggingEnabled>\n<TargetBucket>'}${name}</TargetBucket>\n`;
 -   if (prefix) {
 -     xml += `<TargetPrefix>${prefix}</TargetPrefix>\n`;
 -   }
 -   xml += '</LoggingEnabled>\n</BucketLoggingStatus>';
 -   params.content = xml;
 -   params.mime = 'xml';
 -   params.successStatuses = [200];
 -   const result = await this.request(params);
 -   return {
 -     res: result.res
 -   };
 - };
 - 
 - proto.getBucketLogging = async function getBucketLogging(name, options) {
 -   _checkBucketName(name);
 -   const params = this._bucketRequestParams('GET', name, 'logging', options);
 -   params.successStatuses = [200];
 -   params.xmlResponse = true;
 -   const result = await this.request(params);
 -   const enable = result.data.LoggingEnabled;
 -   return {
 -     enable: !!enable,
 -     prefix: (enable && enable.TargetPrefix) || null,
 -     res: result.res
 -   };
 - };
 - 
 - proto.deleteBucketLogging = async function deleteBucketLogging(name, options) {
 -   _checkBucketName(name);
 -   const params = this._bucketRequestParams('DELETE', name, 'logging', options);
 -   params.successStatuses = [204, 200];
 -   const result = await this.request(params);
 -   return {
 -     res: result.res
 -   };
 - };
 - 
 - proto.putBucketCORS = async function putBucketCORS(name, rules, options) {
 -   _checkBucketName(name);
 -   rules = rules || [];
 -   assert(rules.length, 'rules is required');
 -   rules.forEach(rule => {
 -     assert(rule.allowedOrigin, 'allowedOrigin is required');
 -     assert(rule.allowedMethod, 'allowedMethod is required');
 -   });
 - 
 -   const params = this._bucketRequestParams('PUT', name, 'cors', options);
 -   let xml = '<?xml version="1.0" encoding="UTF-8"?>\n<CORSConfiguration>';
 -   const parseOrigin = val => {
 -     xml += `<AllowedOrigin>${val}</AllowedOrigin>`;
 -   };
 -   const parseMethod = val => {
 -     xml += `<AllowedMethod>${val}</AllowedMethod>`;
 -   };
 -   const parseHeader = val => {
 -     xml += `<AllowedHeader>${val}</AllowedHeader>`;
 -   };
 -   const parseExposeHeader = val => {
 -     xml += `<ExposeHeader>${val}</ExposeHeader>`;
 -   };
 -   for (let i = 0, l = rules.length; i < l; i++) {
 -     const rule = rules[i];
 -     xml += '<CORSRule>';
 - 
 -     toArray(rule.allowedOrigin).forEach(parseOrigin);
 -     toArray(rule.allowedMethod).forEach(parseMethod);
 -     toArray(rule.allowedHeader).forEach(parseHeader);
 -     toArray(rule.exposeHeader).forEach(parseExposeHeader);
 -     if (rule.maxAgeSeconds) {
 -       xml += `<MaxAgeSeconds>${rule.maxAgeSeconds}</MaxAgeSeconds>`;
 -     }
 -     xml += '</CORSRule>';
 -   }
 -   xml += '</CORSConfiguration>';
 -   params.content = xml;
 -   params.mime = 'xml';
 -   params.successStatuses = [200];
 -   const result = await this.request(params);
 -   return {
 -     res: result.res
 -   };
 - };
 - 
 - proto.getBucketCORS = async function getBucketCORS(name, options) {
 -   _checkBucketName(name);
 -   const params = this._bucketRequestParams('GET', name, 'cors', options);
 -   params.successStatuses = [200];
 -   params.xmlResponse = true;
 -   const result = await this.request(params);
 -   const rules = [];
 -   if (result.data && result.data.CORSRule) {
 -     let { CORSRule } = result.data;
 -     if (!isArray(CORSRule)) CORSRule = [CORSRule];
 -     CORSRule.forEach(rule => {
 -       const r = {};
 -       Object.keys(rule).forEach(key => {
 -         r[key.slice(0, 1).toLowerCase() + key.slice(1, key.length)] = rule[key];
 -       });
 -       rules.push(r);
 -     });
 -   }
 -   return {
 -     rules,
 -     res: result.res
 -   };
 - };
 - 
 - proto.deleteBucketCORS = async function deleteBucketCORS(name, options) {
 -   _checkBucketName(name);
 -   const params = this._bucketRequestParams('DELETE', name, 'cors', options);
 -   params.successStatuses = [204];
 -   const result = await this.request(params);
 -   return {
 -     res: result.res
 -   };
 - };
 - 
 - // referer
 - 
 - proto.putBucketReferer = async function putBucketReferer(name, allowEmpty, referers, options) {
 -   _checkBucketName(name);
 -   const params = this._bucketRequestParams('PUT', name, 'referer', options);
 -   let xml = '<?xml version="1.0" encoding="UTF-8"?>\n<RefererConfiguration>\n';
 -   xml += `  <AllowEmptyReferer>${allowEmpty ? 'true' : 'false'}</AllowEmptyReferer>\n`;
 -   if (referers && referers.length > 0) {
 -     xml += '  <RefererList>\n';
 -     for (let i = 0; i < referers.length; i++) {
 -       xml += `    <Referer>${referers[i]}</Referer>\n`;
 -     }
 -     xml += '  </RefererList>\n';
 -   } else {
 -     xml += '  <RefererList />\n';
 -   }
 -   xml += '</RefererConfiguration>';
 -   params.content = xml;
 -   params.mime = 'xml';
 -   params.successStatuses = [200];
 -   const result = await this.request(params);
 -   return {
 -     res: result.res
 -   };
 - };
 - 
 - proto.getBucketReferer = async function getBucketReferer(name, options) {
 -   _checkBucketName(name);
 -   const params = this._bucketRequestParams('GET', name, 'referer', options);
 -   params.successStatuses = [200];
 -   params.xmlResponse = true;
 -   const result = await this.request(params);
 -   let referers = result.data.RefererList.Referer || null;
 -   if (referers) {
 -     if (!isArray(referers)) {
 -       referers = [referers];
 -     }
 -   }
 -   return {
 -     allowEmpty: result.data.AllowEmptyReferer === 'true',
 -     referers,
 -     res: result.res
 -   };
 - };
 - 
 - proto.deleteBucketReferer = async function deleteBucketReferer(name, options) {
 -   _checkBucketName(name);
 -   return await this.putBucketReferer(name, true, null, options);
 - };
 - 
 - // private apis
 - 
 - proto._bucketRequestParams = function _bucketRequestParams(method, bucket, subres, options) {
 -   return {
 -     method,
 -     bucket,
 -     subres,
 -     headers: options && options.headers,
 -     additionalHeaders: options && options.additionalHeaders,
 -     timeout: options && options.timeout,
 -     ctx: options && options.ctx
 -   };
 - };
 
 
  |