@plurid/plurid-routes-server v0.0.0-0
The plurid-routes-server is to be used alongside plurid applications spanning multiple origins in order to resolve the plurid plane routes at client request time.
Contents
About
The plurid-routes-server will respond to a route request with the suitable element identification data, based on calling the functions (queryRoute, registerRoute, verifyToken) which are passed at instantiation time.
Install
Install the package
npm install @plurid/plurid-routes-serveror
yarn add @plurid/plurid-routes-serverInstall the peer dependencies
npm install \
@plurid/deon \
@plurid/plurid-functions \
body-parser \
expressor
yarn add \
@plurid/deon \
@plurid/plurid-functions \
body-parser \
expressSetup
The PluridRoutesServer must be instantiated with the following functions:
queryRoute: QueryRouteregisterRoute: RegisterRouteverifyToken: VerifyToken
which will provide the functionality.
An example (tests/index.xs), with a mock-up initialRoutes, and in-memory (Map) routes registration.
// #region imports
import PluridRoutesServer, {
QueryRoute,
RegisterRoute,
VerifyToken,
RouteElement,
} from '@plurid/plurid-routes-server';
// #endregion imports
// #region data
/**
* Mock-up data.
*
* In the real case, the `initialRoutes` would be loaded from a database,
* and the `validToken` would assume an authentication/authorization mechanism.
*/
/**
* Record of `RouteElement | any` to account for the invalid example
*/
const initialRoutes: Record<string, RouteElement | any> = {
'/example-valid-registered': {
id: '/example-valid-registered',
},
'/example-valid-elementql': {
elementql: '/example-valid-elementql',
},
'/example-invalid': {
},
};
/**
* Map of `any` to account for the invalid example.
* Regular case assumes `Map<string, RouteElement>`
*/
const routes: Map<string, any> = new Map(
Object.entries(initialRoutes),
);
const validToken = 'token';
// #endregion data
// #region functions
const queryRoute: QueryRoute = async (
route,
) => {
console.log('queryRoute', route);
return routes.get(route);
}
const registerRoute: RegisterRoute = async (
route,
data,
) => {
console.log('registerRoute', route, data);
routes.set(route, data);
return true;
}
const verifyToken: VerifyToken = async (
token,
) => {
console.log('verifyToken', token);
return token === validToken;
}
// #endregion functions
// #region server
const server = new PluridRoutesServer({
queryRoute,
registerRoute,
verifyToken,
});
server.handle().post(
'/cache-reset',
(request, response) => {
try {
if (!request.body.token) {
console.log('cacheReset bad request');
response
.status(405)
.send('Bad Request');
return;
}
if (request.body.token !== validToken) {
console.log('cacheReset invalid token');
response
.status(403)
.send('Forbidden');
return;
}
console.log('cacheReset');
server.cacheReset();
response.send('Cache Reseted');
} catch (error) {
console.log('cacheReset error', error);
response
.status(500)
.send('Server Error');
}
}
);
server.cacheLoad(routes);
server.start();
// #endregion serverThe example server can be tested with cURL (more examples in tests/requests.md)
Request:
curl \
-X POST \
-H "Content-Type: application/json" \
-d '{"route":"/example-valid-registered"}' \
-H "Authorization: Bearer token" \
"http://localhost:8080/route"Expected:
{"id":"/example-valid-registered"}The Content-Type header can be application/json or application/deon, with the adequate data serialized into the body (json or deon).
The authentication token can be passed in the Authorization: Bearer header, or directly as a data field in the body.
Requests
The PluridRoutesServer handles two HTTP POST endpoints:
ENDPOINT_ROUTEENDPOINT_REGISTER
The ENDPOINT_ROUTE body must respect the interface
interface EndpointRoute {
token?: string;
route: string;
}The ENDPOINT_REGISTER body must respect the interface
interface EndpointRegister {
token?: string;
route: string;
data: RouteElement;
}The default endpoint values are
ENDPOINT_ROUTE:/routeENDPOINT_REGISTER:/register
and they can be overwritten by environment variables
ENDPOINT_ROUTE:process.env.PLURID_ROUTES_SERVER_ENDPOINT_ROUTEENDPOINT_REGISTER:process.env.PLURID_ROUTES_SERVER_ENDPOINT_REGISTER
Codeophon
5 years ago