| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | var request = Npm.require("request");/** * @method DataMan.URL * @public * @constructor * @param {String} url * @param {String} type The data content (MIME) type. */DataMan.URL = function DataManURL(url, type, options) {  var self = this;  options = options || {};  self.url = url;  self._type = type;  // This is some code borrowed from the http package. Hopefully  // we can eventually use HTTP pkg directly instead of 'request'  // once it supports streams and buffers and such. (`request` takes  // and `auth` option, too, but not of the same form as `HTTP`.)  if (options.auth) {    if (options.auth.indexOf(':') < 0)      throw new Error('auth option should be of the form "username:password"');    options.headers = options.headers || {};    options.headers['Authorization'] = "Basic "+      (new Buffer(options.auth, "ascii")).toString("base64");    delete options.auth;  }  self.urlOpts = options;};/** * @method DataMan.URL.prototype.getBuffer * @private * @param {function} callback callback(err, buffer) * @returns {Buffer|undefined} * * Passes a Buffer representing the data at the URL to a callback. */DataMan.URL.prototype.getBuffer = function dataManUrlGetBuffer(callback) {  var self = this;  request(_.extend({    url: self.url,    method: "GET",    encoding: null,    jar: false  }, self.urlOpts), Meteor.bindEnvironment(function(err, res, body) {    if (err) {      callback(err);    } else {      self._type = res.headers['content-type'];      callback(null, body);    }  }, function(err) {    callback(err);  }));};/** * @method DataMan.URL.prototype.getDataUri * @private * @param {function} callback callback(err, dataUri) * * Passes a data URI representing the data at the URL to a callback. */DataMan.URL.prototype.getDataUri = function dataManUrlGetDataUri(callback) {  var self = this;  self.getBuffer(function (error, buffer) {    if (error) {      callback(error);    } else {      if (!self._type) {        callback(new Error("DataMan.getDataUri couldn't get a contentType"));      } else {        var dataUri = "data:" + self._type + ";base64," + buffer.toString("base64");        callback(null, dataUri);      }    }  });};/** * @method DataMan.URL.prototype.createReadStream * @private * * Returns a read stream for the data. */DataMan.URL.prototype.createReadStream = function dataManUrlCreateReadStream() {  var self = this;  // Stream from URL  return request(_.extend({    url: self.url,    method: "GET"  }, self.urlOpts));};/** * @method DataMan.URL.prototype.size * @param {function} callback callback(err, size) * @private * * Returns the size in bytes of the data at the URL. */DataMan.URL.prototype.size = function dataManUrlSize(callback) {  var self = this;  if (typeof self._size === "number") {    callback(null, self._size);    return;  }  self.getBuffer(function (error, buffer) {    if (error) {      callback(error);    } else {      self._size = buffer.length;      callback(null, self._size);    }  });};/** * @method DataMan.URL.prototype.type * @private * * Returns the type of the data. */DataMan.URL.prototype.type = function dataManUrlType() {  return this._type;};
 |