From 361a6e344a52aa06765c0c0336e65920a4ceeed7 Mon Sep 17 00:00:00 2001 From: Maarten Balliauw Date: Wed, 17 Aug 2016 11:51:19 +0200 Subject: [PATCH 1/2] Update NuGet v3 implementation to not show unlisted versions Fixes #795. --- server.js | 65 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/server.js b/server.js index a58e1d7..935efd8 100644 --- a/server.js +++ b/server.js @@ -3492,29 +3492,52 @@ function mapNugetFeed(pattern, offset, getInfo) { var vPreRegex = new RegExp('^\\/' + pattern + '\\/vpre\\/(.*)\\.(svg|png|gif|jpg|json)$'); function getNugetVersion(apiUrl, id, includePre, request, done) { - var reqUrl = apiUrl + '/flatcontainer/' + id.toLowerCase() + '/index.json'; - request(reqUrl, function(err, res, buffer) { - if (err != null) { - done(err); - return; - } - - try { + // get service index document + regularUpdate(apiUrl + '/index.json', + (3600 * 1000 * 24), // 1 day - can theoretically change often but in practice it doesn't + function(buffer) { var data = JSON.parse(buffer); - var versions = data.versions; - if (!includePre) { - // Remove prerelease versions. - filteredVersions = versions.filter(function(version) { - return !/-/.test(version); - }); - if (filteredVersions.length > 0) { - versions = filteredVersions; + + var autocompleteResources = data.resources.filter(function(resource) { + return resource['@type'] === 'SearchAutocompleteService'; + }); + + return autocompleteResources; + }, + function(err, autocompleteResources) { + if (err != null) { done(err); return; } + + // query autocomplete service + var randomEndpointIdx = Math.floor(Math.random() * autocompleteResources.length); + var reqUrl = autocompleteResources[randomEndpointIdx]['@id'] + + '?id=' + encodeURIComponent(id.toLowerCase()) // NuGet package id (lowercase) + + '&prerelease=true' // Include prerelease versions? + + '&skip=0' // Start at first package found + + '&take=5000'; // Max. number of results + + request(reqUrl, function(err, res, buffer) { + if (err != null) { + done(err); + return; } - } - var lastVersion = versions[versions.length - 1]; - done(null, lastVersion); - } catch (e) { done(e); } - }); + + try { + var data = JSON.parse(buffer); + var versions = data.data; + if (!includePre) { + // Remove prerelease versions. + filteredVersions = versions.filter(function(version) { + return !/-/.test(version); + }); + if (filteredVersions.length > 0) { + versions = filteredVersions; + } + } + var lastVersion = versions[versions.length - 1]; + done(null, lastVersion); + } catch (e) { done(e); } + }); + }); } camp.route(vRegex, From 7f79712f0dfab4ace6cd511335046e4d4858b355 Mon Sep 17 00:00:00 2001 From: Thaddee Tyl Date: Wed, 1 Feb 2017 23:59:08 +0100 Subject: [PATCH 2/2] Set Nuget version endpoint update to 42 minutes --- server.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/server.js b/server.js index 935efd8..f07fc37 100644 --- a/server.js +++ b/server.js @@ -3494,7 +3494,15 @@ function mapNugetFeed(pattern, offset, getInfo) { function getNugetVersion(apiUrl, id, includePre, request, done) { // get service index document regularUpdate(apiUrl + '/index.json', - (3600 * 1000 * 24), // 1 day - can theoretically change often but in practice it doesn't + // The endpoint changes once per year (ie, a period of n = 1 year). + // We minimize the users' waiting time for information. + // With l = latency to fetch the endpoint and x = endpoint update period + // both in years, the yearly number of queries for the endpoint are 1/x, + // and when the endpoint changes, we wait for up to x years to get the + // right endpoint. + // So the waiting time within n years is n*l/x + x years, for which a + // derivation yields an optimum at x = sqrt(n*l), roughly 42 minutes. + (42 * 60 * 1000), function(buffer) { var data = JSON.parse(buffer);