diff --git a/packages/SwingSet/src/controller.js b/packages/SwingSet/src/controller.js index 482fdaf24d3..1c60578a1bc 100644 --- a/packages/SwingSet/src/controller.js +++ b/packages/SwingSet/src/controller.js @@ -125,6 +125,45 @@ export function loadBasedir(basedir) { return config; } +function normalizeConfigDescriptor(desc, dirname, expectParameters) { + if (desc) { + for (const name of Object.keys(desc)) { + const entry = desc[name]; + if (entry.sourcePath) { + entry.sourcePath = path.resolve(dirname, entry.sourcePath); + } + if (entry.bundlePath) { + entry.bundlePath = path.resolve(dirname, entry.bundlePath); + } + if (expectParameters && !entry.parameters) { + entry.parameters = {}; + } + } + } +} + +export function loadSwingsetConfigFile(configPath) { + try { + const config = JSON.parse(fs.readFileSync(configPath)); + const dirname = path.dirname(configPath); + normalizeConfigDescriptor(config.vats, dirname, true); + normalizeConfigDescriptor(config.bundles, dirname, false); + // normalizeConfigDescriptor(config.devices, dirname, true); // TODO: represent devices + if (!config.bootstrap) { + throw Error(`no designated bootstrap vat in ${configPath}`); + } else if (!config.vats[config.bootstrap]) { + throw Error(`bootstrap vat ${config.bootstrap} not found in ${configPath}`); + } + return config; + } catch (e) { + if (e.code === 'ENOENT') { + return null; + } else { + throw e; + } + } +} + export async function buildVatController( config, argv = [], diff --git a/packages/SwingSet/src/index.js b/packages/SwingSet/src/index.js index fef3b160ec7..b71a668899b 100644 --- a/packages/SwingSet/src/index.js +++ b/packages/SwingSet/src/index.js @@ -1,4 +1,8 @@ -export { loadBasedir, buildVatController } from './controller'; +export { + loadBasedir, + loadSwingsetConfigFile, + buildVatController, +} from './controller'; export { buildMailboxStateMap, buildMailbox } from './devices/mailbox'; export { buildTimer } from './devices/timer'; diff --git a/packages/swingset-runner/src/main.js b/packages/swingset-runner/src/main.js index 376853627ce..e92b7e7de6a 100644 --- a/packages/swingset-runner/src/main.js +++ b/packages/swingset-runner/src/main.js @@ -5,7 +5,11 @@ import repl from 'repl'; import util from 'util'; import { makeStatLogger } from '@agoric/stat-logger'; -import { buildVatController, loadBasedir } from '@agoric/swingset-vat'; +import { + buildVatController, + loadSwingsetConfigFile, + loadBasedir, +} from '@agoric/swingset-vat'; import { initSwingStore as initSimpleSwingStore, openSwingStore as openSimpleSwingStore, @@ -85,42 +89,6 @@ function fail(message, printUsage) { process.exit(1); } -function normalizeConfigDescriptor(desc, dirname, expectParameters) { - if (desc) { - for (const name of Object.keys(desc)) { - const entry = desc[name]; - if (entry.sourcePath) { - entry.sourcePath = path.resolve(dirname, entry.sourcePath); - } - if (entry.bundlePath) { - entry.bundlePath = path.resolve(dirname, entry.bundlePath); - } - if (expectParameters && !entry.parameters) { - entry.parameters = {}; - } - } - } -} - -function readConfig(configPath) { - try { - const config = JSON.parse(fs.readFileSync(configPath)); - const dirname = path.dirname(configPath); - normalizeConfigDescriptor(config.vats, dirname, true); - normalizeConfigDescriptor(config.bundles, dirname, false); - // normalizeConfigDescriptor(config.devices, dirname, true); // TODO: represent devices - if (!config.bootstrap) { - fail(`no designated bootstrap vat in ${configPath}`); - } else if (!config.vats[config.bootstrap]) { - fail(`bootstrap vat ${config.bootstrap} not found in ${configPath}`); - } - return config; - } catch (e) { - fail(`bad config file: ${e}`); - return null; // just to make eslint shut up - } -} - function generateIndirectConfig(baseConfig) { const config = { bootstrap: 'launcher', @@ -328,10 +296,13 @@ export async function main() { let config; if (configPath) { - config = readConfig(configPath); + config = loadSwingsetConfigFile(configPath); + if (config === null) { + fail(`config file ${configPath} not found`); + } basedir = path.dirname(configPath); } else { - config = await loadBasedir(basedir); + config = loadBasedir(basedir); } if (launchIndirectly) { config = generateIndirectConfig(config);