Skip to content

Commit fec8f5b

Browse files
feat(unenv-preset): add support for native node:dgram module (#11701)
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
1 parent def5ce3 commit fec8f5b

File tree

6 files changed

+82
-61
lines changed

6 files changed

+82
-61
lines changed

.changeset/native-dgram-module.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@cloudflare/unenv-preset": minor
3+
---
4+
5+
Add support for native `node:dgram` module when the `enable_nodejs_dgram_module` compatibility flag is enabled. This feature is currently experimental and requires both the `enable_nodejs_dgram_module` and `experimental` compatibility flags to be set.

packages/unenv-preset/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
},
5050
"peerDependencies": {
5151
"unenv": "2.0.0-rc.24",
52-
"workerd": "^1.20251202.0"
52+
"workerd": "^1.20251221.0"
5353
},
5454
"peerDependenciesMeta": {
5555
"workerd": {

packages/unenv-preset/src/preset.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export function getCloudflarePreset({
8181
const vmOverrides = getVmOverrides(compat);
8282
const inspectorOverrides = getInspectorOverrides(compat);
8383
const sqliteOverrides = getSqliteOverrides(compat);
84+
const dgramOverrides = getDgramOverrides(compat);
8485

8586
// "dynamic" as they depend on the compatibility date and flags
8687
const dynamicNativeModules = [
@@ -98,6 +99,7 @@ export function getCloudflarePreset({
9899
...vmOverrides.nativeModules,
99100
...inspectorOverrides.nativeModules,
100101
...sqliteOverrides.nativeModules,
102+
...dgramOverrides.nativeModules,
101103
];
102104

103105
// "dynamic" as they depend on the compatibility date and flags
@@ -116,6 +118,7 @@ export function getCloudflarePreset({
116118
...vmOverrides.hybridModules,
117119
...inspectorOverrides.hybridModules,
118120
...sqliteOverrides.hybridModules,
121+
...dgramOverrides.hybridModules,
119122
];
120123

121124
return {
@@ -674,3 +677,39 @@ function getSqliteOverrides({
674677
hybridModules: [],
675678
};
676679
}
680+
681+
/**
682+
* Returns the overrides for `node:dgram` (unenv or workerd)
683+
*
684+
* The native dgram implementation:
685+
* - is experimental and has no default enable date
686+
* - can be enabled with the "enable_nodejs_dgram_module" flag
687+
* - can be disabled with the "disable_nodejs_dgram_module" flag
688+
*/
689+
function getDgramOverrides({
690+
compatibilityFlags,
691+
}: {
692+
compatibilityDate: string;
693+
compatibilityFlags: string[];
694+
}): { nativeModules: string[]; hybridModules: string[] } {
695+
const disabledByFlag = compatibilityFlags.includes(
696+
"disable_nodejs_dgram_module"
697+
);
698+
699+
const enabledByFlag =
700+
compatibilityFlags.includes("enable_nodejs_dgram_module") &&
701+
compatibilityFlags.includes("experimental");
702+
703+
const enabled = enabledByFlag && !disabledByFlag;
704+
705+
// When enabled, use the native `dgram` module from workerd
706+
return enabled
707+
? {
708+
nativeModules: ["dgram"],
709+
hybridModules: [],
710+
}
711+
: {
712+
nativeModules: [],
713+
hybridModules: [],
714+
};
715+
}

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,27 @@ const localTestConfigs: TestConfig[] = [
451451
},
452452
},
453453
],
454+
// node:dgram (experimental, no default enable date)
455+
[
456+
// TODO: add test for disabled by date (no date defined yet)
457+
// TODO: add test for enabled by date (no date defined yet)
458+
{
459+
name: "dgram enabled by flag",
460+
compatibilityDate: "2024-09-23",
461+
compatibilityFlags: ["enable_nodejs_dgram_module", "experimental"],
462+
expectRuntimeFlags: {
463+
enable_nodejs_dgram_module: true,
464+
},
465+
},
466+
{
467+
name: "dgram disabled by flag",
468+
compatibilityDate: "2024-09-23",
469+
compatibilityFlags: ["disable_nodejs_dgram_module", "experimental"],
470+
expectRuntimeFlags: {
471+
enable_nodejs_dgram_module: false,
472+
},
473+
},
474+
],
454475
].flat() as TestConfig[];
455476

456477
describe.each(localTestConfigs)(

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,20 @@ export const WorkerdTests: Record<string, () => void> = {
832832
);
833833
}
834834
},
835+
836+
async testDgram() {
837+
const dgram = await import("node:dgram");
838+
839+
assertTypeOfProperties(dgram, {
840+
createSocket: "function",
841+
Socket: "function",
842+
});
843+
844+
assertTypeOfProperties(dgram.default, {
845+
createSocket: "function",
846+
Socket: "function",
847+
});
848+
},
835849
};
836850

837851
/**

pnpm-lock.yaml

Lines changed: 2 additions & 60 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)