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 routesexpress 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: true
However, it does save the options for a later execution:
build option: truebuild # @options.option is still true
Run the workflow
If you pass an adapter or nothing at all, the middleware chain does run:
buildbuild browserifycoffeeifybuild browserifycoffeeifyoption: true
Write middleware
Skeleton implementation of a mezzo middleware:
mezzo = require "mezzo" module.exports = mezzo constructor: @adapters # array of adapters in order of execution @options # any options passed as a parameter (merged) @index # index of this adapter in `@adapters` -> : next env
Put it all together
mezzo = require "mezzo" # Build adapters # a = mezzo : : consolelog "a @options"@options env.a_run = true next b = mezzo : consolelog "b" next b_run: true c = mezzo : env.c_run = true consolelog "c env"env next # Set options # a opt: true # Execute middleware chain # a bcopt2: true # Output: # # a @options { opt: true, opt2: true } # b # c env { a_run: true, b_run: true, c_run: true }