All files swsHapi.js

24.53% Statements 13/53
0% Branches 0/7
11.11% Functions 1/9
24.53% Lines 13/53

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  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;
            }
        })
    }
}
 
let swsHapi = new SwsHapi();
module.exports = swsHapi;