All files / lib swsHapi.js

21.31% Statements 13/61
0% Branches 0/9
10% Functions 1/10
21.31% Lines 13/61

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130  1x 1x 1x 1x 1x 1x 1x 1x 1x           1x 1x                                                                                                                                                                                                                             1x 1x  
/* swagger-stats Hapi plugin */
const path = require('path');
const promClient = require("prom-client");
const swsSettings = require('./swssettings');
const swsProcessor = require('./swsProcessor');
const swsUtil = require('./swsUtil');
const debug = require('debug')('sws:hapi');
const url = require('url');
const qs = require('qs');
const send = require('send');
 
/* HAPI Plugin */
class SwsHapi {
 
    constructor() {
        this.effectiveOptions = {};
        this.processor = swsProcessor;
    }
 
    // Registers Hapi Plugin
    async register(server, options) {
        let processor = this.processor;
        server.events.on('response', function(request){
            let nodeReq = request.raw.req;
            // Check if tracking
            if( ('sws' in nodeReq) && ('track' in nodeReq.sws) && (nodeReq.sws.track === false) ){
                return;
            }
            let nodeRes = request.raw.res;
            try {
                processor.processResponse(nodeRes);
            }catch(e){
                debug("processResponse:ERROR: " + e);
            }
        });
        await server.ext('onRequest', function (request, h) {
            let nodeReq = request.raw.req;
            let nodeRes = request.raw.res;
            nodeRes._swsReq = nodeReq;
            nodeReq.sws = {};
            nodeReq.sws.query = qs.parse(url.parse(nodeReq.url).query);
            let reqUrl = nodeReq.url;
            if(reqUrl.startsWith(swsSettings.uriPath)){
                // Don't track sws requests
                nodeReq.sws.track = false;
                return h.continue;
            }
            try {
                processor.processRequest(nodeReq,nodeRes);
            }catch(e){
                debug("processRequest:ERROR: " + e);
            }
            return h.continue;
        });
        // Return statistics
        server.route({
            method: 'GET',
            path: swsSettings.pathStats,
            handler: function (request, h) {
                return processor.getStats(request.raw.req.sws.query);
            }
        });
        // Return metrics
        server.route({
            method: 'GET',
            path: swsSettings.pathMetrics,
            handler: function (request, h) {
                const response = h.response(promClient.register.metrics());
                response.code(200);
                response.header('Content-Type', 'text/plain');
                return response;
            }
        });
        // Redirect to ui
        server.route({
            method: 'GET',
            path: swsSettings.uriPath,
            handler: function (request, h) {
                return h.redirect(swsSettings.pathUI);
            }
        });
        // Return UI
        server.route({
            method: 'GET',
            path: swsSettings.pathUI,
            handler: function (request, h) {
                return swsUtil.swsEmbeddedUIMarkup;
            }
        });
        // Return Dist
        server.route({
            method: 'GET',
            path: swsSettings.pathDist+'/{file*}',
            handler: function (request, h) {
                let fileName = request.params.file;
                var options = {
                    root: path.join(__dirname,'..','dist'),
                    dotfiles: 'deny'
                    // TODO Caching
                };
                request.raw.res.setHeader('Content-Type', send.mime.lookup(path.basename(fileName)));
                send(request.raw.req, fileName, options).pipe(request.raw.res);
                return h.abandon;
            }
        });
        // Return UX
        server.route({
            method: 'GET',
            path: swsSettings.pathUX+'/{file*}',
            handler: function (request, h) {
                let fileName = request.params.file;
                if(!fileName){
                    fileName = 'index.html';
                }
                var options = {
                    root: path.join(__dirname,'..','ux'),
                    dotfiles: 'deny'
                    // TODO Caching
                };
                request.raw.res.setHeader('Content-Type', send.mime.lookup(path.basename(fileName)));
                send(request.raw.req, fileName, options).pipe(request.raw.res);
                return h.abandon;
            }
        });
    }
}
 
let swsHapi = new SwsHapi();
module.exports = swsHapi;