Skip to content

dgram: add synchronous Socket.prototype.bindSync()#63838

Merged
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
guybedford:dgram-bind-sync
Jun 15, 2026
Merged

dgram: add synchronous Socket.prototype.bindSync()#63838
nodejs-github-bot merged 1 commit into
nodejs:mainfrom
guybedford:dgram-bind-sync

Conversation

@guybedford

Copy link
Copy Markdown
Contributor

WebAssembly embeddings of libc UDP support relies on a synchronous bind(2). While socket.bind that exposes this is asynchronous in Node.js, it is also completely fine to support a synchronous bind since it is a non-blocking operation in the OS when DNS resolution is excluded.

This adds a very simple socket.bindSync to the dgram API, allowing a direct mode for posix compatibility layers on Node.js without requiring JSPI.

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Review requested:

  • @nodejs/net

@nodejs-github-bot nodejs-github-bot added dgram Issues and PRs related to the dgram subsystem / UDP. needs-ci PRs that need a full CI run. labels Jun 10, 2026
Provides sync non-blocking bind(2), without DNS lookup

Signed-off-by: Guy Bedford <guybedford@gmail.com>

@mcollina mcollina left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@mcollina mcollina added the request-ci Add this label to start a Jenkins CI on a PR. label Jun 13, 2026
@github-actions github-actions Bot removed the request-ci Add this label to start a Jenkins CI on a PR. label Jun 13, 2026
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

@guybedford guybedford added commit-queue Add this label to land a pull request using GitHub Actions. commit-queue-squash Add this label to instruct the Commit Queue to squash all the PR commits into the first one. and removed needs-ci PRs that need a full CI run. labels Jun 15, 2026
@guybedford guybedford added the author ready PRs that have at least one approval, no pending requests for changes, and a CI started. label Jun 15, 2026
@nodejs-github-bot nodejs-github-bot removed the commit-queue Add this label to land a pull request using GitHub Actions. label Jun 15, 2026
@nodejs-github-bot nodejs-github-bot merged commit 723dd38 into nodejs:main Jun 15, 2026
77 checks passed
@nodejs-github-bot

Copy link
Copy Markdown
Collaborator

Landed in 723dd38

@guybedford guybedford deleted the dgram-bind-sync branch June 15, 2026 22:06
aduh95 pushed a commit that referenced this pull request Jun 18, 2026
Provides sync non-blocking bind(2), without DNS lookup

Signed-off-by: Guy Bedford <guybedford@gmail.com>
PR-URL: #63838
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
guybedford added a commit to guybedford/emscripten that referenced this pull request Jun 23, 2026
This adds a new `-sNODERAWSOCKETS` setting that for supporting direct full sockets on Node.js via the `node:net` for TCP and `node:dgram` for UDP modules, without needing `ws`, an external proxy process, or pthreads.

* Full support for both outgoing and incoming TCP, using the `node:net` APIs.
* Full support for UDP using the `node:dgram` APIs
* Support for threading, with tests
* Support for IPV6

To support these embeddings without JSPI being mandatory requires using `process.binding('tcp_wrap')` and `process.binding('udp_wrap')` in Node.js, which are used here to support older versions of Node.js.

Further, to avoid having to rely on private APIs in modern Node.js I actually implemented upstream Node.js PRs to make public API surface area available for the full embedding in the following:

* nodejs/node#63838
* nodejs/node#63932
* nodejs/node#63951
* nodejs/node#63825

Then this PR conditionally checks these features and uses the public APIs as defined by them when it is able to, falling back to `tcp_wrap` and `udp_wrap` only when not supported. While Node.js with these features has not yet been released, as soon as all three have landed, we can rely on this surface area for modern 26+ versions of Node.js compat.
guybedford added a commit to guybedford/emscripten that referenced this pull request Jun 23, 2026
This adds a new `-sNODERAWSOCKETS` setting that for supporting direct full sockets on Node.js via the `node:net` for TCP and `node:dgram` for UDP modules, without needing `ws`, an external proxy process, or pthreads.

* Full support for both outgoing and incoming TCP, using the `node:net` APIs.
* Full support for UDP using the `node:dgram` APIs
* Support for threading, with tests
* Support for IPV6

To support these embeddings without JSPI being mandatory requires using `process.binding('tcp_wrap')` and `process.binding('udp_wrap')` in Node.js, which are used here to support older versions of Node.js.

Further, to avoid having to rely on private APIs in modern Node.js I actually implemented upstream Node.js PRs to make public API surface area available for the full embedding in the following:

* nodejs/node#63838
* nodejs/node#63932
* nodejs/node#63951
* nodejs/node#63825

Then this PR conditionally checks these features and uses the public APIs as defined by them when it is able to, falling back to `tcp_wrap` and `udp_wrap` only when not supported. While Node.js with these features has not yet been released, as soon as all three have landed, we can rely on this surface area for modern 26+ versions of Node.js compat.
guybedford added a commit to guybedford/emscripten that referenced this pull request Jun 23, 2026
This adds a new `-sNODERAWSOCKETS` setting that for supporting direct full sockets on Node.js via the `node:net` for TCP and `node:dgram` for UDP modules, without needing `ws`, an external proxy process, or pthreads.

* Full support for both outgoing and incoming TCP, using the `node:net` APIs.
* Full support for UDP using the `node:dgram` APIs
* Support for threading, with tests
* Support for IPV6

To support these embeddings without JSPI being mandatory requires using `process.binding('tcp_wrap')` and `process.binding('udp_wrap')` in Node.js, which are used here to support older versions of Node.js.

Further, to avoid having to rely on private APIs in modern Node.js I actually implemented upstream Node.js PRs to make public API surface area available for the full embedding in the following:

* nodejs/node#63838
* nodejs/node#63932
* nodejs/node#63951
* nodejs/node#63825

Then this PR conditionally checks these features and uses the public APIs as defined by them when it is able to, falling back to `tcp_wrap` and `udp_wrap` only when not supported. While Node.js with these features has not yet been released, as soon as all three have landed, we can rely on this surface area for modern 26+ versions of Node.js compat.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

author ready PRs that have at least one approval, no pending requests for changes, and a CI started. commit-queue-squash Add this label to instruct the Commit Queue to squash all the PR commits into the first one. dgram Issues and PRs related to the dgram subsystem / UDP.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants