1'use strict'; 2 3const common = require('../common'); 4const { AsyncLocalStorage } = require('async_hooks'); 5const dc = require('diagnostics_channel'); 6const assert = require('assert'); 7const http = require('http'); 8 9const als = new AsyncLocalStorage(); 10let context; 11 12// Bind requests to an AsyncLocalStorage context 13dc.subscribe('http.server.request.start', common.mustCall((message) => { 14 als.enterWith(message); 15 context = message; 16})); 17 18// When the request ends, verify the context has been maintained 19// and that the messages contain the expected data 20dc.subscribe('http.server.response.finish', common.mustCall((message) => { 21 const data = { 22 request, 23 response, 24 server, 25 socket: request.socket 26 }; 27 28 // Context is maintained 29 compare(als.getStore(), context); 30 31 compare(context, data); 32 compare(message, data); 33})); 34 35let request; 36let response; 37 38const server = http.createServer(common.mustCall((req, res) => { 39 request = req; 40 response = res; 41 42 setTimeout(() => { 43 res.end('done'); 44 }, 1); 45})); 46 47server.listen(() => { 48 const { port } = server.address(); 49 http.get(`http://localhost:${port}`, (res) => { 50 res.resume(); 51 res.on('end', () => { 52 server.close(); 53 }); 54 }); 55}); 56 57function compare(a, b) { 58 assert.strictEqual(a.request, b.request); 59 assert.strictEqual(a.response, b.response); 60 assert.strictEqual(a.socket, b.socket); 61 assert.strictEqual(a.server, b.server); 62} 63