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