diff --git a/lib/moduleEncoding.js b/lib/moduleEncoding.js index 1caafb7..11665f5 100644 --- a/lib/moduleEncoding.js +++ b/lib/moduleEncoding.js @@ -24,7 +24,10 @@ const path = require('path'); const DEFAULT_START_ALIGNMENT = 8; -const MAX_ENV_VARS_ASSET_DATA_SIZE = 16 * 1024; +const ENV_ASSET_NAME = 'env'; +const ENV_JSON_FILE = 'env.json'; + +const MAX_ENV_SIZE = 16 * 1024; function moduleFunctionToString(func) { switch (func) { @@ -1285,7 +1288,7 @@ async function createApplicationAndAssetBundle(application, assets, vars) { assets ||= []; assets.push({ data: varsAsset, - name: 'env-vars' + name: ENV_ASSET_NAME }); } @@ -1330,7 +1333,7 @@ async function createApplicationAndAssetBundle(application, assets, vars) { archive.append(asset.data, { name: `assets/${asset.name}` }); } if (vars) { - archive.append(JSON.stringify(vars, null, 2), { name: 'env/env-vars.json' }); + archive.append(JSON.stringify(vars, null, 2), { name: ENV_JSON_FILE }); } output.on('close', resolve); archive.on('error', reject); @@ -1391,19 +1394,16 @@ async function unpackApplicationAndAssetBundle(bundle) { name: path.basename(entry.path), data: data }); - } else if (dir === 'env') { - if (result.vars) { - throw new RangeError('More env vars than expected in a bundle'); - } + } else if (entry.path === ENV_JSON_FILE) { try { - result.vars = { + result.env = { name: entry.path, data: JSON.parse(data.toString('utf-8')) }; } catch (err) { - reject(new Error(`Env vars file at ${entry.path} is invalid: ${err.message}`)); + reject(new Error(`Env file at ${entry.path} is invalid: ${err.message}`)); } - } else if (dir === '.') { + } else if (dir === '.' && path.extname(entry.path) === '.bin') { if (result.application) { throw new RangeError('More applications than expected in a bundle'); } @@ -1688,7 +1688,9 @@ async function encodeEnvVarsAsset(vars, snapshot = undefined) { if (!vars || typeof vars !== 'object') { throw new Error('Expected variable values to be an object'); } - let approxSize = 0; + if (JSON.stringify(vars).length > MAX_ENV_SIZE) { + throw new Error('Asset exceeds the maximum size'); + } for (const [name, val] of Object.entries(vars)) { if (name.length > 128) { throw new Error(`Variable name is too long: ${name.slice(0, 30)}...`); @@ -1699,10 +1701,6 @@ async function encodeEnvVarsAsset(vars, snapshot = undefined) { if (typeof val !== 'string') { throw new Error(`Variable value is not a string: ${name}`); } - approxSize += name.length + val.length; - if (approxSize > MAX_ENV_VARS_ASSET_DATA_SIZE) { - throw new Error('Asset exceeds the maximum size'); - } } let hash; let updatedAt; @@ -1732,11 +1730,6 @@ async function encodeEnvVarsAsset(vars, snapshot = undefined) { hash, updatedAt })).finish(); - - if (assetData.length > MAX_ENV_VARS_ASSET_DATA_SIZE) { - throw new Error('Asset exceeds the maximum size'); - } - return assetData; } @@ -1755,9 +1748,6 @@ async function encodeEnvVarsAsset(vars, snapshot = undefined) { async function createEnvVarsAssetModule(vars, snapshot = undefined) { let assetData; if (Buffer.isBuffer(vars)) { - if (vars.length > MAX_ENV_VARS_ASSET_DATA_SIZE) { - throw new Error('Asset exceeds the maximum size'); - } if (snapshot) { throw new Error('Cannot set snapshot details in already encoded asset data'); } @@ -1766,7 +1756,7 @@ async function createEnvVarsAssetModule(vars, snapshot = undefined) { assetData = await encodeEnvVarsAsset(vars, snapshot); } - const assetModule = await createAssetModule(assetData, 'env-vars', { + const assetModule = await createAssetModule(assetData, ENV_ASSET_NAME, { type: snapshot ? ModuleInfo.AssetType.ENV_VARS_SNAPSHOT : ModuleInfo.AssetType.ENV_VARS_APP, compress: false }); @@ -1797,5 +1787,8 @@ module.exports = { removeModuleExtensions, listModuleExtensions, encodeEnvVarsAsset, - createEnvVarsAssetModule + createEnvVarsAssetModule, + ENV_ASSET_NAME, + ENV_JSON_FILE, + MAX_ENV_SIZE }; diff --git a/specs/lib/moduleEncoding.spec.js b/specs/lib/moduleEncoding.spec.js index ae70ebc..5f921e6 100644 --- a/specs/lib/moduleEncoding.spec.js +++ b/specs/lib/moduleEncoding.spec.js @@ -742,7 +742,7 @@ describe('moduleEncoding', () => { const app = path.join(TEST_BINARIES_PATH, 'tracker-tinker@5.3.1.bin'); const bundle = await createApplicationAndAssetBundle(app, [], vars); const unpacked = await unpackApplicationAndAssetBundle(bundle); - expect(unpacked.vars.data).be.eql(vars); + expect(unpacked.env.data).be.eql(vars); expect(unpacked.assets.length).be.eql(1); }); }); @@ -920,7 +920,7 @@ describe('moduleEncoding', () => { const extensions = info.suffixInfo.extensions; let ext = findExtension(ModuleInfo.ExtensionType.NAME, extensions); expect(ext).to.include({ - name: 'env-vars' + name: 'env' }); ext = findExtension(ModuleInfo.ExtensionType.ASSET_TYPE, extensions); expect(ext).to.include({