7
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								pom.xml
									
									
									
									
									
								
							@@ -3,7 +3,7 @@
 | 
				
			|||||||
    <modelVersion>4.0.0</modelVersion>
 | 
					    <modelVersion>4.0.0</modelVersion>
 | 
				
			||||||
    <groupId>pw.yumc</groupId>
 | 
					    <groupId>pw.yumc</groupId>
 | 
				
			||||||
    <artifactId>MiaoScript</artifactId>
 | 
					    <artifactId>MiaoScript</artifactId>
 | 
				
			||||||
    <version>0.9.7</version>
 | 
					    <version>0.10.0</version>
 | 
				
			||||||
    <developers>
 | 
					    <developers>
 | 
				
			||||||
        <developer>
 | 
					        <developer>
 | 
				
			||||||
            <id>502647092</id>
 | 
					            <id>502647092</id>
 | 
				
			||||||
@@ -54,7 +54,10 @@
 | 
				
			|||||||
    <properties>
 | 
					    <properties>
 | 
				
			||||||
        <env.GIT_COMMIT>DEV</env.GIT_COMMIT>
 | 
					        <env.GIT_COMMIT>DEV</env.GIT_COMMIT>
 | 
				
			||||||
        <update.changes>
 | 
					        <update.changes>
 | 
				
			||||||
            §620-12-07 §afix: 修复 Windows 环境 重载异常;
 | 
					            §620-12-17 §afeat: JavaScriptTask 新增任务ID 并通过ID比较优先级;
 | 
				
			||||||
 | 
					            §620-12-16 §afeat: 优化 require 路径寻找速度;
 | 
				
			||||||
 | 
					            §620-12-15 §cfix: 修复 非主线程重载时发生的异常;
 | 
				
			||||||
 | 
					            §620-12-07 §cfix: 修复 Windows 环境 重载异常;
 | 
				
			||||||
            §620-11-19 §afeat: 新增 JavaScriptTask 类;
 | 
					            §620-11-19 §afeat: 新增 JavaScriptTask 类;
 | 
				
			||||||
            §620-11-11 §afeat: 新增 package 版本锁定逻辑;
 | 
					            §620-11-11 §afeat: 新增 package 版本锁定逻辑;
 | 
				
			||||||
            §620-09-21 §afeat: 完善 upgrade 逻辑;
 | 
					            §620-09-21 §afeat: 完善 upgrade 逻辑;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,11 +4,17 @@ import java.util.concurrent.Delayed;
 | 
				
			|||||||
