feat: remove spring support & optimize require
This commit is contained in:
parent
14cc05e923
commit
074e6e8a10
3
.gitignore
vendored
3
.gitignore
vendored
@ -53,3 +53,6 @@ vendor/
|
|||||||
# Minecraft Data
|
# Minecraft Data
|
||||||
/world
|
/world
|
||||||
**/node_modules/
|
**/node_modules/
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.gradle
|
||||||
|
0
CHANGELOG.md
Normal file
0
CHANGELOG.md
Normal file
58
pom.xml
58
pom.xml
@ -2,13 +2,13 @@
|
|||||||
<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.23.1</version>
|
<version>0.28.0</version>
|
||||||
<developers>
|
<developers>
|
||||||
<developer>
|
<developer>
|
||||||
<id>502647092</id>
|
<id>502647092</id>
|
||||||
<name>MiaoWoo</name>
|
<name>MiaoWoo</name>
|
||||||
<email>admin@yumc.pw</email>
|
<email>admin@yumc.pw</email>
|
||||||
<url>http://www.yumc.pw</url>
|
<url>https://www.yumc.pw</url>
|
||||||
</developer>
|
</developer>
|
||||||
</developers>
|
</developers>
|
||||||
<build>
|
<build>
|
||||||
@ -19,29 +19,6 @@
|
|||||||
<filtering>true</filtering>
|
<filtering>true</filtering>
|
||||||
</resource>
|
</resource>
|
||||||
</resources>
|
</resources>
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-shade-plugin</artifactId>
|
|
||||||
<version>3.2.1</version>
|
|
||||||
<configuration>
|
|
||||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
|
||||||
<artifactSet>
|
|
||||||
<includes>
|
|
||||||
<include>org.kamranzafar:jtar</include>
|
|
||||||
</includes>
|
|
||||||
</artifactSet>
|
|
||||||
</configuration>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>shade</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
</build>
|
||||||
<ciManagement>
|
<ciManagement>
|
||||||
<system>Jenkins</system>
|
<system>Jenkins</system>
|
||||||
@ -50,6 +27,16 @@
|
|||||||
<properties>
|
<properties>
|
||||||
<env.GIT_COMMIT>DEV</env.GIT_COMMIT>
|
<env.GIT_COMMIT>DEV</env.GIT_COMMIT>
|
||||||
<update.changes>
|
<update.changes>
|
||||||
|
§623-07-30 §afeat: 优化 require 性能;
|
||||||
|
§cfix: 修复 require 加载特殊文件异常;
|
||||||
|
§623-07-22 §afeat: 网络加载 jtar 优化包大小;
|
||||||
|
§afeat: 移除 Spring 相关支持;
|
||||||
|
§aremove: 移除 Spring 相关支持;
|
||||||
|
§adeps: 更新 Nashorn 和 GraalvmJS 引擎版本
|
||||||
|
</update.changes>
|
||||||
|
<update.changelog>
|
||||||
|
§622-11-22 §afeat: 兼容 1.7.10-1.19.2 版本;
|
||||||
|
§afeat: 新增 MiaoScriptAPI 相关方法;
|
||||||
§622-06-21 §afeat: 兼容 1.7.10-1.19 版本;
|
§622-06-21 §afeat: 兼容 1.7.10-1.19 版本;
|
||||||
§afeat: 兼容 JDK17 BungeeCord;
|
§afeat: 兼容 JDK17 BungeeCord;
|
||||||
§622-05-25 §afeat: 兼容 1.7.10-1.18.2 版本;
|
§622-05-25 §afeat: 兼容 1.7.10-1.18.2 版本;
|
||||||
@ -71,9 +58,7 @@
|
|||||||
§621-06-25 §afeat: 调整启动逻辑 兼容 Arclight;
|
§621-06-25 §afeat: 调整启动逻辑 兼容 Arclight;
|
||||||
§621-06-22 §afeat: 新增本地版本锁定功能;
|
§621-06-22 §afeat: 新增本地版本锁定功能;
|
||||||
§621-06-19 §afeat: 兼容JDK16 反射异常;
|
§621-06-19 §afeat: 兼容JDK16 反射异常;
|
||||||
§621-05-15 §afeat: 兼容JDK15+ 自动下载Nashorn类库
|
§621-05-15 §afeat: 兼容JDK15+ 自动下载Nashorn类库;
|
||||||
</update.changes>
|
|
||||||
<update.changelog>
|
|
||||||
§621-03-25 §afeat: 异步加载 polyfill 并且同步加载 @ccms/core;
|
§621-03-25 §afeat: 异步加载 polyfill 并且同步加载 @ccms/core;
|
||||||
§621-03-25 §cfix: 修改 ployfill 为 polyfill;
|
§621-03-25 §cfix: 修改 ployfill 为 polyfill;
|
||||||
§620-12-22 §cfix: 增加 require 效验;
|
§620-12-22 §cfix: 增加 require 效验;
|
||||||
@ -202,11 +187,6 @@
|
|||||||
<version>1.18.24</version>
|
<version>1.18.24</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.kamranzafar</groupId>
|
|
||||||
<artifactId>jtar</artifactId>
|
|
||||||
<version>2.3</version>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.spigotmc</groupId>
|
<groupId>org.spigotmc</groupId>
|
||||||
<artifactId>spigot-api</artifactId>
|
<artifactId>spigot-api</artifactId>
|
||||||
@ -231,17 +211,5 @@
|
|||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.0-SNAPSHOT</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.springframework</groupId>
|
|
||||||
<artifactId>spring-websocket</artifactId>
|
|
||||||
<version>5.3.19</version>
|
|
||||||
<scope>compile</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.tomcat</groupId>
|
|
||||||
<artifactId>tomcat-websocket</artifactId>
|
|
||||||
<version>9.0.35</version>
|
|
||||||
<scope>compile</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
@ -21,7 +21,7 @@ import java.io.File;
|
|||||||
* @author 喵♂呜
|
* @author 喵♂呜
|
||||||
* Created on 2017/10/25 20:35.
|
* Created on 2017/10/25 20:35.
|
||||||
*/
|
*/
|
||||||
@Plugin(id = "miaoscript", name = "MiaoScript", version = MiaoScriptAPI.VERSION, authors = "MiaoWoo")
|
@Plugin(id = "miaoscript", name = "MiaoScript", description = "MiaoScript runtime in Sponge", version = MiaoScriptAPI.VERSION, authors = "MiaoWoo")
|
||||||
public class MiaoScriptSponge {
|
public class MiaoScriptSponge {
|
||||||
private ScriptEngine engine;
|
private ScriptEngine engine;
|
||||||
@Inject
|
@Inject
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
package pw.yumc.MiaoScript;
|
|
||||||
|
|
||||||
import lombok.SneakyThrows;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.context.ApplicationContext;
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
|
||||||
import pw.yumc.MiaoScript.api.MiaoScriptAPI;
|
|
||||||
import pw.yumc.MiaoScript.api.ScriptEngine;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@Component
|
|
||||||
public class MiaoScriptSpring {
|
|
||||||
@Bean
|
|
||||||
@SneakyThrows
|
|
||||||
public ScriptEngine buildScriptEngine(ApplicationContext applicationContext) {
|
|
||||||
return MiaoScriptAPI.createEngine(new File("MiaoScript").getCanonicalPath(), log, applicationContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
|
||||||
public ServerEndpointExporter serverEndpointExporter() {
|
|
||||||
return new ServerEndpointExporter();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,5 +1,7 @@
|
|||||||
package pw.yumc.MiaoScript.api;
|
package pw.yumc.MiaoScript.api;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
@ -13,6 +15,7 @@ import java.nio.file.Paths;
|
|||||||
* @author 喵♂呜
|
* @author 喵♂呜
|
||||||
* Created on 2017/10/9 12:40.
|
* Created on 2017/10/9 12:40.
|
||||||
*/
|
*/
|
||||||
|
@Getter
|
||||||
public class Base {
|
public class Base {
|
||||||
private final Object instance;
|
private final Object instance;
|
||||||
|
|
||||||
@ -36,10 +39,6 @@ public class Base {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Object getInstance() {
|
|
||||||
return this.instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Class<?> getProxyClass() {
|
public Class<?> getProxyClass() {
|
||||||
return ProxyClass.class;
|
return ProxyClass.class;
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,11 @@
|
|||||||
package pw.yumc.MiaoScript.api;
|
package pw.yumc.MiaoScript.api;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
import java.util.concurrent.Delayed;
|
import java.util.concurrent.Delayed;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@Getter
|
||||||
public class JavaScriptTask implements Delayed {
|
public class JavaScriptTask implements Delayed {
|
||||||
private final long id;
|
private final long id;
|
||||||
private final Object task;
|
private final Object task;
|
||||||
@ -35,20 +38,4 @@ public class JavaScriptTask implements Delayed {
|
|||||||
return (int) (this.id - task.getId());
|
return (int) (this.id - task.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getId() {
|
|
||||||
return this.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object getTask() {
|
|
||||||
return this.task;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getStartTime() {
|
|
||||||
return this.startTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getExecuteTime() {
|
|
||||||
return this.executeTime;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package pw.yumc.MiaoScript.api;
|
package pw.yumc.MiaoScript.api;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
import pw.yumc.MiaoScript.api.loader.MavenDependLoader;
|
import pw.yumc.MiaoScript.api.loader.MavenDependLoader;
|
||||||
import pw.yumc.MiaoScript.api.plugin.PluginManager;
|
import pw.yumc.MiaoScript.api.plugin.PluginManager;
|
||||||
import pw.yumc.MiaoScript.engine.MiaoScriptEngine;
|
import pw.yumc.MiaoScript.engine.MiaoScriptEngine;
|
||||||
@ -8,10 +9,12 @@ import java.io.File;
|
|||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
|
||||||
public class MiaoScriptAPI {
|
public class MiaoScriptAPI {
|
||||||
public static final String VERSION = "0.23.1";
|
public static final String VERSION = "0.28.0";
|
||||||
|
@Getter
|
||||||
private static String root;
|
private static String root;
|
||||||
private static String libPath;
|
private static String libPath;
|
||||||
private static ScriptEngine scriptEngine;
|
private static ScriptEngine scriptEngine;
|
||||||
|
@Getter
|
||||||
private static PluginManager pluginManager;
|
private static PluginManager pluginManager;
|
||||||
|
|
||||||
public static ScriptEngine createEngine(String root, Object logger, Object instance) {
|
public static ScriptEngine createEngine(String root, Object logger, Object instance) {
|
||||||
@ -19,11 +22,7 @@ public class MiaoScriptAPI {
|
|||||||
return MiaoScriptAPI.scriptEngine;
|
return MiaoScriptAPI.scriptEngine;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getRoot() {
|
static void setRoot(String root) {
|
||||||
return root;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setRoot(String root) {
|
|
||||||
MiaoScriptAPI.root = root;
|
MiaoScriptAPI.root = root;
|
||||||
MiaoScriptAPI.libPath = Paths.get(root, "libs").toString();
|
MiaoScriptAPI.libPath = Paths.get(root, "libs").toString();
|
||||||
}
|
}
|
||||||
@ -32,14 +31,10 @@ public class MiaoScriptAPI {
|
|||||||
return MiaoScriptAPI.scriptEngine.getEngine();
|
return MiaoScriptAPI.scriptEngine.getEngine();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setEngine(ScriptEngine scriptEngine) {
|
static void setEngine(ScriptEngine scriptEngine) {
|
||||||
MiaoScriptAPI.scriptEngine = scriptEngine;
|
MiaoScriptAPI.scriptEngine = scriptEngine;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static PluginManager getPluginManager() {
|
|
||||||
return pluginManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setPluginManager(Object pluginManager) {
|
public static void setPluginManager(Object pluginManager) {
|
||||||
MiaoScriptAPI.pluginManager = getEngine().getInterface(pluginManager, PluginManager.class);
|
MiaoScriptAPI.pluginManager = getEngine().getInterface(pluginManager, PluginManager.class);
|
||||||
}
|
}
|
||||||
|
39
src/main/java/pw/yumc/MiaoScript/api/bukkit/EngineEvent.java
Normal file
39
src/main/java/pw/yumc/MiaoScript/api/bukkit/EngineEvent.java
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package pw.yumc.MiaoScript.api.bukkit;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.bukkit.event.Cancellable;
|
||||||
|
import org.bukkit.event.Event;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
import javax.script.Bindings;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class EngineEvent extends Event implements Cancellable {
|
||||||
|
private final String event;
|
||||||
|
private final Bindings data;
|
||||||
|
|
||||||
|
private boolean cancelled = false;
|
||||||
|
|
||||||
|
public EngineEvent(String event, Bindings data) {
|
||||||
|
this.event = event;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCancelled() {
|
||||||
|
return this.cancelled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCancelled(boolean b) {
|
||||||
|
this.cancelled = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private static final HandlerList handlerList = new HandlerList();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HandlerList getHandlers() {
|
||||||
|
return handlerList;
|
||||||
|
}
|
||||||
|
}
|
@ -1,15 +1,18 @@
|
|||||||
package pw.yumc.MiaoScript.api.bukkit;
|
package pw.yumc.MiaoScript.api.bukkit;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
import org.bukkit.event.Cancellable;
|
import org.bukkit.event.Cancellable;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
import javax.script.Bindings;
|
import javax.script.Bindings;
|
||||||
|
|
||||||
|
@Getter
|
||||||
public class ScriptEvent extends Event implements Cancellable {
|
public class ScriptEvent extends Event implements Cancellable {
|
||||||
private final Bindings plugin;
|
private final Bindings plugin;
|
||||||
private final String event;
|
private final String event;
|
||||||
private final Bindings data;
|
private final Bindings data;
|
||||||
|
|
||||||
private boolean cancelled = false;
|
private boolean cancelled = false;
|
||||||
|
|
||||||
public ScriptEvent(Bindings plugin, String event, Bindings data) {
|
public ScriptEvent(Bindings plugin, String event, Bindings data) {
|
||||||
@ -18,33 +21,6 @@ public class ScriptEvent extends Event implements Cancellable {
|
|||||||
this.data = data;
|
this.data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Which Plugin Call Event
|
|
||||||
*
|
|
||||||
* @return PluginName
|
|
||||||
*/
|
|
||||||
public Bindings getPlugin() {
|
|
||||||
return plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Plugin Event Name
|
|
||||||
*
|
|
||||||
* @return EventName
|
|
||||||
*/
|
|
||||||
public String getEvent() {
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Plugin Event Data
|
|
||||||
*
|
|
||||||
* @return EventData
|
|
||||||
*/
|
|
||||||
public Bindings getData() {
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isCancelled() {
|
public boolean isCancelled() {
|
||||||
return this.cancelled;
|
return this.cancelled;
|
||||||
@ -55,12 +31,9 @@ public class ScriptEvent extends Event implements Cancellable {
|
|||||||
this.cancelled = b;
|
this.cancelled = b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
private static final HandlerList handlerList = new HandlerList();
|
private static final HandlerList handlerList = new HandlerList();
|
||||||
|
|
||||||
public static HandlerList getHandlerList() {
|
|
||||||
return handlerList;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HandlerList getHandlers() {
|
public HandlerList getHandlers() {
|
||||||
return handlerList;
|
return handlerList;
|
||||||
|
@ -4,6 +4,7 @@ import lombok.SneakyThrows;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLConnection;
|
import java.net.URLConnection;
|
||||||
import java.nio.MappedByteBuffer;
|
import java.nio.MappedByteBuffer;
|
||||||
@ -12,6 +13,8 @@ import java.nio.file.Files;
|
|||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.nio.file.StandardCopyOption;
|
import java.nio.file.StandardCopyOption;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class MavenDependLoader {
|
public class MavenDependLoader {
|
||||||
public static final String MavenRepo = "https://maven.aliyun.com/repository/public";
|
public static final String MavenRepo = "https://maven.aliyun.com/repository/public";
|
||||||
@ -48,6 +51,7 @@ public class MavenDependLoader {
|
|||||||
downloadFile(file, groupId, artifactId, version, ext);
|
downloadFile(file, groupId, artifactId, version, ext);
|
||||||
}
|
}
|
||||||
if (!new String(Files.readAllBytes(sha1.toPath())).equals(getSha1(file))) {
|
if (!new String(Files.readAllBytes(sha1.toPath())).equals(getSha1(file))) {
|
||||||
|
sha1.delete();
|
||||||
file.delete();
|
file.delete();
|
||||||
throw new IllegalStateException("file " + file.getName() + " sha1 not match.");
|
throw new IllegalStateException("file " + file.getName() + " sha1 not match.");
|
||||||
}
|
}
|
||||||
@ -71,18 +75,20 @@ public class MavenDependLoader {
|
|||||||
connection.setConnectTimeout(5000);
|
connection.setConnectTimeout(5000);
|
||||||
connection.setReadTimeout(120000);
|
connection.setReadTimeout(120000);
|
||||||
connection.setUseCaches(true);
|
connection.setUseCaches(true);
|
||||||
Files.copy(connection.getInputStream(), target.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
try (InputStream inputStream = connection.getInputStream()) {
|
||||||
|
Files.copy(inputStream, target.toPath(), StandardCopyOption.REPLACE_EXISTING);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
private static String getSha1(File file) {
|
private static String getSha1(File file) {
|
||||||
MessageDigest digest = MessageDigest.getInstance("SHA-1");
|
MessageDigest digest = MessageDigest.getInstance("SHA-1");
|
||||||
FileInputStream in = new FileInputStream(file);
|
try (FileInputStream in = new FileInputStream(file)) {
|
||||||
FileChannel ch = in.getChannel();
|
MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
|
||||||
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
|
|
||||||
digest.update(byteBuffer);
|
digest.update(byteBuffer);
|
||||||
return getHash(digest.digest());
|
return getHash(digest.digest());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static String getHash(byte[] bytes) {
|
private static String getHash(byte[] bytes) {
|
||||||
StringBuilder result = new StringBuilder();
|
StringBuilder result = new StringBuilder();
|
||||||
|
@ -7,4 +7,16 @@ public interface PluginManager {
|
|||||||
Map<String, Bindings> getPlugins();
|
Map<String, Bindings> getPlugins();
|
||||||
|
|
||||||
Bindings getPlugin(String name);
|
Bindings getPlugin(String name);
|
||||||
|
|
||||||
|
boolean has(String name);
|
||||||
|
|
||||||
|
Bindings get(String name);
|
||||||
|
|
||||||
|
boolean enable(String name);
|
||||||
|
|
||||||
|
boolean disable(String name);
|
||||||
|
|
||||||
|
boolean install(String name);
|
||||||
|
|
||||||
|
boolean uninstall(String name);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package pw.yumc.MiaoScript.engine;
|
package pw.yumc.MiaoScript.engine;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import lombok.val;
|
import lombok.val;
|
||||||
import pw.yumc.MiaoScript.api.loader.JarLoader;
|
import pw.yumc.MiaoScript.api.loader.JarLoader;
|
||||||
@ -19,33 +20,41 @@ import java.util.List;
|
|||||||
* @since 2016年8月29日 上午7:51:43
|
* @since 2016年8月29日 上午7:51:43
|
||||||
*/
|
*/
|
||||||
public class MiaoScriptEngine implements ScriptEngine, Invocable {
|
public class MiaoScriptEngine implements ScriptEngine, Invocable {
|
||||||
|
private final String libsRoot;
|
||||||
|
|
||||||
|
@Getter
|
||||||
private ScriptEngine engine;
|
private ScriptEngine engine;
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
public MiaoScriptEngine(String engineRoot) {
|
public MiaoScriptEngine(String engineRoot) {
|
||||||
|
File libRootFile = new File(engineRoot, "libs");
|
||||||
|
libRootFile.mkdirs();
|
||||||
|
this.libsRoot = libRootFile.getCanonicalPath();
|
||||||
if (new File(engineRoot, "debug").exists()) {
|
if (new File(engineRoot, "debug").exists()) {
|
||||||
System.setProperty("nashorn.debug", "true");
|
System.setProperty("nashorn.debug", "true");
|
||||||
}
|
}
|
||||||
|
MavenDependLoader.load(this.libsRoot, "org.kamranzafar", "jtar", "2.3");
|
||||||
if (getJavaVersion() > 15) {
|
if (getJavaVersion() > 15) {
|
||||||
this.loadGraalJS(engineRoot);
|
this.loadGraalJS();
|
||||||
} else {
|
} else {
|
||||||
this.loadNashorn(engineRoot);
|
this.loadNashorn();
|
||||||
}
|
}
|
||||||
if (engine == null)
|
if (engine == null)
|
||||||
throw new UnsupportedOperationException("当前环境不支持 Nashorn 或 GraalJS 脚本引擎.");
|
throw new UnsupportedOperationException("当前环境不支持 Nashorn 或 GraalJS 脚本引擎.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadGraalJS(String engineRoot) {
|
private void loadGraalJS() {
|
||||||
try {
|
try {
|
||||||
this.engine = this.parentLoadNetworkNashorn(engineRoot);
|
this.engine = this.parentLoadNetworkNashorn();
|
||||||
} catch (Throwable ex) {
|
} catch (Throwable ex) {
|
||||||
this.engine = this.loadNetworkNashorn(engineRoot);
|
this.engine = this.loadNetworkNashorn();
|
||||||
}
|
}
|
||||||
if (this.engine == null) {
|
if (this.engine == null) {
|
||||||
this.engine = this.loadNetworkGraalJS(engineRoot);
|
this.engine = this.loadNetworkGraalJS();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadNashorn(String engineRoot) {
|
private void loadNashorn() {
|
||||||
try {
|
try {
|
||||||
this.createEngineByName();
|
this.createEngineByName();
|
||||||
} catch (final Throwable ex) {
|
} catch (final Throwable ex) {
|
||||||
@ -61,7 +70,7 @@ public class MiaoScriptEngine implements ScriptEngine, Invocable {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if (this.engine == null) {
|
if (this.engine == null) {
|
||||||
this.engine = this.loadNetworkNashorn(engineRoot);
|
this.engine = this.loadNetworkNashorn();
|
||||||
}
|
}
|
||||||
} catch (final Throwable ex) {
|
} catch (final Throwable ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
@ -95,43 +104,52 @@ public class MiaoScriptEngine implements ScriptEngine, Invocable {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SneakyThrows
|
private ScriptEngine loadNetworkNashorn() {
|
||||||
private ScriptEngine loadNetworkNashorn(String engineRoot) {
|
MavenDependLoader.load(this.libsRoot, "org.openjdk.nashorn", "nashorn-core", "15.4");
|
||||||
File libRootFile = new File(engineRoot, "libs");
|
MavenDependLoader.load(this.libsRoot, "org.ow2.asm", "asm", "9.5");
|
||||||
libRootFile.mkdirs();
|
MavenDependLoader.load(this.libsRoot, "org.ow2.asm", "asm-commons", "9.5");
|
||||||
String libRoot = libRootFile.getCanonicalPath();
|
MavenDependLoader.load(this.libsRoot, "org.ow2.asm", "asm-tree", "9.5");
|
||||||
MavenDependLoader.load(libRoot, "org.openjdk.nashorn", "nashorn-core", "15.4");
|
MavenDependLoader.load(this.libsRoot, "org.ow2.asm", "asm-util", "9.5");
|
||||||
MavenDependLoader.load(libRoot, "org.ow2.asm", "asm", "9.3");
|
return createEngineByFactoryClassName("org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory", false);
|
||||||
MavenDependLoader.load(libRoot, "org.ow2.asm", "asm-commons", "9.3");
|
}
|
||||||
MavenDependLoader.load(libRoot, "org.ow2.asm", "asm-tree", "9.3");
|
|
||||||
MavenDependLoader.load(libRoot, "org.ow2.asm", "asm-util", "9.3");
|
private ScriptEngine parentLoadNetworkNashorn() {
|
||||||
|
MavenDependLoader.parentLoad(this.libsRoot, "org.openjdk.nashorn", "nashorn-core", "15.4");
|
||||||
|
MavenDependLoader.parentLoad(this.libsRoot, "org.ow2.asm", "asm", "9.5");
|
||||||
|
MavenDependLoader.parentLoad(this.libsRoot, "org.ow2.asm", "asm-commons", "9.5");
|
||||||
|
MavenDependLoader.parentLoad(this.libsRoot, "org.ow2.asm", "asm-tree", "9.5");
|
||||||
|
MavenDependLoader.parentLoad(this.libsRoot, "org.ow2.asm", "asm-util", "9.5");
|
||||||
return createEngineByFactoryClassName("org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory", false);
|
return createEngineByFactoryClassName("org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
private ScriptEngine parentLoadNetworkNashorn(String engineRoot) {
|
private ScriptEngine loadNetworkGraalJS() {
|
||||||
File libRootFile = new File(engineRoot, "libs");
|
MavenDependLoader.load(this.libsRoot, "org.graalvm.js", "js", "23.0.1");
|
||||||
libRootFile.mkdirs();
|
MavenDependLoader.load(this.libsRoot, "org.graalvm.js", "js-scriptengine", "23.0.1");
|
||||||
String libRoot = libRootFile.getCanonicalPath();
|
MavenDependLoader.load(this.libsRoot, "org.graalvm.regex", "regex", "23.0.1");
|
||||||
MavenDependLoader.parentLoad(libRoot, "org.openjdk.nashorn", "nashorn-core", "15.4");
|
MavenDependLoader.load(this.libsRoot, "org.graalvm.sdk", "graal-sdk", "23.0.1");
|
||||||
MavenDependLoader.parentLoad(libRoot, "org.ow2.asm", "asm", "9.3");
|
MavenDependLoader.load(this.libsRoot, "org.graalvm.truffle", "truffle-api", "23.0.1");
|
||||||
MavenDependLoader.parentLoad(libRoot, "org.ow2.asm", "asm-commons", "9.3");
|
System.setProperty("polyglot.js.nashorn-compat", "true");
|
||||||
MavenDependLoader.parentLoad(libRoot, "org.ow2.asm", "asm-tree", "9.3");
|
System.setProperty("polyglot.js.scripting", "true");
|
||||||
MavenDependLoader.parentLoad(libRoot, "org.ow2.asm", "asm-util", "9.3");
|
System.setProperty("polyglot.js.ecmascript-version", "5");
|
||||||
return createEngineByFactoryClassName("org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory", false);
|
System.setProperty("polyglot.js.allowAllAccess", "true");
|
||||||
}
|
Class<?> NashornScriptEngineFactory = Class.forName("com.oracle.truffle.js.scriptengine.GraalJSEngineFactory");
|
||||||
|
Method getScriptEngine = NashornScriptEngineFactory.getMethod("getScriptEngine");
|
||||||
@SneakyThrows
|
Object factory = NashornScriptEngineFactory.newInstance();
|
||||||
private ScriptEngine loadNetworkGraalJS(String engineRoot) {
|
return (ScriptEngine) getScriptEngine.invoke(factory);
|
||||||
File libRootFile = new File(engineRoot, "libs");
|
// Class<?> GraalJSScriptEngine = Class.forName("com.oracle.truffle.js.scriptengine.GraalJSScriptEngine");
|
||||||
libRootFile.mkdirs();
|
// Method createScriptEngine = GraalJSScriptEngine.getMethod("create", Class.forName("org.graalvm.polyglot.Engine"), Class.forName("org.graalvm.polyglot.Context"));
|
||||||
String libRoot = libRootFile.getCanonicalPath();
|
// Class<?> Context = Class.forName("org.graalvm.polyglot.Context");
|
||||||
MavenDependLoader.load(libRoot, "org.graalvm.js", "js", "22.1.0.1");
|
// Method newBuilder = Context.getMethod("newBuilder", String[].class);
|
||||||
MavenDependLoader.load(libRoot, "org.graalvm.js", "js-scriptengine", "22.1.0.1");
|
// Class<?> Builder = Class.forName("org.graalvm.polyglot.Context.Builder");
|
||||||
MavenDependLoader.load(libRoot, "org.graalvm.regex", "regex", "22.1.0.1");
|
// Method allowExperimentalOptions = Builder.getMethod("allowExperimentalOptions", boolean.class);
|
||||||
MavenDependLoader.load(libRoot, "org.graalvm.sdk", "graal-sdk", "22.1.0.1");
|
// Method allowAllAccess = Builder.getMethod("allowAllAccess", boolean.class);
|
||||||
MavenDependLoader.load(libRoot, "org.graalvm.truffle", "truffle-api", "22.1.0.1");
|
// Method option = Builder.getMethod("option", String.class, String.class);
|
||||||
return createEngineByFactoryClassName("org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory", false);
|
// Object context = newBuilder.invoke(null, (Object) new String[]{"js"});
|
||||||
|
// allowExperimentalOptions.invoke(context, true);
|
||||||
|
// allowAllAccess.invoke(context, true);
|
||||||
|
// option.invoke(context, "js.nashorn-compat", "true");
|
||||||
|
// return (ScriptEngine) createScriptEngine.invoke(null, null, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SneakyThrows
|
@SneakyThrows
|
||||||
@ -153,10 +171,6 @@ public class MiaoScriptEngine implements ScriptEngine, Invocable {
|
|||||||
return (ScriptEngine) getScriptEngine.invoke(factory, (Object) engineArgs.toArray(new String[]{}));
|
return (ScriptEngine) getScriptEngine.invoke(factory, (Object) engineArgs.toArray(new String[]{}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ScriptEngine getEngine() {
|
|
||||||
return this.engine;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Bindings createBindings() {
|
public Bindings createBindings() {
|
||||||
return engine.createBindings();
|
return engine.createBindings();
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
package pw.yumc.MiaoScript.web;
|
|
||||||
|
|
||||||
import javax.servlet.Filter;
|
|
||||||
|
|
||||||
public interface WebFilterProxy extends Filter {
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
package pw.yumc.MiaoScript.web;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
public interface WebServerProxy {
|
|
||||||
Object process(HttpServletRequest req, HttpServletResponse resp);
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
package pw.yumc.MiaoScript.websocket;
|
|
||||||
|
|
||||||
import javax.websocket.CloseReason;
|
|
||||||
import javax.websocket.EndpointConfig;
|
|
||||||
import javax.websocket.Session;
|
|
||||||
|
|
||||||
public interface WebSocketProxy {
|
|
||||||
void onOpen(Session session, EndpointConfig config);
|
|
||||||
|
|
||||||
void onMessage(Session session, String message);
|
|
||||||
|
|
||||||
void onClose(Session session, CloseReason reason);
|
|
||||||
|
|
||||||
void onError(Session session, Throwable error);
|
|
||||||
}
|
|
@ -1,70 +0,0 @@
|
|||||||
package pw.yumc.MiaoScript.websocket;
|
|
||||||
|
|
||||||
import lombok.SneakyThrows;
|
|
||||||
|
|
||||||
import org.springframework.beans.BeansException;
|
|
||||||
import org.springframework.context.ApplicationContext;
|
|
||||||
import org.springframework.context.ApplicationContextAware;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import javax.websocket.*;
|
|
||||||
import javax.websocket.server.ServerEndpoint;
|
|
||||||
|
|
||||||
@Component
|
|
||||||
@ServerEndpoint("/ws/")
|
|
||||||
public class WebSocketServer implements ApplicationContextAware {
|
|
||||||
private static ApplicationContext context;
|
|
||||||
private WebSocketProxy proxy;
|
|
||||||
|
|
||||||
private boolean checkProxy(Session session) {
|
|
||||||
try {
|
|
||||||
if (this.proxy == null) {
|
|
||||||
this.proxy = context.getBean(WebSocketProxy.class);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} catch (Exception ex) {
|
|
||||||
try {
|
|
||||||
session.close();
|
|
||||||
} catch (Exception ignore) {
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnOpen
|
|
||||||
@SneakyThrows
|
|
||||||
public void onOpen(Session session, EndpointConfig config) {
|
|
||||||
if (this.checkProxy(session)) {
|
|
||||||
this.proxy.onOpen(session, config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnMessage
|
|
||||||
@SneakyThrows
|
|
||||||
public void onMessage(Session session, String message) {
|
|
||||||
if (this.checkProxy(session)) {
|
|
||||||
this.proxy.onMessage(session, message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnClose
|
|
||||||
@SneakyThrows
|
|
||||||
public void onClose(Session session, CloseReason reason) {
|
|
||||||
if (this.checkProxy(session)) {
|
|
||||||
this.proxy.onClose(session, reason);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@OnError
|
|
||||||
@SneakyThrows
|
|
||||||
public void onError(Session session, Throwable error) {
|
|
||||||
if (this.checkProxy(session)) {
|
|
||||||
this.proxy.onError(session, error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
|
|
||||||
context = ctx;
|
|
||||||
}
|
|
||||||
}
|
|
@ -55,6 +55,7 @@
|
|||||||
var MS_NODE_PATH = System.getenv("MS_NODE_PATH") || root + separatorChar + 'node_modules'
|
var MS_NODE_PATH = System.getenv("MS_NODE_PATH") || root + separatorChar + 'node_modules'
|
||||||
var MS_NODE_REGISTRY = System.getenv("MS_NODE_REGISTRY") || 'https://registry.npmmirror.com'
|
var MS_NODE_REGISTRY = System.getenv("MS_NODE_REGISTRY") || 'https://registry.npmmirror.com'
|
||||||
var MS_FALLBACK_NODE_REGISTRY = System.getenv("MS_FALLBACK_NODE_REGISTRY") || 'https://repo.yumc.pw/repository/npm'
|
var MS_FALLBACK_NODE_REGISTRY = System.getenv("MS_FALLBACK_NODE_REGISTRY") || 'https://repo.yumc.pw/repository/npm'
|
||||||
|
var MS_SCRIPT_PACKAGE_CENTER = System.getenv("MS_SCRIPT_PACKAGE_CENTER") || 'https://mscript.yumc.pw/api/plugin/download'
|
||||||
var MS_NETWORK_CONNECT_TIMEOUT = System.getenv("MS_NETWORK_CONNECT_TIMEOUT") || 5000
|
var MS_NETWORK_CONNECT_TIMEOUT = System.getenv("MS_NETWORK_CONNECT_TIMEOUT") || 5000
|
||||||
var MS_NETWORK_READ_TIMEOUT = System.getenv("MS_NETWORK_TIMEOUT") || 45000
|
var MS_NETWORK_READ_TIMEOUT = System.getenv("MS_NETWORK_TIMEOUT") || 45000
|
||||||
var MS_NETWORK_DOWNLOAD_TIMEOUT = System.getenv("MS_NETWORK_DOWNLOAD_TIMEOUT") || 60000
|
var MS_NETWORK_DOWNLOAD_TIMEOUT = System.getenv("MS_NETWORK_DOWNLOAD_TIMEOUT") || 60000
|
||||||
@ -114,9 +115,11 @@
|
|||||||
return file.absolutePath
|
return file.absolutePath
|
||||||
}
|
}
|
||||||
|
|
||||||
function __error(message) {
|
function __error(message, name) {
|
||||||
|
var error = new Error(message)
|
||||||
|
if (name) { error.name = name }
|
||||||
console.error(message)
|
console.error(message)
|
||||||
return new Error(message)
|
return error
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -153,7 +156,8 @@
|
|||||||
function resolveAsFile(file, dir) {
|
function resolveAsFile(file, dir) {
|
||||||
file = dir !== undefined ? new File(dir, file) : new File(file)
|
file = dir !== undefined ? new File(dir, file) : new File(file)
|
||||||
// 直接文件
|
// 直接文件
|
||||||
if (file.isFile()) {
|
// 只解析带后缀的文件 其他文件视为非法文件
|
||||||
|
if (file.isFile() && file.name.lastIndexOf('.') != -1) {
|
||||||
return file
|
return file
|
||||||
}
|
}
|
||||||
// JS文件
|
// JS文件
|
||||||
@ -364,6 +368,8 @@
|
|||||||
/**
|
/**
|
||||||
* 尝试从网络下载依赖包
|
* 尝试从网络下载依赖包
|
||||||
* @param {string} name 包名称
|
* @param {string} name 包名称
|
||||||
|
* @param {string} optional 附加选项
|
||||||
|
* @param {number} retry 重试次数
|
||||||
*/
|
*/
|
||||||
function download(name, optional, retry) {
|
function download(name, optional, retry) {
|
||||||
var name_arr = splitVersionFromName(name)
|
var name_arr = splitVersionFromName(name)
|
||||||
@ -376,15 +382,19 @@
|
|||||||
var info = fetchPackageInfo(module_name)
|
var info = fetchPackageInfo(module_name)
|
||||||
if (!module_version) {
|
if (!module_version) {
|
||||||
// if not special version get from lock or tag
|
// if not special version get from lock or tag
|
||||||
module_version = ModulesVersionLock[module_name] || info['dist-tags']['latest']
|
module_version = ModulesVersionLock[module_name]
|
||||||
} else if (!/\d+\.\d+\.\w+/.test(module_version)) {
|
} else if (!/\d+\.\d+\.\w+/.test(module_version)) {
|
||||||
// maybe module_version = latest
|
// maybe module_version = latest if special version not exist then fallback latest
|
||||||
|
console.log('try get node_module ' + module_name + ' version from ' + module_version + ' tag waiting...')
|
||||||
module_version = info['dist-tags'][module_version]
|
module_version = info['dist-tags'][module_version]
|
||||||
}
|
}
|
||||||
var _version = info.versions[module_version]
|
if (!module_version) {
|
||||||
if (!_version) {
|
console.log('try get node_module ' + module_name + ' version from latest tag waiting...')
|
||||||
throw __error('fetch node_module ' + module_name + ' version ' + module_version + ' failed. can\t found tarball from versions.')
|
module_version = info['dist-tags']['latest']
|
||||||
}
|
}
|
||||||
|
if (!module_version) { throw __error('fetch node_module ' + module_name + " failed. can't found version from " + name + ".", 'ModuleNotFoundError') }
|
||||||
|
var _version = info.versions[module_version]
|
||||||
|
if (!_version) { throw __error('fetch node_module ' + module_name + ' version ' + module_version + " failed. can't found tarball from versions.", 'ModuleNotFoundError') }
|
||||||
var url = _version.dist.tarball
|
var url = _version.dist.tarball
|
||||||
console.log('fetch node_module ' + module_name + ' version ' + module_version + ' waiting...')
|
console.log('fetch node_module ' + module_name + ' version ' + module_version + ' waiting...')
|
||||||
return executor.submit(new Callable(function () {
|
return executor.submit(new Callable(function () {
|
||||||
@ -400,18 +410,17 @@
|
|||||||
Files.copy(tis, targetPath, StandardCopyOption.REPLACE_EXISTING)
|
Files.copy(tis, targetPath, StandardCopyOption.REPLACE_EXISTING)
|
||||||
}
|
}
|
||||||
return name
|
return name
|
||||||
})).get(MS_NETWORK_DOWNLOAD_TIMEOUT, TimeUnit.SECONDS)
|
})).get(MS_NETWORK_DOWNLOAD_TIMEOUT, TimeUnit.MILLISECONDS)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
retry = retry || 1
|
if (error.name == 'ModuleNotFoundError') { throw error }
|
||||||
if (retry > 3) {
|
if (retry > 3) { throw __error('fetch node_module ' + module_name + ' version ' + module_version + ' failed. greater than 3 times stop retry.') }
|
||||||
throw __error('fetch node_module ' + module_name + ' version ' + module_version + ' failed. greater than 3 times stop retry.')
|
|
||||||
}
|
|
||||||
console.log('fetch node_module ' + module_name + ' version ' + module_version + ' failed retrying...')
|
console.log('fetch node_module ' + module_name + ' version ' + module_version + ' failed retrying...')
|
||||||
return download(name, optional, ++retry)
|
return download(name, optional, ++retry)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* 获取包信息
|
||||||
* @param {string} module_name
|
* @param {string} module_name
|
||||||
*/
|
*/
|
||||||
function fetchPackageInfo(module_name) {
|
function fetchPackageInfo(module_name) {
|
||||||
@ -419,7 +428,7 @@
|
|||||||
try {
|
try {
|
||||||
content = fetchContent(MS_NODE_REGISTRY + '/' + module_name)
|
content = fetchContent(MS_NODE_REGISTRY + '/' + module_name)
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
console.warn('can\'t fetch package ' + module_name + ' from ' + MS_NODE_REGISTRY + ' registry. try fetch from ' + MS_FALLBACK_NODE_REGISTRY + ' registry...')
|
console.warn("can't fetch package " + module_name + ' from ' + MS_NODE_REGISTRY + ' registry. try fetch from ' + MS_FALLBACK_NODE_REGISTRY + ' registry...')
|
||||||
content = fetchContent(MS_FALLBACK_NODE_REGISTRY + '/' + module_name)
|
content = fetchContent(MS_FALLBACK_NODE_REGISTRY + '/' + module_name)
|
||||||
}
|
}
|
||||||
return JSON.parse(content)
|
return JSON.parse(content)
|
||||||
@ -428,6 +437,7 @@
|
|||||||
/**
|
/**
|
||||||
* 获取网络内容
|
* 获取网络内容
|
||||||
* @param {string} url 网址
|
* @param {string} url 网址
|
||||||
|
* @param {number} [timeout] 超时时间
|
||||||
*/
|
*/
|
||||||
function fetchContent(url, timeout) {
|
function fetchContent(url, timeout) {
|
||||||
return executor.submit(new Callable(function fetchContent() {
|
return executor.submit(new Callable(function fetchContent() {
|
||||||
@ -444,7 +454,7 @@
|
|||||||
input.close()
|
input.close()
|
||||||
output.close()
|
output.close()
|
||||||
}
|
}
|
||||||
})).get(timeout || MS_NETWORK_READ_TIMEOUT, TimeUnit.SECONDS)
|
})).get(timeout || MS_NETWORK_READ_TIMEOUT, TimeUnit.MILLISECONDS)
|
||||||
}
|
}
|
||||||
|
|
||||||
var lastModule = ''
|
var lastModule = ''
|
||||||
@ -466,7 +476,7 @@
|
|||||||
if (resolve(newName, path, optional) !== undefined) {
|
if (resolve(newName, path, optional) !== undefined) {
|
||||||
return newName
|
return newName
|
||||||
}
|
}
|
||||||
throw __error("Can't load nodejs core module " + name + " . maybe later will auto replace to " + global.scope + "/nodejs/" + name + ' to compatible...')
|
throw __error("can't load nodejs core module " + name + " . maybe later will auto replace to " + global.scope + "/nodejs/" + name + ' to compatible...')
|
||||||
}
|
}
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
@ -488,7 +498,7 @@
|
|||||||
function _require(name, path, optional) {
|
function _require(name, path, optional) {
|
||||||
// require direct file
|
// require direct file
|
||||||
var file = _isFile(name) ? name : new File(name)
|
var file = _isFile(name) ? name : new File(name)
|
||||||
if (_isFile(file)) {
|
if (_isFile(file) && file.name.lastIndexOf('.') != -1) {
|
||||||
return _requireFile(file, optional)
|
return _requireFile(file, optional)
|
||||||
}
|
}
|
||||||
// require cache module
|
// require cache module
|
||||||
@ -499,14 +509,16 @@
|
|||||||
}
|
}
|
||||||
// check core module
|
// check core module
|
||||||
name = checkCoreModule(name, path, optional)
|
name = checkCoreModule(name, path, optional)
|
||||||
|
var file = resolve(name, path, optional)
|
||||||
// search module
|
// search module
|
||||||
if ((file = resolve(name, path, optional)) === undefined) {
|
if (file === undefined) {
|
||||||
// excloud local dir, prevent too many recursive call and cache not found module
|
// excloud local dir, prevent too many recursive call and cache not found module
|
||||||
if (optional.local || optional.recursive || notFoundModules[name]) {
|
if (optional.local || optional.recursive || notFoundModules[name]) {
|
||||||
throw __error("Can't found module " + name + '(' + JSON.stringify(optional) + ') at local ' + path + ' or network!')
|
delete optional.parent
|
||||||
|
throw __error("can't found module " + name + '(' + JSON.stringify(optional) + ') at local ' + path + ' or network!')
|
||||||
}
|
}
|
||||||
optional.recursive = true
|
optional.recursive = true
|
||||||
return _require(download(name, optional), path, optional)
|
return _require(download(name, optional, 1), path, optional)
|
||||||
}
|
}
|
||||||
setCacheModule(file, optional)
|
setCacheModule(file, optional)
|
||||||
return _requireFile(file, optional)
|
return _requireFile(file, optional)
|
||||||
@ -545,7 +557,7 @@
|
|||||||
*/
|
*/
|
||||||
return function __DynamicRequire__(path, optional) {
|
return function __DynamicRequire__(path, optional) {
|
||||||
if (!path) {
|
if (!path) {
|
||||||
throw __error('require path can\'t be undefined or empty!')
|
throw __error("require path can't be undefined or empty!")
|
||||||
}
|
}
|
||||||
var optional = __assign({
|
var optional = __assign({
|
||||||
cache: true,
|
cache: true,
|
||||||
@ -574,7 +586,7 @@
|
|||||||
function __DynamicClear__(name) {
|
function __DynamicClear__(name) {
|
||||||
for (var cacheModule in cacheModules) {
|
for (var cacheModule in cacheModules) {
|
||||||
if (cacheModule.indexOf(name) !== -1) {
|
if (cacheModule.indexOf(name) !== -1) {
|
||||||
console.trace('Clear module ' + cacheModule + ' ...')
|
console.trace('clear module ' + cacheModule + ' ...')
|
||||||
delete cacheModules[cacheModule]
|
delete cacheModules[cacheModule]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -585,12 +597,12 @@
|
|||||||
for (var cacheModule in cacheModules) {
|
for (var cacheModule in cacheModules) {
|
||||||
delete cacheModules[cacheModule]
|
delete cacheModules[cacheModule]
|
||||||
}
|
}
|
||||||
cacheModules = undefined
|
cacheModules = {}
|
||||||
for (var cacheModuleId in cacheModuleIds) {
|
for (var cacheModuleId in cacheModuleIds) {
|
||||||
delete cacheModuleIds[cacheModuleId]
|
delete cacheModuleIds[cacheModuleId]
|
||||||
}
|
}
|
||||||
cacheModuleIds = undefined
|
cacheModuleIds = {}
|
||||||
notFoundModules = undefined
|
notFoundModules = {}
|
||||||
}
|
}
|
||||||
|
|
||||||
function __setUpgradeMode__(status) {
|
function __setUpgradeMode__(status) {
|
||||||
@ -605,6 +617,7 @@
|
|||||||
* @type {any} require
|
* @type {any} require
|
||||||
*/
|
*/
|
||||||
var require = exports(parent)
|
var require = exports(parent)
|
||||||
|
require.cache = cacheModules
|
||||||
require.resolve = __DynamicResolve__
|
require.resolve = __DynamicResolve__
|
||||||
require.clear = __DynamicClear__
|
require.clear = __DynamicClear__
|
||||||
require.disable = __DynamicDisable__
|
require.disable = __DynamicDisable__
|
||||||
@ -621,6 +634,7 @@
|
|||||||
notFoundModules: notFoundModules,
|
notFoundModules: notFoundModules,
|
||||||
requireLoaders: requireLoaders
|
requireLoaders: requireLoaders
|
||||||
}
|
}
|
||||||
|
require.loadCoreScript = loadCoreScript
|
||||||
return require
|
return require
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -629,8 +643,12 @@
|
|||||||
* @param {any} loader
|
* @param {any} loader
|
||||||
*/
|
*/
|
||||||
function registerLoader(ext, loader) {
|
function registerLoader(ext, loader) {
|
||||||
|
if (requireLoaders[ext]) {
|
||||||
|
return console.error('require loader ' + ext + ' already register ignore. if you want override loader please unregister before register.')
|
||||||
|
}
|
||||||
|
requireExts.push(ext)
|
||||||
requireLoaders[ext] = loader
|
requireLoaders[ext] = loader
|
||||||
console.info('Register Require Loader ' + ext + ' => ' + (loader.name || '<anonymous>') + '.')
|
console.info('register require loader ' + ext + ' => ' + (loader.name || '<anonymous>') + '.')
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @param {*} ext
|
* @param {*} ext
|
||||||
@ -642,8 +660,9 @@
|
|||||||
* @param {*} ext
|
* @param {*} ext
|
||||||
*/
|
*/
|
||||||
function unregisterLoader(ext) {
|
function unregisterLoader(ext) {
|
||||||
|
requireExts.splice(requireExts.indexOf(ext), 1);
|
||||||
delete requireLoaders[ext]
|
delete requireLoaders[ext]
|
||||||
console.info('unregister Require Loader ' + ext + '.')
|
console.info('unregister require loader ' + ext + '.')
|
||||||
}
|
}
|
||||||
|
|
||||||
function printRequireInfo() {
|
function printRequireInfo() {
|
||||||
@ -651,6 +670,7 @@
|
|||||||
console.info('ParentDir:', root)
|
console.info('ParentDir:', root)
|
||||||
console.info('Require module env list:')
|
console.info('Require module env list:')
|
||||||
console.info('- JAVA_VERSION:', System.getProperty("java.version"))
|
console.info('- JAVA_VERSION:', System.getProperty("java.version"))
|
||||||
|
console.info('- PLUGIN_VERSION:', base.version)
|
||||||
console.info('- MS_NODE_PATH:', MS_NODE_PATH.startsWith(root) ? MS_NODE_PATH.split(root)[1] : MS_NODE_PATH)
|
console.info('- MS_NODE_PATH:', MS_NODE_PATH.startsWith(root) ? MS_NODE_PATH.split(root)[1] : MS_NODE_PATH)
|
||||||
console.info('- MS_NODE_REGISTRY:', MS_NODE_REGISTRY)
|
console.info('- MS_NODE_REGISTRY:', MS_NODE_REGISTRY)
|
||||||
console.info('- MS_FALLBACK_NODE_REGISTRY:', MS_FALLBACK_NODE_REGISTRY)
|
console.info('- MS_FALLBACK_NODE_REGISTRY:', MS_FALLBACK_NODE_REGISTRY)
|
||||||
@ -672,7 +692,7 @@
|
|||||||
|
|
||||||
function initVersionLock() {
|
function initVersionLock() {
|
||||||
try {
|
try {
|
||||||
var version_lock_url = 'https://ms.yumc.pw/api/plugin/download/name/version_lock' + (global.debug ? '-debug' : '')
|
var version_lock_url = MS_SCRIPT_PACKAGE_CENTER + '?name=version_lock' + (global.debug ? '-debug' : '')
|
||||||
ModulesVersionLock = JSON.parse(fetchContent(version_lock_url, 5000))
|
ModulesVersionLock = JSON.parse(fetchContent(version_lock_url, 5000))
|
||||||
try {
|
try {
|
||||||
ModulesVersionLock = __assign(ModulesVersionLock, JSON.parse(base.read(localVersionLockFile)))
|
ModulesVersionLock = __assign(ModulesVersionLock, JSON.parse(base.read(localVersionLockFile)))
|
||||||
@ -698,10 +718,7 @@
|
|||||||
registerLoader('js', compileJsFile)
|
registerLoader('js', compileJsFile)
|
||||||
registerLoader('json', compileJson)
|
registerLoader('json', compileJson)
|
||||||
try {
|
try {
|
||||||
engineLoad({
|
loadCoreScript('require_loader')(require)
|
||||||
script: fetchContent('https://ms.yumc.pw/api/plugin/download/name/require_loader', 5000),
|
|
||||||
name: 'core/require_loader.js'
|
|
||||||
})(require)
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.warn("无法获取到最新的加载器信息 使用默认配置.")
|
console.warn("无法获取到最新的加载器信息 使用默认配置.")
|
||||||
console.warn("InitRequireLoader Error:", error)
|
console.warn("InitRequireLoader Error:", error)
|
||||||
@ -711,25 +728,41 @@
|
|||||||
return require
|
return require
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function loadCoreScript(name) {
|
||||||
|
return engineLoad({
|
||||||
|
script: fetchContent(MS_SCRIPT_PACKAGE_CENTER + '?name=' + name, 5000),
|
||||||
|
name: 'core/' + name + '.js'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof parent === 'string') {
|
if (typeof parent === 'string') {
|
||||||
parent = new File(parent)
|
parent = new File(parent)
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
* require 支持的后缀
|
||||||
|
* @type {string[]} requireExts
|
||||||
|
*/
|
||||||
|
var requireExts = []
|
||||||
|
/**
|
||||||
|
* require加载器
|
||||||
* @type {{[key:string]:(module:any, file:string, optional?:any)=>any}} requireLoader
|
* @type {{[key:string]:(module:any, file:string, optional?:any)=>any}} requireLoader
|
||||||
*/
|
*/
|
||||||
var requireLoaders = {}
|
var requireLoaders = {}
|
||||||
/**
|
/**
|
||||||
* @type {{[key:string]:any}} cacheModules
|
* 已缓存的模块
|
||||||
|
* @type {{[key:string]:any}} [cacheModules]
|
||||||
*/
|
*/
|
||||||
var cacheModules = {}
|
var cacheModules = {}
|
||||||
var cacheModuleIdsFile = _canonical(new File(MS_NODE_PATH, 'cacheModuleIds.json'))
|
var cacheModuleIdsFile = _canonical(new File(MS_NODE_PATH, 'cacheModuleIds.json'))
|
||||||
var localVersionLockFile = _canonical(new File(MS_NODE_PATH, 'moduleVersionLock.json'))
|
var localVersionLockFile = _canonical(new File(MS_NODE_PATH, 'moduleVersionLock.json'))
|
||||||
/**
|
/**
|
||||||
* @type {{[key:string]:{[key:string]:string}|string}} cacheModuleIds
|
* 已缓存的模块ID
|
||||||
|
* @type {{[key:string]:{[key:string]:string}|string}} [cacheModuleIds]
|
||||||
*/
|
*/
|
||||||
var cacheModuleIds = {}
|
var cacheModuleIds = {}
|
||||||
/**
|
/**
|
||||||
* @type {{[key:string]:boolean}} notFoundModules
|
* 未找到的模块
|
||||||
|
* @type {{[key:string]:boolean}}
|
||||||
*/
|
*/
|
||||||
var notFoundModules = {}
|
var notFoundModules = {}
|
||||||
var upgradeMode = false
|
var upgradeMode = false
|
||||||
|
Loading…
Reference in New Issue
Block a user