From ae7789a3c1c139d5b8398b651c55c52e4d63d3fc Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Mon, 13 May 2019 14:19:28 +0200 Subject: [PATCH] module: prevent race condition while combining import and require This checks if any require calls have happened to the same file during the file read. If that was the case, it'll return the same module instead of creating a new instance. PR-URL: https://github.com/nodejs/node/pull/27674 Reviewed-By: Guy Bedford --- lib/internal/modules/esm/translators.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/internal/modules/esm/translators.js b/lib/internal/modules/esm/translators.js index 4ca9be4d622faa..f39b59e4bcddc5 100644 --- a/lib/internal/modules/esm/translators.js +++ b/lib/internal/modules/esm/translators.js @@ -124,6 +124,16 @@ translators.set('json', async function jsonStrategy(url) { }); } const content = await readFileAsync(pathname, 'utf-8'); + // A require call could have been called on the same file during loading and + // that resolves synchronously. To make sure we always return the identical + // export, we have to check again if the module already exists or not. + module = CJSModule._cache[modulePath]; + if (module && module.loaded) { + const exports = module.exports; + return createDynamicModule(['default'], url, (reflect) => { + reflect.exports.default.set(exports); + }); + } try { const exports = JsonParse(stripBOM(content)); module = {