import java.util.concurrent.TimeUnit;
 | 
					import java.util.concurrent.TimeUnit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class JavaScriptTask implements Delayed {
 | 
					public class JavaScriptTask implements Delayed {
 | 
				
			||||||
 | 
					    private final long id;
 | 
				
			||||||
    private final Object task;
 | 
					    private final Object task;
 | 
				
			||||||
    private final long startTime;
 | 
					    private final long startTime;
 | 
				
			||||||
    private final long executeTime;
 | 
					    private final long executeTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public JavaScriptTask(Object task, long ms) {
 | 
					    public JavaScriptTask(Object task, long ms) {
 | 
				
			||||||
 | 
					        this(0, task, ms);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public JavaScriptTask(long id, Object task, long ms) {
 | 
				
			||||||
 | 
					        this.id = id;
 | 
				
			||||||
        this.task = task;
 | 
					        this.task = task;
 | 
				
			||||||
        this.startTime = System.currentTimeMillis();
 | 
					        this.startTime = System.currentTimeMillis();
 | 
				
			||||||
        this.executeTime = ms;
 | 
					        this.executeTime = ms;
 | 
				
			||||||
@@ -22,7 +28,16 @@ public class JavaScriptTask implements Delayed {
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public int compareTo(Delayed delayed) {
 | 
					    public int compareTo(Delayed delayed) {
 | 
				
			||||||
        JavaScriptTask task = (JavaScriptTask) delayed;
 | 
					        JavaScriptTask task = (JavaScriptTask) delayed;
 | 
				
			||||||
        return (int) ((this.startTime + this.executeTime) - (task.getStartTime() + task.getExecuteTime()));
 | 
					        int delay = (int) ((this.startTime + this.executeTime) - (task.getStartTime() + task.getExecuteTime()));
 | 
				
			||||||
 | 
					        if (delay != 0) {
 | 
				
			||||||
 | 
					            return delay;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return (int) (this.id - task.getId());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public long getId() {
 | 
				
			||||||
 | 
					        return this.id;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public Object getTask() {
 | 
					    public Object getTask() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,9 +39,9 @@ public class ScriptEngine {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @SneakyThrows
 | 
					    @SneakyThrows
 | 
				
			||||||
    public void enableEngine() {
 | 
					    public void enableEngine() {
 | 
				
			||||||
        createEngine();
 | 
					 | 
				
			||||||
        ClassLoader originLoader = Thread.currentThread().getContextClassLoader();
 | 
					        ClassLoader originLoader = Thread.currentThread().getContextClassLoader();
 | 
				
			||||||
        Thread.currentThread().setContextClassLoader(this.loader);
 | 
					        Thread.currentThread().setContextClassLoader(this.loader);
 | 
				
			||||||
 | 
					        createEngine();
 | 
				
			||||||
        Path bios = Paths.get(root, "bios.js");
 | 
					        Path bios = Paths.get(root, "bios.js");
 | 
				
			||||||
        // 如果存在自定义bios就加载自定义的
 | 
					        // 如果存在自定义bios就加载自定义的
 | 
				
			||||||
        if (Files.exists(bios)) {
 | 
					        if (Files.exists(bios)) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -125,22 +125,20 @@
 | 
				
			|||||||
         * 寻找 ${NODE_PATH}
 | 
					         * 寻找 ${NODE_PATH}
 | 
				
			||||||
         * @param {string} name 模块名称
 | 
					         * @param {string} name 模块名称
 | 
				
			||||||
         * @param {string} parent 父目录
 | 
					         * @param {string} parent 父目录
 | 
				
			||||||
 | 
					         * @param {any} optional 附加参数
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        function resolve(name, parent) {
 | 
					        function resolve(name, parent, optional) {
 | 
				
			||||||
            name = _canonical(name) || name
 | 
					            name = _canonical(name) || name
 | 
				
			||||||
            if (cacheModuleIds[name]) return cacheModuleIds[name]
 | 
					 | 
				
			||||||
            // 解析本地目录
 | 
					            // 解析本地目录
 | 
				
			||||||
            if (name.startsWith('./') || name.startsWith('../')) {
 | 
					            if (optional.local) {
 | 
				
			||||||
                var moduleId = parent + '/' + name
 | 
					                return resolveAsFile(name, parent) || resolveAsDirectory(name, parent) || undefined
 | 
				
			||||||
                if (cacheModuleIds[moduleId]) return cacheModuleIds[moduleId]
 | 
					 | 
				
			||||||
                return cacheModuleIds[moduleId] = resolveAsFile(name, parent) || resolveAsDirectory(name, parent) || undefined
 | 
					 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                // 解析Node目录
 | 
					                // 解析Node目录
 | 
				
			||||||
                var dir = [parent, 'node_modules'].join(separatorChar)
 | 
					                var dir = [parent, 'node_modules'].join(separatorChar)
 | 
				
			||||||
                return cacheModuleIds[name] = resolveAsFile(name, dir) || resolveAsDirectory(name, dir) ||
 | 
					                return resolveAsFile(name, dir) || resolveAsDirectory(name, dir) ||
 | 
				
			||||||
                    // @ts-ignore
 | 
					                    // @ts-ignore
 | 
				
			||||||
                    (parent && parent.toString().startsWith(root) ?
 | 
					                    (parent && parent.toString().startsWith(root) ?
 | 
				
			||||||
                        resolve(name, new File(parent).getParent()) : resolveAsDirectory(name, NODE_PATH) || undefined)
 | 
					                        resolve(name, new File(parent).getParent(), optional) : resolveAsDirectory(name, NODE_PATH) || undefined)
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -341,7 +339,7 @@
 | 
				
			|||||||
         * @param {string} name
 | 
					         * @param {string} name
 | 
				
			||||||
         * @param {string} path
 | 
					         * @param {string} path
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        function checkCoreModule(name, path) {
 | 
					        function checkCoreModule(name, path, optional) {
 | 
				
			||||||
            if (name.startsWith('@ms') && lastModule.endsWith('.js')) {
 | 
					            if (name.startsWith('@ms') && lastModule.endsWith('.js')) {
 | 
				
			||||||
                // @ts-ignore
 | 
					                // @ts-ignore
 | 
				
			||||||
                console.warn(lastModule + ' load deprecated module ' + name + ' auto replace to ' + (name = name.replace('@ms', global.scope)) + '...')
 | 
					                console.warn(lastModule + ' load deprecated module ' + name + ' auto replace to ' + (name = name.replace('@ms', global.scope)) + '...')
 | 
				
			||||||
@@ -352,7 +350,7 @@
 | 
				
			|||||||
            if (CoreModules.indexOf(name) !== -1) {
 | 
					            if (CoreModules.indexOf(name) !== -1) {
 | 
				
			||||||
                // @ts-ignore
 | 
					                // @ts-ignore
 | 
				
			||||||
                var newName = global.scope + '/nodejs/dist/' + name
 | 
					                var newName = global.scope + '/nodejs/dist/' + name
 | 
				
			||||||
                if (resolve(newName, path) !== undefined) {
 | 
					                if (resolve(newName, path, optional) !== undefined) {
 | 
				
			||||||
                    return newName
 | 
					                    return newName
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                // @ts-ignore
 | 
					                // @ts-ignore
 | 
				
			||||||
@@ -360,7 +358,12 @@
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            return name
 | 
					            return name
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * 检查缓存模块
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        function checkCacheModule(optional) {
 | 
				
			||||||
 | 
					            return !optional.path.startsWith('/') && cacheModuleIds[optional.parentId] && cacheModuleIds[optional.parentId][optional.path]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * 加载模块
 | 
					         * 加载模块
 | 
				
			||||||
         * @param {string} name 模块名称
 | 
					         * @param {string} name 模块名称
 | 
				
			||||||
@@ -369,17 +372,18 @@
 | 
				
			|||||||
         * @returns {*}
 | 
					         * @returns {*}
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        function _require(name, path, optional) {
 | 
					        function _require(name, path, optional) {
 | 
				
			||||||
            name = checkCoreModule(name, path)
 | 
					            var cachePath = checkCacheModule(optional)
 | 
				
			||||||
 | 
					            if (cachePath) { return _requireFile(new File(cachePath), optional) }
 | 
				
			||||||
 | 
					            name = checkCoreModule(name, path, optional)
 | 
				
			||||||
            var file = new File(name)
 | 
					            var file = new File(name)
 | 
				
			||||||
            file = _isFile(file) ? file : resolve(name, path)
 | 
					            file = _isFile(file) ? file : resolve(name, path, optional)
 | 
				
			||||||
            optional = __assign({ cache: true }, optional)
 | 
					 | 
				
			||||||
            if (file === undefined) {
 | 
					            if (file === undefined) {
 | 
				
			||||||
 | 
					                // excloud local dir, prevent too many recursive call and cache not found module
 | 
				
			||||||
 | 
					                if (optional.local || optional.recursive || notFoundModules[name]) {
 | 
				
			||||||
 | 
					                    console.log(name, path, optional, notFoundModules[name])
 | 
				
			||||||
 | 
					                    throw new Error("Can't found module " + name + '(' + JSON.stringify(optional) + ') at local ' + path + ' or network!')
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                try {
 | 
					                try {
 | 
				
			||||||
                    // excloud local dir, prevent too many recursive call and cache not found module
 | 
					 | 
				
			||||||
                    if (name.startsWith('.') || name.startsWith('/') || optional.recursive || notFoundModules[name]) {
 | 
					 | 
				
			||||||
                        console.log(name, path, optional, notFoundModules[name])
 | 
					 | 
				
			||||||
                        throw new Error("Can't found module " + name + '(' + JSON.stringify(optional) + ') at local ' + path + ' or network!')
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    optional.recursive = true
 | 
					                    optional.recursive = true
 | 
				
			||||||
                    return _require(download(name), path, optional)
 | 
					                    return _require(download(name), path, optional)
 | 
				
			||||||
                } catch (ex) {
 | 
					                } catch (ex) {
 | 
				
			||||||
@@ -387,6 +391,13 @@
 | 
				
			|||||||
                    throw new FileNotFoundException("Can't found module " + name + ' in directory ' + path + ' ERROR: ' + ex)
 | 
					                    throw new FileNotFoundException("Can't found module " + name + ' in directory ' + path + ' ERROR: ' + ex)
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            var parent = cacheModuleIds[optional.parentId]
 | 
				
			||||||
 | 
					            if (!parent) { cacheModuleIds[optional.parentId] = {} }
 | 
				
			||||||
 | 
					            cacheModuleIds[optional.parentId][optional.path] = _canonical(file)
 | 
				
			||||||
 | 
					            return _requireFile(file, optional)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        function _requireFile(file, optional) {
 | 
				
			||||||
            // 重定向文件名称和类型
 | 
					            // 重定向文件名称和类型
 | 
				
			||||||
            return getCacheModule(_canonical(file), file.name.split('.')[0], file, optional)
 | 
					            return getCacheModule(_canonical(file), file.name.split('.')[0], file, optional)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -403,15 +414,16 @@
 | 
				
			|||||||
             * @param {any} optional
 | 
					             * @param {any} optional
 | 
				
			||||||
             */
 | 
					             */
 | 
				
			||||||
            return function __DynamicRequire__(path, optional) {
 | 
					            return function __DynamicRequire__(path, optional) {
 | 
				
			||||||
                return _require(path, parent, __assign({ parentId: parentId }, optional)).exports
 | 
					                return _require(path, parent, __assign({ cache: true, parentId: parentId, parent: parent, path: path, local: path.startsWith('.') || path.startsWith('/') }, optional)).exports
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * @param {string} name
 | 
					         * @param {string} name
 | 
				
			||||||
 | 
					         * @param {any} optional 附加选项
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        function __DynamicResolve__(name) {
 | 
					        function __DynamicResolve__(name, optional) {
 | 
				
			||||||
            return _canonical(new File(resolve(name, parent)))
 | 
					            return _canonical(new File(resolve(name, parent, __assign({ cache: true, parent: parent, local: name.startsWith('.') || name.startsWith('/') }, optional))))
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
@@ -427,6 +439,8 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function __DynamicDisable__() {
 | 
					        function __DynamicDisable__() {
 | 
				
			||||||
 | 
					            // @ts-ignore
 | 
				
			||||||
 | 
					            base.save(cacheModuleIdsFile, JSON.stringify(cacheModuleIds))
 | 
				
			||||||
            for (var cacheModule in cacheModules) {
 | 
					            for (var cacheModule in cacheModules) {
 | 
				
			||||||
                delete cacheModules[cacheModule]
 | 
					                delete cacheModules[cacheModule]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -461,8 +475,9 @@
 | 
				
			|||||||
         * @type {{[key:string]:any}} cacheModules
 | 
					         * @type {{[key:string]:any}} cacheModules
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        var cacheModules = {}
 | 
					        var cacheModules = {}
 | 
				
			||||||
 | 
					        var cacheModuleIdsFile = _canonical(new File(NODE_PATH, 'cacheModuleIds.json'))
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * @type {{[key:string]:string}} cacheModuleIds
 | 
					         * @type {{[key:string]:{[key:string]:string}}} cacheModuleIds
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        var cacheModuleIds = {}
 | 
					        var cacheModuleIds = {}
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
@@ -474,6 +489,14 @@
 | 
				
			|||||||
        console.info('- NODE_PATH:', NODE_PATH)
 | 
					        console.info('- NODE_PATH:', NODE_PATH)
 | 
				
			||||||
        console.info('- NODE_REGISTRY:', NODE_REGISTRY)
 | 
					        console.info('- NODE_REGISTRY:', NODE_REGISTRY)
 | 
				
			||||||
        console.info('- MS_NODE_REGISTRY:', MS_NODE_REGISTRY)
 | 
					        console.info('- MS_NODE_REGISTRY:', MS_NODE_REGISTRY)
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            // @ts-ignore
 | 
				
			||||||
 | 
					            cacheModuleIds = JSON.parse(base.read(cacheModuleIdsFile))
 | 
				
			||||||
 | 
					            console.log('Read cacheModuleIds from file ' + cacheModuleIdsFile)
 | 
				
			||||||
 | 
					        } catch (error) {
 | 
				
			||||||
 | 
					            cacheModuleIds = {}
 | 
				
			||||||
 | 
					            console.log('Initialization new cacheModuleIds')
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            ModulesVersionLock = JSON.parse(fetchContent('http://ms.yumc.pw/api/plugin/download/name/version_lock', 'version_lock'))
 | 
					            ModulesVersionLock = JSON.parse(fetchContent('http://ms.yumc.pw/api/plugin/download/name/version_lock', 'version_lock'))
 | 
				
			||||||
            console.info('Lock module version List:')
 | 
					            console.info('Lock module version List:')
 | 
				
			||||||
@@ -484,5 +507,5 @@
 | 
				
			|||||||
            console.debug(error)
 | 
					            console.debug(error)
 | 
				
			||||||
            ModulesVersionLock = {}
 | 
					            ModulesVersionLock = {}
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return getRequire(parent, "null")
 | 
					        return getRequire(parent, "")
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user