mirror of
https://github.com/titanscouting/tra-analysis.git
synced 2024-11-14 23:26:18 +00:00
65 lines
1.9 KiB
JavaScript
65 lines
1.9 KiB
JavaScript
|
'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(' ')
|
||
|
}
|