Skip to content

Commit be776fa

Browse files
committed
fixup! module: handle cached linked async jobs in require(esm)
1 parent 27b6cfd commit be776fa

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

lib/internal/modules/esm/loader.js

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,23 @@ function getTranslators() {
9797
return translators;
9898
}
9999

100+
/**
101+
* Generate message about potential race condition caused by requiring a cached module that has started
102+
* async linking.
103+
* @param {string} filename Filename of the module being required.
104+
* @param {string|undefined} parentFilename Filename of the module calling require().
105+
* @returns {string} Error message.
106+
*/
107+
function getRaceMessage(filename, parentFilename) {
108+
let raceMessage = `Cannot require() ES Module ${filename} because it is not yet fully loaded. `;
109+
raceMessage += 'This may be caused by a race condition if the module is simultaneously dynamically ';
110+
raceMessage += 'import()-ed via Promise.all(). Try await-ing the import() sequentially in a loop instead.';
111+
if (parentFilename) {
112+
raceMessage += ` (from ${parentFilename})`;
113+
}
114+
return raceMessage;
115+
}
116+
100117
/**
101118
* @type {HooksProxy}
102119
* Multiple loader instances exist for various, specific reasons (see code comments at site).
@@ -362,14 +379,8 @@ class ModuleLoader {
362379
mod[kRequiredModuleSymbol] = job.module;
363380
const parentFilename = urlToFilename(parent?.filename);
364381
// TODO(node:55782): this race may stop to happen when the ESM resolution and loading become synchronous.
365-
let raceMessage = `Cannot require() ES Module ${filename} because it is not yet fully loaded. `;
366-
raceMessage += 'This may be caused by a race condition if the module is simultaneously dynamically ';
367-
raceMessage += 'import()-ed via Promise.all(). Try await-ing the import() sequentially in a loop instead.';
368-
if (parentFilename) {
369-
raceMessage += ` (from ${parentFilename})`;
370-
}
371382
if (!job.module) {
372-
assert(job.module, raceMessage);
383+
assert.fail(getRaceMessage(filename, parentFilename));
373384
}
374385
if (job.module.async) {
375386
throw new ERR_REQUIRE_ASYNC_MODULE(filename, parentFilename);
@@ -398,7 +409,8 @@ class ModuleLoader {
398409
throwIfPromiseRejected(job.instantiated);
399410
}
400411
if (status !== kEvaluating) {
401-
assert.fail(`Unexpected module status ${status}. ` + raceMessage);
412+
assert.fail(`Unexpected module status ${status}. ` +
413+
getRaceMessage(filename, parentFilename));
402414
}
403415
let message = `Cannot require() ES Module ${filename} in a cycle.`;
404416
if (parentFilename) {

0 commit comments

Comments
 (0)