Esempio n. 1
0
function addRemoteTarball (u, pkgData, shasum, auth, cb_) {
  assert(typeof u === "string", "must have module URL")
  assert(typeof cb_ === "function", "must have callback")

  function cb (er, data) {
    if (data) {
      data._from = u
      data._shasum = data._shasum || shasum
      data._resolved = u
    }
    cb_(er, data)
  }

  cb_ = inflight(u, cb_)
  if (!cb_) return log.verbose("addRemoteTarball", u, "already in flight; waiting")
  log.verbose("addRemoteTarball", u, "not in flight; adding")

  // XXX Fetch direct to cache location, store tarballs under
  // ${cache}/registry.npmjs.org/pkg/-/pkg-1.2.3.tgz
  var tmp = cacheFile(npm.tmp, u)

  function next (er, resp, shasum) {
    if (er) return cb(er)
    addLocalTarball(tmp, pkgData, shasum, cb)
  }

  log.verbose("addRemoteTarball", [u, shasum])
  mkdir(path.dirname(tmp), function (er) {
    if (er) return cb(er)
    addRemoteTarball_(u, tmp, shasum, auth, next)
  })
}
Esempio n. 2
0
function NapaPkg (url, name, opts) {
  if (!(this instanceof NapaPkg)) return new NapaPkg(url, name, opts)
  var self = this
  opts = opts || {}
  this.cwd = opts.cwd || process.cwd()
  this.log = opts.log || log
  if (opts['log-level']) this.log.level = opts['log-level']
  this._mock = opts._mock
  this.ref = opts.ref
  this.url = url
  this.name = name
  this.installTo = path.join(this.cwd, 'node_modules', this.name)
  this.useCache = (typeof opts.cache === 'undefined') || opts.cache !== false
  this.cacheTo = cache(
    typeof opts['cache-path'] !== 'string'
      ? tmp
      : path.resolve(this.cwd, opts['cache-path']),
    this.url
  )
  this._napaResolvedKey = '_napaResolved'
  this.saveToPkgJson = opts.save

  Object.defineProperty(self, 'installed', {
    get: function () {
      var existing = path.join(self.installTo, 'package.json')
      return (fs.existsSync(existing) && require(existing)[self._napaResolvedKey] === url)
    }
  })
  Object.defineProperty(self, 'cached', {
    get: function () { return fs.existsSync(self.cacheTo) }
  })
}
Esempio n. 3
0
function CachingRegistryClient (config) {
  RegistryClient.call(this, adaptConfig(config))

  this._mapToCache = cacheFile(config.get("cache"))

  // swizzle in our custom cache invalidation logic
  this._request = this.request
  this.request  = this._invalidatingRequest
}
 npm.load({ cache: CACHE_DIR, registry: common.registry }, function (err) {
   t.ifError(err, 'npm loaded successfully')
   npm.config.set('cache', CACHE_DIR)
   cacheBase = cacheFile(npm.config.get('cache'))(common.registry + '/-/all')
   cachePath = path.join(cacheBase, '.cache.json')
   server = s
   t.pass('all set up')
   t.done()
 })
function get (uri, params, cb) {
  assert(typeof uri === "string", "must pass registry URI to get")
  assert(params && typeof params === "object", "must pass params to get")
  assert(typeof cb === "function", "must pass callback to get")

  var parsed = url.parse(uri)
  assert(
    parsed.protocol === "http:" || parsed.protocol === "https:",
    "must have a URL that starts with http: or https:"
  )

  var cacheBase = cacheFile(npm.config.get("cache"))(uri)
  var cachePath = path.join(cacheBase, ".cache.json")

  // If the GET is part of a write operation (PUT or DELETE), then
  // skip past the cache entirely, but still save the results.
  if (uri.match(/\?write=true$/)) {
    log.verbose("get", "GET as part of write; not caching result")
    return get_.call(this, uri, cachePath, params, cb)
  }

  var client = this
  fs.stat(cachePath, function (er, stat) {
    if (!er) {
      fs.readFile(cachePath, function (er, data) {
        try {
          data = JSON.parse(data)
        }
        catch (ex) {
          data = null
        }

        params.stat = stat
        params.data = data

        get_.call(client, uri, cachePath, params, cb)
      })
    }
    else {
      get_.call(client, uri, cachePath, params, cb)
    }
  })
}
  mapToRegistry('-/all', npm.config, function (er, uri, auth) {
    if (er) return stream.emit('error', er)

    var cacheBase = cacheFile(npm.config.get('cache'))(uri)
    var cachePath = path.join(cacheBase, '.cache.json')

    createEntryStream(cachePath, uri, auth, staleness, function (err, entryStream, latest, newEntries) {
      if (err) return stream.emit('error', err)
      log.silly('all-package-metadata', 'entry stream created')
      if (entryStream && newEntries) {
        createCacheWriteStream(cachePath, latest, function (err, writeStream) {
          if (err) return stream.emit('error', err)
          log.silly('all-package-metadata', 'output stream created')
          ms.pipeline.obj(entryStream, writeStream, stream)
        })
      } else if (entryStream) {
        ms.pipeline.obj(entryStream, stream)
      } else {
        stream.emit('error', new Error('No search sources available'))
      }
    })
  })
