Skip to content

Commit 0cc576e

Browse files
authored
Merge branch 'nodejs:main' into docs/default-header-count-limit
2 parents 9b31732 + 4b5e86c commit 0cc576e

13 files changed

Lines changed: 1389 additions & 247 deletions

File tree

‎.gitignore‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,6 @@ install_manifest.txt
163163

164164
# === Rules for AI assistants ===
165165
CLAUDE.md
166-
AGENTS.md
167166

168167
# === Global Rules ===
169168
# Keep last to avoid being excluded

‎AGENTS.md‎

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# Agents and Automated Tools
2+
3+
This document outlines rules and requirements for AI automation agents and automated
4+
tooling that interact with the Node.js project.
5+
6+
Existing Node.js collaborators (as listed in the README.md) may use AI agents to
7+
contribute but must do so responsibly.
8+
9+
New Node.js contributors should avoid using AI agents to interact with the project.
10+
11+
## Code Contributions
12+
13+
* **No unreviewed automation**: Automated pull requests must not be created without
14+
ongoing human oversight. The pull request must be actively maintained by a human
15+
contributor who responds to feedback. The AI agent is not permitted to create pull
16+
requests, open issues, post comments, respond to reviews, or push commits without
17+
ongoing human oversight.
18+
19+
* **Commit responsibility**: Commits created with agent assistance must follow all
20+
Node.js [commit message guidelines](./doc/contributing/pull-requests.md#commit-message-guidelines).
21+
The human contributor opening the PR takes full responsibility for the changes.
22+
23+
* **Testing and verification**: All changes must pass the Node.js continuous integration.
24+
Human judgment must verify that existing tests are not removed or modified inappropriately,
25+
and that new tests correctly validate the intended behavior.
26+
27+
### Requirements
28+
29+
* All commits must be signed off by the human user using `Signed-off-by: <your name> (<your email>)`
30+
as an attestation to the [Developer Certificate of Origin](https://developercertificate.org/).
31+
* AI-assistance must be acknowledged using the `Assisted-by: <agent name>` annotation.
32+
* AI-authored code contributions must be compatible with the project's licensing and
33+
contribution guidelines.
34+
35+
## Prohibited Activities
36+
37+
AI agents **must not**:
38+
39+
* Push to any branch or tag in nodejs/node.
40+
* Create unsupervised pull requests or issues without active human engagement.
41+
* Make claims about code without human verification against actual source code.
42+
* Remove or modify existing tests without human judgment.
43+
* Interact with the repository through means other than those explicitly authorized.
44+
* Use commit messages to promote for-profit AI tools or commercial brands. A single
45+
`Assisted-by: <agent-name>` annotation is required disclosure, not promotion, and is
46+
permitted.
47+
* Post AI-generated messages directly into pull requests, issues, or project communication
48+
channels without direct human review and editing to ensure clarity, accuracy, and respect
49+
for collaborator time.
50+
* Sign off commits using `Signed-off-by: <agent name>` or `Co-authored-by: <agent name>`.
51+
52+
## Violations
53+
54+
Automated interactions that violate these rules may result in:
55+
56+
* Immediate closure of pull requests without review.
57+
* Blocking of the automation tool from further interaction with the project.
58+
* Blocking of the tool's account or its owner from contributing.
59+
* Reports to relevant platforms or organizations operating the automation.
60+
61+
***
62+
63+
For more information on AI use in general contributions (not specific to agents),
64+
see [AI use policy and guidelines](./doc/contributing/ai-guidelines.md).

‎Makefile‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,7 +1288,7 @@ ifneq ($(SKIP_SHARED_DEPS), 1)
12881288
cp doc/node.1 $(TARNAME)/doc/node.1
12891289
cp -r out/doc/api/* $(TARNAME)/doc/api/
12901290
endif
1291-
sed 's/fileset = fileset.intersection (fileset.gitTracked root)/fileset =/' tools/nix/v8.nix > $(TARNAME)/tools/nix/v8.nix
1291+
sed 's/fileset = fileset.intersection (fileset.gitTracked root)/fileset =/' tools/nix/v8.nix > $(TARNAME)/tools/nix/v8.nix
12921292
$(RM) -r $(TARNAME)/.editorconfig
12931293
$(RM) -r $(TARNAME)/.git*
12941294
$(RM) -r $(TARNAME)/.mailmap
@@ -1480,7 +1480,7 @@ else
14801480
LINT_MD_NEWER = -newer tools/.mdlintstamp
14811481
endif
14821482

1483-
LINT_MD_TARGETS = doc src lib benchmark test tools/doc tools/icu $(filter-out CLAUDE.md AGENTS.md,$(wildcard *.md))
1483+
LINT_MD_TARGETS = doc src lib benchmark test tools/doc tools/icu $(filter-out CLAUDE.md,$(wildcard *.md))
14841484
LINT_MD_FILES = $(shell $(FIND) $(LINT_MD_TARGETS) -type f \
14851485
! -path '*node_modules*' ! -path 'test/fixtures/*' -name '*.md' \
14861486
$(LINT_MD_NEWER))

‎eslint.config.mjs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ export default [
401401
// #region markdown config
402402
{
403403
files: ['**/*.md'],
404-
ignores: ['CLAUDE.md', 'AGENTS.md'],
404+
ignores: ['CLAUDE.md'],
405405
plugins: {
406406
markdown,
407407
},

‎lib/internal/streams/iter/pull.js‎

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,16 @@ async function appendTransformResultAsyncSlow(target, result) {
434434
}
435435
}
436436

437+
function normalizeTransformResultFast(result) {
438+
if (isUint8ArrayBatch(result)) {
439+
return result.length === 0 ? null : result;
440+
}
441+
if (isUint8Array(result)) return [result];
442+
if (typeof result === 'string') return [toUint8Array(result)];
443+
if (isAnyArrayBuffer(result)) return [new Uint8Array(result)];
444+
if (ArrayBufferIsView(result)) return [arrayBufferViewToUint8Array(result)];
445+
}
446+
437447
// =============================================================================
438448
// Sync Pipeline Implementation
439449
// =============================================================================
@@ -457,7 +467,17 @@ function* applyFusedStatelessSyncTransforms(source, run) {
457467
current = null;
458468
break;
459469
}
460-
current = result;
470+
if (i === run.length - 1) {
471+
current = result;
472+
continue;
473+
}
474+
current = normalizeTransformResultFast(result);
475+
if (current === undefined) {
476+
const normalized = [];
477+
appendTransformResultSync(normalized, result);
478+
current = normalized.length === 0 ? null : normalized[0];
479+
}
480+
if (current === null) break;
461481
}
462482
if (current === null) continue;
463483
// Inline normalization with Uint8Array[] batch as the fast path,
@@ -570,21 +590,24 @@ async function* applyFusedStatelessAsyncTransforms(source, run, signal) {
570590
for await (const chunks of source) {
571591
let current = chunks;
572592
for (let i = 0; i < run.length; i++) {
573-
const result = run[i](current, { __proto__: null, signal });
593+
let result = run[i](current, { __proto__: null, signal });
594+
if (isPromise(result)) result = await result;
574595
if (result === null) {
575596
current = null;
576597
break;
577598
}
578-
if (isPromise(result)) {
579-
const resolved = await result;
580-
if (resolved === null) {
581-
current = null;
582-
break;
583-
}
584-
current = resolved;
585-
} else {
599+
if (i === run.length - 1) {
586600
current = result;
601+
continue;
602+
}
603+
current = normalizeTransformResultFast(result);
604+
if (current === undefined) {
605+
const normalized = [];
606+
const pendingResult = appendTransformResultAsync(normalized, result);
607+
if (pendingResult !== undefined) await pendingResult;
608+
current = normalized.length === 0 ? null : normalized[0];
587609
}
610+
if (current === null) break;
588611
}
589612
if (current === null) continue;
590613
// Normalize the final output

‎src/node_root_certs.h‎

Lines changed: 92 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -17,38 +17,6 @@
1717
"V9mSOdY=\n"
1818
"-----END CERTIFICATE-----",
1919

20-
/* ePKI Root Certification Authority */
21-
"-----BEGIN CERTIFICATE-----\n"
22-
"MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYD\n"
23-
"VQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsM\n"
24-
"IWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0z\n"
25-
"NDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29t\n"
26-
"IENvLiwgTHRkLjEqMCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5\n"
27-
"MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U\n"
28-
"82N0ywEhajfqhFAHSyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrB\n"
29-
"p0xtInAhijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X\n"
30-
"DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZr\n"
31-
"xQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ad\n"
32-
"o4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffAsgRFelQArr5T9rXn4fg8ozHS\n"
33-
"qf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ETOxQvdibBjWzwloPn9s9h6PYq2l\n"
34-
"Y9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUa\n"
35-
"dCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+Xk\n"
36-
"wY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3\n"
37-
"pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF\n"
38-
"MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLHClZ87lt4\n"
39-
"DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B01GqZ\n"
40-
"NF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq\n"
41-
"KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnV\n"
42-
"vwdVxrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltab\n"
43-
"rNMdjmEPNXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc\n"
44-
"7b3jajWvY9+rGNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8\n"
45-
"GrBQAuUBo2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS\n"
46-
"/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C\n"
47-
"6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yI\n"
48-
"VMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4\n"
49-
"EZw=\n"
50-
"-----END CERTIFICATE-----",
51-
5220
/* NetLock Arany (Class Gold) Főtanúsítvány */
5321
"-----BEGIN CERTIFICATE-----\n"
5422
"MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTER\n"
@@ -569,27 +537,6 @@
569537
"gwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==\n"
570538
"-----END CERTIFICATE-----",
571539

572-
/* Atos TrustedRoot 2011 */
573-
"-----BEGIN CERTIFICATE-----\n"
574-
"MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRv\n"
575-
"cyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3\n"
576-
"MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3Qg\n"
577-
"MjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IB\n"
578-
"DwAwggEKAoIBAQCVhTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI41\n"
579-
"9KkM/IL9bcFyYie96mvr54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+\n"
580-
"yj5vdHLqqjAqc2K+SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFs\n"
581-
"Q/H3NYkQ4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L\n"
582-
"cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMB\n"
583-
"AAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/\n"
584-
"MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgGA1UdIAQRMA8wDQYLKwYBBAGw\n"
585-
"LQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4G\n"
586-
"kGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0\n"
587-
"BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQP\n"
588-
"OLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYV\n"
589-
"qL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv\n"
590-
"KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed\n"
591-
"-----END CERTIFICATE-----",
592-
593540
/* QuoVadis Root CA 1 G3 */
594541
"-----BEGIN CERTIFICATE-----\n"
595542
"MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDEL\n"
@@ -2895,4 +2842,96 @@
28952842
"hBC9xdIoaDQCQTV2WnXzkoYI9bIeCvZlC9p2x1L/Cx6AcCIwwzPbGO2E14vs7dOoY4G1VnxH\n"
28962843
"x1YwlGhza9IuqbnZLBwpvQy6uWWL\n"
28972844
"-----END CERTIFICATE-----",
2845+
2846+
/* SECOM TLS RSA Root CA 2024 */
2847+
"-----BEGIN CERTIFICATE-----\n"
2848+
"MIIFmjCCA4KgAwIBAgIJAO6JNNDLgOCyMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAkpQ\n"
2849+
"MSYwJAYDVQQKEx1TRUNPTSBUcnVzdCBTeXN0ZW1zIENvLiwgTHRkLjEjMCEGA1UEAxMaU0VD\n"
2850+
"T00gVExTIFJTQSBSb290IENBIDIwMjQwHhcNMjQwMTMxMDUxMTU1WhcNNDkwMTE0MDUxMTU1\n"
2851+
"WjBaMQswCQYDVQQGEwJKUDEmMCQGA1UEChMdU0VDT00gVHJ1c3QgU3lzdGVtcyBDby4sIEx0\n"
2852+
"ZC4xIzAhBgNVBAMTGlNFQ09NIFRMUyBSU0EgUm9vdCBDQSAyMDI0MIICIjANBgkqhkiG9w0B\n"
2853+
"AQEFAAOCAg8AMIICCgKCAgEA4TjizUwzxbInq8Tx11gaFYNk5fO+34y7TyM4neh0UgL5JIZb\n"
2854+
"JNLTz2x//L/B71+5m6X6nGIr7d4lFJBGtjO677hXOz93zkcWaUTm3VbOAjBlt4YWxlcccBHX\n"
2855+
"uZ7o3Q+4R+ormrBdHeJ1CTUEG8ttQbKIl3G7OZYbnH8/pP8cjPub/0kDVNuMzp7xsVRROOis\n"
2856+
"Qt53fMoJLlYgoebbuMphOqMCtjkJ7R6efEMfLp8UAVi9ZaLRn76ET/CJkk925nduuufC4Bat\n"
2857+
"S4mnXFmxN0vUXb0ij9B8O/D8gixQEsVSD4GK8FWRPh3bVd/6bzdkHGJjy21XI0yejVomZUbR\n"
2858+
"rOfNuz0boPGV1pt18fFC39IHQEth3OFqb5NDO3L+A9bNqTgAyUgRmIn4ucgDc/Ri/Km3V51u\n"
2859+
"eZjy1/yk0qwJVadAVVrCt56iNeXOyEvzJADGgDQ8E1Pdaqct8Cynz/47ReQM62vFYO08wcQk\n"
2860+
"rjmX/tesiko1V1yyaf6EfPzUFzmaGy9xvkCwdbm15EdTolOjE0H2Vb5/APDOyCFEokiYGmXT\n"
2861+
"LdAUl0wKZ4IyjkHGzy0jhpaXEXE/GJcEvI6VzEchjaBL03EJ0h9pG4OqeIOycKvAo3A+Tbet\n"
2862+
"yfsrgYyHzU0a7/qUjGat1AAq1nVljMpKqpinPTsf/d9H39FTUeJL7TpzzjUCAwEAAaNjMGEw\n"
2863+
"HQYDVR0OBBYEFCzrchKOWHdkNRVWNQFXB6l9DTbmMB8GA1UdIwQYMBaAFCzrchKOWHdkNRVW\n"
2864+
"NQFXB6l9DTbmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB\n"
2865+
"DAUAA4ICAQAVwsvluSafaez5tFPR/hRTBzRxEyMMQF3XJXCVi3yegZyKoec7hmE6jx2ZM8Kg\n"
2866+
"M1kn2yJRwFXHX8zUW9nBLEDWc4wuE8LrlZqhGZM9pJQXGmGzResDJV6JgRBna+j4sA1M7yId\n"
2867+
"lvL0sAfFXFCTRaWTD4E1V99RLrFzWfTcC+e180hDuNMpqOEo46+lMeW/Wvh7ifOQs+kiK0O2\n"
2868+
"gHxQDNxslSavnCs4V7l8HRDJ2La10o70Bo7VLzf1W8MBvv0VTnxB+NjT5qTAbhGFh9Gvp4Ba\n"
2869+
"JpmdUf0C5CEP6dbQlfgxWfzYr69yVT6dPQB+GFEaY03IMY+AcBCs+om1fNxrQXt9zoofMBNF\n"
2870+
"bLhvpNH/JsXWdGUzfNbO12uswTa5wah8LB18FTQN2/zPHYmvBEoLuyUgZ09VNLJo5YA0kXIt\n"
2871+
"VYkLjMe2SixzK4scUHv81IK99I91DWx7FwMVKw2xgFp+ZLYB2dnpQQrqwlW64glHUcK2N9BD\n"
2872+
"snjLSxeZ+UPECh9RxH4WAcKiZW+cqaKMmhP2WBfR4IcR7NOL32ml11ds87hhV1CZWWFCJAcC\n"
2873+
"idYZz6CZa8exzHojP9SB5RH0/v1KdHAisqhSjtJl/UIAHIQ48elOn8wrTdFap4Yb5aHglmMe\n"
2874+
"Nx+fAIhDluWVfxTO7H4dTPU+SFVRMLAh+wwKZfqb94nMeQ==\n"
2875+
"-----END CERTIFICATE-----",
2876+
2877+
/* SECOM TLS ECC Root CA 2024 */
2878+
"-----BEGIN CERTIFICATE-----\n"
2879+
"MIICTDCCAdGgAwIBAgIJAIF6LO+PI3pEMAoGCCqGSM49BAMDMFoxCzAJBgNVBAYTAkpQMSYw\n"
2880+
"JAYDVQQKEx1TRUNPTSBUcnVzdCBTeXN0ZW1zIENvLiwgTHRkLjEjMCEGA1UEAxMaU0VDT00g\n"
2881+
"VExTIEVDQyBSb290IENBIDIwMjQwHhcNMjQwMTMxMDU1MjM0WhcNNDkwMTE0MDU1MjM0WjBa\n"
2882+
"MQswCQYDVQQGEwJKUDEmMCQGA1UEChMdU0VDT00gVHJ1c3QgU3lzdGVtcyBDby4sIEx0ZC4x\n"
2883+
"IzAhBgNVBAMTGlNFQ09NIFRMUyBFQ0MgUm9vdCBDQSAyMDI0MHYwEAYHKoZIzj0CAQYFK4EE\n"
2884+
"ACIDYgAE7NzFMtu9dzQXSNC12fabk0+GlC5finB3R7XaZonRUd20aFiWObtuNBCLUZSfk6QX\n"
2885+
"AE55BjEXsXQ/NG8yUqicXjsu9ksDK3JZBgCwLOVh6+nwJXTvso/dEj/GUYH5mBdoo2MwYTAd\n"
2886+
"BgNVHQ4EFgQUO3YReyl04k4GTFaCQNAhL3qzydUwHwYDVR0jBBgwFoAUO3YReyl04k4GTFaC\n"
2887+
"QNAhL3qzydUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZIzj0EAwMD\n"
2888+
"aQAwZgIxAN3ib8fi1pMYtAPjMilB5e5/H+t5CL0xPL+cZ5oTTZuSCjpAn1v7F/VAr8bFxQXA\n"
2889+
"owIxAKsBVO1ACFp7skwzPvdv1EUY5a897WGLT4lb+bjxFAWyl8wDcZJdwGZ/pAHxt1AJ1g==\n"
2890+
"-----END CERTIFICATE-----",
2891+
2892+
/* Telia EC TLS Root CA v3 */
2893+
"-----BEGIN CERTIFICATE-----\n"
2894+
"MIICMjCCAbegAwIBAgIPAYvSIlRjTQSLbOVHH9K1MAoGCCqGSM49BAMDMEoxCzAJBgNVBAYT\n"
2895+
"AlNFMRkwFwYDVQQKDBBUZWxpYSBDb21wYW55IEFCMSAwHgYDVQQDDBdUZWxpYSBFQyBUTFMg\n"
2896+
"Um9vdCBDQSB2MzAeFw0yMzExMTUwODU1MjZaFw00ODA1MjMxMTAwMDBaMEoxCzAJBgNVBAYT\n"
2897+
"AlNFMRkwFwYDVQQKDBBUZWxpYSBDb21wYW55IEFCMSAwHgYDVQQDDBdUZWxpYSBFQyBUTFMg\n"
2898+
"Um9vdCBDQSB2MzB2MBAGByqGSM49AgEGBSuBBAAiA2IABMHIlhVDLbmFKUpW0iK4dpryT6em\n"
2899+
"YOeS31JPwWnWPmkWRrAkTbPX40sQfHI9mpR7Rbktu3ngg6W+BBSXSechtMCnBmWXj/EaVlmV\n"
2900+
"5cY1jD2HoTfhBQ3AacpCNMLJK4NpZaNjMGEwHwYDVR0jBBgwFoAU1GToQ4g6cy/QGnGCNgte\n"
2901+
"hd7H3kMwHQYDVR0OBBYEFNRk6EOIOnMv0BpxgjYLXoXex95DMA4GA1UdDwEB/wQEAwIBBjAP\n"
2902+
"BgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2kAMGYCMQCXAUdS/9bbJ8A1JYaGf/bWt/s7\n"
2903+
"Ta0ot5Ulno8OjSNYRWQIlS4tVWldvTAVA7heOFgCMQCvKr8+Z2Rn+OBr5UHzlgBObpad1Luw\n"
2904+
"NTRcdNgUJxIWadcki+UBLEi1/AURKV5md2M=\n"
2905+
"-----END CERTIFICATE-----",
2906+
2907+
/* Telia RSA TLS Root CA v3 */
2908+
"-----BEGIN CERTIFICATE-----\n"
2909+
"MIIFgjCCA2qgAwIBAgIPAYvSUKtCVSxHWr2h3BrFMA0GCSqGSIb3DQEBDAUAMEsxCzAJBgNV\n"
2910+
"BAYTAlNFMRkwFwYDVQQKDBBUZWxpYSBDb21wYW55IEFCMSEwHwYDVQQDDBhUZWxpYSBSU0Eg\n"
2911+
"VExTIFJvb3QgQ0EgdjMwHhcNMjMxMTE1MDk0NzQyWhcNNDgwNTIzMTEwMDAwWjBLMQswCQYD\n"
2912+
"VQQGEwJTRTEZMBcGA1UECgwQVGVsaWEgQ29tcGFueSBBQjEhMB8GA1UEAwwYVGVsaWEgUlNB\n"
2913+
"IFRMUyBSb290IENBIHYzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsV89KG19\n"
2914+
"hCf4S1Fvk8D3TyDERhmcvx8F7Kmb4WATx3ije1id3KHxRE0TKmcNCbAQ57bvHFEYa4hR2l20\n"
2915+
"VjVadExqOW+2ld99MbEiO+jRVOz+BbxLxJnmGwCqI+BfuTjjVReDxsxjQvjgBsClaO/sm5i7\n"
2916+
"0nlZcWGRtIkvWDK3NNkT5RtwXc/O8NTFVpbUqT6cRjIj3olAblR+lRf4Ffy5o+Q9fabjYn9Z\n"
2917+
"9S4itruElcEFf9Ljk7fwdTycT/rvJW9w/B3G2a3r0f/zXNOVruIBcqE6pkSospACU2bG42fY\n"
2918+
"KrbM/GWnp7u+p9Frz4jaNwpb4YHuEeS8BratNcP8X62jXIvvKHxlsMDJCnb4U8JzFOLsU6mo\n"
2919+
"hVY58BdZrvi0Gk9UOuqmgoG6dskHoksjZTlK61D/InzmEoA1yAYJFDVysjRxDUOu9cAwANbq\n"
2920+
"mq77WIFL6BpnZgVqPtMfG6wN8BrTKdapvilVsYR59BFgIsAVBMxrGh+W+QcvmJafUpASvlAr\n"
2921+
"KvVG2FI4i6PiLjSBT0+6F6EQLrYqefOQF/fBNEXb+njUQ0SUVrAqtH4Y+OjCI/a4/JJQppxe\n"
2922+
"emZcQ0SUShgiI5AM5xHO5iyaUrTjYH4zxUz9j+1FEbDH/xpstr1gXBykspup+hRTaJcbA+Ub\n"
2923+
"pJqtWZndAPddJmt6YJQ+dU3pDu8CAwEAAaNjMGEwHwYDVR0jBBgwFoAUsMep0t2yKFZzBJSM\n"
2924+
"FFxIbzdSkqgwHQYDVR0OBBYEFLDHqdLdsihWcwSUjBRcSG83UpKoMA4GA1UdDwEB/wQEAwIB\n"
2925+
"BjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQBdYzFsNGDRk7bR/AgRKq+5\n"
2926+
"637YuOW+w6uhpoS0VnKMUpyHCwku86hEvqivakPtfmlm4bFwt++sb/8OXsWBqtfbXMaBNDTZ\n"
2927+
"l8XRMJuLWOW2JrbKkRzgG0eBUcvsadG1rrhbmZqYvFXaAZO7o4TdOZzxhBB5GOAWWXB3Iera\n"
2928+
"NP4J63zyo9n8Gqw3sJBG44em5hoYjBffP+npibyslnslRi4L6xHsCYj/Pab+OlqbMCB6v+sT\n"
2929+
"CLeEIukRVzoR9aQ45pEK7Z1QBnSsbAKQtss0JKD9d/mX143H1xePjPhTXlv5JCkhrcj+SShz\n"
2930+
"0P9+EHoWe6m9lyUEOIVn0rp+yVJWNbmyDv3VkwFxHC1ApSQsgSimjGQ4wtr6cSmordYxkV+R\n"
2931+
"o8lOIIhRksXPyDk27gW6IjUXCkZKpxFjkL3jiBSc8SkxnwCWtXg8xwNwdFVNBGLCCuJnsneY\n"
2932+
"XjJNqzRqUcoGwzsvF3Qi/ZnHUNvISdevlgIAXL4Wvrxaqvoa01wB+GCfs57RTGE4TvAGhKNK\n"
2933+
"us8K3hRT1BSpigzMIRzSxtAOrqPN6j//QSmW9f8Jcncri4j2ihSpVrFU0NdNkMhZeAKidTFP\n"
2934+
"sxCVFuW4Aniz7jqiw5sWtjbQrlW035izIEU4sYwQoC1Nx0Svy+mMTRai50LqFQ+A1/Hq6xHH\n"
2935+
"DNx7CI83d23Erw==\n"
2936+
"-----END CERTIFICATE-----",
28982937
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS

‎src/udp_wrap.cc‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ void UDPWrap::DoBind(const FunctionCallbackInfo<Value>& args, int family) {
325325
err = uv_udp_bind(&wrap->handle_,
326326
reinterpret_cast<const sockaddr*>(&addr_storage),
327327
flags);
328+
if (err == 0) wrap->net_permission_granted_ = true;
328329
}
329330

330331
if (err == 0)
@@ -358,6 +359,7 @@ void UDPWrap::DoConnect(const FunctionCallbackInfo<Value>& args, int family) {
358359
if (err == 0) {
359360
err = uv_udp_connect(&wrap->handle_,
360361
reinterpret_cast<const sockaddr*>(&addr_storage));
362+
if (err == 0) wrap->net_permission_granted_ = true;
361363
}
362364

363365
args.GetReturnValue().Set(err);
@@ -368,9 +370,14 @@ void UDPWrap::Open(const FunctionCallbackInfo<Value>& args) {
368370
UDPWrap* wrap;
369371
ASSIGN_OR_RETURN_UNWRAP(
370372
&wrap, args.This(), args.GetReturnValue().Set(UV_EBADF));
373+
Environment* env = wrap->env();
374+
375+
THROW_IF_INSUFFICIENT_PERMISSIONS(env, permission::PermissionScope::kNet, "");
376+
371377
CHECK(args[0]->IsNumber());
372378
int fd = FromV8Value<int>(args[0]);
373379
int err = uv_udp_open(&wrap->handle_, fd);
380+
if (err == 0) wrap->net_permission_granted_ = true;
374381

375382
args.GetReturnValue().Set(err);
376383
}
@@ -697,6 +704,13 @@ void UDPWrapBase::RecvStart(const FunctionCallbackInfo<Value>& args) {
697704

698705
int UDPWrap::RecvStart() {
699706
if (IsHandleClosing()) return UV_EBADF;
707+
708+
if (!net_permission_granted_) {
709+
THROW_IF_INSUFFICIENT_PERMISSIONS(
710+
env(), permission::PermissionScope::kNet, "", UV_EACCES);
711+
net_permission_granted_ = true;
712+
}
713+
700714
int err = uv_udp_recv_start(&handle_, OnAlloc, OnRecv);
701715
// UV_EALREADY means that the socket is already bound but that's okay
702716
if (err == UV_EALREADY)

‎src/udp_wrap.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ class UDPWrap final : public HandleWrap,
214214

215215
uv_udp_t handle_;
216216

217+
bool net_permission_granted_ = false;
217218
bool current_send_has_callback_;
218219
v8::Local<v8::Object> current_send_req_wrap_;
219220
};

0 commit comments

Comments
 (0)