Skip to content

Commit 28ebbd4

Browse files
committed
chore: handle network permission in node25
1 parent 2f2bf1e commit 28ebbd4

2 files changed

Lines changed: 48 additions & 3 deletions

File tree

src/index.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ const createError = ({ name, message, ...props }) => {
1515
return error
1616
}
1717

18-
const [major] = process.version.slice(1).split('.').map(Number)
18+
const [nodeMajor] = process.version.slice(1).split('.').map(Number)
1919

20-
const PERMISSION_FLAG = major >= 24 ? '--permission' : '--experimental-permission'
20+
const PERMISSION_FLAG = nodeMajor >= 24 ? '--permission' : '--experimental-permission'
2121

2222
const flags = ({ memory }) => {
2323
const flags = ['--disable-warning=ExperimentalWarning', PERMISSION_FLAG]
@@ -77,9 +77,15 @@ module.exports = (snippet, { tmpdir, timeout, memory, throwError = true } = {})
7777
}
7878

7979
if (error.code === 'ERR_ACCESS_DENIED') {
80+
const permission = error.permission
81+
? error.permission
82+
: error.message.includes('getaddrinfo')
83+
? 'network'
84+
: undefined
85+
8086
throw createError({
8187
name: 'PermissionError',
82-
message: `Access to '${error.permission}' has been restricted`,
88+
message: `Access to '${permission}' has been restricted`,
8389
profiling: { duration: duration() }
8490
})
8591
}

test/error.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ const test = require('ava')
44

55
const isolatedFunction = require('..')
66

7+
const [nodeMajor] = process.version.slice(1).split('.').map(Number)
8+
79
test('throw an error if snippet is not a function or string', t => {
810
t.throws(
911
() => {
@@ -139,3 +141,40 @@ test('handle child process', async t => {
139141
t.is(error.message, "Access to 'ChildProcess' has been restricted")
140142
}
141143
})
144+
;(nodeMajor >= 25 ? test : test.only)('handle network access', async t => {
145+
{
146+
const [fn, cleanup] = isolatedFunction(async () => {
147+
function doFetch (url) {
148+
return new Promise((resolve, reject) => {
149+
const req = require('node:http').get(url, res => {
150+
let data = ''
151+
152+
res.on('data', chunk => {
153+
data += chunk
154+
})
155+
156+
res.on('end', () => {
157+
resolve({
158+
statusCode: res.statusCode,
159+
headers: res.headers,
160+
body: data
161+
})
162+
})
163+
})
164+
165+
req.on('error', reject)
166+
})
167+
}
168+
169+
const { statusCode } = await doFetch('http://example.com')
170+
return statusCode
171+
})
172+
173+
t.teardown(cleanup)
174+
175+
const error = await t.throwsAsync(fn())
176+
console.log('error', error)
177+
178+
t.is(error.message, "Access to 'network' has been restricted")
179+
}
180+
})

0 commit comments

Comments
 (0)