Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .changeset/brown-trees-go.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@cloudflare/unenv-preset": patch
"wrangler": patch
---

Use the native `node:domain` module when available

It is enabled when the `enable_nodejs_domain_module` compatibility flag is set.
41 changes: 41 additions & 0 deletions packages/unenv-preset/src/preset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ export function getCloudflarePreset({
const punycodeOverrides = getPunycodeOverrides(compat);
const clusterOverrides = getClusterOverrides(compat);
const traceEventsOverrides = getTraceEventsOverrides(compat);
const domainOverrides = getDomainOverrides(compat);

// "dynamic" as they depend on the compatibility date and flags
const dynamicNativeModules = [
Expand All @@ -86,6 +87,7 @@ export function getCloudflarePreset({
...punycodeOverrides.nativeModules,
...clusterOverrides.nativeModules,
...traceEventsOverrides.nativeModules,
...domainOverrides.nativeModules,
];

// "dynamic" as they depend on the compatibility date and flags
Expand All @@ -98,6 +100,7 @@ export function getCloudflarePreset({
...punycodeOverrides.hybridModules,
...clusterOverrides.hybridModules,
...traceEventsOverrides.hybridModules,
...domainOverrides.hybridModules,
];

return {
Expand Down Expand Up @@ -428,3 +431,41 @@ function getTraceEventsOverrides({
hybridModules: [],
};
}

/**
* Returns the overrides for `node:domain` (unenv or workerd)
*
* The native trace_events implementation:
* - is experimental
* - can be enabled with the "enable_nodejs_domain_module" flag
* - can be disabled with the "disable_nodejs_domain_module" flag
*/
function getDomainOverrides({
// eslint-disable-next-line unused-imports/no-unused-vars
compatibilityDate,
compatibilityFlags,
}: {
compatibilityDate: string;
compatibilityFlags: string[];
}): { nativeModules: string[]; hybridModules: string[] } {
const disabledByFlag = compatibilityFlags.includes(
"disable_nodejs_domain_module"
);

// TODO: add `enabledByDate` when a date is defined in workerd
const enabledByFlag =
compatibilityFlags.includes("enable_nodejs_domain_module") &&
compatibilityFlags.includes("experimental");

const enabled = enabledByFlag && !disabledByFlag;

return enabled
? {
nativeModules: ["domain"],
hybridModules: [],
}
: {
nativeModules: [],
hybridModules: [],
};
}
23 changes: 23 additions & 0 deletions packages/wrangler/e2e/unenv-preset/preset.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@ const localTestConfigs: TestConfig[] = [
},
},
],
// trace_events
[
// TODO: add test for disabled by date (no date defined yet)
// TODO: add test for enabled by date (no date defined yet)
Expand All @@ -302,6 +303,28 @@ const localTestConfigs: TestConfig[] = [
},
},
],
// domain
[
// TODO: add test for disabled by date (no date defined yet)
// TODO: add test for enabled by date (no date defined yet)
{
name: "domain enabled by flag",
compatibilityDate: "2024-09-23",
compatibilityFlags: ["enable_nodejs_domain_module", "experimental"],
expectRuntimeFlags: {
enable_nodejs_domain_module: true,
},
},
// TODO: update the date past the default enable date (when defined)
{
name: "domain disabled by flag",
compatibilityDate: "2024-09-23",
compatibilityFlags: ["disable_nodejs_domain_module", "experimental"],
expectRuntimeFlags: {
enable_nodejs_domain_module: false,
},
},
],
].flat() as TestConfig[];

describe.each(localTestConfigs)(
Expand Down
11 changes: 11 additions & 0 deletions packages/wrangler/e2e/unenv-preset/worker/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -596,6 +596,17 @@ export const WorkerdTests: Record<string, () => void> = {
assertTypeOf(tracing, "enabled", "boolean");
assertTypeOf(tracing, "categories", "string");
},

async testDomain() {
const { Domain } = await import("node:domain");

const domain = new Domain();

assertTypeOf(domain, "add", "function");
assertTypeOf(domain, "enter", "function");
assertTypeOf(domain, "exit", "function");
assertTypeOf(domain, "remove", "function");
},
};

function assertTypeOf(target: unknown, property: string, expectType: string) {
Expand Down
Loading