Skip to content

Commit 0cf696d

Browse files
authored
Use the native node:domain module when available (#11353)
1 parent 49eada3 commit 0cf696d

File tree

4 files changed

+83
-0
lines changed

4 files changed

+83
-0
lines changed

.changeset/brown-trees-go.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
"@cloudflare/unenv-preset": patch
3+
"wrangler": patch
4+
---
5+
6+
Use the native `node:domain` module when available
7+
8+
It is enabled when the `enable_nodejs_domain_module` compatibility flag is set.

packages/unenv-preset/src/preset.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ export function getCloudflarePreset({
7575
const punycodeOverrides = getPunycodeOverrides(compat);
7676
const clusterOverrides = getClusterOverrides(compat);
7777
const traceEventsOverrides = getTraceEventsOverrides(compat);
78+
const domainOverrides = getDomainOverrides(compat);
7879

7980
// "dynamic" as they depend on the compatibility date and flags
8081
const dynamicNativeModules = [
@@ -86,6 +87,7 @@ export function getCloudflarePreset({
8687
...punycodeOverrides.nativeModules,
8788
...clusterOverrides.nativeModules,
8889
...traceEventsOverrides.nativeModules,
90+
...domainOverrides.nativeModules,
8991
];
9092

9193
// "dynamic" as they depend on the compatibility date and flags
@@ -98,6 +100,7 @@ export function getCloudflarePreset({
98100
...punycodeOverrides.hybridModules,
99101
...clusterOverrides.hybridModules,
100102
...traceEventsOverrides.hybridModules,
103+
...domainOverrides.hybridModules,
101104
];
102105

103106
return {
@@ -428,3 +431,41 @@ function getTraceEventsOverrides({
428431
hybridModules: [],
429432
};
430433
}
434+
435+
/**
436+
* Returns the overrides for `node:domain` (unenv or workerd)
437+
*
438+
* The native domain implementation:
439+
* - is experimental
440+
* - can be enabled with the "enable_nodejs_domain_module" flag
441+
* - can be disabled with the "disable_nodejs_domain_module" flag
442+
*/
443+
function getDomainOverrides({
444+
// eslint-disable-next-line unused-imports/no-unused-vars
445+
compatibilityDate,
446+
compatibilityFlags,
447+
}: {
448+
compatibilityDate: string;
449+
compatibilityFlags: string[];
450+
}): { nativeModules: string[]; hybridModules: string[] } {
451+
const disabledByFlag = compatibilityFlags.includes(
452+
"disable_nodejs_domain_module"
453+
);
454+
455+
// TODO: add `enabledByDate` when a date is defined in workerd
456+
const enabledByFlag =
457+
compatibilityFlags.includes("enable_nodejs_domain_module") &&
458+
compatibilityFlags.includes("experimental");
459+
460+
const enabled = enabledByFlag && !disabledByFlag;
461+
462+
return enabled
463+
? {
464+
nativeModules: ["domain"],
465+
hybridModules: [],
466+
}
467+
: {
468+
nativeModules: [],
469+
hybridModules: [],
470+
};
471+
}

packages/wrangler/e2e/unenv-preset/preset.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ const localTestConfigs: TestConfig[] = [
278278
},
279279
},
280280
],
281+
// trace_events
281282
[
282283
// TODO: add test for disabled by date (no date defined yet)
283284
// TODO: add test for enabled by date (no date defined yet)
@@ -302,6 +303,28 @@ const localTestConfigs: TestConfig[] = [
302303
},
303304
},
304305
],
306+
// domain
307+
[
308+
// TODO: add test for disabled by date (no date defined yet)
309+
// TODO: add test for enabled by date (no date defined yet)
310+
{
311+
name: "domain enabled by flag",
312+
compatibilityDate: "2024-09-23",
313+
compatibilityFlags: ["enable_nodejs_domain_module", "experimental"],
314+
expectRuntimeFlags: {
315+
enable_nodejs_domain_module: true,
316+
},
317+
},
318+
// TODO: update the date past the default enable date (when defined)
319+
{
320+
name: "domain disabled by flag",
321+
compatibilityDate: "2024-09-23",
322+
compatibilityFlags: ["disable_nodejs_domain_module", "experimental"],
323+
expectRuntimeFlags: {
324+
enable_nodejs_domain_module: false,
325+
},
326+
},
327+
],
305328
].flat() as TestConfig[];
306329

307330
describe.each(localTestConfigs)(

packages/wrangler/e2e/unenv-preset/worker/index.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,17 @@ export const WorkerdTests: Record<string, () => void> = {
596596
assertTypeOf(tracing, "enabled", "boolean");
597597
assertTypeOf(tracing, "categories", "string");
598598
},
599+
600+
async testDomain() {
601+
const { Domain } = await import("node:domain");
602+
603+
const domain = new Domain();
604+
605+
assertTypeOf(domain, "add", "function");
606+
assertTypeOf(domain, "enter", "function");
607+
assertTypeOf(domain, "exit", "function");
608+
assertTypeOf(domain, "remove", "function");
609+
},
599610
};
600611

601612
function assertTypeOf(target: unknown, property: string, expectType: string) {

0 commit comments

Comments
 (0)