function addRemoteTarball (u, pkgData, shasum, auth, cb_) {
  assert(typeof u === 'string', 'must have module URL')
  assert(typeof cb_ === 'function', 'must have callback')

  function cb (er, data) {
    if (data) {
      data._from = u
      data._resolved = u
      data._shasum = data._shasum || shasum
    }
    cb_(er, data)
  }

  cb_ = inflight(u, cb_)
  if (!cb_) return log.verbose('addRemoteTarball', u, 'already in flight; waiting')
  log.verbose('addRemoteTarball', u, 'not in flight; adding')

  // XXX Fetch direct to cache location, store tarballs under
  // ${cache}/registry.npmjs.org/pkg/-/pkg-1.2.3.tgz
  var tmp = cacheFile(npm.tmp, u)

  function next (er, resp, shasum) {
    if (er) return cb(er)
    addLocalTarball(tmp, pkgData, shasum, cleanup)
  }
  function cleanup (er, data) {
    if (er) return cb(er)
    rimraf(tmp, function () {
      cb(er, data)
    })
  }

  log.verbose('addRemoteTarball', [u, shasum])
  mkdir(path.dirname(tmp), function (er) {
    if (er) return cb(er)
    addRemoteTarball_(u, tmp, shasum, auth, next)
  })
}
Esempio n. 8
0
function get (uri, params, cb) {
  assert(typeof uri === 'string', 'must pass registry URI to get')
  assert(params && typeof params === 'object', 'must pass params to get')
  assert(typeof cb === 'function', 'must pass callback to get')

  var parsed = url.parse(uri)
  assert(
    parsed.protocol === 'http:' || parsed.protocol === 'https:',
    'must have a URL that starts with http: or https:'
  )

  var cacheBase = cacheFile(npm.config.get('cache'))(uri)
  var cachePath = path.join(cacheBase, '.cache.json')

  // If the GET is part of a write operation (PUT or DELETE), then
  // skip past the cache entirely, but still save the results.
  if (uri.match(/\?write=true$/)) {
    log.verbose('get', 'GET as part of write; not caching result')
    return get_.call(this, uri, cachePath, params, cb)
  }

  var client = this
  fs.stat(cachePath, function (er, stat) {
    if (!er) {
      fs.readFile(cachePath, function (er, data) {
        data = parseJSON.noExceptions(data)

        params.stat = stat
        params.data = data

        get_.call(client, uri, cachePath, params, cb)
      })
    } else {
      get_.call(client, uri, cachePath, params, cb)
    }
  })
}
Esempio n. 9
0
File: pkg.js Progetto: jsdevel/napa
function NapaPkg(url, name, opts) {
  if (!(this instanceof NapaPkg)) return new NapaPkg(url, name, opts)
  var self = this
  opts = opts || {}
  this.cwd = opts.cwd || process.cwd()
  this.log = opts.log || log
  this._mock = opts._mock
  this.ref = opts.ref
  this.url = url
  this.name = name
  this.installTo = path.join(this.cwd, 'node_modules', this.name)
  this.cacheTo = cache(tmp, this.url)
  this._napaResolvedKey = '_napaResolved'

  Object.defineProperty(self, 'installed', {
    get: function() {
      var existing = path.join(self.installTo, 'package.json')
      return (fs.existsSync(existing) && require(existing)[self._napaResolvedKey] === url)
    }
  })
  Object.defineProperty(self, 'cached', {
    get: function() { return fs.existsSync(self.cacheTo) }
  })
}
function allPackageMetadata (opts) {
  const staleness = opts.staleness
  const stream = ms.through.obj()

  opts = APMOpts(opts)
  const cacheBase = cacheFile(path.resolve(path.dirname(opts.cache)))(url.resolve(opts.registry, '/-/all'))
  const cachePath = path.join(cacheBase, '.cache.json')
  createEntryStream(
    cachePath, staleness, opts
  ).then(({entryStream, latest, newEntries}) => {
    log.silly('all-package-metadata', 'entry stream created')
    if (entryStream && newEntries) {
      return createCacheWriteStream(cachePath, latest, opts).then(writer => {
        log.silly('all-package-metadata', 'output stream created')
        ms.pipeline.obj(entryStream, writer, stream)
      })
    } else if (entryStream) {
      ms.pipeline.obj(entryStream, stream)
    } else {
      stream.emit('error', new Error('No search sources available'))
    }
  }).catch(err => stream.emit('error', err))
  return stream
}
Esempio n. 11
0
var CACHE_DIR = path.resolve(PKG_DIR, 'cache')
var BIGCO_SAMPLE = {
  name: '@bigco/sample',
  version: '1.2.3'
}

