Skip to content
🌳 JS web server charged with Browsers' WebAPI with native HTTP2 support
JavaScript Other
Branch: master
Clone or download

readme.md

Plant logo

Plant

npm npm

NPM · Source · Readme

Plant is WebAPI standards based HTTP2 web server, created with modular architecture and functional design in mind. Also it's pure and less coupled.

Plant supports HTTP 1 and HTTP 2 protocols. But it's transport agnostic and can work right in the browser over WebSockets, WebRTC, or PostMessage.

Features

  • ☁️ Lightweight: only 8 KiB minified and gzipped.
  • Serverless ready: works even in browser.
  • 🛡 Security oriented: uses the most strict Content Securiy Policy (CSP) by default.
  • 📐 Standards based: uses WebAPI interfaces.
  • 🛳 Transport agnostic: no HTTP or platform coupling, ship requests via everything.

Table of Contents

Install

# Install plant web server
npm i @plant/plant
# Install node HTTP2 transport
npm i @plant/http2

Examples

Hello World

Hello world with HTTP2 as transport.

⚠️ Note that default CSP header value is default-src localhost; form-action localhost. This will prevent web page from loading any external resource at all. Set minimal required CSP on your own. Read about CSP on Mozilla Developer Network

// Build request handler
const createServer = require('@plant/http2');
const Plant = require('@plant/plant');

const plant = new Plant();
plant.use(({res}) => {
  res.body = 'Hello, World!'
})

createServer(plant)
.listen(8080)

Router

Plant's builtin router is extremely simple and works only with exact strings. But there is more powerful router package which brings named params and regular expressions into routing.

const Plant = require('@plant/plant');
const Router = require('@plant/router');

const plant = new Plant()
const router = new Router()

router.get('/user/:name', async function({res, route}) {
  res.body = `Hello, ${route.params.name}!`
})

plant.use('/api/v1/*', router)

HTTP2 pushes

Hello world with HTTP2 as transport.

// Build request handler
const createServer = require('@plant/http2');
const Plant = require('@plant/plant');

const plant = new Plant();

plant.use('/script.js', ({res}) => {
  res.headers.set('content-type', 'application/javascript')
  res.body = 'console.log("Hello")'
})

plant.use('/index.html', ({res, fetch}) => {
  // Push '/script.js' URL to pushed resources.
  // It will be requested before sending main response.
  res.push('/script.js')
  // ... or ...
  // Push complete response from subrequest
  res.push(
    await fetch('/script.js')
  )

  res.body = '<html><script src="/script.js"></script></html>'
})

createServer(plant)
.listen(8080)

Packages

Router @plant/router

NPM · Source · Readme

Plant standalone router.

HTTP2 @plant/http2

NPM · Source · Readme

Plant adapter for native node.js http2 module server. It creates server listener from Plant instance and http2.createServer() options. It's usage is the same as https module.

HTTPS2 @plant/https2

NPM · Source · Readme

Plant adapter for native node.js http2 module SSL server. It creates server listener from Plant instance and http2.createSecureServer() options. It's usage is the same as https module.

HTTP @plant/http

NPM · Source · Readme

Plant adapter for native node.js http module. It creates server listener from plant instance.

HTTPS @plant/https

NPM · Source · Readme

Plant adapter for native node.js https module. It creates server listener from plant instance and https options.

Internal packages

flow @plant/flow

NPM · Source · Readme

This is library for cascades. This is where contexts manage take place and requests pass from one handler to another.

HTTP Adapter @plant/http-adapter

NPM · Source · Readme

This package is using to connect Plant and native Node's HTTP server. Modules http, https, http2, and https2 use it under the hood.

Test HTTP Suite @plant/test-http

NPM · Source · Readme

Tiny package with tools for HTTP testing. It simplify server creation and request sending and receiving.

License

MIT © Rumkin

You can’t perform that action at this time.