mirror of
https://github.com/nodejs/node.git
synced 2026-10-28 10:15:07 +08:00
traceCallback() defaults to a frozen context but writes the callback's result or error to it. Allocate a fresh context when undefined is passed and subscribers are present, matching traceSync() and tracePromise(). Set the prototype after allocation to avoid dictionary-mode properties. Assisted-by: pi Signed-off-by: Matteo Collina <hello@matteocollina.com> PR-URL: https://github.com/nodejs/node/pull/66481 Reviewed-By: Bryan English <bryan@bryanenglish.com>
57 lines
2.0 KiB
JavaScript
57 lines
2.0 KiB
JavaScript
'use strict';
|
|
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
const dc = require('diagnostics_channel');
|
|
|
|
for (const expectedError of [null, new Error('test')]) {
|
|
const channel = dc.tracingChannel(`test-${expectedError ? 'error' : 'result'}`);
|
|
const contexts = [];
|
|
const results = [{ value: 1 }, { value: 2 }];
|
|
let completed = 0;
|
|
|
|
channel.subscribe({
|
|
start: common.mustCall((context) => {
|
|
assert.strictEqual(context.result, undefined);
|
|
assert.strictEqual(context.error, undefined);
|
|
for (const previous of contexts) {
|
|
assert.notStrictEqual(context, previous);
|
|
}
|
|
contexts.push(context);
|
|
}, 2),
|
|
asyncStart: common.mustCall((context) => {
|
|
assert.strictEqual(context, contexts[completed]);
|
|
if (expectedError) {
|
|
assert.strictEqual(context.error, expectedError);
|
|
assert.strictEqual(context.result, undefined);
|
|
} else {
|
|
assert.strictEqual(context.result, results[completed]);
|
|
assert.strictEqual(context.error, undefined);
|
|
}
|
|
completed++;
|
|
}, 2),
|
|
asyncEnd: common.mustCall(2),
|
|
error: expectedError ? common.mustCall((context) => {
|
|
assert.strictEqual(context, contexts[completed]);
|
|
assert.strictEqual(context.error, expectedError);
|
|
}, 2) : common.mustNotCall(),
|
|
});
|
|
|
|
for (const result of results) {
|
|
channel.traceCallback(common.mustCall((callback) => {
|
|
setImmediate(callback, expectedError, expectedError ? undefined : result);
|
|
}), undefined, undefined, undefined, common.mustCall((err, value) => {
|
|
assert.strictEqual(err, expectedError);
|
|
assert.strictEqual(value, expectedError ? undefined : result);
|
|
}));
|
|
}
|
|
|
|
setImmediate(common.mustCall(() => {
|
|
assert.strictEqual(completed, 2);
|
|
for (const [index, context] of contexts.entries()) {
|
|
assert.strictEqual(context.error, expectedError || undefined);
|
|
assert.strictEqual(context.result, expectedError ? undefined : results[index]);
|
|
}
|
|
}));
|
|
}
|