app-builder
Version:
Promise based composable functions for middleware
47 lines • 3.79 kB
JavaScript
const flatten = (values) => [].concat(...values), noop = function noop() {
return Promise.resolve();
};
export function functionList(list, ...args) {
const arrayList = Symbol.iterator in list ? Array.from(list) : [list];
return arrayList.map((x) => {
return (_, next) => Promise.resolve(x(...args)).then(next);
});
}
class Executor {
constructor(mw, continuation) {
this.mw = mw;
this.continuation = continuation;
}
tryInvokeMiddleware(context, middleware, next = noop) {
try {
const resolved = middleware ? middleware(context, next) : context;
return Promise.resolve(resolved);
}
catch (error) {
return Promise.reject(error);
}
}
get middleware() {
return (context, next) => {
return this.tryInvokeMiddleware(context, this.mw, this.continuation.bind(null, context, next));
};
}
}
/**
* Create a function to invoke all passed middleware functions
* with a single argument <T>context
* @param middleware
*/
export function compose(...middleware) {
return flatten(middleware)
.filter((x) => {
if ('function' !== typeof x) {
throw new TypeError(`${x}, must be a middleware function accepting (context, next) arguments`);
}
return x;
})
.reduceRight((composed, mw) => {
return new Executor(mw, composed).middleware;
}, Executor.prototype.tryInvokeMiddleware);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb3NlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE1BQU0sT0FBTyxHQUFHLENBQUksTUFBMkIsRUFBRSxFQUFFLENBQUUsRUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBUSxFQUN0RixJQUFJLEdBQUcsU0FBUyxJQUFJO0lBQ2xCLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0FBQzFCLENBQUMsQ0FBQTtBQUVILE1BQU0sVUFBVSxZQUFZLENBQzFCLElBQTJCLEVBQzNCLEdBQUcsSUFBVztJQUVkLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQVksQ0FBQyxDQUFBO0lBQ3ZGLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ3pCLE9BQU8sQ0FBQyxDQUFNLEVBQUUsSUFBUyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3RFLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVELE1BQU0sUUFBUTtJQUNaLFlBQW9CLEVBQWlCLEVBQVUsWUFBdUM7UUFBbEUsT0FBRSxHQUFGLEVBQUUsQ0FBZTtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUEyQjtJQUFHLENBQUM7SUFDMUYsbUJBQW1CLENBQ2pCLE9BQVUsRUFDVixVQUF5QixFQUN6QixPQUFrQyxJQUFJO1FBRXRDLElBQUk7WUFDRixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQTtZQUNqRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7U0FDakM7UUFBQyxPQUFPLEtBQUssRUFBRTtZQUNkLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtTQUM3QjtJQUNILENBQUM7SUFDRCxJQUFJLFVBQVU7UUFDWixPQUFPLENBQUMsT0FBVSxFQUFFLElBQStCLEVBQUUsRUFBRTtZQUNyRCxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDaEcsQ0FBQyxDQUFBO0lBQ0gsQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQ3JCLEdBQUcsVUFBK0M7SUFFbEQsT0FBTyxPQUFPLENBQUMsVUFBVSxDQUFDO1NBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQ1osSUFBSSxVQUFVLEtBQUssT0FBTyxDQUFDLEVBQUU7WUFDM0IsTUFBTSxJQUFJLFNBQVMsQ0FDakIsR0FBRyxDQUFDLHFFQUFxRSxDQUMxRSxDQUFBO1NBQ0Y7UUFDRCxPQUFPLENBQVEsQ0FBQTtJQUNqQixDQUFDLENBQUM7U0FDRCxXQUFXLENBQUMsQ0FBQyxRQUFtQyxFQUFFLEVBQWlCLEVBQUUsRUFBRTtRQUN0RSxPQUFPLElBQUksUUFBUSxDQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxVQUF1QyxDQUFBO0lBQzlFLENBQUMsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLG1CQUFnRCxDQUFDLENBQUE7QUFDM0UsQ0FBQyJ9