'use strict';

const common = require('../common');
const { setTimeout } = require('node:timers/promises');
const { AsyncLocalStorage } = require('async_hooks');
const dc = require('diagnostics_channel');
const assert = require('assert');

const channel = dc.tracingChannel('test');
const store = new AsyncLocalStorage();

const firstContext = { foo: 'bar' };
const secondContext = { baz: 'buz' };

channel.start.bindStore(store, common.mustCall(() => {
  return firstContext;
}));

channel.asyncStart.bindStore(store, common.mustCall(() => {
  return secondContext;
}));

assert.strictEqual(store.getStore(), undefined);
channel.tracePromise(common.mustCall(async () => {
  assert.deepStrictEqual(store.getStore(), firstContext);
  await setTimeout(1);
  // Should _not_ switch to second context as promises don't have an "after"
  // point at which to do a runStores.
  assert.deepStrictEqual(store.getStore(), firstContext);
})).then(common.mustCall(() => {
  assert.strictEqual(store.getStore(), undefined);
}));
assert.strictEqual(store.getStore(), undefined);