// mock server reference
var server

var mocks = {
  'get': {
    '/@bigco%2fsample/1.2.3': [200, BIGCO_SAMPLE]
  }
}

var mapper = cacheFile(CACHE_DIR)

function getCachePath (uri) {
  return path.join(mapper(uri), '.cache.json')
}

test('setup', function (t) {
  mkdirp.sync(CACHE_DIR)

  mr({port: common.port, mocks: mocks}, function (er, s) {
    t.ifError(er)
    npm.load({cache: CACHE_DIR, registry: common.registry}, function (er) {
      t.ifError(er)
      server = s
      t.end()
    })
Esempio n. 12
0
var path = require('path')
var mkdirp = require('mkdirp')
var mr = require('npm-registry-mock')
var osenv = require('osenv')
var rimraf = require('rimraf')
var cacheFile = require('npm-cache-filename')
var test = require('tap').test
var Tacks = require('tacks')
var File = Tacks.File

var common = require('../common-tap.js')

var PKG_DIR = path.resolve(__dirname, 'search')
var CACHE_DIR = path.resolve(PKG_DIR, 'cache')
var cacheBase = cacheFile(CACHE_DIR)(common.registry + '/-/all')
var cachePath = path.join(cacheBase, '.cache.json')

var server

test('setup', function (t) {
  mr({port: common.port, throwOnUnmatched: true}, function (err, s) {
    t.ifError(err, 'registry mocked successfully')
    server = s
    t.pass('all set up')
    t.done()
  })
})

test('notifies when there are no results', function (t) {
  setup()
  server.get('/-/v1/search?text=none&size=20').once().reply(200, {
Esempio n. 13
0
exports.resize = function(req, res) {
  var url = req.query.url,
    width = req.query.width,
    height = req.query.height,
    type = req.query.type || "resize", //resize,crop
    gravity = req.query.type || "center";

  url = decodeURIComponent (url);
  console.info(url);
  var cacheOrginFile = null;
  try{
    cacheOrginFile = cf(config.root + config.resize_dist_cache, url);
    if(fs.existsSync()){

    }
  }catch(e){
    res.send(404);
  }

  var cacheResizeFile = S(cacheOrginFile + "_{{type}}_{{gravity}}_{{width}}__{{height}}").template({
    width: width,
    height: height,
    type: type,
    gravity: gravity
  }).s;
  var cacheDir = path.dirname(cacheOrginFile);

  function resizeImage() {
    return Q.Promise(function resize(resolve, reject) {
      var argSize = width + 'x' + height,
        command = '';
      if (type == 'resize') {
        command = 'gm convert ' + cacheOrginFile + ' -resize "' + argSize + '>" +profile "*" ' + cacheResizeFile;
        console.info(command);
      } else if (type == 'crop') {
        command = 'gm convert ' + cacheOrginFile + ' -gravity ' + gravity + ' -extent ' + argSize + '  ' + cacheResizeFile;
      }
      exec(command, function(error, stdout, stderr) {
        if (error !== null) {
          console.log('exec error: ' + error);
        } else {
          resolve();
        }
      });

    });
  }

  Q.Promise(function mkdir(resolve, reject) {
    if (fs.existsSync(cacheDir)) {
      resolve();
    } else {
      Q.nfcall(mkdirp, cacheDir)
        .then(function() {
          resolve();
        });
    }
  }).then(function() {

    return Q.Promise(function getCacheFile(resolve, reject) {
      if (fs.existsSync(cacheResizeFile)) {
        resolve();
      } else {

        if (fs.existsSync(cacheOrginFile)) {
          resizeImage().then(function() {
            resolve();
          });
        } else {
          Q.Promise(function fetch(resolve, reject) {
            var headers = req.headers;
            delete headers.host;
            if (fs.existsSync(cacheOrginFile)) {
              resolve();
            } else {
              request.head({
                url:url,
                headers:req.headers
              }, function(err, result, body) {
                if(err){
                  res.send(404);
                }else{
                  var contentType = result.headers['content-type'];
                  if (!/^image\/(png|jpeg|jpg|gif)/.test(contentType)) {
                    res.set('Content-Type', 'image/jpeg');
                    res.end('', 'binary');
                  } else {
                    var stream = fs.createWriteStream(cacheOrginFile);
                    request({
                      url:url,
                      headers:req.headers
                    }).pipe(stream).on('finish',function(){
                      stream.close();
                      resolve();
                    });
                  }
                }

              });
            }

          }).then(function() {
            resizeImage().then(function() {
              resolve();
            });

          });
        }


      }
    }).then(function() {

      res.sendFile(cacheResizeFile, {maxAge: 10 * 365 * 24 * 60 * 60, headers: {
        'Content-Type': 'image/jpeg'
      }});
    })


  });


}