/
getPackage.js
70 lines (54 loc) · 1.45 KB
/
getPackage.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
var request = require('request')
var url = require('url')
module.exports = getPackage
function getPackage(respond, route, unpm) {
var baseUrl = url.format(unpm.config.host)
var version = route.params.version
var name = route.params.name
if(!version) {
return unpm.Package.getMeta(name, returnMeta)
}
unpm.Package.getVersionMeta(name, version, returnMeta)
function returnMeta(err, meta) {
if(err) {
return respond(err)
}
if(!meta) {
return notFound()
}
if(!version) {
Object.keys(meta.versions).forEach(function(version) {
meta.versions[version].dist.tarball = getTarballUrl(version)
if(!meta.versions[version]._id) {
meta.versions[version]._id = name + '@' + version
}
})
} else {
meta.dist.tarball = getTarballUrl(version)
}
return respond(null, 200, meta)
}
function getTarballUrl(version) {
return baseUrl + '/' + name + '/-/' + name + '/' + version + '.tgz'
}
function notFound() {
if(!unpm.config.fallback) {
return respond.notFound()
}
request(unpm.config.fallback + route.path, proxyResponse)
}
function proxyResponse(err, res, data) {
if(err) {
return respond(err)
}
if(res.statusCode !== 200) {
respond.res.writeHead(res.statusCode, res.headers)
return respond.res.end(data)
}
try {
respond(null, 200, JSON.parse(data))
} catch(err) {
respond(err)
}
}
}