Repository URL to install this package:
|
Version:
0.7.0 ▾
|
// (c) Copyright 2023 Supertenant Ltd. - all rights reserved.
// See LICENSE file in project root for license terms.
"use strict";let logger=require("@supertenant/core").logger.getLogger("shared-metrics/native-module-retry");const EventEmitter=require("events"),copy=require("recursive-copy"),fs=require("fs"),os=require("os"),tar=require("tar"),path=require("path"),detectLibc=require("detect-libc"),copyPrecompiledDisabled=process.env.INSTANA_COPY_PRECOMPILED_NATIVE_ADDONS&&"false"===process.env.INSTANA_COPY_PRECOMPILED_NATIVE_ADDONS.toLowerCase(),platform=os.platform(),arch=process.arch;let{family,GLIBC}=detectLibc;family=family||GLIBC;class ModuleLoadEmitter extends EventEmitter{}function loadNativeAddOn(opts){var loaderEmitter=new ModuleLoadEmitter;return opts.loadFrom=opts.nativeModuleName,process.nextTick(loadNativeAddOnInternal.bind(null,opts,loaderEmitter)),loaderEmitter}function loadNativeAddOnInternal(opts,loaderEmitter){try{var isMainThread=require("worker_threads")["isMainThread"];if(!isMainThread)return void loaderEmitter.emit("failed")}catch(err){}let nativeModuleHasBeenRequiredSuccessfully=attemptRequire(opts,loaderEmitter,"directly");nativeModuleHasBeenRequiredSuccessfully||(copyPrecompiledDisabled?giveUp(opts,loaderEmitter):copyPrecompiled(opts,loaderEmitter,success=>{success&&(nativeModuleHasBeenRequiredSuccessfully=attemptRequire(opts,loaderEmitter,"after copying precompiled binaries"))||giveUp(opts,loaderEmitter)}))}function attemptRequire(opts,loaderEmitter,mechanism){try{var nativeModule=require(opts.loadFrom);return loaderEmitter.emit("loaded",nativeModule),logger.debug(`Attempt to load native add-on ${opts.nativeModuleName} ${mechanism} has been successful.`),!0}catch(e){return logger.debug(`Attempt to load native add-on ${opts.nativeModuleName} ${mechanism} has failed.`,e),!1}}function giveUp(opts,loaderEmitter){logger.warn(opts.message),loaderEmitter.emit("failed")}function copyPrecompiled(opts,loaderEmitter,callback){if(logger.debug(`Trying to copy precompiled version of ${opts.nativeModuleName} for Node.js ${process.version}.`),opts.nativeModulePath&&opts.nativeModuleParentPath||findNativeModulePath(opts)){var abi=process.versions.modules;if(abi){const label="linux"===platform?`(${platform}/${arch}/${family}/ABI ${abi})`:`(${platform}/${arch}/ABI ${abi})`;var precompiledPathPrefix=path.join(opts.moduleRoot,"addons",platform,arch);const precompiledTarGzPath="linux"===platform?path.join(precompiledPathPrefix,family,abi,opts.nativeModuleName+".tar.gz"):path.join(precompiledPathPrefix,abi,opts.nativeModuleName+".tar.gz");fs.stat(precompiledTarGzPath,statsErr=>{statsErr&&"ENOENT"===statsErr.code?(logger.info(`A precompiled version for ${opts.nativeModuleName} is not available ${label} (at ${precompiledTarGzPath}).`),callback(!1)):statsErr?(logger.warn(`Looking for a precompiled version for ${opts.nativeModuleName} ${label} failed.`,statsErr),callback(!1)):(logger.info(`Found a precompiled version for ${opts.nativeModuleName} ${label}, unpacking.`),tar.x({cwd:os.tmpdir(),file:precompiledTarGzPath}).then(()=>{const targetDir=path.join(opts.nativeModulePath,"precompiled");copy(path.join(os.tmpdir(),opts.nativeModuleName),targetDir,{overwrite:!0,dot:!0},cpErr=>{cpErr?(logger.warn(`Copying the precompiled build for ${opts.nativeModuleName} ${label} failed.`,cpErr),callback(!1)):(opts.loadFrom=targetDir,callback(!0))})}).catch(tarErr=>{logger.warn(`Unpacking the precompiled build for ${opts.nativeModuleName} ${label} failed.`,tarErr),callback(!1)}))})}else logger.warn(`Could not determine ABI version for Node.js version ${process.version}.`),process.nextTick(callback.bind(!1))}else logger.warn(`Unable to find or construct a path for native add-on ${opts.nativeModuleName}.`),process.nextTick(callback.bind(!1))}function findNativeModulePath(opts){try{var idx,nativeModulePath=require.resolve(opts.nativeModuleName);return nativeModulePath?(idx=nativeModulePath.lastIndexOf("node_modules"))<0?(logger.warn(`Could not find node_modules substring in ${nativeModulePath}.`),!1):(opts.nativeModulePath=nativeModulePath.substring(0,idx+"node_modules".length+opts.nativeModuleName.length+2),opts.nativeModuleParentPath=path.join(opts.nativeModulePath,".."),!0):(logger.debug(`Could not find location for ${opts.nativeModuleName} (require.resolve didn't return anything). `+"Will create a path for it."),createNativeModulePath(opts))}catch(e){return logger.debug(`Could not find location for ${opts.nativeModuleName}. Will create a path for it.`,e),createNativeModulePath(opts)}}function createNativeModulePath(opts){if(!loadNativeAddOn.selfNodeModulesPath){var selfPath=path.join(__dirname,"..",".."),idx=selfPath.lastIndexOf("node_modules");if(idx<0)return logger.warn(`Could not find node_modules substring in ${selfPath}. Will give up loading ${opts.nativeModuleName}.`),!1;selfPath=selfPath.substring(0,idx+"node_modules".length+__dirname.length+2);loadNativeAddOn.selfNodeModulesPath=path.join(selfPath,"..","..")}return opts.nativeModuleParentPath=loadNativeAddOn.selfNodeModulesPath,opts.nativeModulePath=path.join(loadNativeAddOn.selfNodeModulesPath,opts.nativeModuleName),!0}function setLogger(_logger){logger=_logger}loadNativeAddOn.setLogger=setLogger,loadNativeAddOn.selfNodeModulesPath="",module.exports=loadNativeAddOn;