diff --git a/lib/wasi.js b/lib/wasi.js index 0a6574108ebfb3..7ea2d1bbe0f7c0 100644 --- a/lib/wasi.js +++ b/lib/wasi.js @@ -1,7 +1,6 @@ 'use strict'; /* global WebAssembly */ const { - ArrayIsArray, ArrayPrototypeMap, ArrayPrototypePush, FunctionPrototypeBind, @@ -13,6 +12,11 @@ const { ERR_WASI_ALREADY_STARTED } = require('internal/errors').codes; const { emitExperimentalWarning } = require('internal/util'); +const { + validateArray, + validateBoolean, + validateObject, +} = require('internal/validators'); const { WASI: _WASI } = internalBinding('wasi'); const kExitCode = Symbol('exitCode'); const kSetMemory = Symbol('setMemory'); @@ -23,52 +27,39 @@ emitExperimentalWarning('WASI'); class WASI { constructor(options = {}) { - if (options === null || typeof options !== 'object') - throw new ERR_INVALID_ARG_TYPE('options', 'object', options); - - const { env, preopens, returnOnExit = false } = options; - let { args = [] } = options; + validateObject(options, 'options'); - if (ArrayIsArray(args)) - args = ArrayPrototypeMap(args, (arg) => { return String(arg); }); - else - throw new ERR_INVALID_ARG_TYPE('options.args', 'Array', args); + if (options.args !== undefined) + validateArray(options.args, 'options.args'); + const args = ArrayPrototypeMap(options.args || [], String); - const envPairs = []; - - if (env !== null && typeof env === 'object') { - for (const key in env) { - const value = env[key]; + const env = []; + if (options.env !== undefined) { + validateObject(options.env, 'options.env'); + for (const [key, value] of ObjectEntries(options.env)) { if (value !== undefined) - ArrayPrototypePush(envPairs, `${key}=${value}`); + ArrayPrototypePush(env, `${key}=${value}`); } - } else if (env !== undefined) { - throw new ERR_INVALID_ARG_TYPE('options.env', 'Object', env); } - const preopenArray = []; - - if (typeof preopens === 'object' && preopens !== null) { - for (const [key, value] of ObjectEntries(preopens)) { - ArrayPrototypePush(preopenArray, String(key), String(value)); + const preopens = []; + if (options.preopens !== undefined) { + validateObject(options.preopens, 'options.preopens'); + for (const [key, value] of ObjectEntries(options.preopens)) { + ArrayPrototypePush(preopens, String(key), String(value)); } - } else if (preopens !== undefined) { - throw new ERR_INVALID_ARG_TYPE('options.preopens', 'Object', preopens); - } - - if (typeof returnOnExit !== 'boolean') { - throw new ERR_INVALID_ARG_TYPE( - 'options.returnOnExit', 'boolean', returnOnExit); } - const wrap = new _WASI(args, envPairs, preopenArray); + const wrap = new _WASI(args, env, preopens); for (const prop in wrap) { wrap[prop] = FunctionPrototypeBind(wrap[prop], wrap); } - if (returnOnExit) { - wrap.proc_exit = FunctionPrototypeBind(wasiReturnOnProcExit, this); + if (options.returnOnExit !== undefined) { + validateBoolean(options.returnOnExit, 'options.returnOnExit'); + if (options.returnOnExit) + wrap.proc_exit = FunctionPrototypeBind(wasiReturnOnProcExit, this); } this[kSetMemory] = wrap._setMemory; @@ -86,8 +77,7 @@ class WASI { const exports = instance.exports; - if (exports === null || typeof exports !== 'object') - throw new ERR_INVALID_ARG_TYPE('instance.exports', 'Object', exports); + validateObject(exports, 'instance.exports'); const { memory } = exports;