diff options
Diffstat (limited to 'deps/npm/lib/search/esearch.js')
-rw-r--r-- | deps/npm/lib/search/esearch.js | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/deps/npm/lib/search/esearch.js b/deps/npm/lib/search/esearch.js new file mode 100644 index 0000000000..f4beb7ade6 --- /dev/null +++ b/deps/npm/lib/search/esearch.js @@ -0,0 +1,64 @@ +'use strict' + +var npm = require('../npm.js') +var log = require('npmlog') +var mapToRegistry = require('../utils/map-to-registry.js') +var jsonstream = require('JSONStream') +var ms = require('mississippi') +var gunzip = require('../utils/gunzip-maybe') + +module.exports = esearch + +function esearch (opts) { + var stream = ms.through.obj() + + mapToRegistry('-/v1/search', npm.config, function (er, uri, auth) { + if (er) return stream.emit('error', er) + createResultStream(uri, auth, opts, function (err, resultStream) { + if (err) return stream.emit('error', err) + ms.pipeline.obj(resultStream, stream) + }) + }) + return stream +} + +function createResultStream (uri, auth, opts, cb) { + log.verbose('esearch', 'creating remote entry stream') + var params = { + timeout: 600, + follow: true, + staleOk: true, + auth: auth, + streaming: true + } + var q = buildQuery(opts) + npm.registry.request(uri + '?text=' + encodeURIComponent(q) + '&size=' + opts.limit, params, function (err, res) { + if (err) return cb(err) + log.silly('esearch', 'request stream opened, code:', res.statusCode) + // NOTE - The stream returned by `request` seems to be very persnickety + // and this is almost a magic incantation to get it to work. + // Modify how `res` is used here at your own risk. + var entryStream = ms.pipeline.obj( + res, + ms.through(function (chunk, enc, cb) { + cb(null, chunk) + }), + gunzip(), + jsonstream.parse('objects.*.package', function (data) { + return { + name: data.name, + description: data.description, + maintainers: data.maintainers, + keywords: data.keywords, + version: data.version, + date: data.date ? new Date(data.date) : null + } + }) + ) + return cb(null, entryStream) + }) +} + +function buildQuery (opts) { + return opts.include.join(' ') +} |