https://github.com/invrs/mezzo
Abstract anything into middleware
https://github.com/invrs/mezzo
Last synced: about 1 year ago
JSON representation
Abstract anything into middleware
- Host: GitHub
- URL: https://github.com/invrs/mezzo
- Owner: invrs
- Created: 2015-07-25T22:21:10.000Z (almost 11 years ago)
- Default Branch: master
- Last Pushed: 2015-09-21T04:29:18.000Z (almost 11 years ago)
- Last Synced: 2025-02-09T11:04:34.149Z (over 1 year ago)
- Language: CoffeeScript
- Homepage:
- Size: 148 KB
- Stars: 0
- Watchers: 8
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Mezzo
[](https://travis-ci.org/invrs/mezzo)
Abstract anything into middleware.
## The future
What if you could use middleware for things other than an HTTP request?
Things like:
* configuring a web server
* building your client assets
* extending component functionality
* DRYing up shared project functionality
### Example
From the **[paradiso](https://github.com/invrs/paradiso)** web framework:
```coffee
# Start the web server
#
routes = require "./routes"
server = require "paradiso-server"
express = require "paradiso-server-express"
server routes, express
port: 9000
static: "public"
```
### Goals
* Abstract library-specific code into small, reusable, and testable middleware.
* Maintain a similar interface for libraries that do the same thing.
* (Change out libraries without changing app code.)
* Piece together and configure middleware easily.
### Configuring middleware
If you only pass options to an adapter, it **does not** run the middleware chain.
```coffee
build option: true
```
However, it does save the options for a later execution:
```coffee
build option: true
build() # @options.option is still true
```
### Run the workflow
If you pass an adapter or nothing at all, the middleware chain **does** run:
```coffee
build()
build browserify, coffeeify
build browserify, coffeeify, option: true
```
## Write middleware
Skeleton implementation of a mezzo middleware:
```coffee
mezzo = require "mezzo"
module.exports = mezzo class
constructor: ({
@adapters # array of adapters in order of execution
@options # any options passed as a parameter (merged)
@index # index of this adapter in `@adapters`
}) ->
run: ({ env, next }) -> next env
```
### Put it all together
```coffee
mezzo = require "mezzo"
# Build adapters
#
a = mezzo class
constructor: ({ @options }) ->
run: ({ env, next }) ->
console.log "a @options", @options
env.a_run = true
next()
b = mezzo class
run: ({ env, next }) ->
console.log "b"
next b_run: true
c = mezzo class
run: ({ env, next }) ->
env.c_run = true
console.log "c env", env
next()
# Set options
#
a opt: true
# Execute middleware chain
#
a b, c, opt2: true
# Output:
#
# a @options { opt: true, opt2: true }
# b
# c env { a_run: true, b_run: true, c_run: true }
```