From 9023883c5bd8d7a61e82f8393b3a6cce384c4bb5 Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Fri, 17 Feb 2023 23:47:23 +0800 Subject: [PATCH] =?UTF-8?q?[+]=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 + docs/Deploy.md | 10 +- taoyao-client-web/src/components/Taoyao.js | 5 +- taoyao-media-server/README.md | 41 +++ taoyao-media-server/src/Config.js | 16 +- taoyao-media-server/src/Signal.js | 92 ++++++ .../taoyao/boot/annotation/EventProtocol.java | 22 -- .../taoyao/boot/annotation/Manager.java | 2 +- .../taoyao/boot/annotation/Protocol.java | 2 +- .../{Client.java => Prototype.java} | 7 +- .../boot/config/BootAutoConfiguration.java | 229 --------------- .../configuration/BootAutoConfiguration.java | 229 +++++++++++++++ .../SpringDocAutoConfiguration.java | 20 +- .../WebMvcConfigurerAutoConfiguration.java | 6 +- .../controller/TaoyaoControllerAdvice.java | 4 + .../controller/TaoyaoErrorController.java | 2 +- .../boot/interceptor/InterceptorAdapter.java | 8 +- .../com/acgist/taoyao/boot/model/Message.java | 31 +- .../boot/model/MessageCodeException.java | 10 +- .../com/acgist/taoyao/boot/model/Model.java | 47 --- .../taoyao/boot/property/IdProperties.java | 10 +- .../boot/property/MediaAudioProperties.java | 22 +- .../taoyao/boot/property/MediaProperties.java | 42 +-- .../boot/property/MediaServerProperties.java | 28 -- .../boot/property/MediaVideoProperties.java | 40 +-- .../boot/property/ScriptProperties.java | 30 +- .../boot/property/SecurityProperties.java | 22 +- .../boot/property/SocketProperties.java | 50 +--- .../boot/property/TaoyaoProperties.java | 16 +- .../boot/property/WebrtcProperties.java | 6 - .../boot/property/WebrtcStunProperties.java | 9 - .../boot/property/WebrtcTurnProperties.java | 9 - .../taoyao/boot/utils/CloseableUtils.java | 2 +- .../acgist/taoyao/boot/utils/DateUtils.java | 275 +++++++----------- .../acgist/taoyao/boot/utils/ErrorUtils.java | 66 +++-- .../acgist/taoyao/boot/utils/FileUtils.java | 15 +- .../acgist/taoyao/boot/utils/HTTPUtils.java | 16 +- .../acgist/taoyao/boot/utils/JSONUtils.java | 2 - .../acgist/taoyao/boot/utils/ScriptUtils.java | 8 +- .../taoyao/boot/utils/WebSocketUtils.java | 66 ----- ...ot.autoconfigure.AutoConfiguration.imports | 6 +- .../taoyao/boot/utils/FileUtilsTest.java | 22 ++ .../taoyao/boot/utils/HTTPUtilsTest.java | 29 ++ .../taoyao/boot/utils/ScriptUtilsTest.java | 13 + .../TaoyaoAutoConfiguration.java | 12 +- .../interceptor/SecurityInterceptor.java | 27 +- .../taoyao/interceptor/SlowInterceptor.java | 14 +- .../src/main/resources/application-dev.yml | 4 +- .../src/main/resources/application-local.yml | 4 +- .../src/main/resources/application.yml | 10 +- taoyao-signal-server/taoyao-signal/README.md | 10 +- .../acgist/taoyao/signal/MapBodyGetter.java | 3 +- .../acgist/taoyao/signal/client/Client.java | 6 +- .../taoyao/signal/client/ClientAdapter.java | 8 +- .../taoyao/signal/client/ClientManager.java | 33 ++- .../taoyao/signal/client/ClientStatus.java | 33 +-- .../signal/client/socket/SocketClient.java | 16 +- .../signal/client/socket/SocketSignal.java | 14 +- .../socket/SocketSignalAcceptHandler.java | 8 +- .../socket/SocketSignalMessageHandler.java | 23 +- .../client/websocket/WebSocketClient.java | 11 +- .../client/websocket/WebSocketSignal.java | 10 +- .../WebSocketSignalConfigurator.java | 37 +++ .../config/SignalAutoConfiguration.java | 54 ---- .../MediaClientAutoConfiguration.java | 27 ++ .../ScriptAutoConfiguration.java | 2 +- .../SocketSignalAutoConfiguration.java} | 4 +- .../WebSocketSignalAutoConfiguration.java | 32 ++ .../signal/event/ApplicationEventAdapter.java | 15 +- .../signal/event/ClientEventAdapter.java | 12 +- .../signal/event/MediaEventAdapter.java | 4 +- .../taoyao/signal/event/RoomEventAdapter.java | 2 - .../taoyao/signal/media/MediaClient.java | 161 +++++----- .../signal/media/MediaClientManager.java | 2 +- .../com/acgist/taoyao/signal/media/Peer.java | 2 +- .../com/acgist/taoyao/signal/media/Room.java | 8 +- .../taoyao/signal/media/RoomManager.java | 24 +- .../taoyao/signal/media/RoomStatus.java | 19 +- .../taoyao/signal/protocol/Constant.java | 6 +- .../taoyao/signal/protocol/Protocol.java | 6 +- .../signal/protocol/ProtocolManager.java | 32 +- .../protocol/client/ClientCloseProtocol.java | 4 +- .../client/ClientRegisterProtocol.java | 1 + ...otocol.java => ConsumerCloseProtocol.java} | 2 +- .../protocol/media/MediaShutdownProtocol.java | 2 +- ...va => TransportWebRtcConnectProtocol.java} | 2 +- .../media/TransportWebRtcCreateProtocol.java | 35 +++ .../signal/service/SecurityService.java | 6 +- .../service/impl/SecurityServiceImpl.java | 2 +- ...ot.autoconfigure.AutoConfiguration.imports | 7 +- 90 files changed, 1142 insertions(+), 1216 deletions(-) delete mode 100644 taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/EventProtocol.java rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/annotation/{Client.java => Prototype.java} (64%) delete mode 100644 taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/BootAutoConfiguration.java create mode 100644 taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/configuration/BootAutoConfiguration.java rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{config => configuration}/SpringDocAutoConfiguration.java (89%) rename taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/{config => configuration}/WebMvcConfigurerAutoConfiguration.java (85%) delete mode 100644 taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/model/Model.java delete mode 100644 taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/utils/WebSocketUtils.java create mode 100644 taoyao-signal-server/taoyao-boot/src/test/java/com/acgist/taoyao/boot/utils/FileUtilsTest.java create mode 100644 taoyao-signal-server/taoyao-boot/src/test/java/com/acgist/taoyao/boot/utils/HTTPUtilsTest.java create mode 100644 taoyao-signal-server/taoyao-boot/src/test/java/com/acgist/taoyao/boot/utils/ScriptUtilsTest.java rename taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/{config => configuration}/TaoyaoAutoConfiguration.java (72%) create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/websocket/WebSocketSignalConfigurator.java delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/SignalAutoConfiguration.java create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/MediaClientAutoConfiguration.java rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/{config => configuration}/ScriptAutoConfiguration.java (97%) rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/{config/SocketAutoConfigruation.java => configuration/SocketSignalAutoConfiguration.java} (94%) create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/configuration/WebSocketSignalAutoConfiguration.java rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/{WebRtcTransportCreateProtocol.java => ConsumerCloseProtocol.java} (54%) rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/{WebRtcTransportConnectProtocol.java => TransportWebRtcConnectProtocol.java} (71%) create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/TransportWebRtcCreateProtocol.java diff --git a/README.md b/README.md index 541762c..b1dbc40 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,20 @@ 桃夭是套基于`Mediasoup`开发的`WebRTC`音视频信令服务 +

+ Java + + GitHub stars + + Gitee stars +
+ GitHub release (latest by date) + GitHub code size in bytes + GitHub +

+ +---- + ## 模块 |模块|名称|描述| @@ -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