1.0.3 • Published 10 years ago
mezzo v1.0.3
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 web framework:
# 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.
build option: trueHowever, it does save the options for a later execution:
build option: true
build()  # @options.option is still trueRun the workflow
If you pass an adapter or nothing at all, the middleware chain does run:
build()
build browserify, coffeeify
build browserify, coffeeify, option: trueWrite middleware
Skeleton implementation of a mezzo middleware:
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 envPut it all together
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 }