/** * * Agora Real Time Engagement * Created by Wei Hu in 2022-05. * Copyright (c) 2022 Agora IO. All rights reserved. * */ // NOTE: There is a mechanism in RTE react-native binding which we can inject // dependency modules when RTE 'require' modules. In order to maintain the // interface consistency between RTE nodejs binding & RTE react-native binding, // we put the relevant codes of this mechanism to RTE nodejs binding, too. type ModuleContent = Record; type ModuleContentGenerator = () => ModuleContent; type ModulesContentGenerator = Record; interface CjsModule { exports: ModuleContent; } export interface EsModule { default: ModuleContent; } type CjsModuleGenerator = () => CjsModule; type CjsModulesGeneratorPair = Array<[string, CjsModuleGenerator]>; export type CjsModulesGenerator = Record; export function getModuleContent( code_text: string, moduleName: string, modulesDependsOn: CjsModulesGenerator, ): ModuleContent { const modulesDependsOn_: CjsModulesGenerator = Object.create(modulesDependsOn); function require(name: string): ModuleContent { if (!(name in modulesDependsOn_) && moduleName === name) { const module: CjsModule = { exports: {} }; modulesDependsOn_[name] = (): CjsModule => { return module; }; // eslint-disable-next-line no-new-func const wrapper = Function('require, exports, module, global', code_text); wrapper(require, module.exports, module, globalThis); } else if (!(name in modulesDependsOn_)) { throw new Error(`Module '${name}' not found`); } return modulesDependsOn_[name]().exports; } return require(moduleName); } const fromPairs = ( cjsModuleGenerator: CjsModulesGeneratorPair, ): CjsModulesGenerator => { return Object.assign( {}, ...cjsModuleGenerator.map(([ k, v ]) => { return { [k]: v }; }), ); }; export function getCjsModules( modulesContentGenerator: ModulesContentGenerator, ): CjsModulesGenerator { return fromPairs( Object.keys(modulesContentGenerator).map((k) => [ k, (): CjsModule => { return { exports: modulesContentGenerator[k]() }; }, ]), ); }