Skip to content

Latest commit

 

History

History
109 lines (78 loc) · 3.6 KB

README.md

File metadata and controls

109 lines (78 loc) · 3.6 KB

whook

Build strong and efficient REST web services.

GitHub license Build status

Coverage Status

Why write code when you have an OpenAPI definition?

Summary

Whook eats your documentation and provide you with a performant router that take care of running the right code for the right operation.

By using the OpenAPI standard and the dependency injection pattern, Whook provides a convenient, highly modular and easily testable back end framework.

Usage

Work in progress

I'd like to end up with a quick start guide looking like that:

# Initialize the project
mkdir simple_server && cd simple_server;
npm init whook simple_server;
npm install;

# Check install with a dry run of the server
DRY_RUN=1 npm run start

But atm, I only need it for my projects so leaving this as is in the meanwhile. If you're still motivated to use it, you should be prepared to face issues. That said, I'll help as much as I can if you have any question.

Principles

This projects aims to make creating well documented and highly customizable REST APIs a breeze.

By relying on the OpenAPI format to declare a new endpoint, this project forces documentation before code. It also is highly customizable since based on the dependency injection with inversion of control pattern allowing you to override or wrap its main constituents.

Architecture Overview

The Whook route handling flow is very simple.

First, we have a HTTPServer that handles requests an serve responses (the httpServer service).

Then, the httpTransaction transform the NodeJS requests into raw serializable ones (raw objects with no methods nor internal states).

Then the router (httpRouter) deal with that request to test which handler need to be run by comparing the method/path couple with the OpenAPI operations declarations.

Once found, it simply runs the right handler with the OpenAPI parameters value filled from the serializable request. The handler simply have to return a serializable response object in turn.

If any error occurs within this process, than the errorHandler is responsible for providing the now lacking response object based on the error it catches.

And that's it, you have your REST API. We have no middleware concept here. Instead, every handler is a simple function taking an object and returning another one. It makes those objects very easily composable (in a functional programming sense).

You may add global wrappers to change every handlers input/output on the fly or add a local wrapper specifically to one of a few handlers.

Contributing

Clone this project repository and run:

npm i

The repository is based on LernaJS that allows to host several NPM packages in a single repository. That said, to keep it simple it only proxies the packages commands.

Authors

License

MIT