docs: function (parameters) {
          var self = this;
  
          // Store these to be able to create a new instance from an instance.
          this.parameters = parameters;
  
          this.artifacts = [];
          if (parameters && parameters.logger) {
              this.logger = parameters.logger;
          } else {
              /*eslint-disable no-console*/
              var doLog = function () {
                  console.log.apply(console, arguments);
              };
              this.logger = {
                  debug: doLog,
                  log: doLog,
                  info: doLog,
                  warn: doLog,
                  error: doLog
              };
              console.warn('Since v1.3.0 BlobClient requires a logger, falling back on console.log.');
              /*eslint-enable no-console*/
          }
  
          if (parameters && parameters.uploadProgressHandler) {
              this.uploadProgressHandler = parameters.uploadProgressHandler;
          } else {
              this.uploadProgressHandler = function (fName, e) {
                  self.logger.debug('File upload of', fName, e.percent, '%');
              };
          }
  
          this.logger.debug('ctor', {metadata: parameters});
  
          if (parameters) {
              this.server = parameters.server || this.server;
              this.serverPort = parameters.serverPort || this.serverPort;
              this.httpsecure = (parameters.httpsecure !== undefined) ? parameters.httpsecure : this.httpsecure;
              this.webgmeToken = parameters.webgmeToken;
              this.keepaliveAgentOptions = parameters.keepaliveAgentOptions || {/* use defaults */};
          } else {
              this.keepaliveAgentOptions = {/* use defaults */};
          }
          this.origin = '';
          if (this.httpsecure !== undefined && this.server && this.serverPort) {
              this.origin = (this.httpsecure ? 'https://' : 'http://') + this.server + ':' + this.serverPort;
          }
          if (parameters && typeof parameters.relativeUrl === 'string') {
              this.relativeUrl = parameters.relativeUrl;
          } else if (typeof WebGMEGlobal !== 'undefined' && WebGMEGlobal.gmeConfig &&
              typeof WebGMEGlobal.gmeConfig.client.mountedPath === 'string') {
              this.relativeUrl = WebGMEGlobal.gmeConfig.client.mountedPath + '/rest/blob/';
          } else {
              this.relativeUrl = '/rest/blob/';
          }
          this.blobUrl = this.origin + this.relativeUrl;
  
          this.isNodeOrNodeWebKit = typeof process !== 'undefined';
          if (this.isNodeOrNodeWebKit) {
              // node or node-webkit
              this.logger.debug('Running under node or node-web-kit');
              if (this.httpsecure) {
                  this.Agent = require('agentkeepalive').HttpsAgent;
              } else {
                  this.Agent = require('agentkeepalive');
              }
              if (this.keepaliveAgentOptions.hasOwnProperty('ca') === false) {
                  this.keepaliveAgentOptions.ca = require('https').globalAgent.options.ca;
              }
              this.keepaliveAgent = new this.Agent(this.keepaliveAgentOptions);
          }
  
          this.logger.debug('origin', this.origin);
          this.logger.debug('blobUrl', this.blobUrl);
      }