Meet npm Pro: unlimited public & private packages + package-based permissions.Learn more »


0.7.2 • Public • Published


Greenkeeper badge

Monadic Middleware

npm install --save fantasy-states fluture momi

Middleware - specifically in the case of Connect, Express and Koa - is a mechanism which encodes several effects:

  • A build-up of state through mutation of the req parameter
  • An eventual response through mutation of the res parameter
  • Inversion of control over the continuation by means of calling the next parameter
  • Possible error branch by means of calling the next parameter with a value

If we would want to encode all of these effects into a data-structure, we could use a StateT(Future) -> StateT(Future) structure:

  • A build-up of state through the State monad
  • An eventual response through the right-sided value of Future
  • Inversion of control by passing the whole structure into a function
  • Possible error branch through the left-sided value of Future

In other words, the StateT(Future)-structure might be considered the Middleware monad. This packages exposes the Middleware monad, comprised of State from fantasy-states and Future from Fluture. Besides the monad itself, it also exposes some utility functions and structures for practically applying Middleware. One such utility is the App class, which allows composition of functions over Middleware to be written more like what you are used to from middleware as it comes with Connect, Express or Koa.


const {App, Middleware} = require('momi');
const qs = require('querystring');
const queryParseMiddleware =*(next) {
  const req = yield Middleware.get;
  const query = qs.parse(req.url.split('?')[1]);
  yield Middleware.put(Object.assign({query}, req));
  return yield next;
const echoMiddleware = _ => => ({
  status: 200,
  headers: {'X-Powered-By': 'momi'},
  body: req.query.echo
const app = App.empty()
App.mount(app, 3000);


  • Readme the code from Usage, ready to run.
  • Express shows how to embed Momi within Express.
  • Bootstrap an extensive example showing application structure.
  • Real World how momi is being used in real life.




npm i momi

DownloadsWeekly Downloads






Unpacked Size

8.28 kB

Total Files


Last publish


  • avatar
  • avatar