diff --git a/README.md b/README.md
index 541762c..b1dbc40 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,20 @@
桃夭是套基于`Mediasoup`开发的`WebRTC`音视频信令服务
+
+
+
+
+
+
+
+
+
+
+
+
+----
+
## 模块
|模块|名称|描述|
@@ -54,6 +68,7 @@
* P2P
* 信令直传
* 信令服务集群
+* 安全处理:房间
* 媒体交互式启动
* 会议调整为房间
* 内外网/多网卡环境
diff --git a/docs/Deploy.md b/docs/Deploy.md
index 19cd131..0517d67 100644
--- a/docs/Deploy.md
+++ b/docs/Deploy.md
@@ -331,12 +331,12 @@ pm2 start | stop | restart taoyao-client
```
# 终端服务:建议使用Nginx代理
firewall-cmd --zone=public --add-port=8443/tcp --permanent
-# 信令服务(Socket):没有启用不用添加规则
-firewall-cmd --zone=public --add-port=9999/tcp --permanent
# 信令服务(WebSocket)
firewall-cmd --zone=public --add-port=8888/tcp --permanent
+# 信令服务(Socket):没有启用不用添加规则
+firewall-cmd --zone=public --add-port=9999/tcp --permanent
# 媒体服务(控制):只暴露给信令服务
-firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="4443" accept" --permanent
+firewall-cmd --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9443" accept" --permanent
# 媒体服务(数据)
firewall-cmd --zone=public --add-port=40000-49999/udp --permanent
@@ -345,9 +345,9 @@ firewall-cmd --list-ports
# 删除端口
#firewall-cmd --zone=public --remove-port=8443/tcp --permanent
-#firewall-cmd --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="4443" accept" --permanent
-#firewall-cmd --zone=public --remove-port=9999/tcp --permanent
#firewall-cmd --zone=public --remove-port=8888/tcp --permanent
+#firewall-cmd --zone=public --remove-port=9999/tcp --permanent
+#firewall-cmd --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="9443" accept" --permanent
#firewall-cmd --zone=public --remove-port=40000-49999/udp --permanent
```
diff --git a/taoyao-client-web/src/components/Taoyao.js b/taoyao-client-web/src/components/Taoyao.js
index 2a1fe71..1febd98 100644
--- a/taoyao-client-web/src/components/Taoyao.js
+++ b/taoyao-client-web/src/components/Taoyao.js
@@ -395,7 +395,8 @@ class Taoyao {
const audioTrack = stream.getAudioTracks()[0];
const videoTrack = stream.getVideoTracks()[0];
if(self.produce) {
- const transportInfo = await self.request("webrtc::transport::create", {
+ const transportInfo = await self.request("transport::webrtc::create", {
+ roomId : self.roomId,
forceTcp : self.forceTcp,
producing : true,
consuming : false,
@@ -431,7 +432,7 @@ class Taoyao {
'connect', ({ dtlsParameters }, callback, errback) =>
{
self.request(
- 'webrtc::transport::connect',
+ 'transport::webrtc::connect',
{
transportId : self.sendTransport.id,
dtlsParameters
diff --git a/taoyao-media-server/README.md b/taoyao-media-server/README.md
index d107103..c519853 100644
--- a/taoyao-media-server/README.md
+++ b/taoyao-media-server/README.md
@@ -16,6 +16,47 @@ make
make -C worker
```
+## 事件
+
+```
+mediasoup.observer.on("newworker", fn(worker));
+worker.on("died", fn(error));
+worker.observer.on("close", fn());
+worker.observer.on("newrouter", fn(router));
+worker.observer.on("newwebrtcserver", fn(router));
+router.on(“workerclose”, fn());
+router.observer.on(“close”, fn());
+router.observer.on(“newtransport”, fn(transport));
+router.observer.on(“newrtpobserver”, fn(rtpObserver));
+transport.on("trace", fn(trace));
+transport.on(“routerclose”, fn());
+transport.on(“listenserverclose”, fn());
+transport.on(“trace”, fn(trace));
+webRtcTransport.on(“icestatechange”, fn(iceState))
+webRtcTransport.on(“iceselectedtuplechange”, fn(iceSelectedTuple))
+webRtcTransport.on(“dtlsstatechange”, fn(dtlsState))
+webRtcTransport.on(“sctpstatechange”, fn(sctpState))
+plainTransport.on(“tuple”, fn(tuple))
+plainTransport.on(“rtcptuple”, fn(rtcpTuple))
+plainTransport.on(“sctpstatechange”, fn(sctpState))
+pipeTransport.on(“sctpstatechange”, fn(sctpState))
+directTransport.on(“rtcp”, fn(rtcpPacket))
+transport.observer.on(“close”, fn())
+transport.observer.on(“newproducer”, fn(producer))
+transport.observer.on(“newconsumer”, fn(consumer))
+transport.observer.on(“newdataproducer”, fn(dataProducer))
+transport.observer.on(“newdataconsumer”, fn(dataConsumer))
+transport.observer.on(“trace”, fn(trace))
+webRtcTransport.observer.on(“icestatechange”, fn(iceState))
+webRtcTransport.observer.on(“iceselectedtuplechange”, fn(iceSelectedTuple))
+webRtcTransport.observer.on(“dtlsstatechange”, fn(dtlsState))
+webRtcTransport.observer.on(“sctpstatechange”, fn(sctpState))
+plainTransport.observer.on(“tuple”, fn(tuple))
+plainTransport.observer.on(“rtcptuple”, fn(rtcpTuple))
+plainTransport.observer.on(“sctpstatechange”, fn(sctpState))
+pipeTransport.observer.on(“sctpstatechange”, fn(sctpState))
+```
+
## 安全
默认媒体服务只要暴露媒体`UDP`端口,信令接口不用暴露,所以使用简单鉴权。
diff --git a/taoyao-media-server/src/Config.js b/taoyao-media-server/src/Config.js
index 9058fcc..fea3c71 100644
--- a/taoyao-media-server/src/Config.js
+++ b/taoyao-media-server/src/Config.js
@@ -6,17 +6,19 @@ const os = require("os");
module.exports = {
// 服务名称
name: "taoyao-media-server",
+ // 服务版本
version: "1.0.0",
- // 交互式命令行
- command: true,
+ // 欢迎页面
welcome: `${__dirname}/index.html`,
// 日志级别
logLevel: "DEBUG",
+ // 录像目录
+ recordStoragePath: "/data/record",
// 信令服务
https: {
// 信令服务地址端口
listenIp: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0",
- listenPort: process.env.HTTPS_LISTEN_PORT || 4443,
+ listenPort: process.env.HTTPS_LISTEN_PORT || 9443,
// 信令服务安全配置
username: "taoyao",
password: "taoyao",
@@ -26,6 +28,14 @@ module.exports = {
key: process.env.HTTPS_CERT_PRIVATE_KEY || `${__dirname}/certs/privateKey.pem`,
},
},
+ // 水印
+ watermark: {
+ enabled: false,
+ text: "taoyao",
+ posx: 0,
+ posy: 0,
+ opacity: 1,
+ },
// Mediasoup
mediasoup: {
// 配置Worker进程数量
diff --git a/taoyao-media-server/src/Signal.js b/taoyao-media-server/src/Signal.js
index bbe3611..59e3f98 100644
--- a/taoyao-media-server/src/Signal.js
+++ b/taoyao-media-server/src/Signal.js
@@ -207,6 +207,9 @@ class Signal {
case "room::create":
this.roomCreate(session, message, message.body);
break;
+ case "transport:webrtc::create":
+ this.transportWebrtcCreate(session, message, message.body);
+ break;
}
}
@@ -311,6 +314,95 @@ class Signal {
return room;
}
+ /**
+ * @param {*} session 信令通道
+ * @param {*} message 消息
+ * @param {*} body 消息主体
+ */
+ transportWebrtcCreate(session, message, body) {
+ const {
+ roomId,
+ forceTcp,
+ producing,
+ consuming,
+ sctpCapabilities
+ } = body;
+ const webRtcTransportOptions =
+ {
+ ...config.mediasoup.webRtcTransportOptions,
+ enableSctp : Boolean(sctpCapabilities),
+ numSctpStreams : (sctpCapabilities || {}).numStreams,
+ appData : { producing, consuming }
+ };
+
+ if (forceTcp)
+ {
+ webRtcTransportOptions.enableUdp = false;
+ webRtcTransportOptions.enableTcp = true;
+ }
+ const room = this.rooms.get(roomId);
+ const transport = await room.mediasoupRouter.createWebRtcTransport(
+ {
+ ...webRtcTransportOptions,
+ webRtcServer : room.webRtcServer
+ });
+
+ transport.on('sctpstatechange', (sctpState) =>
+ {
+ logger.debug('WebRtcTransport "sctpstatechange" event [sctpState:%s]', sctpState);
+ });
+
+ transport.on('dtlsstatechange', (dtlsState) =>
+ {
+ if (dtlsState === 'failed' || dtlsState === 'closed')
+ logger.warn('WebRtcTransport "dtlsstatechange" event [dtlsState:%s]', dtlsState);
+ });
+
+ // NOTE: For testing.
+ // await transport.enableTraceEvent([ 'probation', 'bwe' ]);
+ await transport.enableTraceEvent([ 'bwe' ]);
+
+ transport.on('trace', (trace) =>
+ {
+ logger.debug(
+ 'transport "trace" event [transportId:%s, trace.type:%s, trace:%o]',
+ transport.id, trace.type, trace);
+
+ if (trace.type === 'bwe' && trace.direction === 'out')
+ {
+ peer.notify(
+ 'downlinkBwe',
+ {
+ desiredBitrate : trace.info.desiredBitrate,
+ effectiveDesiredBitrate : trace.info.effectiveDesiredBitrate,
+ availableBitrate : trace.info.availableBitrate
+ })
+ .catch(() => {});
+ }
+ });
+
+ // Store the WebRtcTransport into the protoo Peer data Object.
+ peer.data.transports.set(transport.id, transport);
+
+ self.push(
+ {
+ id : transport.id,
+ iceParameters : transport.iceParameters,
+ iceCandidates : transport.iceCandidates,
+ dtlsParameters : transport.dtlsParameters,
+ sctpParameters : transport.sctpParameters
+ }, session);
+
+ const { maxIncomingBitrate } = config.mediasoup.webRtcTransportOptions;
+
+ // If set, apply max incoming bitrate limit.
+ if (maxIncomingBitrate)
+ {
+ try { await transport.setMaxIncomingBitrate(maxIncomingBitrate); }
+ catch (error) {}
+ }
+ }
+
}
module.exports = Signal;
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/EventProtocol.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/EventProtocol.java
deleted file mode 100644
index 4b5fda9..0000000
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/EventProtocol.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.acgist.taoyao.boot.annotation;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.springframework.stereotype.Component;
-
-/**
- * 事件信令协议
- *
- * @author acgist
- */
-@Target(ElementType.TYPE)
-@Component
-@Retention(RetentionPolicy.RUNTIME)
-@Documented
-public @interface EventProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Manager.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Manager.java
index 02c51a8..5947254 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Manager.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Manager.java
@@ -9,7 +9,7 @@ import java.lang.annotation.Target;
import org.springframework.stereotype.Component;
/**
- * 管理
+ * 管理器
*
* @author acgist
*/
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Protocol.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Protocol.java
index 68761c3..0894fa7 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Protocol.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Protocol.java
@@ -9,7 +9,7 @@ import java.lang.annotation.Target;
import org.springframework.stereotype.Component;
/**
- * 信令协议
+ * 信令
*
* @author acgist
*/
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Client.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Prototype.java
similarity index 64%
rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Client.java
rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Prototype.java
index 9752414..2e0a563 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Client.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/Prototype.java
@@ -6,17 +6,20 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
/**
- * 终端
+ * 模板:多例对象
*
* @author acgist
*/
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Target(ElementType.TYPE)
@Component
@Retention(RetentionPolicy.RUNTIME)
@Documented
-public @interface Client {
+public @interface Prototype {
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/BootAutoConfiguration.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/BootAutoConfiguration.java
deleted file mode 100644
index ec39093..0000000
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/BootAutoConfiguration.java
+++ /dev/null
@@ -1,229 +0,0 @@
-package com.acgist.taoyao.boot.config;
-
-import java.lang.management.ManagementFactory;
-import java.lang.management.RuntimeMXBean;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.stream.Collectors;
-
-import org.slf4j.ILoggerFactory;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.ConversionNotSupportedException;
-import org.springframework.beans.TypeMismatchException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration;
-import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.boot.task.TaskExecutorBuilder;
-import org.springframework.boot.task.TaskSchedulerBuilder;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.EnableAspectJAutoProxy;
-import org.springframework.context.annotation.Import;
-import org.springframework.context.annotation.Primary;
-import org.springframework.core.Ordered;
-import org.springframework.core.annotation.Order;
-import org.springframework.core.task.TaskExecutor;
-import org.springframework.http.converter.HttpMessageNotReadableException;
-import org.springframework.http.converter.HttpMessageNotWritableException;
-import org.springframework.scheduling.TaskScheduler;
-import org.springframework.scheduling.annotation.EnableAsync;
-import org.springframework.scheduling.annotation.EnableScheduling;
-import org.springframework.validation.BindException;
-import org.springframework.web.HttpMediaTypeNotAcceptableException;
-import org.springframework.web.HttpMediaTypeNotSupportedException;
-import org.springframework.web.HttpRequestMethodNotSupportedException;
-import org.springframework.web.bind.MethodArgumentNotValidException;
-import org.springframework.web.bind.MissingPathVariableException;
-import org.springframework.web.bind.MissingServletRequestParameterException;
-import org.springframework.web.bind.ServletRequestBindingException;
-import org.springframework.web.context.request.async.AsyncRequestTimeoutException;
-import org.springframework.web.multipart.support.MissingServletRequestPartException;
-import org.springframework.web.servlet.NoHandlerFoundException;
-
-import com.acgist.taoyao.boot.controller.TaoyaoControllerAdvice;
-import com.acgist.taoyao.boot.controller.TaoyaoErrorController;
-import com.acgist.taoyao.boot.model.MessageCode;
-import com.acgist.taoyao.boot.property.IdProperties;
-import com.acgist.taoyao.boot.property.MediaProperties;
-import com.acgist.taoyao.boot.property.ScriptProperties;
-import com.acgist.taoyao.boot.property.SecurityProperties;
-import com.acgist.taoyao.boot.property.SocketProperties;
-import com.acgist.taoyao.boot.property.TaoyaoProperties;
-import com.acgist.taoyao.boot.property.WebrtcProperties;
-import com.acgist.taoyao.boot.service.IdService;
-import com.acgist.taoyao.boot.service.impl.IdServiceImpl;
-import com.acgist.taoyao.boot.utils.ErrorUtils;
-import com.acgist.taoyao.boot.utils.FileUtils;
-import com.acgist.taoyao.boot.utils.HTTPUtils;
-import com.acgist.taoyao.boot.utils.JSONUtils;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import ch.qos.logback.classic.LoggerContext;
-import jakarta.annotation.PostConstruct;
-import jakarta.annotation.PreDestroy;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 全局配置
- *
- * @author acgist
- */
-@Slf4j
-@Order(Ordered.HIGHEST_PRECEDENCE)
-@Import({ TaskExecutionAutoConfiguration.class, TaskSchedulingAutoConfiguration.class })
-@EnableAsync
-@Configuration
-@EnableScheduling
-@EnableAspectJAutoProxy(exposeProxy = false)
-@EnableConfigurationProperties({
- IdProperties.class,
- MediaProperties.class,
- ScriptProperties.class,
- SocketProperties.class,
- TaoyaoProperties.class,
- WebrtcProperties.class,
- SecurityProperties.class
-})
-public class BootAutoConfiguration {
-
- @Value("${spring.application.name:taoyao}")
- private String name;
-
- @Autowired
- private ApplicationContext applicationContext;
-
- @Bean
- @ConditionalOnMissingBean
- public IdService idService() {
- return new IdServiceImpl();
- }
-
- @Bean
- @Primary
- @ConditionalOnMissingBean
- public ObjectMapper objectMapper() {
- return JSONUtils.buildMapper();
- }
-
- @Bean
- @Primary
- @ConditionalOnMissingBean
- public TaskExecutor taskExecutor(TaskExecutorBuilder builder) {
- return builder.build();
- }
-
- @Bean
- @Primary
- @ConditionalOnMissingBean
- public TaskScheduler taskScheduler(TaskSchedulerBuilder builder) {
- return builder.build();
- }
-
- @Bean
- @Autowired
- public CommandLineRunner successCommandLineRunner(
- TaskExecutor taskExecutor,
- TaoyaoProperties taoyaoProperties
- ) {
- return new CommandLineRunner() {
- @Override
- public void run(String ... args) throws Exception {
- HTTPUtils.init(taoyaoProperties.getTimeout(), taskExecutor);
- log.info("项目启动成功:{}", BootAutoConfiguration.this.name);
- }
- };
- }
-
- @Bean
- @ConditionalOnMissingBean
- public TaoyaoErrorController taoyaoErrorController() {
- return new TaoyaoErrorController();
- }
-
- @Bean
- @ConditionalOnMissingBean
- public TaoyaoControllerAdvice taoyaoControllerAdvice() {
- return new TaoyaoControllerAdvice();
- }
-
- @PostConstruct
- public void init() {
- final Runtime runtime = Runtime.getRuntime();
- final RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
- final String freeMemory = FileUtils.formatSize(runtime.freeMemory());
- final String totalMemory = FileUtils.formatSize(runtime.totalMemory());
- final String maxMemory = FileUtils.formatSize(runtime.maxMemory());
- log.info("操作系统名称:{}", System.getProperty("os.name"));
- log.info("操作系统架构:{}", System.getProperty("os.arch"));
- log.info("操作系统版本:{}", System.getProperty("os.version"));
- log.info("可用的处理器数量:{}", runtime.availableProcessors());
- log.info("Java版本:{}", System.getProperty("java.version"));
- log.info("Java主目录:{}", System.getProperty("java.home"));
- log.info("Java库目录:{}", System.getProperty("java.library.path"));
- log.info("ClassPath:{}", System.getProperty("java.class.path"));
- log.info("虚拟机名称:{}", System.getProperty("java.vm.name"));
- log.info("虚拟机参数:{}", runtimeMXBean.getInputArguments().stream().collect(Collectors.joining(" ")));
- log.info("虚拟机空闲内存:{}", freeMemory);
- log.info("虚拟机已用内存:{}", totalMemory);
- log.info("虚拟机最大内存:{}", maxMemory);
- log.info("工作目录:{}", System.getProperty("user.dir"));
- log.info("用户目录:{}", System.getProperty("user.home"));
- log.info("临时目录:{}", System.getProperty("java.io.tmpdir"));
- log.info("文件编码:{}", System.getProperty("file.encoding"));
- this.applicationContext.getBeansOfType(TaskExecutor.class).forEach((k, v) -> {
- log.info("系统任务线程池:{}-{}", k, v);
- });
- this.applicationContext.getBeansOfType(TaskScheduler.class).forEach((k, v) -> {
- log.info("系统定时任务线程池:{}-{}", k, v);
- });
- this.registerException();
- }
-
- /**
- * 异常注册
- */
- public void registerException() {
- ErrorUtils.register(MessageCode.CODE_3400, BindException.class);
- ErrorUtils.register(MessageCode.CODE_3400, TypeMismatchException.class);
- ErrorUtils.register(MessageCode.CODE_3404, NoHandlerFoundException.class);
- ErrorUtils.register(MessageCode.CODE_3503, AsyncRequestTimeoutException.class);
- ErrorUtils.register(MessageCode.CODE_3500, MissingPathVariableException.class);
- ErrorUtils.register(MessageCode.CODE_3400, ServletRequestBindingException.class);
- ErrorUtils.register(MessageCode.CODE_3400, HttpMessageNotReadableException.class);
- ErrorUtils.register(MessageCode.CODE_3400, MethodArgumentNotValidException.class);
- ErrorUtils.register(MessageCode.CODE_3500, ConversionNotSupportedException.class);
- ErrorUtils.register(MessageCode.CODE_3500, HttpMessageNotWritableException.class);
- ErrorUtils.register(MessageCode.CODE_3400, MissingServletRequestPartException.class);
- ErrorUtils.register(MessageCode.CODE_3415, HttpMediaTypeNotSupportedException.class);
- ErrorUtils.register(MessageCode.CODE_3406, HttpMediaTypeNotAcceptableException.class);
- ErrorUtils.register(MessageCode.CODE_3405, HttpRequestMethodNotSupportedException.class);
- ErrorUtils.register(MessageCode.CODE_3400, MissingServletRequestParameterException.class);
- }
-
- @PreDestroy
- public void destroy() {
- log.info("系统关闭:{}", this.name);
- // 刷出日志缓存
- final ILoggerFactory factory = LoggerFactory.getILoggerFactory();
- if (factory instanceof LoggerContext context) {
- context.stop();
- }
- // 定时强制关机
- final Timer timer = new Timer(true);
- timer.schedule(new TimerTask() {
- @Override
- public void run() {
- // 强制关机:无效
-// System.exit(0);
- // 强制关机
- Runtime.getRuntime().halt(0);
- }
- }, 5000);
- }
-
-}
\ No newline at end of file
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/BootAutoConfiguration.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/BootAutoConfiguration.java
new file mode 100644
index 0000000..e710270
--- /dev/null
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/BootAutoConfiguration.java
@@ -0,0 +1,229 @@
+package com.acgist.taoyao.boot.configuration;
+
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.stream.Collectors;
+
+import org.slf4j.ILoggerFactory;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.ConversionNotSupportedException;
+import org.springframework.beans.TypeMismatchException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration;
+import org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.task.TaskExecutorBuilder;
+import org.springframework.boot.task.TaskSchedulerBuilder;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.Primary;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.core.task.TaskExecutor;
+import org.springframework.http.converter.HttpMessageNotReadableException;
+import org.springframework.http.converter.HttpMessageNotWritableException;
+import org.springframework.scheduling.TaskScheduler;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.validation.BindException;
+import org.springframework.web.HttpMediaTypeNotAcceptableException;
+import org.springframework.web.HttpMediaTypeNotSupportedException;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.MissingPathVariableException;
+import org.springframework.web.bind.MissingServletRequestParameterException;
+import org.springframework.web.bind.ServletRequestBindingException;
+import org.springframework.web.context.request.async.AsyncRequestTimeoutException;
+import org.springframework.web.multipart.support.MissingServletRequestPartException;
+import org.springframework.web.servlet.NoHandlerFoundException;
+
+import com.acgist.taoyao.boot.controller.TaoyaoControllerAdvice;
+import com.acgist.taoyao.boot.controller.TaoyaoErrorController;
+import com.acgist.taoyao.boot.model.MessageCode;
+import com.acgist.taoyao.boot.property.IdProperties;
+import com.acgist.taoyao.boot.property.MediaProperties;
+import com.acgist.taoyao.boot.property.ScriptProperties;
+import com.acgist.taoyao.boot.property.SecurityProperties;
+import com.acgist.taoyao.boot.property.SocketProperties;
+import com.acgist.taoyao.boot.property.TaoyaoProperties;
+import com.acgist.taoyao.boot.property.WebrtcProperties;
+import com.acgist.taoyao.boot.service.IdService;
+import com.acgist.taoyao.boot.service.impl.IdServiceImpl;
+import com.acgist.taoyao.boot.utils.ErrorUtils;
+import com.acgist.taoyao.boot.utils.FileUtils;
+import com.acgist.taoyao.boot.utils.HTTPUtils;
+import com.acgist.taoyao.boot.utils.JSONUtils;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import ch.qos.logback.classic.LoggerContext;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.PreDestroy;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 全局自动配置
+ *
+ * @author acgist
+ */
+@Slf4j
+@Order(Ordered.HIGHEST_PRECEDENCE)
+@Import({ TaskExecutionAutoConfiguration.class, TaskSchedulingAutoConfiguration.class })
+@EnableAsync
+@Configuration
+@EnableScheduling
+@EnableAspectJAutoProxy(exposeProxy = false)
+@EnableConfigurationProperties({
+ IdProperties.class,
+ MediaProperties.class,
+ ScriptProperties.class,
+ SocketProperties.class,
+ TaoyaoProperties.class,
+ WebrtcProperties.class,
+ SecurityProperties.class
+})
+public class BootAutoConfiguration {
+
+ @Value("${spring.application.name:taoyao}")
+ private String name;
+
+ @Autowired
+ private ApplicationContext applicationContext;
+
+ @Bean
+ @ConditionalOnMissingBean
+ public IdService idService() {
+ return new IdServiceImpl();
+ }
+
+ @Bean
+ @Primary
+ @ConditionalOnMissingBean
+ public ObjectMapper objectMapper() {
+ return JSONUtils.buildMapper();
+ }
+
+ @Bean
+ @Primary
+ @ConditionalOnMissingBean
+ public TaskExecutor taskExecutor(TaskExecutorBuilder builder) {
+ return builder.build();
+ }
+
+ @Bean
+ @Primary
+ @ConditionalOnMissingBean
+ public TaskScheduler taskScheduler(TaskSchedulerBuilder builder) {
+ return builder.build();
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public TaoyaoErrorController taoyaoErrorController() {
+ return new TaoyaoErrorController();
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public TaoyaoControllerAdvice taoyaoControllerAdvice() {
+ return new TaoyaoControllerAdvice();
+ }
+
+ @Bean
+ @Autowired
+ public CommandLineRunner successCommandLineRunner(
+ TaskExecutor taskExecutor,
+ TaoyaoProperties taoyaoProperties
+ ) {
+ return new CommandLineRunner() {
+ @Override
+ public void run(String ... args) throws Exception {
+ HTTPUtils.init(taoyaoProperties.getTimeout(), taskExecutor);
+ log.info("项目启动成功:{}", BootAutoConfiguration.this.name);
+ }
+ };
+ }
+
+ @PostConstruct
+ public void init() {
+ final Runtime runtime = Runtime.getRuntime();
+ final RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
+ final String freeMemory = FileUtils.formatSize(runtime.freeMemory());
+ final String totalMemory = FileUtils.formatSize(runtime.totalMemory());
+ final String maxMemory = FileUtils.formatSize(runtime.maxMemory());
+ log.info("操作系统名称:{}", System.getProperty("os.name"));
+ log.info("操作系统架构:{}", System.getProperty("os.arch"));
+ log.info("操作系统版本:{}", System.getProperty("os.version"));
+ log.info("可用的处理器数量:{}", runtime.availableProcessors());
+ log.info("Java版本:{}", System.getProperty("java.version"));
+ log.info("Java主目录:{}", System.getProperty("java.home"));
+ log.info("Java库目录:{}", System.getProperty("java.library.path"));
+ log.info("ClassPath:{}", System.getProperty("java.class.path"));
+ log.info("虚拟机名称:{}", System.getProperty("java.vm.name"));
+ log.info("虚拟机参数:{}", runtimeMXBean.getInputArguments().stream().collect(Collectors.joining(" ")));
+ log.info("虚拟机空闲内存:{}", freeMemory);
+ log.info("虚拟机已用内存:{}", totalMemory);
+ log.info("虚拟机最大内存:{}", maxMemory);
+ log.info("工作目录:{}", System.getProperty("user.dir"));
+ log.info("用户目录:{}", System.getProperty("user.home"));
+ log.info("临时目录:{}", System.getProperty("java.io.tmpdir"));
+ log.info("文件编码:{}", System.getProperty("file.encoding"));
+ this.applicationContext.getBeansOfType(TaskExecutor.class).forEach((k, v) -> {
+ log.info("系统任务线程池:{}-{}", k, v);
+ });
+ this.applicationContext.getBeansOfType(TaskScheduler.class).forEach((k, v) -> {
+ log.info("系统定时任务线程池:{}-{}", k, v);
+ });
+ this.registerException();
+ }
+
+ /**
+ * 异常注册
+ */
+ public void registerException() {
+ ErrorUtils.register(MessageCode.CODE_3400, BindException.class);
+ ErrorUtils.register(MessageCode.CODE_3400, TypeMismatchException.class);
+ ErrorUtils.register(MessageCode.CODE_3404, NoHandlerFoundException.class);
+ ErrorUtils.register(MessageCode.CODE_3503, AsyncRequestTimeoutException.class);
+ ErrorUtils.register(MessageCode.CODE_3500, MissingPathVariableException.class);
+ ErrorUtils.register(MessageCode.CODE_3400, ServletRequestBindingException.class);
+ ErrorUtils.register(MessageCode.CODE_3400, HttpMessageNotReadableException.class);
+ ErrorUtils.register(MessageCode.CODE_3400, MethodArgumentNotValidException.class);
+ ErrorUtils.register(MessageCode.CODE_3500, ConversionNotSupportedException.class);
+ ErrorUtils.register(MessageCode.CODE_3500, HttpMessageNotWritableException.class);
+ ErrorUtils.register(MessageCode.CODE_3400, MissingServletRequestPartException.class);
+ ErrorUtils.register(MessageCode.CODE_3415, HttpMediaTypeNotSupportedException.class);
+ ErrorUtils.register(MessageCode.CODE_3406, HttpMediaTypeNotAcceptableException.class);
+ ErrorUtils.register(MessageCode.CODE_3405, HttpRequestMethodNotSupportedException.class);
+ ErrorUtils.register(MessageCode.CODE_3400, MissingServletRequestParameterException.class);
+ }
+
+ @PreDestroy
+ public void destroy() {
+ log.info("系统关闭:{}", this.name);
+ // 刷出日志缓存
+ final ILoggerFactory factory = LoggerFactory.getILoggerFactory();
+ if (factory instanceof LoggerContext context) {
+ context.stop();
+ }
+ // 定时强制关机
+ final Timer timer = new Timer(true);
+ timer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ // 强制关机:无效
+// System.exit(0);
+ // 强制关机
+ Runtime.getRuntime().halt(0);
+ }
+ }, 5000);
+ }
+
+}
\ No newline at end of file
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SpringDocAutoConfiguration.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/SpringDocAutoConfiguration.java
similarity index 89%
rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SpringDocAutoConfiguration.java
rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/SpringDocAutoConfiguration.java
index 5e1d004..7235d13 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/SpringDocAutoConfiguration.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/SpringDocAutoConfiguration.java
@@ -1,4 +1,4 @@
-package com.acgist.taoyao.boot.config;
+package com.acgist.taoyao.boot.configuration;
import java.util.List;
@@ -22,11 +22,11 @@ import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
/**
- * 文档配置
+ * 文档自动配置
*
* @author acgist
*/
-@Profile("dev")
+@Profile({ "dev", "local" })
@Configuration
@ConditionalOnClass(OpenAPI.class)
public class SpringDocAutoConfiguration {
@@ -43,7 +43,7 @@ public class SpringDocAutoConfiguration {
private TaoyaoProperties taoyaoProperties;
@Bean
- public GroupedOpenApi roomApi() {
+ public GroupedOpenApi signalApi() {
return GroupedOpenApi.builder()
.group("signal")
.displayName("信令")
@@ -63,8 +63,8 @@ public class SpringDocAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public OpenAPI openAPI() {
- // 本地测试不要配置服务器的信息
return new OpenAPI()
+// .servers(null)
.info(this.buildInfo())
.security(this.buildSecurity())
.components(this.buildComponents());
@@ -96,12 +96,12 @@ public class SpringDocAutoConfiguration {
*/
private License buildLicense() {
return new License()
- .name("Apache 2.0")
- .url("https://www.apache.org/licenses/LICENSE-2.0.html");
+ .url("https://www.apache.org/licenses/LICENSE-2.0.html")
+ .name("Apache 2.0");
}
/**
- * @return 授权
+ * @return 安全授权
*/
private List buildSecurity() {
return List.of(
@@ -111,7 +111,7 @@ public class SpringDocAutoConfiguration {
}
/**
- * @return 授权
+ * @return 安全授权
*/
private Components buildComponents() {
return new Components()
@@ -119,7 +119,7 @@ public class SpringDocAutoConfiguration {
}
/**
- * @return 授权
+ * @return 授权模式
*/
private SecurityScheme buildSecurityScheme() {
return new SecurityScheme()
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebMvcConfigurerAutoConfiguration.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/WebMvcConfigurerAutoConfiguration.java
similarity index 85%
rename from taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebMvcConfigurerAutoConfiguration.java
rename to taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/WebMvcConfigurerAutoConfiguration.java
index cb0456a..bf646fd 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/WebMvcConfigurerAutoConfiguration.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/WebMvcConfigurerAutoConfiguration.java
@@ -1,4 +1,4 @@
-package com.acgist.taoyao.boot.config;
+package com.acgist.taoyao.boot.configuration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
@@ -11,7 +11,7 @@ import com.acgist.taoyao.boot.interceptor.InterceptorAdapter;
import lombok.extern.slf4j.Slf4j;
/**
- * MVC配置
+ * MVC自动配置
*
* @author acgist
*/
@@ -28,7 +28,7 @@ public class WebMvcConfigurerAutoConfiguration implements WebMvcConfigurer {
.sorted((a, z) -> a.getValue().compareTo(z.getValue()))
.forEach(entry -> {
final InterceptorAdapter value = entry.getValue();
- log.info("加载拦截器:{} - {}", String.format("%-32s", entry.getKey()), value.name());
+ log.info("注册MVC拦截器:{} - {}", String.format("%-32s", entry.getKey()), value.name());
registry.addInterceptor(value).addPathPatterns(value.pathPattern());
});
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/controller/TaoyaoControllerAdvice.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/controller/TaoyaoControllerAdvice.java
index 6287e0a..dffe949 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/controller/TaoyaoControllerAdvice.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/controller/TaoyaoControllerAdvice.java
@@ -6,6 +6,8 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.utils.ErrorUtils;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@@ -14,9 +16,11 @@ import jakarta.servlet.http.HttpServletResponse;
*
* @author acgist
*/
+@Tag(name = "统一异常处理", description = "全局统一异常处理")
@RestControllerAdvice
public class TaoyaoControllerAdvice {
+ @Operation(summary = "统一异常处理", description = "全局统一异常处理")
@ExceptionHandler(Exception.class)
public Message exception(Exception e, HttpServletRequest request, HttpServletResponse response) {
return ErrorUtils.message(e, request, response);
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/controller/TaoyaoErrorController.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/controller/TaoyaoErrorController.java
index a85d820..145ca34 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/controller/TaoyaoErrorController.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/controller/TaoyaoErrorController.java
@@ -21,7 +21,7 @@ import jakarta.servlet.http.HttpServletResponse;
@RestController
public class TaoyaoErrorController implements ErrorController {
- @Operation(summary = "统一错误地址", description = "全局统一错误地址")
+ @Operation(summary = "统一错误页面", description = "全局统一错误页面")
@RequestMapping(value = ErrorUtils.ERROR_PATH)
public Message index(HttpServletRequest request, HttpServletResponse response) {
return ErrorUtils.message(request, response);
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/interceptor/InterceptorAdapter.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/interceptor/InterceptorAdapter.java
index bf17ca8..d220a1d 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/interceptor/InterceptorAdapter.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/interceptor/InterceptorAdapter.java
@@ -4,11 +4,11 @@ import org.springframework.core.Ordered;
import org.springframework.web.servlet.HandlerInterceptor;
/**
- * 拦截器适配器
+ * MVC拦截器适配器
*
* @author acgist
*/
-public abstract class InterceptorAdapter implements Ordered, HandlerInterceptor, Comparable {
+public abstract class InterceptorAdapter implements Ordered, Comparable, HandlerInterceptor {
/**
* @return 名称
@@ -21,8 +21,8 @@ public abstract class InterceptorAdapter implements Ordered, HandlerInterceptor,
public abstract String[] pathPattern();
@Override
- public int compareTo(InterceptorAdapter o) {
- return Integer.compare(this.getOrder(), o.getOrder());
+ public int compareTo(InterceptorAdapter target) {
+ return Integer.compare(this.getOrder(), target.getOrder());
}
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Message.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Message.java
index 7a74aa6..fd77d36 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Message.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Message.java
@@ -1,6 +1,7 @@
package com.acgist.taoyao.boot.model;
import java.io.Serializable;
+import java.util.HashMap;
import org.apache.commons.lang3.StringUtils;
@@ -15,6 +16,7 @@ import lombok.Setter;
/**
* 消息
+ * 接口、信令、媒体信令通用消息模型
*
* @author acgist
*/
@@ -50,8 +52,6 @@ public class Message implements Cloneable, Serializable {
private Object body;
/**
- * 重载方法
- *
* @param code 状态编码
*/
public void setCode(String code) {
@@ -97,7 +97,7 @@ public class Message implements Cloneable, Serializable {
}
/**
- * @return 错误消息
+ * @return 失败消息
*/
public static final Message fail() {
return fail(null, null, null);
@@ -106,7 +106,7 @@ public class Message implements Cloneable, Serializable {
/**
* @param code 状态编码
*
- * @return 错误消息
+ * @return 失败消息
*/
public static final Message fail(MessageCode code) {
return fail(code, null, null);
@@ -116,7 +116,7 @@ public class Message implements Cloneable, Serializable {
* @param code 状态编码
* @param body 消息主体
*
- * @return 错误消息
+ * @return 失败消息
*/
public static final Message fail(MessageCode code, Object body) {
return fail(code, null, body);
@@ -125,7 +125,7 @@ public class Message implements Cloneable, Serializable {
/**
* @param message 状态描述
*
- * @return 错误消息
+ * @return 失败消息
*/
public static final Message fail(String message) {
return fail(null, message, null);
@@ -135,7 +135,7 @@ public class Message implements Cloneable, Serializable {
* @param message 状态描述
* @param body 消息主体
*
- * @return 错误消息
+ * @return 失败消息
*/
public static final Message fail(String message, Object body) {
return fail(null, message, body);
@@ -145,7 +145,7 @@ public class Message implements Cloneable, Serializable {
* @param code 状态编码
* @param message 状态描述
*
- * @return 错误消息
+ * @return 失败消息
*/
public static final Message fail(MessageCode code, String message) {
return fail(code, message, null);
@@ -156,7 +156,7 @@ public class Message implements Cloneable, Serializable {
* @param message 状态描述
* @param body 消息主体
*
- * @return 错误消息
+ * @return 失败消息
*/
public static final Message fail(MessageCode code, String message, Object body) {
final Message failMessage = new Message();
@@ -171,7 +171,18 @@ public class Message implements Cloneable, Serializable {
}
/**
- * 克隆排除消息主体
+ * 克隆消息设置Map消息主体
+ *
+ * @return 克隆消息
+ */
+ public Message CloneWithMapBody() {
+ final Message message = this.clone();
+ message.setBody(new HashMap<>());
+ return message;
+ }
+
+ /**
+ * 克隆消息排除消息主体
*
* @return 克隆消息
*/
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/MessageCodeException.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/MessageCodeException.java
index 23a5551..0368cbd 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/MessageCodeException.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/MessageCodeException.java
@@ -22,7 +22,7 @@ public class MessageCodeException extends RuntimeException {
private final MessageCode code;
/**
- * @param message 错误消息
+ * @param message 异常消息
*
* @return 状态编码异常
*/
@@ -32,7 +32,7 @@ public class MessageCodeException extends RuntimeException {
/**
* @param t 异常
- * @param message 错误消息
+ * @param message 异常消息
*
* @return 状态编码异常
*/
@@ -42,7 +42,7 @@ public class MessageCodeException extends RuntimeException {
/**
* @param code 状态编码
- * @param message 错误消息
+ * @param message 异常消息
*
* @return 状态编码异常
*/
@@ -53,7 +53,7 @@ public class MessageCodeException extends RuntimeException {
/**
* @param t 异常
* @param code 状态编码
- * @param message 错误消息
+ * @param message 异常消息
*
* @return 状态编码异常
*/
@@ -70,7 +70,7 @@ public class MessageCodeException extends RuntimeException {
/**
* @param t 异常
* @param code 状态编码
- * @param message 错误消息
+ * @param message 异常消息
*/
public MessageCodeException(Throwable t, MessageCode code, String message) {
super(message, t);
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Model.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Model.java
deleted file mode 100644
index c74533d..0000000
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Model.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.acgist.taoyao.boot.model;
-
-import java.io.Serializable;
-import java.time.LocalDateTime;
-
-import com.acgist.taoyao.boot.utils.JSONUtils;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * Model
- *
- * @author acgist
- */
-@Getter
-@Setter
-@Schema(title = "模型", description = "模型")
-@EqualsAndHashCode(callSuper = false, of = "id")
-public abstract class Model implements Cloneable, Serializable {
-
- private static final long serialVersionUID = 1L;
-
- /**
- * ID
- */
- @Schema(title = "标识", description = "标识")
- private Long id;
- /**
- * 创建时间
- */
- @Schema(title = "创建时间", description = "创建时间")
- private LocalDateTime createDate;
- /**
- * 修改时间
- */
- @Schema(title = "修改时间", description = "修改时间")
- private LocalDateTime modifyDate;
-
- @Override
- public String toString() {
- return JSONUtils.toJSON(this);
- }
-
-}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/IdProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/IdProperties.java
index e0cb249..40df398 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/IdProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/IdProperties.java
@@ -2,6 +2,7 @@ package com.acgist.taoyao.boot.property;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@@ -12,16 +13,13 @@ import lombok.Setter;
*/
@Getter
@Setter
+@Schema(title = "ID配置", description = "ID配置")
@ConfigurationProperties(prefix = "taoyao.id")
public class IdProperties {
- /**
- * 机器序号
- */
+ @Schema(title = "机器序号", description = "机器序号")
private Integer index;
- /**
- * 最大序号
- */
+ @Schema(title = "最大序号", description = "最大序号")
private Integer maxIndex;
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaAudioProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaAudioProperties.java
index c3690ac..b1bbcc4 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaAudioProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaAudioProperties.java
@@ -21,35 +21,17 @@ public class MediaAudioProperties {
*/
public enum Format {
- /**
- * PCMA
- */
+ G722,
PCMA,
- /**
- * PCMU
- */
PCMU,
- /**
- * OPUS
- */
OPUS;
}
- /**
- * 格式
- */
- @Schema(title = "格式", description = "格式")
+ @Schema(title = "格式", description = "格式", example = "G722|PCMA|PCMU|OPUS")
private Format format;
- /**
- * 采样数
- */
@Schema(title = "采样数", description = "采样数", example = "16")
private Integer sampleSize;
- /**
- * 采样率
- * 8000|16000|32000|48000
- */
@Schema(title = "采样率", description = "采样率", example = "8000|16000|32000|48000")
private Integer sampleRate;
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaProperties.java
index 95da112..0f0cf72 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaProperties.java
@@ -4,8 +4,6 @@ import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@@ -21,51 +19,21 @@ import lombok.Setter;
@ConfigurationProperties(prefix = "taoyao.media")
public class MediaProperties {
- /**
- * 音频配置
- */
@Schema(title = "音频配置", description = "音频配置")
private MediaAudioProperties audio;
- /**
- * 视频配置
- */
@Schema(title = "视频配置", description = "视频配置")
private MediaVideoProperties video;
- /**
- * 4K视频
- */
- @Schema(title = "4K视频", description = "4K视频")
+ @Schema(title = "4K视频配置", description = "4K视频配置")
private MediaVideoProperties udVideo;
- /**
- * 2K视频
- */
- @Schema(title = "2K视频", description = "2K视频")
+ @Schema(title = "2K视频配置", description = "2K视频配置")
private MediaVideoProperties qdVideo;
- /**
- * 超清视频
- */
- @Schema(title = "超清视频", description = "超清视频")
+ @Schema(title = "超清视频配置", description = "超清视频配置")
private MediaVideoProperties fdVideo;
- /**
- * 高清视频
- */
- @Schema(title = "高清视频", description = "高清视频")
+ @Schema(title = "高清视频配置", description = "高清视频配置")
private MediaVideoProperties hdVideo;
- /**
- * 标清视频
- */
- @Schema(title = "标清视频", description = "标清视频")
+ @Schema(title = "标清视频配置", description = "标清视频配置")
private MediaVideoProperties sdVideo;
- /**
- * 媒体服务配置
- */
@Schema(title = "媒体服务配置", description = "媒体服务配置")
private List mediaServerList;
- /**
- * 录像存放路径
- */
- @Schema(title = "录像存放路径", description = "录像存放路径")
- @JsonIgnore
- private String recordStoragePath;
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaServerProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaServerProperties.java
index e48e004..df25d26 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaServerProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaServerProperties.java
@@ -1,7 +1,5 @@
package com.acgist.taoyao.boot.property;
-import com.fasterxml.jackson.annotation.JsonIgnore;
-
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@@ -16,47 +14,21 @@ import lombok.Setter;
@Schema(title = "媒体服务配置", description = "媒体服务配置")
public class MediaServerProperties {
- /**
- * 媒体服务标识
- */
@Schema(title = "媒体服务标识", description = "媒体服务标识")
private String mediaId;
- /**
- * 是否启用
- */
@Schema(title = "是否启用", description = "是否启用")
private Boolean enabled;
- /**
- * 主机
- */
@Schema(title = "主机", description = "主机")
private String host;
- /**
- * 端口
- */
@Schema(title = "端口", description = "端口")
private Integer port;
- /**
- * 协议
- */
@Schema(title = "协议", description = "协议")
private String schema;
- /**
- * 用户
- */
@Schema(title = "用户", description = "用户")
- @JsonIgnore
private String username;
- /**
- * 密码
- */
@Schema(title = "密码", description = "密码")
- @JsonIgnore
private String password;
- /**
- * @return 完整地址
- */
@Schema(title = "完整地址", description = "完整地址")
public String getAddress() {
return this.schema + "://" + this.host + ":" + this.port;
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaVideoProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaVideoProperties.java
index 5e84c0f..cb8988f 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaVideoProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/MediaVideoProperties.java
@@ -21,59 +21,26 @@ public class MediaVideoProperties {
*/
public enum Format {
- /**
- * VP8
- */
VP8,
- /**
- * VP9
- */
VP9,
- /**
- * H264
- */
H264,
- /**
- * H265
- */
H265;
}
- /**
- * 格式
- */
- @Schema(title = "格式", description = "格式")
+ @Schema(title = "格式", description = "格式", example = "VP8|VP9|H264|H265")
private Format format;
- /**
- * 码率(画质)
- */
@Schema(title = "码率", description = "码率影响画质", example = "600|1200|1500|1800")
private Integer bitrate;
- /**
- * 帧率(流畅)
- */
- @Schema(title = "帧率", description = "帧率影响流程", example = "20|24|30|60")
+ @Schema(title = "帧率", description = "帧率影响流畅", example = "20|24|30|60")
private Integer frameRate;
- /**
- * 分辨率(画面大小)
- */
@Schema(title = "分辨率", description = "分辨率影响画面大小", example = "1920*1080|1280*720")
private String resolution;
- /**
- * 宽度
- */
@Schema(title = "宽度", description = "宽度")
private Integer width;
- /**
- * 高度
- */
@Schema(title = "高度", description = "高度")
private Integer height;
- /**
- * @return 宽度
- */
public Integer getWidth() {
if(this.width == null) {
final int index = this.resolution.indexOf('*');
@@ -82,9 +49,6 @@ public class MediaVideoProperties {
return this.width;
}
- /**
- * @return 高度
- */
public Integer getHeight() {
if(this.height == null) {
final int index = this.resolution.indexOf('*');
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/ScriptProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/ScriptProperties.java
index 44b20da..e7c4d4d 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/ScriptProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/ScriptProperties.java
@@ -2,6 +2,7 @@ package com.acgist.taoyao.boot.property;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@@ -12,36 +13,23 @@ import lombok.Setter;
*/
@Getter
@Setter
+@Schema(title = "脚本配置", description = "脚本配置")
@ConfigurationProperties(prefix = "taoyao.script")
public class ScriptProperties {
- /**
- * 是否启用
- */
+ @Schema(title = "是否启用", description = "是否启用")
private Boolean enabled;
- /**
- * 重启媒体服务
- */
+ @Schema(title = "重启媒体服务", description = "重启媒体服务")
private String mediaReboot;
- /**
- * 关闭媒体服务
- */
+ @Schema(title = "关闭媒体服务", description = "关闭媒体服务")
private String mediaShutdown;
- /**
- * 重启系统
- */
+ @Schema(title = "重启系统", description = "重启系统")
private String systemReboot;
- /**
- * 关闭系统
- */
+ @Schema(title = "关闭系统", description = "关闭系统")
private String systemShutdown;
- /**
- * 重启平台
- */
+ @Schema(title = "重启平台", description = "重启平台")
private String platformReboot;
- /**
- * 关闭平台
- */
+ @Schema(title = "关闭平台", description = "关闭平台")
private String platformShutdown;
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SecurityProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SecurityProperties.java
index ca99a1b..059bc99 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SecurityProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SecurityProperties.java
@@ -2,6 +2,7 @@ package com.acgist.taoyao.boot.property;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@@ -12,28 +13,19 @@ import lombok.Setter;
*/
@Getter
@Setter
+@Schema(title = "安全配置", description = "安全配置")
@ConfigurationProperties(prefix = "taoyao.security")
public class SecurityProperties {
- /**
- * 是否启用
- */
+ @Schema(title = "是否启用", description = "是否启用")
private Boolean enabled;
- /**
- * 范围
- */
+ @Schema(title = "安全范围", description = "安全范围")
private String realm;
- /**
- * 公共地址
- */
+ @Schema(title = "公共地址", description = "公共地址")
private String[] permit;
- /**
- * 名称
- */
+ @Schema(title = "名称", description = "名称")
private String username;
- /**
- * 密码
- */
+ @Schema(title = "密码", description = "密码")
private String password;
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SocketProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SocketProperties.java
index e19291c..743b5e0 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SocketProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/SocketProperties.java
@@ -2,6 +2,7 @@ package com.acgist.taoyao.boot.property;
import org.springframework.boot.context.properties.ConfigurationProperties;
+import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
@@ -12,48 +13,29 @@ import lombok.Setter;
*/
@Getter
@Setter
+@Schema(title = "Socket信令配置", description = "Socket信令配置")
@ConfigurationProperties(prefix = "taoyao.socket")
public class SocketProperties {
- /**
- * 是否启用
- */
+ @Schema(title = "是否启用", description = "是否启用")
private Boolean enabled;
- /**
- * 监听地址
- */
+ @Schema(title = "监听地址", description = "监听地址")
private String host;
- /**
- * 监听端口
- */
+ @Schema(title = "监听端口", description = "监听端口")
private Integer port;
- /**
- * 超时时间
- */
- private Integer timeout;
- /**
- * 线程队列长度
- */
+ @Schema(title = "超时时间", description = "超时时间")
+ private Long timeout;
+ @Schema(title = "队列长度", description = "队列长度")
private Integer queueSize;
- /**
- * 最小线程数量
- */
- private Integer threadMin;
- /**
- * 最大线程数量
- */
- private Integer threadMax;
- /**
- * 线程池的前缀
- */
+ @Schema(title = "最小线程数量", description = "最小线程数量")
+ private Integer minThread;
+ @Schema(title = "最大线程数量", description = "最大线程数量")
+ private Integer maxThread;
+ @Schema(title = "线程池的前缀", description = "线程池的前缀")
private String threadNamePrefix;
- /**
- * 线程销毁时间
- */
- private Integer keepAliveTime;
- /**
- * 缓冲大小
- */
+ @Schema(title = "线程销毁时间", description = "线程销毁时间")
+ private Long keepAliveTime;
+ @Schema(title = "缓冲大小", description = "缓冲大小")
private Integer bufferSize;
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/TaoyaoProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/TaoyaoProperties.java
index 6160af0..92492ee 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/TaoyaoProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/TaoyaoProperties.java
@@ -13,32 +13,18 @@ import lombok.Setter;
*/
@Getter
@Setter
+@Schema(title = "平台配置", description = "平台配置")
@ConfigurationProperties(prefix = "taoyao")
public class TaoyaoProperties {
- /**
- * 项目地址
- */
@Schema(title = "项目地址", description = "项目地址")
private String url;
- /**
- * 项目名称
- */
@Schema(title = "项目名称", description = "项目名称")
private String name;
- /**
- * 项目版本
- */
@Schema(title = "项目版本", description = "项目版本")
private String version;
- /**
- * 项目描述
- */
@Schema(title = "项目描述", description = "项目描述")
private String description;
- /**
- * 超时时间
- */
@Schema(title = "超时时间", description = "超时时间")
private Long timeout;
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcProperties.java
index 1ad5732..04dd33d 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcProperties.java
@@ -17,14 +17,8 @@ import lombok.Setter;
@ConfigurationProperties(prefix = "taoyao.webrtc")
public class WebrtcProperties {
- /**
- * STUN服务器
- */
@Schema(title = "STUN服务器", description = "STUN服务器")
private WebrtcStunProperties[] stun;
- /**
- * TURN服务器
- */
@Schema(title = "TURN服务器", description = "TURN服务器")
private WebrtcTurnProperties[] turn;
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcStunProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcStunProperties.java
index 23b3575..f9e64e1 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcStunProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcStunProperties.java
@@ -14,20 +14,11 @@ import lombok.Setter;
@Schema(title = "WebRTC STUN配置", description = "WebRTC STUN配置")
public class WebrtcStunProperties {
- /**
- * 主机
- */
@Schema(title = "主机", description = "主机")
protected String host;
- /**
- * 端口
- */
@Schema(title = "端口", description = "端口")
protected Integer port;
- /**
- * @return 完整地址
- */
@Schema(title = "完整地址", description = "完整地址")
public String getAddress() {
return "stun://" + this.host + ":" + this.port;
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcTurnProperties.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcTurnProperties.java
index f1dab81..27eb9e0 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcTurnProperties.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/property/WebrtcTurnProperties.java
@@ -14,20 +14,11 @@ import lombok.Setter;
@Schema(title = "WebRTC TURN配置", description = "WebRTC TURN配置")
public class WebrtcTurnProperties extends WebrtcStunProperties {
- /**
- * 帐号
- */
@Schema(title = "帐号", description = "帐号")
private String username;
- /**
- * 密码
- */
@Schema(title = "密码", description = "密码")
private String password;
- /**
- * @return 完整地址
- */
@Schema(title = "完整地址", description = "完整地址")
public String getAddress() {
return "turn://" + this.host + ":" + this.port;
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/CloseableUtils.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/CloseableUtils.java
index a5f0caf..a587214 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/CloseableUtils.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/CloseableUtils.java
@@ -10,7 +10,7 @@ import lombok.extern.slf4j.Slf4j;
* @author acgist
*/
@Slf4j
-public class CloseableUtils {
+public final class CloseableUtils {
private CloseableUtils() {
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/DateUtils.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/DateUtils.java
index 650e04c..e0739fb 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/DateUtils.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/DateUtils.java
@@ -1,7 +1,5 @@
package com.acgist.taoyao.boot.utils;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@@ -10,80 +8,47 @@ import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Objects;
-import org.apache.commons.lang3.StringUtils;
-
import lombok.Getter;
-import lombok.extern.slf4j.Slf4j;
/**
* 日期工具
*
* @author acgist
*/
-@Slf4j
public final class DateUtils {
private DateUtils() {
}
+
+ /**
+ * 日期
+ *
+ * @author acgist
+ */
+ @Getter
+ public static enum DateStyle {
+
+ YYMMDD("yyMMdd"),
+ YYYYMMDD("yyyyMMdd"),
+ YY_MM_DD("yy-MM-dd"),
+ YYYY_MM_DD("yyyy-MM-dd");
+
+ /**
+ * 格式
+ */
+ private final String format;
+ /**
+ * 格式工具
+ */
+ private final DateTimeFormatter dateTimeFormatter;
+
+ private DateStyle(String format) {
+ this.format = format;
+ this.dateTimeFormatter = DateTimeFormatter.ofPattern(format);
+ }
+
+ }
- /**
- * 默认日期格式
- */
- public static final String YYYY_MM_DD_HH24_MM_SS = "yyyy-MM-dd HH:mm:ss";
-
- /**
- * 日期时间
- *
- * @author acgist
- */
- @Getter
- public static enum DateTimeStyle {
-
- // YYYY
- YYYYMMDD_HH24_MM("yyyyMMdd HH:mm"),
- YYYY_MM_DD_HH24_MM("yyyy-MM-dd HH:mm"),
- YYYYMMDDHH24MMSS("yyyyMMddHHmmss"),
- YYYYMMDDHH24MMSSSSS("yyyyMMddHHmmssSSS"),
- YYYYMMDD_HH24_MM_SS("yyyyMMdd HH:mm:ss"),
- YYYYMMDD_HH24_MM_SS_SSS("yyyyMMdd HH:mm:ss.SSS"),
- YYYY_MM_DD_HH24_MM_SS("yyyy-MM-dd HH:mm:ss"),
- YYYY_MM_DD_HH24_MM_SS_SSS("yyyy-MM-dd HH:mm:ss.SSS"),
- // YY
- YYMMDD_HH24_MM("yyMMdd HH:mm"),
- YY_MM_DD_HH24_MM("yy-MM-dd HH:mm"),
- YYMMDDHH24MMSS("yyMMddHHmmss"),
- YYMMDDHH24MMSSSSS("yyMMddHHmmssSSS"),
- YYMMDD_HH24_MM_SS("yyMMdd HH:mm:ss"),
- YYMMDD_HH24_MM_SS_SSS("yyMMdd HH:mm:ss.SSS"),
- YY_MM_DD_HH24_MM_SS("yy-MM-dd HH:mm:ss"),
- YY_MM_DD_HH24_MM_SS_SSS("yy-MM-dd HH:mm:ss.SSS"),
- // ISO
- YY_MM_DD_HH24_MM_SS_ISO("yy-MM-dd'T'HH:mm:ss"),
- YY_MM_DD_HH24_MM_SS_SSS_ISO("yy-MM-dd'T'HH:mm:ss.SSS"),
- YYYY_MM_DD_HH24_MM_SS_ISO("yyyy-MM-dd'T'HH:mm:ss"),
- YYYY_MM_DD_HH24_MM_SS_SSS_ISO("yyyy-MM-dd'T'HH:mm:ss.SSS"),
- // UTC
- YY_MM_DD_HH24_MM_SS_UTC("yy-MM-dd'T'HH:mm:ss'Z'"),
- YY_MM_DD_HH24_MM_SS_SSS_UTC("yy-MM-dd'T'HH:mm:ss.SSS'Z'"),
- YYYY_MM_DD_HH24_MM_SS_UTC("yyyy-MM-dd'T'HH:mm:ss'Z'"),
- YYYY_MM_DD_HH24_MM_SS_SSS_UTC("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
-
- /**
- * 格式
- */
- private final String format;
- /**
- * 格式工具
- */
- private final DateTimeFormatter dateTimeFormatter;
-
- private DateTimeStyle(String format) {
- this.format = format;
- this.dateTimeFormatter = DateTimeFormatter.ofPattern(format);
- }
-
- }
-
/**
* 时间
*
@@ -115,36 +80,60 @@ public final class DateUtils {
}
}
-
- /**
- * 日期
- *
- * @author acgist
- */
- @Getter
- public static enum DateStyle {
-
- YYMMDD("yyMMdd"),
- YYYYMMDD("yyyyMMdd"),
- YY_MM_DD("yy-MM-dd"),
- YYYY_MM_DD("yyyy-MM-dd");
-
- /**
- * 格式
- */
- private String format;
- /**
- * 格式工具
- */
- private final DateTimeFormatter dateTimeFormatter;
-
- private DateStyle(String format) {
- this.format = format;
- this.dateTimeFormatter = DateTimeFormatter.ofPattern(format);
- }
-
- }
+ /**
+ * 日期时间
+ *
+ * @author acgist
+ */
+ @Getter
+ public static enum DateTimeStyle {
+
+ // YYYY
+ YYYYMMDD_HH24_MM("yyyyMMdd HH:mm"),
+ YYYY_MM_DD_HH24_MM("yyyy-MM-dd HH:mm"),
+ YYYYMMDDHH24MMSS("yyyyMMddHHmmss"),
+ YYYYMMDDHH24MMSSSSS("yyyyMMddHHmmssSSS"),
+ YYYYMMDD_HH24_MM_SS("yyyyMMdd HH:mm:ss"),
+ YYYYMMDD_HH24_MM_SS_SSS("yyyyMMdd HH:mm:ss.SSS"),
+ YYYY_MM_DD_HH24_MM_SS("yyyy-MM-dd HH:mm:ss"),
+ YYYY_MM_DD_HH24_MM_SS_SSS("yyyy-MM-dd HH:mm:ss.SSS"),
+ // YY
+ YYMMDD_HH24_MM("yyMMdd HH:mm"),
+ YY_MM_DD_HH24_MM("yy-MM-dd HH:mm"),
+ YYMMDDHH24MMSS("yyMMddHHmmss"),
+ YYMMDDHH24MMSSSSS("yyMMddHHmmssSSS"),
+ YYMMDD_HH24_MM_SS("yyMMdd HH:mm:ss"),
+ YYMMDD_HH24_MM_SS_SSS("yyMMdd HH:mm:ss.SSS"),
+ YY_MM_DD_HH24_MM_SS("yy-MM-dd HH:mm:ss"),
+ YY_MM_DD_HH24_MM_SS_SSS("yy-MM-dd HH:mm:ss.SSS"),
+ // ISO
+ YY_MM_DD_HH24_MM_SS_ISO("yy-MM-dd'T'HH:mm:ss"),
+ YY_MM_DD_HH24_MM_SS_SSS_ISO("yy-MM-dd'T'HH:mm:ss.SSS"),
+ YYYY_MM_DD_HH24_MM_SS_ISO("yyyy-MM-dd'T'HH:mm:ss"),
+ YYYY_MM_DD_HH24_MM_SS_SSS_ISO("yyyy-MM-dd'T'HH:mm:ss.SSS"),
+ // UTC
+ YY_MM_DD_HH24_MM_SS_UTC("yy-MM-dd'T'HH:mm:ss'Z'"),
+ YY_MM_DD_HH24_MM_SS_SSS_UTC("yy-MM-dd'T'HH:mm:ss.SSS'Z'"),
+ YYYY_MM_DD_HH24_MM_SS_UTC("yyyy-MM-dd'T'HH:mm:ss'Z'"),
+ YYYY_MM_DD_HH24_MM_SS_SSS_UTC("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+
+ /**
+ * 格式
+ */
+ private final String format;
+ /**
+ * 格式工具
+ */
+ private final DateTimeFormatter dateTimeFormatter;
+
+ private DateTimeStyle(String format) {
+ this.format = format;
+ this.dateTimeFormatter = DateTimeFormatter.ofPattern(format);
+ }
+
+ }
+
/**
* 生成时间戳
*
@@ -159,7 +148,7 @@ public final class DateUtils {
/**
* 生成时间戳
*
- * @param localDateTime 时间
+ * @param localDateTime 日期时间
*
* @return 时间戳
*/
@@ -170,43 +159,6 @@ public final class DateUtils {
return DateTimeStyle.YYYYMMDDHH24MMSS.getDateTimeFormatter().format(localDateTime);
}
- /**
- * 日期字符串转换日期
- *
- * @param value 日期字符串
- * @param format 格式
- *
- * @return 日期
- */
- public static final Date parse(String value, String format) {
- if(StringUtils.isEmpty(value) || StringUtils.isEmpty(format)) {
- return null;
- }
- try {
- final SimpleDateFormat formatter = new SimpleDateFormat(format);
- return formatter.parse(value);
- } catch (ParseException e) {
- log.error("字符串转换日期异常:{}-{}", value, format, e);
- }
- return null;
- }
-
- /**
- * 日期格式化字符串
- *
- * @param date 日期
- * @param format 格式
- *
- * @return 日期字符串
- */
- public static final String format(Date date, String format) {
- if(date == null || StringUtils.isEmpty(format)) {
- return null;
- }
- final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
- return simpleDateFormat.format(date);
- }
-
/**
* 日期转化
*
@@ -217,6 +169,17 @@ public final class DateUtils {
public static final LocalDate toLocalDate(Date date) {
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}
+
+ /**
+ * 日期转化
+ *
+ * @param date Date
+ *
+ * @return LocalTime
+ */
+ public static final LocalTime toLocalTime(Date date) {
+ return date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
+ }
/**
* 日期转化
@@ -229,28 +192,6 @@ public final class DateUtils {
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
- /**
- * 日期转化
- *
- * @param localDate LocalDate
- *
- * @return Date
- */
- public static final Date toDate(LocalDate localDate) {
- return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
- }
-
- /**
- * 日期转化
- *
- * @param localDateTime LocalDateTime
- *
- * @return Date
- */
- public static final Date toDate(LocalDateTime localDateTime) {
- return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
- }
-
/**
* 转换毫秒
*
@@ -262,6 +203,18 @@ public final class DateUtils {
return localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
}
+ /**
+ * 格式化日期
+ *
+ * @param localDate LocalDate
+ * @param format 格式
+ *
+ * @return 日期字符串
+ */
+ public static String format(LocalDate localDate, DateStyle format) {
+ return localDate != null && format != null ? format.getDateTimeFormatter().format(localDate) : null;
+ }
+
/**
* 格式化时间
*
@@ -275,24 +228,12 @@ public final class DateUtils {
}
/**
- * 格式化日期
- *
- * @param localDate LocalDate
- * @param format 格式
- *
- * @return 日期字符串
- */
- public static String format(LocalDate localDate, DateStyle format) {
- return localDate != null && format != null ? format.getDateTimeFormatter().format(localDate) : null;
- }
-
- /**
- * 格式化日期
+ * 格式化日期时间
*
* @param localDateTime LocalDateTime
* @param format 格式
*
- * @return 日期字符串
+ * @return 日期时间字符串
*/
public static String format(LocalDateTime localDateTime, DateTimeStyle format) {
return localDateTime != null && format != null ? format.getDateTimeFormatter().format(localDateTime) : null;
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/ErrorUtils.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/ErrorUtils.java
index 937405b..6c6ddab 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/ErrorUtils.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/ErrorUtils.java
@@ -61,19 +61,21 @@ public final class ErrorUtils {
/**
* 注册异常(注意继承顺序)
*
- * @param code 异常编码
+ * @param code 状态编码
* @param clazz 异常类型
*/
public static final void register(MessageCode code, Class> clazz) {
- log.info("注册异常映射:{}-{}", code, clazz);
- CODE_MAPPING.put(clazz, code);
+ log.info("注册状态编码异常映射:{}-{}", code, clazz);
+ synchronized (CODE_MAPPING) {
+ CODE_MAPPING.put(clazz, code);
+ }
}
/**
* @param request 请求
* @param response 响应
*
- * @return 错误信息
+ * @return 错误消息
*/
public static final Message message(HttpServletRequest request, HttpServletResponse response) {
return message(null, request, response);
@@ -84,29 +86,29 @@ public final class ErrorUtils {
* @param request 请求
* @param response 响应
*
- * @return 错误信息
+ * @return 错误消息
*/
public static final Message message(Throwable t, HttpServletRequest request, HttpServletResponse response) {
final Message message;
+ // 错误状态编码
int status = globalStatus(request, response);
+ // 全局异常
final Object globalError = t == null ? globalError(request) : t;
+ // 原始异常
final Object rootError = rootException(globalError);
- if(rootError instanceof MessageCodeException) {
- // 自定义的异常
- final MessageCodeException messageCodeException = (MessageCodeException) rootError;
+ if(rootError instanceof MessageCodeException messageCodeException) {
+ // 状态编码异常
final MessageCode messageCode = messageCodeException.getCode();
status = messageCode.getStatus();
message = Message.fail(messageCode, messageCodeException.getMessage());
- } else if(rootError instanceof Throwable) {
- // 未知异常
- final Throwable throwable = (Throwable) rootError;
+ } else if(rootError instanceof Throwable throwable) {
+ // 未知异常:异常转换
final MessageCode messageCode = messageCode(status, throwable);
status = messageCode.getStatus();
message = Message.fail(messageCode, message(messageCode, throwable));
} else {
// 没有异常
final MessageCode messageCode = MessageCode.of(status);
-// status = messageCode.getStatus();
message = Message.fail(messageCode);
}
// 状态编码
@@ -114,12 +116,13 @@ public final class ErrorUtils {
status = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
}
response.setStatus(status);
+ // 打印信息
final String path = Objects.toString(request.getAttribute(SERVLET_REQUEST_URI), request.getServletPath());
final String query = request.getQueryString();
final String method = request.getMethod();
if(globalError instanceof Throwable) {
log.error("""
- 请求错误
+ 请求异常
请求地址:{}
请求参数:{}
请求方法:{}
@@ -144,7 +147,7 @@ public final class ErrorUtils {
* @param request 请求
* @param response 响应
*
- * @return 响应状态
+ * @return 状态编码
*/
public static final int globalStatus(HttpServletRequest request, HttpServletResponse response) {
final Object status = request.getAttribute(SERVLET_STATUS_CODE);
@@ -174,18 +177,18 @@ public final class ErrorUtils {
}
/**
- * @param status 原始状态
- * @param t 异常
+ * @param status 原始状态编码
+ * @param throwable 异常
*
- * @return 响应状态
+ * @return 状态编码
*
* @see ResponseEntityExceptionHandler
* @see DefaultHandlerExceptionResolver
*/
- public static final MessageCode messageCode(int status, Throwable t) {
+ public static final MessageCode messageCode(int status, Throwable throwable) {
+ final Class> clazz = throwable.getClass();
return CODE_MAPPING.entrySet().stream()
.filter(entry -> {
- final Class> clazz = t.getClass();
final Class> mappingClazz = entry.getKey();
return mappingClazz.equals(clazz) || mappingClazz.isAssignableFrom(clazz);
})
@@ -195,27 +198,28 @@ public final class ErrorUtils {
}
/**
- * @param messageCode 错误编码
- * @param t 异常
+ * @param messageCode 状态编码
+ * @param throwable 异常
*
* @return 异常信息
*/
- public static final String message(MessageCode messageCode, Throwable t) {
- // ValidationException
+ public static final String message(MessageCode messageCode, Throwable throwable) {
+ // 数据校验异常:ValidationException
if(
- t instanceof BindException ||
- t instanceof MethodArgumentNotValidException
+ throwable instanceof BindException ||
+ throwable instanceof MethodArgumentNotValidException
) {
- final BindException bindException = (BindException) t;
+ final BindException bindException = (BindException) throwable;
final List allErrors = bindException.getAllErrors();
return allErrors.stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining(","));
}
// 为了系统安全建议不要直接返回
- final String message = t.getMessage();
- if(messageCode == MessageCode.CODE_9999 && StringUtils.isNotEmpty(message)) {
+ final String message = throwable.getMessage();
+ if(StringUtils.isNotEmpty(message) && messageCode == MessageCode.CODE_9999) {
return message;
}
- if(StringUtils.isNotEmpty(message) && message.length() < 64) {
+ // 匹配含有中文
+ if(StringUtils.isNotEmpty(message) && message.matches(".*[\\u4e00-\\u9fa5]+.*")) {
return message;
}
return messageCode.getMessage();
@@ -229,8 +233,8 @@ public final class ErrorUtils {
* @see #rootException(Throwable)
*/
public static final Object rootException(Object t) {
- if(t instanceof Throwable) {
- return rootException((Throwable) t);
+ if(t instanceof Throwable throwable) {
+ return rootException(throwable);
}
return t;
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/FileUtils.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/FileUtils.java
index d5c66be..a241ec5 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/FileUtils.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/FileUtils.java
@@ -15,6 +15,10 @@ public final class FileUtils {
private FileUtils() {
}
+ /**
+ * 数据进制
+ */
+ private static final int SCALE = 1024;
/**
* 文件大小单位
*/
@@ -36,20 +40,19 @@ public final class FileUtils {
* @return 文件大小
*/
public static final String formatSize(Long size, String unit) {
- if(size == null || size == 0L) {
+ if(size == null || size <= 0L) {
return "0B";
}
int index = ArrayUtils.indexOf(UNITS, unit);
- BigDecimal decimal = BigDecimal.valueOf(size);
- final BigDecimal dataScale = BigDecimal.valueOf(1024);
- while(decimal.compareTo(dataScale) >= 0) {
+ double value = size;
+ while(value >= SCALE) {
if(++index >= UNITS.length) {
index = UNITS.length - 1;
break;
}
- decimal = decimal.divide(dataScale);
+ value /= SCALE;
}
- return decimal.setScale(2, RoundingMode.HALF_UP) + UNITS[index];
+ return BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_EVEN) + UNITS[index];
}
}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/HTTPUtils.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/HTTPUtils.java
index a8c245e..9fdb654 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/HTTPUtils.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/HTTPUtils.java
@@ -7,12 +7,12 @@ import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.time.Duration;
+import java.util.concurrent.Executor;
+import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.X509TrustManager;
-import org.springframework.core.task.TaskExecutor;
-
import lombok.extern.slf4j.Slf4j;
/**
@@ -30,7 +30,7 @@ public final class HTTPUtils {
/**
* 线程池
*/
- private static TaskExecutor executor;
+ private static Executor executor;
private HTTPUtils() {
}
@@ -39,7 +39,7 @@ public final class HTTPUtils {
* @param timeout 超时时间
* @param executor 线程池
*/
- public static final void init(long timeout, TaskExecutor executor) {
+ public static final void init(long timeout, Executor executor) {
HTTPUtils.timeout = timeout;
HTTPUtils.executor = executor;
}
@@ -59,15 +59,17 @@ public final class HTTPUtils {
}
/**
- * SSLContext
- *
* @return {@link SSLContext}
*/
private static final SSLContext buildSSLContext() {
try {
// SSL协议:SSL、SSLv2、SSLv3、TLS、TLSv1、TLSv1.1、TLSv1.2、TLSv1.3
final SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
- sslContext.init(null, new X509TrustManager[] { TaoyaoTrustManager.INSTANCE }, new SecureRandom());
+ sslContext.init(
+ new KeyManager[0],
+ new X509TrustManager[] { TaoyaoTrustManager.INSTANCE },
+ new SecureRandom()
+ );
return sslContext;
} catch (KeyManagementException | NoSuchAlgorithmException e) {
log.error("新建SSLContext异常", e);
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/JSONUtils.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/JSONUtils.java
index 4cb021f..42c0127 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/JSONUtils.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/JSONUtils.java
@@ -185,8 +185,6 @@ public final class JSONUtils {
return List.of();
}
try {
-// final JavaType javaType = MAPPER.getTypeFactory().constructParametricType(ArrayList.class, clazz);
-// return MAPPER.readValue(json, javaType);
return MAPPER.readValue(json, new TypeReference>() {
});
} catch (IOException e) {
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/ScriptUtils.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/ScriptUtils.java
index 0a4d545..c15b346 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/ScriptUtils.java
+++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/ScriptUtils.java
@@ -15,7 +15,10 @@ import lombok.extern.slf4j.Slf4j;
* @author acgist
*/
@Slf4j
-public class ScriptUtils {
+public final class ScriptUtils {
+
+ private ScriptUtils() {
+ }
/**
* 执行命令
@@ -44,9 +47,6 @@ public class ScriptUtils {
失败结果:{}
""", script, inputValue, errorValue);
result = StringUtils.isEmpty(inputValue) ? errorValue : inputValue;
- } catch (Exception e) {
- log.error("命令执行异常:{}", script, e);
- result = e.getMessage();
}
} catch (Exception e) {
log.error("执行命令异常:{}", script, e);
diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/WebSocketUtils.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/WebSocketUtils.java
deleted file mode 100644
index c6fcc2f..0000000
--- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/WebSocketUtils.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.acgist.taoyao.boot.utils;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.reflect.FieldUtils;
-
-import jakarta.websocket.Session;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * WebSocket工具
- *
- * @author acgist
- */
-@Slf4j
-public class WebSocketUtils {
-
- private WebSocketUtils() {
- }
-
- /**
- * @param session WebSocket
- *
- * @return 远程地址
- */
- public static final String getRemoteAddress(Session session) {
- if (session == null) {
- return null;
- }
- // 远程IP地址
- return (String) getField(session.getAsyncRemote(), "base.socketWrapper.remoteAddr");
- }
-
- /**
- * @param object 对象
- * @param fieldPath 属性路径
- *
- * @return 属性
- */
- private static final Object getField(Object object, String fieldPath) {
- final String fields[] = StringUtils.split(fieldPath, '.');
- for (String field : fields) {
- object = getField(object, object.getClass(), field);
- if (object == null) {
- return null;
- }
- }
- return object;
- }
-
- /**
- * @param object 对象
- * @param clazz 属性类型
- * @param fieldName 属性名称
- *
- * @return 属性
- */
- private static final Object getField(Object object, Class> clazz, String fieldName) {
- try {
- return FieldUtils.getField(clazz, fieldName, true).get(object);
- } catch (IllegalArgumentException | IllegalAccessException e) {
- log.error("读取属性异常:{}-{}", clazz, fieldName, e);
- }
- return null;
- }
-
-}
diff --git a/taoyao-signal-server/taoyao-boot/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/taoyao-signal-server/taoyao-boot/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 57dc20f..bc27118 100644
--- a/taoyao-signal-server/taoyao-boot/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/taoyao-signal-server/taoyao-boot/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,3 +1,3 @@
-com.acgist.taoyao.boot.config.BootAutoConfiguration
-com.acgist.taoyao.boot.config.SpringDocAutoConfiguration
-com.acgist.taoyao.boot.config.WebMvcConfigurerAutoConfiguration
+com.acgist.taoyao.boot.configuration.BootAutoConfiguration
+com.acgist.taoyao.boot.configuration.SpringDocAutoConfiguration
+com.acgist.taoyao.boot.configuration.WebMvcConfigurerAutoConfiguration
diff --git a/taoyao-signal-server/taoyao-boot/src/test/java/com/acgist/taoyao/boot/utils/FileUtilsTest.java b/taoyao-signal-server/taoyao-boot/src/test/java/com/acgist/taoyao/boot/utils/FileUtilsTest.java
new file mode 100644
index 0000000..b7af8df
--- /dev/null
+++ b/taoyao-signal-server/taoyao-boot/src/test/java/com/acgist/taoyao/boot/utils/FileUtilsTest.java
@@ -0,0 +1,22 @@
+package com.acgist.taoyao.boot.utils;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class FileUtilsTest {
+
+ @Test
+ void test() {
+ assertEquals("0B", FileUtils.formatSize(0L));
+ assertEquals("0B", FileUtils.formatSize(-10L));
+ assertEquals("1.00KB", FileUtils.formatSize(1024L));
+ log.info("{}", FileUtils.formatSize(1025L));
+ log.info("{}", FileUtils.formatSize(2025L));
+ log.info("{}", FileUtils.formatSize(Long.MAX_VALUE));
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-boot/src/test/java/com/acgist/taoyao/boot/utils/HTTPUtilsTest.java b/taoyao-signal-server/taoyao-boot/src/test/java/com/acgist/taoyao/boot/utils/HTTPUtilsTest.java
new file mode 100644
index 0000000..7529999
--- /dev/null
+++ b/taoyao-signal-server/taoyao-boot/src/test/java/com/acgist/taoyao/boot/utils/HTTPUtilsTest.java
@@ -0,0 +1,29 @@
+package com.acgist.taoyao.boot.utils;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.net.http.HttpResponse.BodyHandlers;
+import java.util.concurrent.Executors;
+
+import org.junit.jupiter.api.Test;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class HTTPUtilsTest {
+
+ @Test
+ void test() throws IOException, InterruptedException {
+ HTTPUtils.init(5000, Executors.newCachedThreadPool());
+ final HttpClient client = HTTPUtils.newClient();
+ final HttpResponse response = client.send(
+ HttpRequest.newBuilder(URI.create("https://www.acgist.com")).GET().build(),
+ BodyHandlers.ofString()
+ );
+ log.info("{}", response.body());
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-boot/src/test/java/com/acgist/taoyao/boot/utils/ScriptUtilsTest.java b/taoyao-signal-server/taoyao-boot/src/test/java/com/acgist/taoyao/boot/utils/ScriptUtilsTest.java
new file mode 100644
index 0000000..08dce33
--- /dev/null
+++ b/taoyao-signal-server/taoyao-boot/src/test/java/com/acgist/taoyao/boot/utils/ScriptUtilsTest.java
@@ -0,0 +1,13 @@
+package com.acgist.taoyao.boot.utils;
+
+import org.junit.jupiter.api.Test;
+
+public class ScriptUtilsTest {
+
+ @Test
+ void test() {
+ ScriptUtils.execute("ls");
+ ScriptUtils.execute("netstat -ano");
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/config/TaoyaoAutoConfiguration.java b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/configuration/TaoyaoAutoConfiguration.java
similarity index 72%
rename from taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/config/TaoyaoAutoConfiguration.java
rename to taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/configuration/TaoyaoAutoConfiguration.java
index 5321970..7e56e07 100644
--- a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/config/TaoyaoAutoConfiguration.java
+++ b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/configuration/TaoyaoAutoConfiguration.java
@@ -1,4 +1,4 @@
-package com.acgist.taoyao.config;
+package com.acgist.taoyao.configuration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -7,9 +7,11 @@ import org.springframework.context.annotation.Configuration;
import com.acgist.taoyao.interceptor.SecurityInterceptor;
import com.acgist.taoyao.interceptor.SlowInterceptor;
+import com.acgist.taoyao.signal.service.SecurityService;
+import com.acgist.taoyao.signal.service.impl.SecurityServiceImpl;
/**
- * 配置
+ * 自动配置
*
* @author acgist
*/
@@ -22,6 +24,12 @@ public class TaoyaoAutoConfiguration {
return new SlowInterceptor();
}
+ @Bean
+ @ConditionalOnMissingBean
+ public SecurityService securityService() {
+ return new SecurityServiceImpl();
+ }
+
@Bean
@ConditionalOnProperty(prefix = "taoyao.security", name = "enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnMissingBean
diff --git a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SecurityInterceptor.java b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SecurityInterceptor.java
index b75c8c2..d0f0b90 100644
--- a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SecurityInterceptor.java
+++ b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SecurityInterceptor.java
@@ -18,28 +18,26 @@ import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
/**
- * 安全拦截
+ * 安全拦截器
*
* @author acgist
*/
@Slf4j
public class SecurityInterceptor extends InterceptorAdapter {
- /**
- * Basic认证
- */
- private static final String BASIC = "Basic";
-
- private AntPathMatcher matcher = new AntPathMatcher();
-
@Autowired
private SecurityService securityService;
@Autowired
private SecurityProperties securityProperties;
+
+ /**
+ * 地址匹配
+ */
+ private final AntPathMatcher matcher = new AntPathMatcher();
@Override
public String name() {
- return "安全拦截";
+ return "安全拦截器";
}
@Override
@@ -94,12 +92,13 @@ public class SecurityInterceptor extends InterceptorAdapter {
if(StringUtils.isEmpty(authorization)) {
return false;
}
- if(!StringUtils.startsWithIgnoreCase(authorization, BASIC)) {
- return false;
+ int index = authorization.indexOf(' ');
+ if(index < 0) {
+ return false;
}
- authorization = authorization.substring(BASIC.length()).strip();
- authorization = new String(Base64.getDecoder().decode(authorization));
- final int index = authorization.indexOf(':');
+ authorization = authorization.substring(index + 1).strip();
+ authorization = new String(Base64.getMimeDecoder().decode(authorization));
+ index = authorization.indexOf(':');
if(index < 0) {
return false;
}
diff --git a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SlowInterceptor.java b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SlowInterceptor.java
index 7cfb171..6d3e10d 100644
--- a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SlowInterceptor.java
+++ b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/interceptor/SlowInterceptor.java
@@ -10,24 +10,24 @@ import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
/**
- * 过慢请求统计拦截
+ * 过慢请求拦截器
*
* @author acgist
*/
@Slf4j
public class SlowInterceptor extends InterceptorAdapter {
-
- /**
- * 时间
- */
- private ThreadLocal local = new ThreadLocal<>();
@Autowired
private TaoyaoProperties taoyaoProperties;
+ /**
+ * 请求开始时间
+ */
+ private final ThreadLocal local = new ThreadLocal<>();
+
@Override
public String name() {
- return "过慢请求统计拦截";
+ return "过慢请求拦截器";
}
@Override
diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/application-dev.yml b/taoyao-signal-server/taoyao-server/src/main/resources/application-dev.yml
index 9c6f945..53acc7f 100644
--- a/taoyao-signal-server/taoyao-server/src/main/resources/application-dev.yml
+++ b/taoyao-signal-server/taoyao-server/src/main/resources/application-dev.yml
@@ -1,10 +1,10 @@
taoyao:
media:
media-server-list:
- - name: media-local-a
+ - media-id: media-local-a
enabled: true
host: 192.168.8.110
- port: 4443
+ port: 9443
schema: wss
username: taoyao
password: taoyao
diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/application-local.yml b/taoyao-signal-server/taoyao-server/src/main/resources/application-local.yml
index 5cbc9d5..9556df7 100644
--- a/taoyao-signal-server/taoyao-server/src/main/resources/application-local.yml
+++ b/taoyao-signal-server/taoyao-server/src/main/resources/application-local.yml
@@ -1,10 +1,10 @@
taoyao:
media:
media-server-list:
- - name: media-local-a
+ - media-id: media-local-a
enabled: false
host: 192.168.1.110
- port: 4443
+ port: 9443
schema: wss
username: taoyao
password: taoyao
diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/application.yml b/taoyao-signal-server/taoyao-server/src/main/resources/application.yml
index 9b29909..2a770c9 100644
--- a/taoyao-signal-server/taoyao-server/src/main/resources/application.yml
+++ b/taoyao-signal-server/taoyao-server/src/main/resources/application.yml
@@ -103,19 +103,17 @@ taoyao:
- media-id: media-local-a
enabled: true
host: localhost
- port: 4443
+ port: 9443
schema: wss
username: taoyao
password: taoyao
- media-id: media-local-z
enabled: true
host: localhost
- port: 4443
+ port: 9443
schema: wss
username: taoyao
password: taoyao
- # 录像配置
- record-storage-path: /data/record
# Socket信令
socket:
enabled: true
@@ -123,8 +121,8 @@ taoyao:
port: 9999
timeout: ${taoyao.timeout}
queue-size: 100000
- thread-min: 4
- thread-max: 128
+ min-thread: 4
+ max-thread: 128
thread-name-prefix: ${spring.application.name}-signal-
keep-alive-time: 60000
buffer-size: 2048
diff --git a/taoyao-signal-server/taoyao-signal/README.md b/taoyao-signal-server/taoyao-signal/README.md
index fa4ef07..c71d647 100644
--- a/taoyao-signal-server/taoyao-signal/README.md
+++ b/taoyao-signal-server/taoyao-signal/README.md
@@ -84,7 +84,7 @@
{
"signal": 信号强度(0~100),
"battery": 电池电量(0~100),
- "charging": 是否充电(true|false)
+ "charging": 是否正在充电(true|false)
}
# 响应主体
{
@@ -105,7 +105,7 @@
"ip": "终端IP",
"signal": 信号强度(0~100),
"battery": 电池电量(0~100),
- "charging": 是否充电(true|false),
+ "charging": 是否正在充电(true|false),
"mediaId": "媒体服务标识",
"lastHeartbeat": "最后心跳时间"
},
@@ -133,7 +133,7 @@
"ip": "终端IP",
"signal": 信号强度(0~100),
"battery": 电池电量(0~100),
- "charging": 是否充电(true|false),
+ "charging": 是否正在充电(true|false),
"mediaId": "媒体服务标识",
"lastHeartbeat": "最后心跳时间"
}
@@ -160,7 +160,7 @@
"ip": "终端IP",
"signal": 信号强度(0~100),
"battery": 电池电量(0~100),
- "charging": 是否充电(true|false)
+ "charging": 是否正在充电(true|false)
}
# 响应主体
{
@@ -182,7 +182,7 @@
"ip": "终端IP",
"signal": 信号强度(0~100),
"battery": 电池电量(0~100),
- "charging": 是否充电(true|false),
+ "charging": 是否正在充电(true|false),
"mediaId": "媒体服务标识",
"lastHeartbeat": "最后心跳时间"
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/MapBodyGetter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/MapBodyGetter.java
index 6bee868..6f273b5 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/MapBodyGetter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/MapBodyGetter.java
@@ -3,7 +3,7 @@ package com.acgist.taoyao.signal;
import java.util.Map;
/**
- * Map参数
+ * Map参数Getter
*
* @author acgist
*/
@@ -43,7 +43,6 @@ public interface MapBodyGetter {
return t == null ? defaultValue : t;
}
-
/**
* @param body 消息主体
* @param key 参数名称
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/Client.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/Client.java
index c4c1dce..404dc54 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/Client.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/Client.java
@@ -4,11 +4,9 @@ import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.media.MediaClient;
/**
- * 终端会话
+ * 终端
*
* @author acgist
- *
- * @param 会话类型
*/
public interface Client extends AutoCloseable {
@@ -37,7 +35,7 @@ public interface Client extends AutoCloseable {
/**
* @param timeout 超时时间
*
- * @return 是否超时会话
+ * @return 授权是否超时
*/
boolean timeout(long timeout);
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientAdapter.java
index 7224201..b193a71 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientAdapter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientAdapter.java
@@ -3,9 +3,11 @@ package com.acgist.taoyao.signal.client;
import com.acgist.taoyao.signal.media.MediaClient;
/**
- * 会话适配器
+ * 终端适配器
*
* @author acgist
+ *
+ * @param 实例泛型
*/
public abstract class ClientAdapter implements Client {
@@ -22,7 +24,7 @@ public abstract class ClientAdapter implements Client {
*/
protected String clientId;
/**
- * 会话实例
+ * 终端实例
*/
protected final T instance;
/**
@@ -99,7 +101,7 @@ public abstract class ClientAdapter implements Client {
@Override
public String toString() {
- return this.getClass().getSimpleName() + " - " + this.clientId;
+ return this.getClass().getSimpleName() + " - " + this.ip + " - " + this.clientId;
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java
index eb28742..06fc1c2 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientManager.java
@@ -16,7 +16,7 @@ import com.acgist.taoyao.signal.event.client.ClientCloseEvent;
import lombok.extern.slf4j.Slf4j;
/**
- * 终端管理
+ * 终端管理器
*
* @author acgist
*/
@@ -49,7 +49,7 @@ public class ClientManager {
}
/**
- * 单播消息
+ * 授权终端单播消息
*
* @param to 接收终端
* @param message 消息
@@ -61,7 +61,7 @@ public class ClientManager {
}
/**
- * 单播消息
+ * 授权终端单播消息
*
* @param to 接收终端
* @param message 消息
@@ -73,7 +73,7 @@ public class ClientManager {
}
/**
- * 广播消息
+ * 授权终端广播消息
*
* @param message 消息
*/
@@ -82,7 +82,7 @@ public class ClientManager {
}
/**
- * 广播消息
+ * 授权终端广播消息
*
* @param from 发送终端
* @param message 消息
@@ -94,7 +94,7 @@ public class ClientManager {
}
/**
- * 广播消息
+ * 授权终端广播消息
*
* @param from 发送终端
* @param message 消息
@@ -120,7 +120,7 @@ public class ClientManager {
/**
* @param clientId 终端标识
*
- * @return 终端列表
+ * @return 授权终端列表
*/
public List clients(String clientId) {
return this.clients().stream()
@@ -129,7 +129,7 @@ public class ClientManager {
}
/**
- * @return 所有终端列表
+ * @return 所有授权终端列表
*/
public List clients() {
return this.clients.stream()
@@ -150,7 +150,7 @@ public class ClientManager {
/**
* @param clientId 终端标识
*
- * @return 终端状态列表
+ * @return 授权终端状态列表
*/
public List status(String clientId) {
return this.clients(clientId).stream()
@@ -159,7 +159,7 @@ public class ClientManager {
}
/**
- * @return 所有终端状态列表
+ * @return 所有授权终端状态列表
*/
public List status() {
return this.clients().stream()
@@ -168,15 +168,15 @@ public class ClientManager {
}
/**
- * 发送消息
+ * 推送消息
*
* @param instance 终端实例
* @param message 消息
*/
- public void send(AutoCloseable instance, Message message) {
+ public void push(AutoCloseable instance, Message message) {
final Client client = this.client(instance);
if(client == null) {
- log.warn("发送消息终端无效:{}-{}", instance, message);
+ log.warn("推送消息终端无效:{}-{}", instance, message);
return;
}
client.push(message);
@@ -189,7 +189,6 @@ public class ClientManager {
*/
public void close(AutoCloseable instance) {
final Client client = this.client(instance);
- // TODO:如果出现异常可以提前移除
try {
if(client != null) {
client.close();
@@ -197,7 +196,7 @@ public class ClientManager {
instance.close();
}
} catch (Exception e) {
- log.error("关闭终端异常", e);
+ log.error("关闭终端异常:{}", instance, e);
} finally {
if(client != null) {
// 移除管理
@@ -212,7 +211,7 @@ public class ClientManager {
* 定时关闭超时终端
*/
private void closeTimeout() {
- log.debug("定时关闭超时终端");
+ final int oldSize = this.clients.size();
this.clients.stream()
.filter(v -> !v.authorized())
.filter(v -> v.timeout(this.taoyaoProperties.getTimeout()))
@@ -220,6 +219,8 @@ public class ClientManager {
log.debug("关闭超时终端:{}", v);
this.close(v);
});
+ final int newSize = this.clients.size();
+ log.debug("定时关闭超时终端:{}", newSize - oldSize);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientStatus.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientStatus.java
index ba78ca1..6b78e84 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientStatus.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/ClientStatus.java
@@ -9,8 +9,6 @@ import lombok.Setter;
/**
* 终端状态
*
- * TODO:统计拉流数量
- *
* @author acgist
*/
@Getter
@@ -18,39 +16,22 @@ import lombok.Setter;
@Schema(title = "终端状态", description = "终端状态")
public class ClientStatus {
- /**
- * 终端标识
- */
+ @Schema(title = "终端IP", description = "终端IP")
+ private String ip;
@Schema(title = "终端标识", description = "终端标识")
private String clientId;
- /**
- * 终端IP
- */
- @Schema(title = "终端IP", description = "终端IP")
- private String ip;
- /**
- * 信号强度(0~100)
- */
@Schema(title = "信号强度(0~100)", description = "信号强度(0~100)")
private Integer signal = 0;
- /**
- * 电池电量(0~100)
- */
@Schema(title = "电池电量(0~100)", description = "电池电量(0~100)")
private Integer battery = 0;
- /**
- * 是否充电
- */
- @Schema(title = "是否充电", description = "是否充电")
+ @Schema(title = "是否正在充电", description = "是否正在充电")
private Boolean charging = false;
- /**
- * 媒体服务标识
- */
@Schema(title = "媒体服务标识", description = "媒体服务标识")
private String mediaId;
- /**
- * 最后心跳时间
- */
+ @Schema(title = "生产者数量", description = "生产者数量")
+ private Integer producerSize;
+ @Schema(title = "消费者数量", description = "消费者数量")
+ private Integer customerSize;
@Schema(title = "最后心跳时间", description = "最后心跳时间")
private LocalDateTime lastHeartbeat;
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketClient.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketClient.java
index eed3761..b427ba3 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketClient.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketClient.java
@@ -26,7 +26,7 @@ import lombok.extern.slf4j.Slf4j;
public class SocketClient extends ClientAdapter {
/**
- * 发送超时时间
+ * 超时时间
*/
private final long timeout;
/**
@@ -38,7 +38,7 @@ public class SocketClient extends ClientAdapter {
*/
private final int lineLength;
- public SocketClient(Integer timeout, AsynchronousSocketChannel instance) {
+ public SocketClient(Long timeout, AsynchronousSocketChannel instance) {
super(instance);
this.timeout = timeout;
this.line = Constant.LINE.getBytes();
@@ -46,14 +46,14 @@ public class SocketClient extends ClientAdapter {
try {
this.ip = ((InetSocketAddress) instance.getRemoteAddress()).getHostString();
} catch (IOException e) {
- log.error("Socket信令获取远程IP异常", e);
+ log.error("Socket终端获取远程IP异常", e);
}
}
@Override
public void push(Message message) {
- try {
- synchronized (this.instance) {
+ synchronized (this.instance) {
+ try {
if(this.instance.isOpen()) {
final byte[] bytes = message.toString().getBytes();
final ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length + this.lineLength);
@@ -63,11 +63,11 @@ public class SocketClient extends ClientAdapter {
final Future future = this.instance.write(buffer);
future.get(this.timeout, TimeUnit.MILLISECONDS);
} else {
- log.error("Socket信令已经关闭:{}", this.instance);
+ log.error("Socket终端已经关闭:{}", this.instance);
}
+ } catch (Exception e) {
+ log.error("Socket终端发送消息异常:{}", message, e);
}
- } catch (Exception e) {
- log.error("Socket信令发送消息异常:{}", message, e);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignal.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignal.java
index 40badba..0b72d56 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignal.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignal.java
@@ -62,10 +62,12 @@ public class SocketSignal {
*/
public void init() {
boolean success = true;
+ final String host = this.socketProperties.getHost();
+ final Integer port = this.socketProperties.getPort();
try {
final ExecutorService executor = new ThreadPoolExecutor(
- this.socketProperties.getThreadMin(),
- this.socketProperties.getThreadMax(),
+ this.socketProperties.getMinThread(),
+ this.socketProperties.getMaxThread(),
this.socketProperties.getKeepAliveTime(),
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(this.socketProperties.getQueueSize()),
@@ -73,7 +75,7 @@ public class SocketSignal {
);
this.group = AsynchronousChannelGroup.withThreadPool(executor);
this.channel = AsynchronousServerSocketChannel.open(this.group);
- this.channel.bind(new InetSocketAddress(this.socketProperties.getHost(), this.socketProperties.getPort()));
+ this.channel.bind(new InetSocketAddress(host, port));
this.channel.accept(this.channel, new SocketSignalAcceptHandler(
this.clientManager,
this.protocolManager,
@@ -85,7 +87,7 @@ public class SocketSignal {
success = false;
} finally {
if(success) {
- log.info("启动Socket信令服务:{}-{}", this.socketProperties.getHost(), this.socketProperties.getPort());
+ log.info("启动Socket信令服务成功:{}-{}", host, port);
} else {
this.destroy();
}
@@ -100,7 +102,7 @@ public class SocketSignal {
final Thread thread = new Thread(runnable);
// 线程名称
synchronized(this) {
- if(++this.index > this.socketProperties.getThreadMax()) {
+ if(++this.index > this.socketProperties.getMaxThread()) {
this.index = 0;
}
thread.setName(this.socketProperties.getThreadNamePrefix() + this.index);
@@ -113,7 +115,7 @@ public class SocketSignal {
@PreDestroy
public void destroy() {
- log.debug("关闭Socket信令服务");
+ log.debug("关闭Socket信令服务:{}", this.channel);
CloseableUtils.close(this.channel);
this.group.shutdown();
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignalAcceptHandler.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignalAcceptHandler.java
index 3250921..2ad2af5 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignalAcceptHandler.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignalAcceptHandler.java
@@ -14,7 +14,7 @@ import com.acgist.taoyao.signal.protocol.platform.PlatformErrorProtocol;
import lombok.extern.slf4j.Slf4j;
/**
- * Socket信令接收处理器
+ * Socket信令终端接收器
*
* @author acgist
*/
@@ -51,9 +51,9 @@ public final class SocketSignalAcceptHandler implements CompletionHandler= 0) {
final String message = this.builder.substring(0, index);
@@ -102,7 +105,7 @@ public final class SocketSignalMessageHandler implements CompletionHandler {
public WebSocketClient(Session instance) {
super(instance);
- this.ip = WebSocketUtils.getRemoteAddress(instance);
+ final Map userProperties = instance.getUserProperties();
+ this.ip = (String) userProperties.get(Constant.IP);
}
@Override
@@ -31,10 +34,10 @@ public class WebSocketClient extends ClientAdapter {
if(this.instance.isOpen()) {
this.instance.getBasicRemote().sendText(message.toString(), true);
} else {
- log.error("WebSocket信令已经关闭:{}", this.instance);
+ log.error("WebSocket终端已经关闭:{}", this.instance);
}
} catch (Exception e) {
- log.error("WebSocket信令发送消息异常:{}", message, e);
+ log.error("WebSocket终端发送消息异常:{}", message, e);
}
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignal.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignal.java
index 5eea685..f037752 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignal.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignal.java
@@ -20,7 +20,7 @@ import lombok.extern.slf4j.Slf4j;
* @author acgist
*/
@Slf4j
-@ServerEndpoint(value = "/websocket.signal")
+@ServerEndpoint(value = "/websocket.signal", configurator = WebSocketSignalConfigurator.class)
public class WebSocketSignal {
private static ClientManager clientManager;
@@ -29,7 +29,7 @@ public class WebSocketSignal {
@OnOpen
public void open(Session session) {
- log.debug("WebSocket信令连接成功:{}", session);
+ log.debug("WebSocket信令终端连接成功:{}", session);
WebSocketSignal.clientManager.open(new WebSocketClient(session));
}
@@ -40,19 +40,19 @@ public class WebSocketSignal {
WebSocketSignal.protocolManager.execute(message.strip(), session);
} catch (Exception e) {
log.error("处理WebSocket信令消息异常:{}", message, e);
- WebSocketSignal.clientManager.send(session, WebSocketSignal.platformErrorProtocol.build(e));
+ WebSocketSignal.clientManager.push(session, WebSocketSignal.platformErrorProtocol.build(e));
}
}
@OnClose
public void close(Session session) {
- log.debug("WebSocket信令关闭:{}", session);
+ log.debug("WebSocket信令终端关闭:{}", session);
WebSocketSignal.clientManager.close(session);
}
@OnError
public void error(Session session, Throwable e) {
- log.error("WebSocket信令异常:{}", session, e);
+ log.error("WebSocket信令终端异常:{}", session, e);
this.close(session);
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignalConfigurator.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignalConfigurator.java
new file mode 100644
index 0000000..76e14e8
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignalConfigurator.java
@@ -0,0 +1,37 @@
+package com.acgist.taoyao.signal.client.websocket;
+
+import java.lang.reflect.Field;
+import java.util.Map;
+
+import org.apache.catalina.connector.RequestFacade;
+
+import com.acgist.taoyao.signal.protocol.Constant;
+
+import jakarta.websocket.HandshakeResponse;
+import jakarta.websocket.server.HandshakeRequest;
+import jakarta.websocket.server.ServerEndpointConfig;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * WebSocket信令配置
+ *
+ * @author acgist
+ */
+@Slf4j
+public class WebSocketSignalConfigurator extends ServerEndpointConfig.Configurator {
+
+ @Override
+ public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {
+ try {
+ final Field field = request.getClass().getDeclaredField(Constant.REQUEST);
+ field.setAccessible(true);
+ final RequestFacade requestFacade = (RequestFacade) field.get(request);
+ final Map userProperties = config.getUserProperties();
+ userProperties.put(Constant.IP, requestFacade.getRemoteAddr());
+ } catch (SecurityException | NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
+ log.error("WebSocket终端获取远程IP异常", e);
+ }
+ super.modifyHandshake(config, request, response);
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/SignalAutoConfiguration.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/SignalAutoConfiguration.java
deleted file mode 100644
index 7b5f6a6..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/SignalAutoConfiguration.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.acgist.taoyao.signal.config;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.socket.config.annotation.EnableWebSocket;
-import org.springframework.web.socket.server.standard.ServerEndpointExporter;
-
-import com.acgist.taoyao.signal.client.websocket.WebSocketSignal;
-import com.acgist.taoyao.signal.media.MediaClientManager;
-import com.acgist.taoyao.signal.service.SecurityService;
-import com.acgist.taoyao.signal.service.impl.SecurityServiceImpl;
-
-/**
- * 信令配置
- *
- * @author acgist
- */
-@Configuration
-@EnableWebSocket
-public class SignalAutoConfiguration {
-
- @Bean
- @ConditionalOnMissingBean
- public WebSocketSignal webSocketSignal() {
- return new WebSocketSignal();
- }
-
- @Bean
- @ConditionalOnMissingBean
- public SecurityService securityService() {
- return new SecurityServiceImpl();
- }
-
- @Bean
- @ConditionalOnMissingBean
- public ServerEndpointExporter serverEndpointExporter() {
- return new ServerEndpointExporter();
- }
-
- @Bean
- @Autowired
- public CommandLineRunner mediaCommandLineRunner(MediaClientManager mediaClientManager) {
- return new CommandLineRunner() {
- @Override
- public void run(String ... args) throws Exception {
- mediaClientManager.init();
- }
- };
- }
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/MediaClientAutoConfiguration.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/MediaClientAutoConfiguration.java
new file mode 100644
index 0000000..cc5acf0
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/MediaClientAutoConfiguration.java
@@ -0,0 +1,27 @@
+package com.acgist.taoyao.signal.configuration;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.context.annotation.Bean;
+
+import com.acgist.taoyao.signal.media.MediaClientManager;
+
+/**
+ * 媒体服务自动配置
+ *
+ * @author acgist
+ */
+public class MediaClientAutoConfiguration {
+
+ @Bean
+ @Autowired
+ public CommandLineRunner mediaCommandLineRunner(MediaClientManager mediaClientManager) {
+ return new CommandLineRunner() {
+ @Override
+ public void run(String ... args) throws Exception {
+ mediaClientManager.init();
+ }
+ };
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/ScriptAutoConfiguration.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/ScriptAutoConfiguration.java
similarity index 97%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/ScriptAutoConfiguration.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/ScriptAutoConfiguration.java
index f3656e4..297d9ae 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/ScriptAutoConfiguration.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/ScriptAutoConfiguration.java
@@ -1,4 +1,4 @@
-package com.acgist.taoyao.signal.config;
+package com.acgist.taoyao.signal.configuration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/SocketAutoConfigruation.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/SocketSignalAutoConfiguration.java
similarity index 94%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/SocketAutoConfigruation.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/SocketSignalAutoConfiguration.java
index 1030d22..a4442f6 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/SocketAutoConfigruation.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/SocketSignalAutoConfiguration.java
@@ -1,4 +1,4 @@
-package com.acgist.taoyao.signal.config;
+package com.acgist.taoyao.signal.configuration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
@@ -21,7 +21,7 @@ import com.acgist.taoyao.signal.protocol.platform.PlatformErrorProtocol;
*/
@Configuration
@ConditionalOnProperty(prefix = "taoyao.socket", name = "enabled", havingValue = "true", matchIfMissing = true)
-public class SocketAutoConfigruation {
+public class SocketSignalAutoConfiguration {
@Bean
@Autowired
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/WebSocketSignalAutoConfiguration.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/WebSocketSignalAutoConfiguration.java
new file mode 100644
index 0000000..eb8b86c
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/WebSocketSignalAutoConfiguration.java
@@ -0,0 +1,32 @@
+package com.acgist.taoyao.signal.configuration;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+import com.acgist.taoyao.signal.client.websocket.WebSocketSignal;
+
+/**
+ * WebSocket信令自动配置
+ *
+ * @author acgist
+ */
+@Configuration
+@EnableWebSocket
+public class WebSocketSignalAutoConfiguration {
+
+ @Bean
+ @ConditionalOnMissingBean
+ public WebSocketSignal webSocketSignal() {
+ return new WebSocketSignal();
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public ServerEndpointExporter serverEndpointExporter() {
+ return new ServerEndpointExporter();
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ApplicationEventAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ApplicationEventAdapter.java
index 91dc40c..e25ea72 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ApplicationEventAdapter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ApplicationEventAdapter.java
@@ -8,7 +8,6 @@ import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.MapBodyGetter;
import lombok.Getter;
-import lombok.Setter;
/**
* 事件适配器
@@ -16,7 +15,6 @@ import lombok.Setter;
* @author acgist
*/
@Getter
-@Setter
public class ApplicationEventAdapter extends ApplicationEvent implements MapBodyGetter {
private static final long serialVersionUID = 1L;
@@ -47,21 +45,28 @@ public class ApplicationEventAdapter extends ApplicationEvent implements MapBody
* @see #get(Map, String, Object)
*/
public T get(String key, T defaultValue) {
- return this.get(body, key, defaultValue);
+ return this.get(this.body, key, defaultValue);
}
/**
* @see #getLong(Map, String)
*/
public Long getLong(String key) {
- return this.getLong(body, key);
+ return this.getLong(this.body, key);
}
/**
* @see #getInteger(Map, String)
*/
public Integer getInteger(String key) {
- return this.getInteger(body, key);
+ return this.getInteger(this.body, key);
+ }
+
+ /**
+ * @see #getBoolean(Map, String)
+ */
+ public Boolean getBoolean(String key) {
+ return this.getBoolean(this.body, key);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ClientEventAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ClientEventAdapter.java
index 041e649..ea343c9 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ClientEventAdapter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/ClientEventAdapter.java
@@ -6,7 +6,6 @@ import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.client.Client;
import lombok.Getter;
-import lombok.Setter;
/**
* 终端事件适配器
@@ -14,19 +13,18 @@ import lombok.Setter;
* @author acgist
*/
@Getter
-@Setter
public abstract class ClientEventAdapter extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
- /**
- * 终端标识
- */
- private String clientId;
/**
* 终端
*/
private final Client client;
+ /**
+ * 终端标识
+ */
+ private final String clientId;
public ClientEventAdapter(Message message, Client client) {
this(Map.of(), message, client);
@@ -34,8 +32,8 @@ public abstract class ClientEventAdapter extends ApplicationEventAdapter {
public ClientEventAdapter(Map, ?> body, Message message, Client client) {
super(body, message, client);
- this.clientId = client.clientId();
this.client = client;
+ this.clientId = client.clientId();
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/MediaEventAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/MediaEventAdapter.java
index b67b58f..02e61d2 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/MediaEventAdapter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/MediaEventAdapter.java
@@ -6,7 +6,6 @@ import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.media.MediaClient;
import lombok.Getter;
-import lombok.Setter;
/**
* 媒体事件适配器
@@ -14,13 +13,12 @@ import lombok.Setter;
* @author acgist
*/
@Getter
-@Setter
public class MediaEventAdapter extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
/**
- * 终端
+ * 媒体服务终端
*/
private final MediaClient mediaClient;
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/RoomEventAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/RoomEventAdapter.java
index b09245f..0417d1b 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/RoomEventAdapter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/RoomEventAdapter.java
@@ -6,7 +6,6 @@ import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.media.Room;
import lombok.Getter;
-import lombok.Setter;
/**
* 房间事件适配器
@@ -14,7 +13,6 @@ import lombok.Setter;
* @author acgist
*/
@Getter
-@Setter
public class RoomEventAdapter extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClient.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClient.java
index 97a39d4..5cd7bb3 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClient.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClient.java
@@ -16,11 +16,9 @@ import java.util.concurrent.TimeoutException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.config.ConfigurableBeanFactory;
-import org.springframework.context.annotation.Scope;
import org.springframework.scheduling.TaskScheduler;
-import com.acgist.taoyao.boot.annotation.Client;
+import com.acgist.taoyao.boot.annotation.Prototype;
import com.acgist.taoyao.boot.model.Header;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.model.MessageCode;
@@ -41,8 +39,7 @@ import lombok.extern.slf4j.Slf4j;
* @author acgist
*/
@Slf4j
-@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
-@Client
+@Prototype
public class MediaClient {
@Autowired
@@ -68,11 +65,11 @@ public class MediaClient {
*/
private long duration;
/**
- * 通道
+ * 服务通道
*/
private WebSocket webSocket;
/**
- * 配置
+ * 服务配置
*/
private MediaServerProperties mediaServerProperties;
/**
@@ -86,10 +83,10 @@ public class MediaClient {
* @param mediaServerProperties 媒体服务配置
*/
public void init(MediaServerProperties mediaServerProperties) {
- this.mediaServerProperties = mediaServerProperties;
this.mediaId = mediaServerProperties.getMediaId();
this.duration = this.taoyaoProperties.getTimeout();
- this.buildClient();
+ this.mediaServerProperties = mediaServerProperties;
+ this.connectServer();
}
/**
@@ -105,45 +102,13 @@ public class MediaClient {
public void heartbeat() {
final CompletableFuture future = this.webSocket.sendPing(ByteBuffer.allocate(0));
try {
- log.debug("心跳:{}", this.mediaId);
+ log.debug("媒体服务心跳:{}", this.mediaId);
future.get(this.taoyaoProperties.getTimeout(), TimeUnit.MILLISECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
- log.error("心跳异常:{}", this.mediaId, e);
+ log.error("媒体服务心跳异常:{}", this.mediaId, e);
}
}
- /**
- * 连接WebSocket通道
- */
- public void buildClient() {
- final URI uri = URI.create(this.mediaServerProperties.getAddress());
- log.info("连接媒体服务:{}", uri);
- try {
- final WebSocket webSocket = HTTPUtils.newClient()
- .newWebSocketBuilder()
- .connectTimeout(Duration.ofMillis(this.taoyaoProperties.getTimeout()))
- .buildAsync(uri, new MessageListener())
- .get();
- log.info("连接媒体服务成功:{}", webSocket);
- // 关闭旧的通道
- if(this.webSocket != null && !(this.webSocket.isInputClosed() && this.webSocket.isOutputClosed())) {
- this.webSocket.abort();
- }
- // 设置新的通道
- this.webSocket = webSocket;
- // 重置重试周期
- this.duration = this.taoyaoProperties.getTimeout();
- // 发送授权消息
- this.send(this.mediaRegisterProtocol.build(this.mediaServerProperties));
- } catch (Exception e) {
- log.error("连接媒体服务异常:{}", uri, e);
- this.taskScheduler.schedule(
- this::buildClient,
- Instant.now().plusMillis(this.retryDuration())
- );
- }
- }
-
/**
* 发送消息
*
@@ -159,24 +124,25 @@ public class MediaClient {
/**
* 请求消息
*
- * @param message 消息
+ * @param request 消息
*
* @return 响应
*/
- public Message sendSync(Message message) {
- final String id = message.getHeader().getId();
- this.syncMessage.put(id, message);
- synchronized (message) {
- this.send(message);
+ public Message request(Message request) {
+ final Header header = request.getHeader();
+ final String id = header.getId();
+ this.syncMessage.put(id, request);
+ synchronized (request) {
+ this.send(request);
try {
- message.wait(this.taoyaoProperties.getTimeout());
+ request.wait(this.taoyaoProperties.getTimeout());
} catch (InterruptedException e) {
- log.error("等待媒体服务响应异常:{}", message, e);
+ log.error("媒体服务等待响应异常:{}", request, e);
}
}
final Message response = this.syncMessage.remove(id);
- if(response == null || message.equals(response)) {
- log.warn("媒体服务没有响应:{}", message);
+ if(response == null || request.equals(response)) {
+ log.warn("媒体服务没有响应:{}", request);
throw MessageCodeException.of(MessageCode.CODE_2001, "媒体服务没有响应");
}
return response;
@@ -189,35 +155,66 @@ public class MediaClient {
return this.duration = Math.min(this.duration + this.taoyaoProperties.getTimeout(), MAX_DURATION);
}
+ /**
+ * 连接服务通道
+ */
+ private void connectServer() {
+ final URI uri = URI.create(this.mediaServerProperties.getAddress());
+ log.debug("开始连接媒体服务:{}", uri);
+ try {
+ final WebSocket webSocket = HTTPUtils.newClient()
+ .newWebSocketBuilder()
+ .connectTimeout(Duration.ofMillis(this.taoyaoProperties.getTimeout()))
+ .buildAsync(uri, new MessageListener())
+ .get();
+ log.info("连接媒体服务成功:{}", webSocket);
+ // 关闭旧的通道
+ if(this.webSocket != null && !(this.webSocket.isInputClosed() && this.webSocket.isOutputClosed())) {
+ this.webSocket.abort();
+ }
+ // 设置新的通道
+ this.webSocket = webSocket;
+ // 重置重试周期
+ this.duration = this.taoyaoProperties.getTimeout();
+ // 发送授权消息
+ this.send(this.mediaRegisterProtocol.build(this.mediaServerProperties));
+ } catch (Exception e) {
+ log.error("连接媒体服务异常:{}", uri, e);
+ this.taskScheduler.schedule(
+ this::connectServer,
+ Instant.now().plusMillis(this.retryDuration())
+ );
+ }
+ }
+
/**
- * 处理消息
+ * 处理信令消息
*
- * @param data 消息
+ * @param content 信令消息
*/
- private void execute(String data) {
- if(StringUtils.isEmpty(data)) {
- log.warn("媒体服务消息格式错误:{}", data);
+ private void execute(String content) {
+ if(StringUtils.isEmpty(content)) {
+ log.warn("媒体服务信令消息格式错误:{}", content);
return;
}
- final Message message = JSONUtils.toJava(data, Message.class);
+ final Message message = JSONUtils.toJava(content, Message.class);
final Header header = message.getHeader();
if(header == null) {
- log.warn("媒体服务消息格式错误(没有头部):{}", message);
+ log.warn("媒体服务信令消息格式错误(没有头部):{}", content);
return;
}
final String v = header.getV();
final String id = header.getId();
final String signal = header.getSignal();
if(v == null || id == null || signal == null) {
- log.warn("媒体服务消息格式错误(缺失头部关键参数):{}", message);
+ log.warn("媒体服务信令消息格式错误(缺失头部关键参数):{}", content);
return;
}
final Message request = this.syncMessage.get(id);
if(request != null) {
- // 同步处理
- // 重新设置消息
+ // 同步处理:重新设置响应消息
this.syncMessage.put(id, message);
- // 唤醒等待现场
+ // 唤醒等待线程
synchronized (request) {
request.notifyAll();
}
@@ -225,7 +222,7 @@ public class MediaClient {
} else {
final Protocol protocol = this.protocolManager.protocol(signal);
if(protocol == null) {
- log.warn("未知媒体服务信令:{}", message);
+ log.warn("不支持的媒体信令协议:{}", content);
} else {
protocol.execute(this, message);
}
@@ -233,7 +230,7 @@ public class MediaClient {
}
/**
- * 消息监听
+ * 信令消息监听
*
* @author acgist
*/
@@ -246,20 +243,20 @@ public class MediaClient {
}
@Override
- public CompletionStage> onBinary(WebSocket webSocket, ByteBuffer data, boolean last) {
- log.debug("媒体服务收到消息(binary):{}", webSocket);
- return Listener.super.onBinary(webSocket, data, last);
+ public CompletionStage> onBinary(WebSocket webSocket, ByteBuffer buffer, boolean last) {
+ log.debug("媒体服务收到信令消息(binary):{}", webSocket);
+ return Listener.super.onBinary(webSocket, buffer, last);
}
@Override
- public CompletionStage> onText(WebSocket webSocket, CharSequence data, boolean last) {
- log.debug("媒体服务收到消息(text):{}-{}", webSocket, data);
+ public CompletionStage> onText(WebSocket webSocket, CharSequence content, boolean last) {
+ log.debug("媒体服务收到信令消息(text):{}-{}", webSocket, content);
try {
- MediaClient.this.execute(data.toString());
+ MediaClient.this.execute(content.toString());
} catch (Exception e) {
- log.error("媒体服务处理异常:{}", data, e);
+ log.error("处理媒体服务信令消息异常:{}", content, e);
}
- return Listener.super.onText(webSocket, data, last);
+ return Listener.super.onText(webSocket, content, last);
}
@Override
@@ -269,7 +266,7 @@ public class MediaClient {
return Listener.super.onClose(webSocket, statusCode, reason);
} finally {
MediaClient.this.taskScheduler.schedule(
- MediaClient.this::buildClient,
+ MediaClient.this::connectServer,
Instant.now().plusMillis(MediaClient.this.retryDuration())
);
}
@@ -282,22 +279,22 @@ public class MediaClient {
Listener.super.onError(webSocket, error);
} finally {
MediaClient.this.taskScheduler.schedule(
- MediaClient.this::buildClient,
+ MediaClient.this::connectServer,
Instant.now().plusMillis(MediaClient.this.retryDuration())
);
}
}
@Override
- public CompletionStage> onPing(WebSocket webSocket, ByteBuffer message) {
- log.debug("媒体服务收到消息(ping):{}", webSocket);
- return Listener.super.onPing(webSocket, message);
+ public CompletionStage> onPing(WebSocket webSocket, ByteBuffer buffer) {
+ log.debug("媒体服务收到信令消息(ping):{}", webSocket);
+ return Listener.super.onPing(webSocket, buffer);
}
@Override
- public CompletionStage> onPong(WebSocket webSocket, ByteBuffer message) {
- log.debug("媒体服务收到消息(pong):{}", webSocket);
- return Listener.super.onPong(webSocket, message);
+ public CompletionStage> onPong(WebSocket webSocket, ByteBuffer buffer) {
+ log.debug("媒体服务收到信令消息(pong):{}", webSocket);
+ return Listener.super.onPong(webSocket, buffer);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClientManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClientManager.java
index 11257cf..b8df28d 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClientManager.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/MediaClientManager.java
@@ -46,7 +46,7 @@ public class MediaClientManager {
final MediaClient client = this.applicationContext.getBean(MediaClient.class);
client.init(v);
this.clientMap.put(client.mediaId(), client);
- log.info("注册媒体服务终端:{}-{}", v.getAddress(), client);
+ log.info("注册媒体服务终端:{}-{}", v.getMediaId(), v.getAddress());
});
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/Peer.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/Peer.java
index c49f90b..a9dc67a 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/Peer.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/Peer.java
@@ -17,7 +17,7 @@ import lombok.Setter;
public class Peer {
/**
- * 终端会话
+ * 终端
*/
private Client client;
private String device;
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/Room.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/Room.java
index 38ed1a7..afcd1fe 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/Room.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/Room.java
@@ -23,11 +23,12 @@ import lombok.extern.slf4j.Slf4j;
public class Room implements Closeable {
/**
- * ID
+ * 房间标识
*/
private Long roomId;
/**
* 密码
+ * 设置密码之后进入房间需要验证密码
*/
private String password;
/**
@@ -44,6 +45,7 @@ public class Room implements Closeable {
private List clients;
/**
* 传输通道列表
+ * TODO:是否需要
*/
private List transports;
@@ -126,10 +128,10 @@ public class Room implements Closeable {
}
/**
- * @see MediaClient#sendSync(Message)
+ * @see MediaClient#request(Message)
*/
public Message sendSync(Message message) {
- return this.mediaClient.sendSync(message);
+ return this.mediaClient.request(message);
}
@Override
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RoomManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RoomManager.java
index 5450c6f..f9186f1 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RoomManager.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RoomManager.java
@@ -36,9 +36,9 @@ public class RoomManager {
private List rooms = new CopyOnWriteArrayList<>();
/**
- * @param roomId ID
+ * @param roomId 房间标识
*
- * @return 房间信息
+ * @return 房间
*/
public Room room(Long roomId) {
return this.rooms.stream()
@@ -55,9 +55,9 @@ public class RoomManager {
}
/**
- * @param roomId ID
+ * @param roomId 房间标识
*
- * @return 房间信息
+ * @return 房间状态
*/
public RoomStatus status(Long roomId) {
final Room room = this.room(roomId);
@@ -65,7 +65,7 @@ public class RoomManager {
}
/**
- * @return 所有房间状态
+ * @return 所有房间状态列表
*/
public List status() {
return this.rooms().stream()
@@ -92,7 +92,7 @@ public class RoomManager {
final Long id = this.idService.buildId();
// 状态
final RoomStatus roomStatus = new RoomStatus();
- roomStatus.setId(id);
+ roomStatus.setRoomId(id);
roomStatus.setName(name);
roomStatus.setMediaId(mediaId);
roomStatus.setClientSize(0L);
@@ -105,7 +105,7 @@ public class RoomManager {
room.setClients(new CopyOnWriteArrayList<>());
// 创建媒体服务房间
message.setBody(Map.of(Constant.ROOM_ID, id));
- mediaClient.sendSync(message);
+ mediaClient.request(message);
log.info("创建房间:{}-{}", id, name);
this.rooms.add(room);
return room;
@@ -114,12 +114,12 @@ public class RoomManager {
/**
* 关闭房间
*
- * @param id ID
+ * @param roomId 房间标识
*/
- public void close(Long id) {
- final Room room = this.room(id);
+ public void close(Long roomId) {
+ final Room room = this.room(roomId);
if(room == null) {
- log.warn("房间无效:{}", id);
+ log.warn("关闭房间无效:{}", roomId);
return;
}
if(this.rooms.remove(room)) {
@@ -128,7 +128,7 @@ public class RoomManager {
}
/**
- * 释放房间
+ * 离开房间
*
* @param client 终端
*/
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RoomStatus.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RoomStatus.java
index 564f339..7d462ce 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RoomStatus.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/media/RoomStatus.java
@@ -11,26 +11,15 @@ import lombok.Setter;
*/
@Getter
@Setter
+@Schema(title = "房间状态", description = "房间状态")
public class RoomStatus {
- /**
- * ID
- */
- @Schema(title = "ID", description = "ID")
- private Long id;
- /**
- * 名称
- */
- @Schema(title = "名称", description = "名称")
+ @Schema(title = "房间标识", description = "房间标识")
+ private Long roomId;
+ @Schema(title = "房间名称", description = "房间名称")
private String name;
- /**
- * 媒体服务标识
- */
@Schema(title = "媒体服务标识", description = "媒体服务标识")
private String mediaId;
- /**
- * 终端数量
- */
@Schema(title = "终端数量", description = "终端数量")
private Long clientSize;
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Constant.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Constant.java
index c092d8b..dcf6549 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Constant.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Constant.java
@@ -32,7 +32,7 @@ public interface Constant {
*/
String BATTERY = "battery";
/**
- * 是否充电
+ * 是否正在充电
*/
String CHARGING = "charging";
/**
@@ -47,6 +47,10 @@ public interface Constant {
* 结果
*/
String RESULT = "result";
+ /**
+ * 请求
+ */
+ String REQUEST = "request";
/**
* 帐号
*/
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Protocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Protocol.java
index 5a4743e..815ee5b 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Protocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/Protocol.java
@@ -20,19 +20,19 @@ import com.acgist.taoyao.signal.media.MediaClient;
public interface Protocol {
/**
- * @return 信令协议名称
+ * @return 信令名称
*/
String name();
/**
- * @return 信令协议标识
+ * @return 信令标识
*/
String signal();
/**
* 鉴权
*
- * @param message 信令
+ * @param message 信令消息
*
* @return 是否成功
*/
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolManager.java
index e07d4fd..da0a4fb 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolManager.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolManager.java
@@ -50,15 +50,15 @@ public class ProtocolManager {
map.entrySet().stream()
.sorted((a, z) -> a.getValue().signal().compareTo(z.getValue().signal()))
.forEach(e -> {
- final String k = e.getKey();
- final Protocol v = e.getValue();
- final String name = v.name();
- final String signal = v.signal();
+ final String key = e.getKey();
+ final Protocol value = e.getValue();
+ final String name = value.name();
+ final String signal = value.signal();
if(this.protocolMapping.containsKey(signal)) {
throw MessageCodeException.of("存在重复信令协议:" + signal);
}
- log.info("注册信令协议:{} - {} - {}", String.format("%-32s", signal), String.format("%-32s", k), name);
- this.protocolMapping.put(signal, v);
+ log.info("注册信令协议:{} - {} - {}", String.format("%-32s", signal), String.format("%-32s", key), name);
+ this.protocolMapping.put(signal, value);
});
}
@@ -75,7 +75,7 @@ public class ProtocolManager {
* 执行信令消息
*
* @param content 信令消息
- * @param instance 会话实例
+ * @param instance 终端实例
*/
public void execute(String content, AutoCloseable instance) {
log.debug("执行信令消息:{}", content);
@@ -87,14 +87,14 @@ public class ProtocolManager {
// 验证请求
final Message message = JSONUtils.toJava(content, Message.class);
if(message == null) {
- log.warn("消息格式错误(解析失败):{}", content);
- client.push(this.platformErrorProtocol.build("消息格式错误(解析失败)"));
+ log.warn("信令消息格式错误(解析失败):{}", content);
+ client.push(this.platformErrorProtocol.build("信令消息格式错误(解析失败)"));
return;
}
final Header header = message.getHeader();
if(header == null) {
- log.warn("消息格式错误(没有头部):{}", content);
- client.push(this.platformErrorProtocol.build("消息格式错误(没有头部)"));
+ log.warn("信令消息格式错误(没有头部):{}", content);
+ client.push(this.platformErrorProtocol.build("信令消息格式错误(没有头部)"));
return;
}
final String v = header.getV();
@@ -103,8 +103,8 @@ public class ProtocolManager {
// 设置缓存ID
this.platformErrorProtocol.set(id);
if(v == null || id == null || signal == null) {
- log.warn("消息格式错误(缺失头部关键参数):{}", content);
- client.push(this.platformErrorProtocol.build("消息格式错误(缺失头部关键参数)"));
+ log.warn("信令消息格式错误(缺失头部关键参数):{}", content);
+ client.push(this.platformErrorProtocol.build("信令消息格式错误(缺失头部关键参数)"));
return;
}
// 开始处理协议
@@ -116,11 +116,11 @@ public class ProtocolManager {
}
if(protocol instanceof ClientRegisterProtocol) {
protocol.execute(client, message);
- } else if(this.securityService.authenticate(message, client, protocol)) {
+ } else if(this.securityService.authenticate(client, message, protocol)) {
protocol.execute(client, message);
} else {
- log.warn("终端会话没有授权:{}", content);
- client.push(this.platformErrorProtocol.build(MessageCode.CODE_3401, "终端会话没有授权"));
+ log.warn("终端没有授权:{}", content);
+ client.push(this.platformErrorProtocol.build(MessageCode.CODE_3401, "终端没有授权"));
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientCloseProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientCloseProtocol.java
index 118682b..5af002f 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientCloseProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientCloseProtocol.java
@@ -5,7 +5,7 @@ import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
-import com.acgist.taoyao.boot.annotation.EventProtocol;
+import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.event.client.ClientCloseEvent;
@@ -20,7 +20,7 @@ import lombok.extern.slf4j.Slf4j;
* @author acgist
*/
@Slf4j
-@EventProtocol
+@Protocol
public class ClientCloseProtocol extends ProtocolClientAdapter implements ApplicationListener {
public static final String SIGNAL = "client::close";
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java
index b5390fb..edebc00 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRegisterProtocol.java
@@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
/**
* 终端注册信令
+ * 如果需要验证终端授权自行实现
*
* @author acgist
*/
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/WebRtcTransportCreateProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerCloseProtocol.java
similarity index 54%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/WebRtcTransportCreateProtocol.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerCloseProtocol.java
index 2782b6d..9d0558f 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/WebRtcTransportCreateProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/ConsumerCloseProtocol.java
@@ -1,5 +1,5 @@
package com.acgist.taoyao.signal.protocol.media;
-public class WebRtcTransportCreateProtocol {
+public class ConsumerCloseProtocol {
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaShutdownProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaShutdownProtocol.java
index 6ad8014..aeed727 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaShutdownProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaShutdownProtocol.java
@@ -20,7 +20,7 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MediaShutdownProtocol extends ProtocolClientAdapter {
- public static final String SIGNAL = "media::reboot";
+ public static final String SIGNAL = "media::shutdown";
@Autowired
private ScriptProperties scriptProperties;
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/WebRtcTransportConnectProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/TransportWebRtcConnectProtocol.java
similarity index 71%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/WebRtcTransportConnectProtocol.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/TransportWebRtcConnectProtocol.java
index 385e9dc..bd04794 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/WebRtcTransportConnectProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/TransportWebRtcConnectProtocol.java
@@ -5,6 +5,6 @@ package com.acgist.taoyao.signal.protocol.media;
*
* @author acgist
*/
-public class WebRtcTransportConnectProtocol {
+public class TransportWebRtcConnectProtocol {
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/TransportWebRtcCreateProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/TransportWebRtcCreateProtocol.java
new file mode 100644
index 0000000..23ebe2d
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/TransportWebRtcCreateProtocol.java
@@ -0,0 +1,35 @@
+package com.acgist.taoyao.signal.protocol.media;
+
+import java.util.Map;
+
+import com.acgist.taoyao.boot.annotation.Protocol;
+import com.acgist.taoyao.boot.model.Message;
+import com.acgist.taoyao.signal.client.Client;
+import com.acgist.taoyao.signal.media.MediaClient;
+import com.acgist.taoyao.signal.media.Room;
+import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter;
+
+/**
+ * 创建WebRTC通道信令
+ *
+ * @author acgist
+ */
+@Protocol
+public class TransportWebRtcCreateProtocol extends ProtocolRoomAdapter {
+
+ public static final String SIGNAL = "transport:webrtc::create";
+
+ protected TransportWebRtcCreateProtocol() {
+ super("创建WebRTC通道信令", SIGNAL);
+ }
+
+ @Override
+ public void execute(Room room, Map, ?> body, MediaClient mediaClient, Message message) {
+ }
+
+ @Override
+ public void execute(String clientId, Room room, Map, ?> body, Client client, Message message) {
+ room.send(message);
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/SecurityService.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/SecurityService.java
index 9358921..daddb48 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/SecurityService.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/SecurityService.java
@@ -12,7 +12,7 @@ import com.acgist.taoyao.signal.protocol.Protocol;
public interface SecurityService {
/**
- * 鉴权
+ * 认证
*
* @param username 用户名称
* @param password 用户密码
@@ -24,12 +24,12 @@ public interface SecurityService {
/**
* 鉴权
*
+ * @param client 终端
* @param message 信令
- * @param client 会话
* @param protocol 协议
*
* @return 是否成功
*/
- boolean authenticate(Message message, Client client, Protocol protocol);
+ boolean authenticate(Client client, Message message, Protocol protocol);
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/impl/SecurityServiceImpl.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/impl/SecurityServiceImpl.java
index 6a78aeb..b3f7935 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/impl/SecurityServiceImpl.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/service/impl/SecurityServiceImpl.java
@@ -27,7 +27,7 @@ public class SecurityServiceImpl implements SecurityService {
}
@Override
- public boolean authenticate(Message message, Client client, Protocol protocol) {
+ public boolean authenticate(Client client, Message message, Protocol protocol) {
return client.authorized() && protocol.authenticate(message);
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/taoyao-signal-server/taoyao-signal/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 07f6f51..942b253 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/taoyao-signal-server/taoyao-signal/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,3 +1,4 @@
-com.acgist.taoyao.signal.config.ScriptAutoConfiguration
-com.acgist.taoyao.signal.config.SignalAutoConfiguration
-com.acgist.taoyao.signal.config.SocketAutoConfigruation
+com.acgist.taoyao.signal.configuration.ScriptAutoConfiguration
+com.acgist.taoyao.signal.configuration.MediaClientAutoConfiguration
+com.acgist.taoyao.signal.configuration.SocketSignalAutoConfiguration
+com.acgist.taoyao.signal.configuration.WebSocketSignalAutoConfiguration