Decorators (#42)

Adds decorator functionality to BaseService
This commit is contained in:
Sebastian Rindom
2020-04-30 21:39:30 +02:00
committed by GitHub
parent 2273cc519a
commit feda00d2d1
12 changed files with 2428 additions and 45 deletions
+31 -1
View File
@@ -2,5 +2,35 @@
* Common functionality for Services
* @interface
*/
class BaseService {}
class BaseService {
constructor() {
this.decorators_ = []
}
/**
* Adds a decorator to a service. The decorator must be a function and should
* return a decorated object.
* @param {function} fn - the decorator to add to the service
*/
addDecorator(fn) {
if (typeof fn !== "function") {
throw Error("Decorators must be of type function")
}
this.decorators_.push(fn)
}
/**
* Runs the decorators registered on the service. The decorators are run in
* the order they have been registered in. Failing decorators will be skipped
* in order to ensure deliverability in spite of breaking code.
* @param {object} obj - the object to decorate.
* @return {object} the decorated object.
*/
runDecorators_(obj) {
return this.decorators_.reduce(async (acc, next) => {
return acc.then(res => next(res)).catch(() => acc)
}, Promise.resolve(obj))
}
}
export default BaseService