Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/rumkin/plant

🌳 JS web server charged with WebAPI and neat HTTP2 support
https://github.com/rumkin/plant

http javascript js server

Last synced: about 2 months ago
JSON representation

🌳 JS web server charged with WebAPI and neat HTTP2 support

Awesome Lists containing this project

README

        


Plant logo

# Plant

[![npm](https://img.shields.io/npm/v/@plant/plant.svg?style=flat-square)](https://npmjs.com/package/@plant/plant)
[![npm](https://img.shields.io/npm/dw/@plant/plant.svg?style=flat-square)](https://npmjs.com/package/@plant/plant)
![](https://img.shields.io/badge/size-8KiB-blue.svg?style=flat-square)

[NPM](https://npmjs.com/package/@plant/plant) ·
[Source](packages/plant) · [Readme](packages/plant/readme.md)

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](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) (CSP) by default.
- 📐 Standards based: uses WebAPI interfaces.
- 🛳 Transport agnostic: no HTTP or platform coupling, ship requests via __everything__.

---

## Table of Contents

* [Install](#install)
* [Examples](#exmaples)
* [Packages](#packages)
* [Internal packages](#internal-packages)

## Install

```bash
# 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](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) on Mozilla Developer Network

```javascript
// 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.

```javascript
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.

```javascript
// 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 = ''
})

createServer(plant)
.listen(8080)
```

## Packages

### [Router](packages/router) `@plant/router`

[NPM](https://npmjs.com/package/@plant/router) ·
[Source](packages/router) · [Readme](packages/router/readme.md)

Plant standalone router.

## HTTP(S) Packages

### [HTTP2](packages/http2) `@plant/http2`

[NPM](https://npmjs.com/package/@plant/http2) ·
[Source](packages/http2) · [Readme](packages/http2/readme.md)

Plant adapter for native node.js http2 module server. It creates server
listener from Plant instance and `http2.createServer()` [options](https://nodejs.org/dist/latest-v11.x/docs/api/http2.html#http2_http2_createserver_options_onrequesthandler). It's
usage is the same as https module.

### [HTTPS2](packages/https2) `@plant/https2`

[NPM](https://npmjs.com/package/@plant/https2) ·
[Source](packages/https2) · [Readme](packages/https2/readme.md)

Plant adapter for native node.js http2 module SSL server. It creates server
listener from Plant instance and `http2.createSecureServer()` [options](https://nodejs.org/dist/latest-v11.x/docs/api/http2.html#http2_http2_createsecureserver_options_onrequesthandler). It's
usage is the same as https module.

### [HTTP](packages/http) `@plant/http`

[NPM](https://npmjs.com/package/@plant/http) ·
[Source](packages/http) · [Readme](packages/http/readme.md)

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

### [HTTPS](packages/https) `@plant/https`

[NPM](https://npmjs.com/package/@plant/https) ·
[Source](packages/https) · [Readme](packages/https/readme.md)

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

### [HTTP Adapter](packages/http-adapter) `@plant/http-adapter`

[NPM](https://npmjs.com/package/@plant/http-adapter) ·
[Source](packages/http-adapter) · [Readme](packages/http-adapter/readme.md)

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

## Electron Packages

### [Electron](packages/electron-adapter) `@plant/electron`

[NPM](https://npmjs.com/package/@plant/electron) ·
[Source](packages/electron) · [Readme](packages/electron/readme.md)

This package is using to connect Plant and with current Electron instance protocols API.
It's using `electron-adapter` under the hood.

### [Electron Adapter](packages/electron-adapter) `@plant/electron-adapter`

[NPM](https://npmjs.com/package/@plant/electron-adapter) ·
[Source](packages/electron-adapter) · [Readme](packages/electron-adapter/readme.md)

This package is using to connect Plant and with Electron protocols API.

## Utility Packages

### [Flow](packages/flow) `@plant/flow`

[NPM](https://npmjs.com/package/@plant/flow) ·
[Source](packages/flow) · [Readme](packages/flow/readme.md)

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

### [Node Stream Utils](packages/node-stream-utils) `@plant/node-stream-utils`

[NPM](https://npmjs.com/package/@plant/node-stream-utils) ·
[Source](packages/node-stream-utils) · [Readme](packages/node-stream-utils/readme.md)

Node <-> WebAPI streams adapters. Useful for wrapping Node.js streams to work
with Plant.

## Tests Packages

### [Test HTTP Suite](packages/test-http) `@plant/test-http`

[NPM](https://npmjs.com/package/@plant/test-http) ·
[Source](packages/test-http) · [Readme](packages/test-http/readme.md)

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

## License

MIT © [Rumkin](https://rumk.in)