Hatsy Router
Routing
This module contains a Routing capability that extends request processing context with request routing means.
The latter has the following properties:
-
fullRoute
original route. -
route
matching route. E.g. a tail section of original route. -
routeMatch
a successful match of the route(s) against the pattern(s).
The @hatsy/route-match library performs route parsing and matching.
Dispatch
Once Routing capability applied the request processing can be dispatched by matching route by one of the dispatchers.
dispatchByName()
import { httpListener } from '@hatsy/hatsy';
import { dispatchByName, Routing } from '@hatsy/router';
import { createServer } from 'http';
const server = createServer(
httpListener(
Routing.for(
dispatchByName({
api: apiHandler, // Handle API request under `/api` route
assets: assetsHandler, // Serve static assets under `/assets` route
}),
),
),
);
server.listen(8080);
dispatchByName()
function accepts a map of request processing handlers under route entry names the handler should
serve. The handler receives a request processing context with the rest of the route.
dispatchByPattern()
import { httpListener } from '@hatsy/hatsy';
import { dispatchByPattern, Routing } from '@hatsy/router';
import { createServer } from 'http';
const server = createServer(
httpListener(
Routing.for(
dispatchByPattern([
{ on: 'api/v{apiVersion}/**', to: apiHandler },
{ on: '**/*.html', to: pageHandler },
{ on: 'assets/**', to: assetsHandler },
]),
),
),
);
server.listen(8080);
dispatchByPatttern()
function accepts dispatch patterns containing a route pattern and handler that serves
the matching route. The handler receives a request processing context with matching route tail.
Route Format
The route format is URLRoute by default, while route patterns parsed by simpleRoutePattern().
This can be changed by configuring Routing capability.
import { httpListener } from '@hatsy/hatsy';
import { matrixRoute, matrixRoutePattern } from '@hatsy/route-match';
import { dispatchByPattern, Routing } from '@hatsy/router';
import { createServer } from 'http';
import { matrixRoute } from './matrix-route';
const server = createServer(
httpListener(
Routing.with({
buildRoute: ({ requestAddresses: { url } }) => matrixRoute(url),
routePattern: pattern => matrixRoutePattern(pattern),
}).for(
dispatchByPattern([
{ on: 'api;v/**', to: apiHandler }, // API version as matrix attribute
{ on: '**/*.html', to: pageHandler },
{ on: 'assets/**', to: assetsHandler },
]),
),
),
);
server.listen(8080);