npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

response

v0.18.0

Published

Streaming and mutation API for HTTP responses.

Downloads

1,631

Readme

Quick Example

response.json({result:'error',missing_keys:['email']}).status(400).pipe(res)

// headers are { 'content-type': 'application/json',
// date: 'Mon, 12 May 2014 12:57:31 GMT',
// connection: 'keep-alive',
// 'transfer-encoding': 'chunked' } 
// statusCode is 400 
// body is { result: 'error', missing_keys: [ 'email' ] }

Response

The basic idea is to build request for HTTP Responses.

This whole package is still beta.

files

var server = http.createServer(function (req, res) {
  var f = fs.createReadStream('file.js')
  if (req.url === '/test.js') return f.pipe(response()).pipe(res)
})

When pipeing files to response it will lookup the mime type and set the propert content-type header for whatever file extension you send it.

html, json, txt

var server = http.createServer(function (req, res) {
  if (req.url === '/') return response.html('<html>Hello World</html>').pipe(res)
  if (req.url === '/sitemap.html') {
    var f = fs.createReadStream('sitemap')
    return f.pipe(response.html()).pipe(res)
  }
  if (req.url === '/something.json') return response.json({test:1}).pipe(res)
  if (req.url === '/something.txt') return response.txt('some test').pipe(res)
})

.error(err[, statusCode])

r.error(new Error('Uh Oh!')).pipe(res)
r.error(555).pipe(res)
r.error(new Error('Uh Oh!'), 501).pipe(res)

In addition, errors emitted on the stream piped to response will be passed through the same API and are accesssible in views.

gzip and deflate compression

The compress and gzip keys in an options object are used for compression.

var server = http.createServer(function (req, res) {
  var f = fs.createReadStream('file.js')
  if (req.url === '/file.js') return f.pipe(response({compress:req})).pipe(res)
})

You can pass an HTTP Request object and the best compression, if any, will be chosen for you. Alternatively you can pass "gzip" or "deflate" to forcce compression of the response stream.

This compression option is compatible with every other feature in response and will work whether you do file streaming, html, json, or even using views. When passing a view, string or buffer to response the second argument is used as the options object.

var server = http.createServer(function (req, res) {
  if (req.url === '/') return response.html('<html>Nope</html>', {compress:req}).pipe(res)
})

status codes and headers

response also has an extended version of node core's HTTP Response API.

All headers setting and checking is done caseless while preserving the original casing when first set. This way you never accidentally send two of the same header but can still support broken clients that check for specific caseing.

.statusCode

Set the statusCode property to send the HTTP status code. This is a non-destructive way to send the status code.

var r = response()
r.statusCode = 500
r.html('<html>Error</html>')

.setHeader(key, value[, clobber=true])

Defaults to clobbering (overwritting) existing values but when disabled will concatenate values.

r.setHeader('X-Blah', 'somehost.com')

.setHeader(headers)

Set multiple headers by passing an object.

r.setHeader({'x-blah': 'somehost', 'x-blah2': 'anotherhost.com'})

.getHeader(key)

You can retreive a header by its key, use this method instead of directly accessing the headers object to avoid caseing constraints.

r.getHeader('content-type')

.hasHeader(key)

Check if a header is already set. If one is set the header key will be returned (which is important because it may have different caseing).

r.hasHeader('content-type')

views (very experimental)

function view (e, data, cb) {
  if (e) return cb(e)
  cb(null, '<html>' + data + '</html>')
}

var server = http.createServer(function (req, res) {
  var r = response(view)
  r.pipe(res)
  if (req.url === '/test1') return r.html('test')
})

This is how you would easily support something like a template system. TODO: example.

Credits

Mad props to @marak who handed over the "response" package in npm that he registered way back in the day.