diff --git a/doc/api/wasi.md b/doc/api/wasi.md index ad4597ab30d..eddc6a057e5 100644 --- a/doc/api/wasi.md +++ b/doc/api/wasi.md @@ -121,6 +121,9 @@ changes: - version: REPLACEME pr-url: https://github.com/nodejs/node/pull/47391 description: The version option is now required and has no default value. + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/47390 + description: default value of returnOnExit changed to true. - version: v19.8.0 pr-url: https://github.com/nodejs/node/pull/46469 description: version field added to options. @@ -136,10 +139,11 @@ changes: sandbox directory structure. The string keys of `preopens` are treated as directories within the sandbox. The corresponding values in `preopens` are the real paths to those directories on the host machine. - * `returnOnExit` {boolean} By default, WASI applications terminate the Node.js - process via the `__wasi_proc_exit()` function. Setting this option to `true` - causes `wasi.start()` to return the exit code rather than terminate the - process. **Default:** `false`. + * `returnOnExit` {boolean} By default, when WASI applications call + `__wasi_proc_exit()` `wasi.start()` will return with the exit code + specified rather than terminatng the process. Setting this option to + `false` will cause the Node.js process to exit with the specified + exit code instead. **Default:** `true`. * `stdin` {integer} The file descriptor used as standard input in the WebAssembly application. **Default:** `0`. * `stdout` {integer} The file descriptor used as standard output in the diff --git a/lib/wasi.js b/lib/wasi.js index e3d4294eeae..6c700219a80 100644 --- a/lib/wasi.js +++ b/lib/wasi.js @@ -102,11 +102,13 @@ class WASI { wrap[prop] = FunctionPrototypeBind(wrap[prop], wrap); } + let returnOnExit = true; if (options.returnOnExit !== undefined) { validateBoolean(options.returnOnExit, 'options.returnOnExit'); - if (options.returnOnExit) - wrap.proc_exit = FunctionPrototypeBind(wasiReturnOnProcExit, this); + returnOnExit = options.returnOnExit; } + if (returnOnExit) + wrap.proc_exit = FunctionPrototypeBind(wasiReturnOnProcExit, this); this[kSetMemory] = wrap._setMemory; delete wrap._setMemory; diff --git a/test/wasi/test-wasi.js b/test/wasi/test-wasi.js index cbfaf35d208..f1f3ece4b4e 100644 --- a/test/wasi/test-wasi.js +++ b/test/wasi/test-wasi.js @@ -1,6 +1,15 @@ 'use strict'; const common = require('../common'); +function returnOnExitEnvToValue(env) { + const envValue = env.RETURN_ON_EXIT; + if (envValue === undefined) { + return undefined; + } + + return envValue === 'true'; +} + if (process.argv[2] === 'wasi-child-preview1') { // Test version set to preview1 const assert = require('assert'); @@ -23,6 +32,7 @@ if (process.argv[2] === 'wasi-child-preview1') { '/sandbox': fixtures.path('wasi'), '/tmp': tmpdir.path, }, + returnOnExit: returnOnExitEnvToValue(process.env), }); // Validate the getImportObject helper @@ -56,6 +66,10 @@ if (process.argv[2] === 'wasi-child-preview1') { if (options.stdin !== undefined) opts.input = options.stdin; + if ('returnOnExit' in options) { + opts.env.RETURN_ON_EXIT = options.returnOnExit; + } + const child = cp.spawnSync(process.execPath, [ ...args, __filename, @@ -79,7 +93,9 @@ if (process.argv[2] === 'wasi-child-preview1') { if (!common.isIBMi) { runWASI({ test: 'clock_getres' }); } - runWASI({ test: 'exitcode', exitCode: 120 }); + runWASI({ test: 'exitcode' }); + runWASI({ test: 'exitcode', returnOnExit: true }); + runWASI({ test: 'exitcode', exitCode: 120, returnOnExit: false }); runWASI({ test: 'fd_prestat_get_refresh' }); runWASI({ test: 'freopen', stdout: `hello from input2.txt${checkoutEOL}` }); runWASI({ test: 'ftruncate' });