From 422f21477632fec217c6228e8a63fb5e239f60c0 Mon Sep 17 00:00:00 2001 From: Brad Gardner Date: Sat, 13 Jan 2018 10:03:25 -0500 Subject: [PATCH 1/2] fulfills feature request #24 - updated for HapiJS 17.x --- __tests__/middleware-wrapper.spec.js | 61 +++++++++++++++++++++------- index.js | 8 ++-- package.json | 2 +- src/middleware-wrapper.js | 22 ++++------ 4 files changed, 59 insertions(+), 34 deletions(-) diff --git a/__tests__/middleware-wrapper.spec.js b/__tests__/middleware-wrapper.spec.js index 6bb3824..2d2d096 100755 --- a/__tests__/middleware-wrapper.spec.js +++ b/__tests__/middleware-wrapper.spec.js @@ -8,25 +8,56 @@ describe('hapijs-status-monitor', () => { }); describe('when invoked', () => { - const server = { - socket: {}, - on: jest.fn(), - route: jest.fn(), - ext: jest.fn(), - }; - const options = { send: jest.fn() }; - const next = jest.fn(); - - it(`and server.path === ${defaultConfig.path}, then next() called one times`, () => { + let server; + let options; + + beforeEach(() => { + server = { + socket: {}, + events: { + on: jest.fn(), + }, + route: jest.fn(), + ext: jest.fn(), + }; + + options = { send: jest.fn() }; + }); + + it(`and server.path === ${defaultConfig.path}, then on() called one times`, () => { + server.path = defaultConfig.path; + middleware(server, options); + expect(server.events.on).toHaveBeenCalledTimes(1); + }); + + it(`and server.path === ${defaultConfig.path}, then route() called one times`, () => { + server.path = defaultConfig.path; + middleware(server, options); + expect(server.route).toHaveBeenCalledTimes(1); + }); + + it(`and server.path === ${defaultConfig.path}, then ext() called one times`, () => { server.path = defaultConfig.path; - middleware(server, options, next); - expect(next).toHaveBeenCalledTimes(1); + middleware(server, options); + expect(server.ext).toHaveBeenCalledTimes(1); + }); + + it(`and server.path !== ${defaultConfig.path}, then on() called one times`, () => { + server.path = '/another-path'; + middleware(server, options); + expect(server.events.on).toHaveBeenCalledTimes(1); + }); + + it(`and server.path !== ${defaultConfig.path}, then route() called one times`, () => { + server.path = '/another-path'; + middleware(server, options); + expect(server.route).toHaveBeenCalledTimes(1); }); - it(`and server.path !== ${defaultConfig.path}, then next() called two times`, () => { + it(`and server.path !== ${defaultConfig.path}, then ext() called one times`, () => { server.path = '/another-path'; - middleware(server, options, next); - expect(next).toHaveBeenCalledTimes(2); + middleware(server, options); + expect(server.ext).toHaveBeenCalledTimes(1); }); }); }); diff --git a/index.js b/index.js index 56558a3..6c56c07 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,6 @@ const pkg = require('./package.json'); const register = require('./src/middleware-wrapper'); -// provide meta-information as expected by hapi.js -register.attributes = { pkg }; - -// export register function, wrapped in a plugin object -module.exports = { register }; +module.exports.plugin = { + register, name: 'HapiJS Status Monitor', pkg, +}; diff --git a/package.json b/package.json index dd02d6a..a31d0e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hapijs-status-monitor", - "version": "0.6.0", + "version": "1.0.0", "description": "Monitoring plugin for hapi.js applications", "main": "index.js", "scripts": { diff --git a/src/middleware-wrapper.js b/src/middleware-wrapper.js index ed2ecc8..5a4d08f 100644 --- a/src/middleware-wrapper.js +++ b/src/middleware-wrapper.js @@ -5,18 +5,18 @@ const onHeadersListener = require('./helpers/on-headers-listener'); const socketIoInit = require('./helpers/socket-io-init'); // hapi.js plugin register function -const middlewareWrapper = (server, options, next) => { +const middlewareWrapper = (server, options) => { const opts = validate(options); // Setup Socket.IO - server.on('start', () => { + server.events.on('start', () => { socketIoInit(server.listener, opts.spans); }); server.route({ method: 'GET', path: opts.path, - handler: (request, reply) => { + handler: () => { const renderedHtml = fs.readFileSync(path.join(__dirname, '/public/index.html')) .toString() @@ -24,31 +24,27 @@ const middlewareWrapper = (server, options, next) => { .replace(/{{script}}/g, fs.readFileSync(path.join(__dirname, '/public/javascripts/app.js'))) .replace(/{{style}}/g, fs.readFileSync(path.join(__dirname, '/public/stylesheets/style.css'))); - reply(renderedHtml) - .header('Content-Type', 'text/html') - .code(200); + return renderedHtml; }, config: opts.routeConfig, }); // Hook into the middle of processing - server.ext('onPreResponse', (request, reply) => { + server.ext('onPreResponse', (request, h) => { if (request.response.isBoom || request.path === opts.path) { - return reply.continue(); + return h.continue; } const startTime = process.hrtime(); const resp = request.response; - resp.once('finish', () => { + resp.events.once('finish', () => { onHeadersListener(resp.statusCode, startTime, opts.spans); }); - return reply.continue(); + // Continue Processing + return h.continue; }); - - // Continue processing - return next(); }; module.exports = middlewareWrapper; From f2c94ed9c00198b6c791e923daa0c5897f492f5d Mon Sep 17 00:00:00 2001 From: Brad Gardner Date: Sun, 21 Jan 2018 16:12:28 -0500 Subject: [PATCH 2/2] initialization of responses --- src/helpers/on-headers-listener.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/helpers/on-headers-listener.js b/src/helpers/on-headers-listener.js index ea7c5c3..c345367 100644 --- a/src/helpers/on-headers-listener.js +++ b/src/helpers/on-headers-listener.js @@ -4,7 +4,13 @@ module.exports = (statusCode, startTime, spans) => { const category = Math.floor(statusCode / 100); spans.forEach((span) => { - const last = span.responses[span.responses.length - 1]; + let { responses } = span; + + if (!responses) { + responses = []; + } + + const last = responses[span.responses.length - 1]; if (last !== undefined && (last.timestamp / 1000) + span.interval > Date.now() / 1000) { last[category] += 1; last.count += 1;