Skip to content

Instantly share code, notes, and snippets.

@Maxim-Mazurok
Created April 27, 2020 08:38
Show Gist options
  • Save Maxim-Mazurok/92cba84b5eafa26bc024249e947b1f36 to your computer and use it in GitHub Desktop.
Save Maxim-Mazurok/92cba84b5eafa26bc024249e947b1f36 to your computer and use it in GitHub Desktop.
Get download stats of all gapi.client.* packages from npmjs api from behind a proxy
const http = require('http');
const https = require('https');
const { getProxySettings } = require('get-proxy-settings');
const apis = [
'acceleratedmobilepageurl',
'adexchangebuyer',
'adexchangebuyer2',
'adexchangeseller',
'adexperiencereport',
'admin',
'adsense',
'adsensehost',
'analytics',
'analyticsreporting',
'androiddeviceprovisioning',
'androidenterprise',
'androidmanagement',
'androidpublisher',
'appengine',
'appsactivity',
'appstate',
'bigquery',
'bigquerydatatransfer',
'blogger',
'books',
'calendar',
'civicinfo',
'classroom',
'cloudbilling',
'cloudbuild',
'clouddebugger',
'clouderrorreporting',
'cloudfunctions',
'cloudiot',
'cloudkms',
'cloudmonitoring',
'cloudresourcemanager',
'cloudtasks',
'cloudtrace',
'clouduseraccounts',
'compute',
'consumersurveys',
'container',
'content',
'customsearch',
'dataflow',
'dataproc',
'datastore',
'deploymentmanager',
'dfareporting',
'discovery',
'dlp',
'dns',
'doubleclickbidmanager',
'doubleclicksearch',
'drive',
'firebasedynamiclinks',
'firebaseremoteconfig',
'firebaserules',
'firestore',
'fitness',
'fusiontables',
'games',
'gamesconfiguration',
'gamesmanagement',
'genomics',
'gmail',
'groupsmigration',
'groupssettings',
'iam',
'identitytoolkit',
'kgsearch',
'language',
'licensing',
'logging',
'manufacturers',
'mirror',
'ml',
'monitoring',
'oauth2',
'oslogin',
'pagespeedonline',
'partners',
'people',
'photoslibrary',
'playcustomapp',
'playmoviespartner',
'plus',
'plusdomains',
'prediction',
'proximitybeacon',
'pubsub',
'qpxexpress',
'reseller',
'resourceviews',
'runtimeconfig',
'safebrowsing',
'script',
'searchconsole',
'servicecontrol',
'servicemanagement',
'serviceuser',
'sheets',
'siteverification',
'slides',
'sourcerepo',
'spanner',
'spectrum',
'speech',
'sqladmin',
'storage',
'storagetransfer',
'streetviewpublish',
'surveys',
'tagmanager',
'taskqueue',
'tasks',
'testing',
'toolresults',
'translate',
'urlshortener',
'vault',
'videointelligence',
'vision',
'webfonts',
'webmasters',
'youtube',
'youtubeanalytics',
'youtubereporting',
];
const data = [];
(async () => {
const proxy = await getProxySettings();
for (api of apis) {
await new Promise((resolve, reject) => {
http.request({
host: proxy.http.host,
port: proxy.http.port,
method: 'CONNECT',
path: 'api.npmjs.org:443',
})
.on('connect', (res, socket) => {
if (res.statusCode === 200) {
https.get(
{
host: 'api.npmjs.org',
path: `/downloads/point/last-month/@types/gapi.client.${api}`,
socket,
// agent: false,
},
res => {
let chunks = [];
res.on('data', chunk => chunks.push(chunk));
res.on('end', () => {
const parsedData = JSON.parse(Buffer.concat(chunks).toString('utf8'));
data.push(parsedData);
console.log(parsedData);
resolve();
});
},
);
} else {
reject(res.statusCode);
}
})
.on('error', err => {
console.error('error', err);
})
.end();
});
}
console.log(
data.sort((a, b) => b.downloads - a.downloads).map(({ downloads, package }) => ({ downloads, package })),
);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment