Source: uploader.js

/*
 * deploy-asset
 * https://github.com/qiu8310/deploy-asset
 *
 * Copyright (c) 2015 Zhonglei Qiu
 * Licensed under the MIT license.
 */

/* jshint unused: vars */
var Base = require('class-extend');

/**
 *
 * 上传组件的基类
 *
 * @mixin
 * @param {Object} opts - 上传模块需要的配置, 由 {@link da}.opts.uploaderOptions 透传过来的
 * @constructor
 *
 */
function Uploader(opts) {

  /**
   * 是否启用批量上传模式
   *
   * 如果启用了,会调用 {@link Uploader.batchUploadFiles} 来上传文件,否则调用 {@link Uploader.uploadFile} 来上传
   *
   * @type {Boolean}
   */
  this.enableBatchUpload = false;


  /**
   *  是否支持将静态资源扁平化
   *
   *  扁平化即将所有静态资源的目录结构去掉,所以文件都放在一个目录下
   *
   *  @type {Boolean}
   *
   */
  this.supportFlatAssets = false;
}


/**
 * 统一用户配置的 baseUrl 为带 http:// 前缀及后缀有 / 的一个 Url
 * @param {String} baseUrl
 * @returns {String}
 */
Uploader.prototype.normalizeBaseUrl = function (baseUrl) {
  return baseUrl.replace(/^(\w+:\/\/)?(.*?)(\/)?$/, function(raw, prefix, mid, postfix) {
    return (prefix || 'http://') + mid + (postfix || '/');
  });
};


/**
 * 有些平台的 api 返回的错误并不是一个 js 的 Error 实例,这里把所有错误转化成一个 js 的 Error 实例
 * @param {*} err
 * @returns Error
 */
Uploader.prototype.normalizeError = function (err) {
  if (!err) { return err; }
  if (err && err instanceof Error) { return err; }

  return new Error(JSON.stringify(err));
};

/**
 *
 * 通过当前文件信息,得到此文件在远程服务器上的 http 地址(文件还没上传)
 *
 * 在此函数中,你要做的事就是更新 `file.remote.path` 的值,将其改为 `此文件上传后的远程路径`,它默认值是 `null`
 *
 * @abstract
 * @param {File} file - 当前文件的 {@link File} 对象
 * @see QiniuUploader.setFileRemotePath
 */
Uploader.prototype.setFileRemotePath = function(file) {
  throw new Error('Abstract method');
};


/**
 *
 * 异步上传一个文件
 *
 * @abstract
 * @param {File} file - 要上传的文件对像
 * @param {UploaderCallback} cb - 上传后的回调函数
 */
Uploader.prototype.uploadFile = function(file, cb) {
  throw new Error('Abstract method');
};


/**
 * 异步批量上传文件
 *
 * @abstract
 * @param {Array} files - {@link File} 数组
 * @param {UploaderCallback} cb - 上传后的回调函数
 */
Uploader.prototype.batchUploadFiles = function(files, cb) {
  throw new Error('Abstract method');
};


var cache = {};

/**
 *
 * 注册新的上传组件,请用 `da.registerUploader` 形式调用
 *
 * 如何写新的 uploader,可以参考 {@link QiniuUploader}
 *
 * @param {String} name - 模块名称
 * @param {Uploader} uploader - uploader
 * @see QiniuUploader
 */
Uploader.register = function(name, uploader) {
  cache[name] = uploader;
};


/**
 * 实例化一个 Uploader,如果指定的 name 不存在,会抛出异常
 *
 * 如果要定义一个自己的 Uploader,参考 {@link Uploader.register}
 *
 * @param {String} name - 要 实例化的 Uploader 名称
 * @param {Object} opts - 给 要实例化的 Uploader 初始化用
 * @throws {Error}
 */
Uploader.instance = function(name, opts) {
  if (name in cache) {
    return new cache[name](opts);
  }

  throw new Error('Uploader ' + name + ' not exists.');
};


/**
 * 用于子类继承 Uploader 类
 *
 * @static
 * @type {Function}
 * @method
 * @see https://github.com/SBoudrias/class-extend
 */
Uploader.extend = Base.extend;

module.exports = Uploader;