feat(lib/modules/metro): switch to proper objects for storage

This commit is contained in:
PalmDevs 2025-07-18 23:36:04 +07:00
parent 59375836a6
commit 00638ed845
No known key found for this signature in database
GPG key ID: 6FAE8F8677ACA8BA
4 changed files with 33 additions and 43 deletions

View file

@ -13,44 +13,34 @@ const HasImportedAll = 1 << 3
const Initializing = 1 << 4
const InitializedOrInitializing = Initialized | Initializing
const NotInitializedOrInitializingMask = ~InitializedOrInitializing
export const FlagKey = 0
export const ModuleObjectKey = 1
const FactoryKey = 2
const ImportedDefaultKey = 3
const ImportedAllKey = 4
const ErrorKey = 5
export const global = globalThis
export const metroRequire = (moduleId => {
const module = mList.get(moduleId)!
const flags = module[FlagKey]
const moduleObject = module[ModuleObjectKey]
const mod = mList.get(moduleId)!
const { flags, module: moduleObject } = mod
if (flags & InitializedOrInitializing) return moduleObject.exports
if (flags & HasError) throw module[ErrorKey]
if (flags & HasError) throw mod.error
module[FlagKey] |= Initializing
mod.flags |= Initializing
moduleObject.id = moduleId
try {
const factory = module[FactoryKey]
module[FactoryKey] = undefined
const { factory } = mod
mod.factory = undefined
factory!()
module[FlagKey] =
(flags & NotInitializedOrInitializingMask) | Initialized
mod.flags = (flags & NotInitializedOrInitializingMask) | Initialized
return moduleObject.exports
} catch (e) {
module[FlagKey] = (flags & NotInitializedOrInitializingMask) | HasError
module[ErrorKey] = e
mod.flags = (flags & NotInitializedOrInitializingMask) | HasError
mod.error = e
// @ts-expect-error: We never access this key again
module[ModuleObjectKey] = undefined
mod.module = undefined
// @ts-expect-error: Not documented, but used by React Native
if (global.ErrorUtils) global.ErrorUtils.reportFatalError(e)
@ -62,20 +52,20 @@ global.__r = metroRequire
export const metroImportDefault: Metro.RequireFn = moduleId => {
const mod = mList.get(moduleId)!
if (mod[FlagKey] & HasImportedDefault) return mod[ImportedDefaultKey]
if (mod.flags & HasImportedDefault) return mod.importedDefault
const exports = metroRequire(moduleId)
return (mod[ImportedDefaultKey] = exports?.__esModule
return (mod.importedDefault = exports?.__esModule
? exports.default
: exports)
}
export const metroImportAll: Metro.RequireFn = moduleId => {
const mod = mList.get(moduleId)!
if (mod[FlagKey] & HasImportedAll) return mod[ImportedAllKey]
if (mod.flags & HasImportedAll) return mod.importedAll
const exports = metroRequire(moduleId)
if (!exports?.__esModule) exports.default = exports
return (mod[ImportedAllKey] = exports)
return (mod.importedAll = exports)
}

View file

@ -38,16 +38,16 @@ const metroDefine = (
const moduleObject = { exports: {} }
mList.set(id, [
0,
moduleObject,
() => {
mList.set(id, {
flags: 0,
module: moduleObject,
factory: () => {
handleFactoryCall(factory, moduleObject)
},
undefined, // Imported default
undefined, // Imported all
undefined, // Error
])
importedDefault: undefined,
importedAll: undefined,
error: undefined,
})
}
/**

View file

@ -1,5 +1,5 @@
import { isProxy } from '@revenge-mod/utils/proxy'
import { FlagKey, Initialized, ModuleObjectKey } from './custom'
import { Initialized } from './custom'
import { mDeps, mList } from './patches'
import type { Metro } from '../types'
@ -20,7 +20,7 @@ export function getModuleDependencies(
* @returns Non-zero number if the module is initialized, `0` if it is not initialized or does not exist.
*/
export function isModuleInitialized(id: Metro.ModuleID): number | undefined {
return mList.get(id)?.[FlagKey]! & Initialized
return mList.get(id)?.flags! & Initialized
}
/**
@ -34,7 +34,7 @@ export function isModuleInitialized(id: Metro.ModuleID): number | undefined {
export function getInitializedModuleExports(
id: Metro.ModuleID,
): Metro.ModuleExports | undefined {
return mList.get(id)?.[ModuleObjectKey]?.exports
return mList.get(id)?.module?.exports
}
/**

View file

@ -72,14 +72,14 @@ export namespace Metro {
}
export namespace RevengeMetro {
export type ModuleDefinition<Initialized = boolean> = [
flags: number,
module: Metro.Module,
factory: If<Initialized, undefined, () => void>,
importedDefault?: Metro.ModuleExports,
importedAll?: Metro.ModuleExports,
error?: If<Initialized, undefined, any>,
]
export type ModuleDefinition<Initialized = boolean> = {
flags: number
module: Metro.Module
factory: If<Initialized, undefined, () => void>
importedDefault?: Metro.ModuleExports
importedAll?: Metro.ModuleExports
error?: If<Initialized, undefined, any>
}
export type ModuleList = Map<Metro.ModuleID, ModuleDefinition>
}