const cors = require('cors') const express = require('express') const createRequestHandler = require('npm-http-server').createRequestHandler const onFinished = require('on-finished') const redis = require('redis') const registryURL = process.env.npm_package_config_registryURL const bowerBundle = process.env.npm_package_config_bowerBundle const redirectTTL = process.env.npm_package_config_redirectTTL const autoIndex = process.env.npm_package_config_autoIndex const port = process.env.PORT || process.env.npm_package_config_port const URLFormat = /^\/((?:@[^\/@]+\/)?[^\/@]+)(?:@([^\/]+))?(\/.*)?$/ const logStats = (redisURL) => { const redisClient = redis.createClient(redisURL) return (req, res, next) => { onFinished(res, () => { const path = req.path if (res.statusCode === 200 && path.charAt(path.length - 1) !== '/') { redisClient.zincrby([ 'request-paths', 1, path ]) const match = URLFormat.exec(path) if (match) { const packageName = match[1] redisClient.zincrby([ 'package-requests', 1, packageName ]) } } }) next() } } const app = express() app.disable('x-powered-by') app.use(cors()) app.use(express.static('public', { maxAge: 60000 })) if (process.env.REDIS_URL) app.use(logStats(process.env.REDIS_URL)) app.use(createRequestHandler({ registryURL: registryURL, bowerBundle: bowerBundle, redirectTTL: redirectTTL, autoIndex: autoIndex })) app.listen(port, () => { console.log('Server started on port %s, Ctrl+C to quit', port) })