• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3const common = require('../common');
4const assert = require('assert');
5const { readFile } = require('fs');
6const {
7  createHook,
8  executionAsyncResource,
9  AsyncResource
10} = require('async_hooks');
11
12// Ignore any asyncIds created before our hook is active.
13let firstSeenAsyncId = -1;
14const idResMap = new Map();
15const numExpectedCalls = 5;
16
17createHook({
18  init: common.mustCallAtLeast(
19    (asyncId, type, triggerId, resource) => {
20      if (firstSeenAsyncId === -1) {
21        firstSeenAsyncId = asyncId;
22      }
23      assert.ok(idResMap.get(asyncId) === undefined);
24      idResMap.set(asyncId, resource);
25    }, numExpectedCalls),
26  before(asyncId) {
27    if (asyncId >= firstSeenAsyncId) {
28      beforeHook(asyncId);
29    }
30  },
31  after(asyncId) {
32    if (asyncId >= firstSeenAsyncId) {
33      afterHook(asyncId);
34    }
35  }
36}).enable();
37
38const beforeHook = common.mustCallAtLeast(
39  (asyncId) => {
40    const res = idResMap.get(asyncId);
41    assert.ok(res !== undefined);
42    const execRes = executionAsyncResource();
43    assert.ok(execRes === res, 'resource mismatch in before');
44  }, numExpectedCalls);
45
46const afterHook = common.mustCallAtLeast(
47  (asyncId) => {
48    const res = idResMap.get(asyncId);
49    assert.ok(res !== undefined);
50    const execRes = executionAsyncResource();
51    assert.ok(execRes === res, 'resource mismatch in after');
52  }, numExpectedCalls);
53
54const res = new AsyncResource('TheResource');
55const initRes = idResMap.get(res.asyncId());
56assert.ok(initRes === res, 'resource mismatch in init');
57res.runInAsyncScope(common.mustCall(() => {
58  const execRes = executionAsyncResource();
59  assert.ok(execRes === res, 'resource mismatch in cb');
60}));
61
62readFile(__filename, common.mustCall());
63