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

like-backend

v2.2.0

Published

Create HTTP servers with graceful shutdown and tests easily

Downloads

157

Readme

like-backend

Create HTTP servers with graceful shutdown and tests easily

npm i like-backend

It includes graceful-goodbye and graceful-http.

Usage

Run it as a process (auto-detects SIGINT etc) or import it for testing (will auto-teardown).

app.js

const Backend = require('like-backend')
const express = require('express')

module.exports = Backend.launch(main)

function main () {
  const app = express()

  app.get('/api/example', function (req, res) {
    res.json('Hello world!')
  })

  app.post('/api/users', function (req, res) {
    res.status(409).json({ error: 'EMAIL_ALREADY_REGISTERED' })
  })

  const server = app.listen(Backend.testing ? 0 : 1337, '127.0.0.1')

  return new Backend({
    server,
    goodbye: async function () {
      // Close resources here
    }
  })
}

test.js

const test = require('brittle')
const launch = require('./app.js')

test('basic', async function (t) {
  const request = await launch(t)

  const data = await request('/api/example')
  t.is(data, 'Hello world!')
})

test('basic error', async function (t) {
  const request = await launch(t)

  try {
    await request('/api/users', { method: 'POST' })
  } catch (err) {
    if (!err.response) throw err
    t.is(err.response.status, 409)
    t.alike(err.body, { error: 'EMAIL_ALREADY_REGISTERED' })
  }
})

API

const backend = new Backend(options)

Creates a Backend instance based on a HTTP server.

Avoid async operations between server.listen and the Backend creation.
So there is no new connections until graceful-http is hooked up.

Available options:

{
  server,
  goodbye // Function that is called to teardown the backend
}

backend.host

Hostname or IP of the server once is listening.

backend.port

Port of the server once is listening.

Backend.testing

Static property that indicates if it's running for tests.

Backend.launch(main)

Static method to handle the start up of the server.

main must be a function that returns an HTTP server or a Backend instance.

Backend.goodbye(onclose)

Static method to add teardown handlers from outside of launch.

const request = await launch(options)

Starts the app for testing.

The returned request is a like-fetch instance, bound with the backend URL prefixed.

options available:

{
  teardown
}

More examples

test('custom teardown', async function (t) {
  const request = await launch({ teardown: t.teardown })
  // ...
})

test('disable response type', async function (t) {
  const request = await launch(t)

  const response = await request('/api/example', { responseType: false })
  const data = await response.json()

  t.is(data, 'Hello world!')
})

test('manual request', async function (t) {
  const backend = await launch(t)

  const response = await fetch('http://' + backend.host + ':' + backend.port + '/api/example')
  const data = await response.json()

  t.is(data, 'Hello world!')
})

License

MIT