compassdigital.middleware
CDL Provider middleware module
- This middleware module extends the CDL core provider with the ability to run functions before requests get handled
- This can be handled at the provider level (for every incoming request) or at the event level (for particular events, ex: "post_order")
Usage
Registering Provider-level middleware
const Middleware = require("@compassdigital/middleware").handler;
const ActionLogger = require("@compassdigital/middleware").fn.ActionLogger;
/**
* Inside the Provider constructor.
* The "bind" call is needed for this particular function but
* is not needed to make any custom middleware work with this
* package.
*/
this.middleware = new Middleware(ActionLogger.bind(this));
Registering handler-level middleware
const Middleware = require("@compassdigital/middleware").handler;
// Inside the domain-specific Provider
function bodyLogger (req, res, next) {
/**
* req: the request object from the lambda event
* res: the response object currently only holds a reference to user-defined local variables specific to the lifecycle of a single request
* next: the callback function to call when the middleware is finished work.
* - No parameters passes the middleware off to the next layer in the stack
* - Passing an error will cause the provider's error handler to take over and send the appropiate response
* - Passing true will skip the rest of the middleware for the current request
/
console.log(JSON.stringify(req.body));
return next();
}
Provider.on("post_test", "*:*:*", [ bodyLogger, async function (req, next) {
// Business logic here...
}]);
Feature Flagging
Feature flagging middleware provides an easy way to get state of flags in the req object.
const FeatureFlagging = require('@compassdigital/middleware').fn.FeatureFlagging;
You can register the middleware at the provider level with minimal boilerplate code.
UserProvider.use(FeatureFlagging.call(UserProvider));
Or at the handler level
Provider.on("post_test", "*:*:*", [FeatureFlagging(), async function (req, next) {
// Business logic here...
}]);
From here on, a feature_flags
property will be exposed on the req
object. You can then use the flags as
Provider.on("post_test", "*:*:*", async function (req, next) {
if (req.feature_flags.my_feature_1) doSomething();
});
Split API Key
For the middleware to be able to contact Split, an environment variable must be set in the provider's serverless.yml
file.
provider:
environment:
SPLIT_KEY: ${config:SPLIT_KEY}
Flag Caching
Before the middleware hits Split to retrieve the flags, it gets a CDL config file that has a cache_time property. This tells the middleware how long it should hold on to the flags before getting them again from Split. This can be changed.
{
"is_split_enabled": true,
"cache_time": 10000
}