diff --git a/lib/channels.js b/lib/channels.js new file mode 100644 index 000000000..4e54c33ff --- /dev/null +++ b/lib/channels.js @@ -0,0 +1,15 @@ +'use strict'; + +exports = module.exports = {}; + +try { + const DiagnosticsChannel = require('diagnostics_channel'); + + exports = module.exports = { + serverChannel: DiagnosticsChannel.channel('hapi:server') + }; +} +catch { + // diagnostics_channel is not supported (e.g. node 12) +} + diff --git a/lib/server.js b/lib/server.js index 4ecf64192..2f333c500 100755 --- a/lib/server.js +++ b/lib/server.js @@ -5,6 +5,7 @@ const Shot = require('@hapi/shot'); const Somever = require('@hapi/somever'); const Teamwork = require('@hapi/teamwork'); +const Channels = require('./channels'); const Config = require('./config'); const Core = require('./core'); const Cors = require('./cors'); @@ -85,6 +86,10 @@ internals.Server = class { } core.registerServer(this); + + if (Channels.serverChannel && Channels.serverChannel.hasSubscribers) { + Channels.serverChannel.publish(this); + } } _clone(name) { diff --git a/test/server.js b/test/server.js index c43eb9a3f..0f350b11b 100755 --- a/test/server.js +++ b/test/server.js @@ -2941,6 +2941,34 @@ describe('Server', () => { expect(res3.result).to.equal('

grabbed

'); }); }); + + describe('Diagnostics channel', () => { + + it('Fires server event on server creation', async () => { + + // If diagnostics_channel is not supported (node 12), skip test + try { + require('diagnostics_channel'); + } + catch { + return Promise.resolve(); + } + + const DiagnosticsChannel = require('diagnostics_channel'); + + const serverChannel = DiagnosticsChannel.channel('hapi:server'); + return await new Promise((resolve) => { + + serverChannel.subscribe((server) => { + + expect(server).to.exist(); + resolve(); + }); + + new Hapi.Server(); + }); + }); + }); });