@ords/core
Version:
Microservice architecture with service proposals in nodejs and typescript
164 lines (163 loc) • 5.24 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const proposals_1 = require("./proposals");
const rxjs_1 = require("rxjs");
/**
* Implemented registry with microservices
*/
class ServiceRegistry {
constructor() {
/**
* Microservices implemented
*/
this.services = {};
/**
* Hooks implemented
*/
this.hooks = {
pre: [],
post: []
};
/**
* Non local resolvers of microservice acts
* TODO: THis is not used yet
*/
this.resolvers = [];
}
/**
* Adds an microservice on a specific root performing a certain operation and give that a name
*/
addMicroService(root, name, service) {
// check if root exists otherwise add it
if (this.services[root] === undefined) {
this.services[root] = {};
}
// check if name exist otherwise add it
if (this.services[root][name] === undefined) {
// add service to list of services
this.services[root][name] = service;
}
else {
throw new Error(proposals_1.main.flag.error.NAME_ON_ROOT_EXISTS);
}
}
/**
* Adds a pre hook to microservice
*/
addPreHook(root, name, hook) {
// add the hook to stack
this.hooks.pre.push({
root: root,
name: name,
hook: hook
});
}
/**
* Adds a post hook to microservice
*/
addPostHook(root, name, hook) {
/// add the hook to stack
this.hooks.post.push({
root: root,
name: name,
hook: hook
});
}
/**
* Do the microservice pre hook
*/
doPreHook(root, name, payload) {
// loop the hooks
for (let source of this.hooks.pre) {
// check match for root
if (source.root.match(root)) {
// then check match for name
if (source.name.match(name)) {
payload = source.hook(payload);
}
}
}
return payload;
}
/**
* Do the microservice post hook
*/
doPostHook(root, name, payload) {
// loop the hooks
for (let source of this.hooks.post) {
// check match for root
if (source.root.match(root)) {
// then check match for name
if (source.name.match(name)) {
payload = source.hook(payload);
}
}
}
return payload;
}
/**
* Act out the microservice based upon the request
*/
act(root, name, request) {
// init empty handlers as undefined
let metaHandler = undefined;
let packageHandler = undefined;
// keep track of number of nexts
let nextCounter = 0;
// add the root and name metas
request._meta = {
msName: name,
msRoot: root
};
// prepare function to be run when observable is finished
let next = () => {
// count handlers up
nextCounter++;
// check that handlers are populated
if (nextCounter === 2) {
// check if root exists otherwise add it
if (this.services[root] === undefined) {
packageHandler.error(new Error(proposals_1.main.flag.error.NO_ROOT_FOUND));
packageHandler.complete();
metaHandler.complete();
}
else {
// check if name exists otherwise add it
if (this.services[root][name] === undefined) {
packageHandler.error(new Error(proposals_1.main.flag.error.NO_NAME_ON_ROOT));
packageHandler.complete();
metaHandler.complete();
}
else {
// perform the pre hooks
request = this.doPreHook(root, name, request);
// use the handlers to perform the main service
this.services[root][name](request, metaHandler, packageHandler);
// test
request.package.subscribe(null, (err) => {
packageHandler.error(err);
packageHandler.complete();
metaHandler.complete();
});
}
}
}
};
// generate response to make the handlers
let response = {
meta: rxjs_1.Observable.create((innerHandler) => {
metaHandler = innerHandler;
next();
}),
package: rxjs_1.Observable.create((innerHandler) => {
packageHandler = innerHandler;
next();
})
};
// perform the post hooks
response = this.doPostHook(root, name, response);
// return the final response
return response;
}
}
exports.ServiceRegistry = ServiceRegistry;