UNPKG

@ords/core

Version:

Microservice architecture with service proposals in nodejs and typescript

164 lines (163 loc) 5.24 kB
"use strict"; 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;