mirror of
https://github.com/alibaba/anyproxy.git
synced 2025-04-20 19:44:21 +00:00
75 lines
1.7 KiB
JavaScript
75 lines
1.7 KiB
JavaScript
'use strict';
|
|
|
|
const proxyUtil = require('./util');
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const request = require('request');
|
|
|
|
const cachePath = proxyUtil.getAnyProxyPath('cache');
|
|
|
|
/**
|
|
* download a file and cache
|
|
*
|
|
* @param {any} url
|
|
* @returns {string} cachePath
|
|
*/
|
|
function cacheRemoteFile(url) {
|
|
return new Promise((resolve, reject) => {
|
|
request(url, (error, response, body) => {
|
|
if (error) {
|
|
return reject(error);
|
|
} else if (response.statusCode !== 200) {
|
|
return reject(`failed to load with a status code ${response.statusCode}`);
|
|
} else {
|
|
const fileCreatedTime = proxyUtil.formatDate(new Date(), 'YYYY_MM_DD_hh_mm_ss');
|
|
const random = Math.ceil(Math.random() * 500);
|
|
const fileName = `remote_rule_${fileCreatedTime}_r${random}.js`;
|
|
const filePath = path.join(cachePath, fileName);
|
|
fs.writeFileSync(filePath, body);
|
|
resolve(filePath);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
|
|
/**
|
|
* load a local npm module
|
|
*
|
|
* @param {any} filePath
|
|
* @returns module
|
|
*/
|
|
function loadLocalPath(filePath) {
|
|
return new Promise((resolve, reject) => {
|
|
const ruleFilePath = path.resolve(process.cwd(), filePath);
|
|
if (fs.existsSync(ruleFilePath)) {
|
|
resolve(require(ruleFilePath));
|
|
} else {
|
|
resolve(require(filePath));
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
/**
|
|
* load a module from url or local path
|
|
*
|
|
* @param {any} urlOrPath
|
|
* @returns module
|
|
*/
|
|
function requireModule(urlOrPath) {
|
|
return new Promise((resolve, reject) => {
|
|
if (/^http/i.test(urlOrPath)) {
|
|
resolve(cacheRemoteFile(urlOrPath));
|
|
} else {
|
|
resolve(urlOrPath);
|
|
}
|
|
}).then(localPath => loadLocalPath(localPath));
|
|
}
|
|
|
|
module.exports = {
|
|
cacheRemoteFile,
|
|
loadLocalPath,
|
|
requireModule,
|
|
};
|