import * as Hapi from "hapi" import {Handler} from "./Handler"; import {BaseRequestPayload, BaseResponsePayload, Request} from "./AbstractCall"; import {Service} from "./Service"; import {Logger} from "../Logger"; /** * Class to handle the actual Server */ export class MeetznowService{ readonly server: Hapi.Server; readonly serviceName : Service; private readonly logger : Logger; static INSTANCE : MeetznowService; private constructor(serviceName : Service){ this.serviceName = serviceName; this.logger = new Logger(this.serviceName, "general"); this.server = new Hapi.Server({ host : '0.0.0.0', port : process.env.PORT || 3000 }); this.server.route({ method: 'GET', path: '/' + this.serviceName, handler: (request, h) => { return 'Connection possible!'; } }); this.server.route([{ method: 'GET', path: "/" + this.serviceName + "/health", handler: (request, h) => { return "Thx, I'm fine!"; } },{ method: 'GET', path: "/health", handler: (request, h) => { return "Thx, I'm fine!"; } }]); this.server.route({ method: 'GET', path: '/{path*}', handler: async (request, h) => { return h.response({message : "Can't find path " + request.path + " !"}).code(200); } }); MeetznowService.INSTANCE = this; } /** * starts the Server * @param {Service} service * @returns {Promise} */ //Singleton static async start(service : Service) : Promise{ if(MeetznowService.INSTANCE) return MeetznowService.INSTANCE; try { MeetznowService.INSTANCE = new MeetznowService(service); await MeetznowService.INSTANCE.server.start(); console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); console.log(`Server running at: ${MeetznowService.INSTANCE.server.info.uri}`); console.log("Service: " + MeetznowService.INSTANCE.serviceName); console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); } catch (e) { console.log(e); } return MeetznowService.INSTANCE; } getLogger(namespace? : string){ if(!namespace) return this.logger; return new Logger(this.serviceName, namespace) } /** * adds a Handler an checks for valid json form * @param {RequestHandler} handler * @returns {MeetznowService} */ addHandler >(handler : RequestHandler) : MeetznowService{ const handle = async function (request) { try{ if(typeof request.payload === "string") return await handler.handle(JSON.parse(request.payload) as Request, MeetznowService.INSTANCE.getLogger()); else if(typeof request.payload === "object") return await handler.handle(request.payload as Request, MeetznowService.INSTANCE.getLogger()); else throw Error("Request is of type " + typeof request.payload + " but we require json/object!") }catch (e) { MeetznowService.INSTANCE.getLogger().error((request.payload as Request).toString(), e); return e; } }; this.server.route([{ method: 'POST', path: '/' + this.serviceName + '/' + handler.getHandlerName(), handler: handle, options : { cors : true }},{ method: 'POST', path: '/' + handler.getHandlerName(), handler: handle, options : { cors : true }}]); console.log("Added handler with path: /" + handler.getHandlerName()); return this; } }