Updated to include multi-endpoint support

This commit is contained in:
Michael Uzquiano
2012-10-02 14:20:44 -04:00
parent 5d9257d908
commit 0e0a1c6432
3 changed files with 143 additions and 21 deletions

View File

@@ -1,4 +1,25 @@
module.exports = {
directory: 'components',
json: 'component.json'
}
// Bower Config
// UZI
// added searchpath array
module.exports = function() {
var c = require('rc') ('bower', {
//Bower Defaults
directory: 'components',
json: 'component.json',
endpoint: 'https://bower.herokuapp.com',
searchpath: []
});
// temp for now
// rc doesn't read .bowerrc from local so we do it manually
var fs = require('fs');
if (fs.existsSync('.bowerrc')) {
c = JSON.parse(fs.readFileSync('.bowerrc').toString());
}
return c;
}();
// END UZI

View File

@@ -7,22 +7,57 @@
// ==========================================
var request = require('request');
var _ = require('lodash');
var _ = require('underscore');
var config = require('./config');
var endpoint = 'https://bower.herokuapp.com/packages';
var endpoint = config.endpoint + '/packages';
if (process.env.HTTP_PROXY) {
request = request.defaults({'proxy': process.env.HTTP_PROXY});
// UZI
// allow for additional endpoints to be used for search and lookup
var endpoints = [];
endpoints.push(endpoint);
if (config.searchpath) {
for (var i = 0; i < config.searchpath.length; i++) {
endpoints.push(config.searchpath[i] + '/packages');
}
}
// END UZI
// UZI
// modified so that this now checks each repository and finds the first match
exports.lookup = function (name, callback) {
request.get(endpoint + '/' + encodeURIComponent(name), function (err, response, body) {
if (err || response.statusCode !== 200) return callback(err || new Error(name + ' not found'));
callback(err, body && JSON.parse(body).url);
});
var f = function(i) {
var endpoint = endpoints[i];
console.log("EP: " + endpoint);
request.get(endpoint + '/' + encodeURIComponent(name), function (err, response, body) {
if (!response) {
console.log("No response from endpoint: " + endpoint);
}
else if (err && response.statusCode !== 200 && response.statusCode !== 404) {
return callback(err || new Error(name + ' failed to look up for endpoint: ' + endpoint));
}
if (response && response.statusCode !== 404) {
callback(err, body && JSON.parse(body).url);
} else {
if (i + 1 < endpoints.length) {
f(i+1);
} else {
return callback(new Error(name + ' not found'));
}
}
});
};
f(0);
};
// END UZI
exports.register = function (name, url, callback) {
var body = {name: name, url: url};
request.post({url: endpoint, form: body}, function (err, response, body) {
@@ -44,11 +79,47 @@ exports.register = function (name, url, callback) {
});
};
// UZI
// modified so now searches across many repositories
// hands back in order of preference with higher-level endpoint resources overriding lower-level
// also marks an "endpoint" property on the results to indicate which registry the search result was found in
// this uses a map to mark which "names" have been obscured by higher level endpoints
exports.search = function (name, callback) {
request.get(endpoint + '/search/' + encodeURIComponent(name), function (err, response, body) {
callback(err, body && JSON.parse(body));
});
var f = function(i, map, results) {
var endpoint = endpoints[i];
request.get(endpoint + '/search/' + encodeURIComponent(name), function (err, response, body) {
if (!response) {
console.log("No response from endpoint: " + endpoint);
}
else if (err && response.statusCode !== 200 && response.statusCode !== 404) {
return callback(err || new Error(name + ' failed to look up for endpoint: ' + endpoint));
}
if (response && response.statusCode !== 404) {
var array = body && JSON.parse(body);
for (var x = 0; x < array.length; x++) {
var name = array[x].name;
if (!map[name]) {
map[name] = name;
results.push({ name: array[x].name, url: array[x].url, endpoint: array[x].endpoint });
}
}
}
if (i + 1 < endpoints.length) {
f(i + 1, map, results);
} else {
return callback(null, results);
}
});
};
f(0, {}, []);
};
// END UZI
exports.info = function (name, callback) {
exports.lookup(name, function (err, url) {
@@ -65,8 +136,37 @@ exports.info = function (name, callback) {
});
};
// UZI
// modified so this goes across all endpoints
// hands back in order of preference with higher-level endpoint resources overriding lower-level
exports.all = function (callback) {
request.get(endpoint, function (err, response, body) {
callback(err, body && JSON.parse(body));
});
var f = function(i, results) {
var endpoint = endpoints[i];
request.get(endpoint, function (err, response, body) {
if (!response) {
console.log("No response from endpoint: " + endpoint);
}
else if (err && response.statusCode !== 200 && response.statusCode !== 404) {
return callback(err || new Error(name + ' failed to look up for endpoint: ' + endpoint));
}
if (response && response.statusCode !== 404) {
var array = body && JSON.parse(body);
for (var x = 0; x < array.length; x++) {
results.push({ name: array[x].name, url: array[x].url, endpoint: array[x].endpoint });
}
}
if (i + 1 < endpoints.length) {
f(i + 1, results);
} else {
return callback(new Error(name + ' not found'));
}
});
};
f(0, {});
};
// END UZI