From c949517e4abd9f6cf2e8b0c266b51be9db4352b2 Mon Sep 17 00:00:00 2001 From: PalmDevs Date: Sun, 13 Jul 2025 19:22:15 +0700 Subject: [PATCH] fix(lib/modules/metro): mark module as initializing instead of optimistically marking as initialized during require --- lib/modules/src/metro/custom.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/modules/src/metro/custom.ts b/lib/modules/src/metro/custom.ts index 9c6a200..a388248 100644 --- a/lib/modules/src/metro/custom.ts +++ b/lib/modules/src/metro/custom.ts @@ -10,8 +10,11 @@ export const Initialized = 1 << 0 const HasError = 1 << 1 const HasImportedDefault = 1 << 2 const HasImportedAll = 1 << 3 +const Initializing = 1 << 4 -const NotInitializedMask = ~Initialized +const InitializedOrInitializing = Initialized | Initializing + +const NotInitializedOrInitializingMask = ~InitializedOrInitializing export const FlagKey = 0 export const ModuleObjectKey = 1 @@ -27,13 +30,10 @@ export const metroRequire = (moduleId => { const flags = module[FlagKey] const moduleObject = module[ModuleObjectKey] - if (flags & Initialized) return moduleObject.exports + if (flags & InitializedOrInitializing) return moduleObject.exports if (flags & HasError) throw module[ErrorKey] - // Optimistically mark module as initialized before running the - // factory to keep any require cycles inside the factory from causing an - // infinite require loop. - module[FlagKey] |= Initialized + module[FlagKey] |= Initializing moduleObject.id = moduleId try { @@ -42,9 +42,12 @@ export const metroRequire = (moduleId => { factory!() + module[FlagKey] = + (flags & NotInitializedOrInitializingMask) | Initialized + return moduleObject.exports } catch (e) { - module[FlagKey] = (flags & NotInitializedMask) | HasError + module[FlagKey] = (flags & NotInitializedOrInitializingMask) | HasError module[ErrorKey] = e // @ts-expect-error: We never access this key again module[ModuleObjectKey] = undefined