Sign Up for Free

RunKit +

Try any Node.js package right in your browser

This is a playground to test code. It runs a full Node.js environment and already has all of npm’s 400,000 packages pre-installed, including momi with all npm packages installed. Try it out:

require("fantasy-states/package.json"); // fantasy-states is a peer dependency. require("fluture/package.json"); // fluture is a peer dependency. var momi = require("momi")

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

momi v0.7.2

Monadic middleware


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.


RunKit is a free, in-browser JavaScript dev environment for prototyping Node.js code, with every npm package installed. Sign up to share your code.
Sign Up for Free