mirror of
https://github.com/verdaccio/verdaccio.git
synced 2025-03-18 02:22:46 -05:00
try to fetch package from uplinks if user requested a tarball we don't know about
closes #29 + tests fix
This commit is contained in:
parent
9094d0742f
commit
ef61515f28
5 changed files with 66 additions and 39 deletions
|
@ -179,9 +179,11 @@ Storage.prototype.update_versions = function(name, newdata, callback) {
|
|||
|
||||
if (change) {
|
||||
self.logger.debug('updating package info')
|
||||
self._write_package(name, data, callback)
|
||||
self._write_package(name, data, function(err) {
|
||||
callback(err, data)
|
||||
})
|
||||
} else {
|
||||
callback()
|
||||
callback(null, data)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
@ -348,45 +348,23 @@ Storage.prototype.get_tarball = function(name, filename) {
|
|||
rstream = null // gc
|
||||
|
||||
self.local.get_package(name, function(err, info) {
|
||||
if (err) return stream.emit('error', err)
|
||||
if (!err && info._distfiles && info._distfiles[filename] != null) {
|
||||
// information about this file exists locally
|
||||
serve_file(info._distfiles[filename])
|
||||
|
||||
if (info._distfiles[filename] == null) {
|
||||
return stream.emit('error', err404)
|
||||
}
|
||||
} else {
|
||||
// we know nothing about this file, trying to get information elsewhere
|
||||
|
||||
var file = info._distfiles[filename]
|
||||
var uplink = null
|
||||
for (var p in self.uplinks) {
|
||||
if (self.uplinks[p].can_fetch_url(file.url)) {
|
||||
uplink = self.uplinks[p]
|
||||
}
|
||||
}
|
||||
if (uplink == null) {
|
||||
uplink = new Proxy({
|
||||
url: file.url,
|
||||
_autogenerated: true,
|
||||
}, self.config)
|
||||
}
|
||||
self._sync_package_with_uplinks(name, info, {}, function(err, info) {
|
||||
if (err) return stream.emit('error', err)
|
||||
|
||||
var savestream = self.local.add_tarball(name, filename)
|
||||
savestream.on('error', function(err) {
|
||||
savestream.abort()
|
||||
stream.emit('error', err)
|
||||
})
|
||||
savestream.on('open', function() {
|
||||
var rstream2 = uplink.get_url(file.url)
|
||||
rstream2.on('error', function(err) {
|
||||
savestream.abort()
|
||||
stream.emit('error', err)
|
||||
if (!info._distfiles || info._distfiles[filename] == null) {
|
||||
return stream.emit('error', err404)
|
||||
}
|
||||
|
||||
serve_file(info._distfiles[filename])
|
||||
})
|
||||
rstream2.on('end', function() {
|
||||
savestream.done()
|
||||
})
|
||||
|
||||
// XXX: check, what would happen if client disconnects?
|
||||
rstream2.pipe(stream)
|
||||
rstream2.pipe(savestream)
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
rstream.on('open', function() {
|
||||
|
@ -394,6 +372,41 @@ Storage.prototype.get_tarball = function(name, filename) {
|
|||
rstream.pipe(stream)
|
||||
})
|
||||
return stream
|
||||
|
||||
function serve_file(file) {
|
||||
var uplink = null
|
||||
for (var p in self.uplinks) {
|
||||
if (self.uplinks[p].can_fetch_url(file.url)) {
|
||||
uplink = self.uplinks[p]
|
||||
}
|
||||
}
|
||||
if (uplink == null) {
|
||||
uplink = new Proxy({
|
||||
url: file.url,
|
||||
_autogenerated: true,
|
||||
}, self.config)
|
||||
}
|
||||
|
||||
var savestream = self.local.add_tarball(name, filename)
|
||||
savestream.on('error', function(err) {
|
||||
savestream.abort()
|
||||
stream.emit('error', err)
|
||||
})
|
||||
savestream.on('open', function() {
|
||||
var rstream2 = uplink.get_url(file.url)
|
||||
rstream2.on('error', function(err) {
|
||||
savestream.abort()
|
||||
stream.emit('error', err)
|
||||
})
|
||||
rstream2.on('end', function() {
|
||||
savestream.done()
|
||||
})
|
||||
|
||||
// XXX: check, what would happen if client disconnects?
|
||||
rstream2.pipe(stream)
|
||||
rstream2.pipe(savestream)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -509,7 +522,7 @@ Storage.prototype._sync_package_with_uplinks = function(name, pkginfo, options,
|
|||
}), null, uplink_errors)
|
||||
}
|
||||
|
||||
self.local.update_versions(name, pkginfo, function(err) {
|
||||
self.local.update_versions(name, pkginfo, function(err, pkginfo) {
|
||||
if (err) return callback(err)
|
||||
return callback(null, pkginfo, uplink_errors)
|
||||
})
|
||||
|
|
|
@ -22,7 +22,7 @@ packages:
|
|||
proxy_access: server1
|
||||
proxy_publish: server1
|
||||
|
||||
testpkg:
|
||||
'testpkg*':
|
||||
allow_access: test anonymous
|
||||
allow_publish: test anonymous
|
||||
proxy_access: server1
|
||||
|
|
11
test/gh29.js
11
test/gh29.js
|
@ -1,5 +1,6 @@
|
|||
var assert = require('assert')
|
||||
, readfile = require('fs').readFileSync
|
||||
, crypto = require('crypto')
|
||||
, ex = module.exports
|
||||
, server = process.server
|
||||
, server2 = process.server2
|
||||
|
@ -36,6 +37,16 @@ ex['uploading new tarball / srv1'] = function(cb) {
|
|||
})
|
||||
}
|
||||
|
||||
ex['uploading new package version / srv1'] = function(cb) {
|
||||
var pkg = require('./lib/package')('testpkg-gh29')
|
||||
pkg.dist.shasum = crypto.createHash('sha1').update(readfile('fixtures/binary')).digest('hex')
|
||||
server.put_version('testpkg-gh29', '0.0.1', pkg, function(res, body) {
|
||||
assert.equal(res.statusCode, 201)
|
||||
assert(~body.ok.indexOf('published'))
|
||||
cb()
|
||||
})
|
||||
}
|
||||
|
||||
ex['downloading newly created tarball / srv2'] = function(cb) {
|
||||
server2.get_tarball('testpkg-gh29', 'blahblah', function(res, body) {
|
||||
assert.equal(res.statusCode, 200)
|
||||
|
|
|
@ -16,6 +16,7 @@ function prep(cb) {
|
|||
}
|
||||
|
||||
Server.prototype.request = function(options, cb) {
|
||||
assert(options.uri)
|
||||
var headers = options.headers || {};
|
||||
headers.accept = headers.accept || 'application/json';
|
||||
headers['user-agent'] = headers['user-agent'] || this.userAgent;
|
||||
|
|
Loading…
Add table
Reference in a new issue