From 7889d4f7081f691b037ae642d94110028e5df28b Mon Sep 17 00:00:00 2001
From: acgist <289547414@qq.com>
Date: Mon, 6 Feb 2023 20:57:12 +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 | 3 +
taoyao-client-web/.gitignore | 2 -
taoyao-client-web/.vscode/extensions.json | 3 -
taoyao-client-web/index.html | 8 +-
taoyao-client-web/public/favicon.ico | Bin 4286 -> 16958 bytes
.../{src/static/fonts => public}/taoyao.svg | 0
.../{src/static/fonts => public}/taoyao.ttf | Bin
.../{src/static/fonts => public}/taoyao.woff | Bin
taoyao-client-web/src/App.vue | 42 +-
taoyao-client-web/src/assets/base.css | 13 +-
taoyao-client-web/src/assets/font.taoyao.css | 1492 +++++++++++++++++
taoyao-client-web/src/assets/logo.svg | 1 -
taoyao-client-web/src/assets/main.css | 4 +-
taoyao-client-web/src/components/Config.js | 0
.../src/components/HelloWorld.vue | 43 -
.../src/components/LocalClient.vue | 7 +
.../src/components/RemoteClient.vue | 7 +
taoyao-client-web/src/components/Taoyao.js | 0
.../src/components/TheWelcome.vue | 86 -
.../src/components/WelcomeItem.vue | 86 -
.../src/components/icons/IconCommunity.vue | 7 -
.../components/icons/IconDocumentation.vue | 7 -
.../src/components/icons/IconEcosystem.vue | 7 -
.../src/components/icons/IconSupport.vue | 7 -
.../src/components/icons/IconTooling.vue | 19 -
taoyao-client-web/vite.config.js | 4 +-
taoyao-media-server/src/Config.js | 56 +-
taoyao-media-server/src/Server.js | 4 +-
taoyao-signal-server/README.md | 16 +-
taoyao-signal-server/pom.xml | 3 +-
.../config/SpringDocAutoConfiguration.java | 8 +-
.../taoyao/boot/property/MediaProperties.java | 5 +
.../boot/property/SecurityProperties.java | 7 -
.../boot/property/WebrtcProperties.java | 4 +-
.../interceptor/SecurityInterceptor.java | 26 +-
.../src/main/resources/application-dev.yml | 4 +
.../main/resources/application-release.yml | 3 -
.../src/main/resources/application.yml | 44 +-
.../src/main/resources/static/favicon.ico | Bin 0 -> 16958 bytes
taoyao-signal-server/taoyao-signal/README.md | 28 +-
.../media/meeting/MeetingListenerAdapter.java | 20 -
.../taoyao/media/meeting/MeetingManager.java | 77 -
.../listener/MeetingCreateListener.java | 27 -
.../listener/MeetingEnterListener.java | 41 -
.../taoyao/mediasoup/MediasoupClient.java | 48 +-
.../mediasoup/MediasoupClientManager.java | 44 +
.../com/acgist/taoyao/mediasoup/Router.java | 33 +
.../com/acgist/taoyao/mediasoup/Stream.java | 52 +
.../acgist/taoyao/mediasoup/Transport.java | 34 +
.../taoyao/mediasoup/client/ClientStream.java | 10 -
.../ApplyNetworkThrottleProtocol.java | 5 +
.../{client => }/AuthorizeProtocol.java | 21 +-
.../protocol/ChangeDisplayNameProtocol.java | 5 +
.../protocol/CloseProducerProtocol.java | 5 +
.../ConnectWebRtcTransportProtocol.java | 5 +
.../CreateWebRtcTransportProtocol.java | 5 +
.../protocol/GetConsumerStatsProtocol.java | 5 +
.../GetDataConsumerStatsProtocol.java | 5 +
.../GetDataProducerStatsProtocol.java | 5 +
.../protocol/GetProducerStatsProtocol.java | 5 +
.../protocol/GetTransportStatsProtocol.java | 5 +
.../mediasoup/protocol/NewPeerProtocol.java | 5 +
.../protocol/PauseConsumerProtocol.java | 5 +
.../protocol/PauseProducerProtocol.java | 5 +
.../protocol/ProduceDataProtocol.java | 5 +
.../mediasoup/protocol/ProduceProtocol.java | 5 +
.../protocol/ProducerScoreProtocol.java | 5 +
.../RequestConsumerKeyFrameProtocol.java | 5 +
.../ResetNetworkThrottleProtocol.java | 5 +
.../protocol/RestartIceProtocol.java | 5 +
.../protocol/ResumeConsumerProtocol.java | 5 +
.../protocol/ResumeProducerProtocol.java | 5 +
.../SetConsumerPreferredLayersProtocol.java | 2 +-
.../protocol/SetConsumerPriorityProtocol.java | 5 +
.../VideoorientationchangeProtocol.java | 5 +
.../media/ApplyNetworkThrottleProtocol.java | 5 -
.../media/ChangeDisplayNameProtocol.java | 5 -
.../protocol/media/CloseProducerProtocol.java | 5 -
.../media/ConnectWebRtcTransportProtocol.java | 5 -
.../media/CreateWebRtcTransportProtocol.java | 5 -
.../media/GetConsumerStatsProtocol.java | 5 -
.../media/GetDataConsumerStatsProtocol.java | 5 -
.../media/GetDataProducerStatsProtocol.java | 5 -
.../media/GetProducerStatsProtocol.java | 5 -
.../media/GetTransportStatsProtocol.java | 5 -
.../protocol/media/NewPeerProtocol.java | 5 -
.../protocol/media/PauseConsumerProtocol.java | 5 -
.../protocol/media/PauseProducerProtocol.java | 5 -
.../protocol/media/ProduceDataProtocol.java | 5 -
.../protocol/media/ProduceProtocol.java | 5 -
.../protocol/media/ProducerScoreProtocol.java | 5 -
.../RequestConsumerKeyFrameProtocol.java | 5 -
.../media/ResetNetworkThrottleProtocol.java | 5 -
.../protocol/media/RestartIceProtocol.java | 5 -
.../media/ResumeConsumerProtocol.java | 5 -
.../media/ResumeProducerProtocol.java | 5 -
.../media/SetConsumerPriorityProtocol.java | 5 -
.../media/VideoorientationchangeProtocol.java | 5 -
.../taoyao/mediasoup/router/Router.java | 19 -
.../taoyao/mediasoup/transport/Transport.java | 28 -
.../controller/RoomController.java} | 30 +-
.../RoomCreateEvent.java} | 8 +-
.../RoomEnterEvent.java} | 8 +-
.../signal/listener/RoomListenerAdapter.java | 20 +
.../listener/client/ClientCloseListener.java | 2 +-
.../client/ClientRegisterListener.java | 2 +-
.../listener/media}/MediaAnswerListener.java | 2 +-
.../media}/MediaCandidateListener.java | 2 +-
.../listener/media}/MediaOfferListener.java | 2 +-
.../listener/media}/MediaPublishListener.java | 2 +-
.../media}/MediaSubscribeListener.java | 2 +-
.../listener/room/RoomCreateListener.java | 27 +
.../listener/room/RoomEnterListener.java | 41 +
.../taoyao/signal/protocol/Protocol.java | 2 +-
.../signal/protocol/ProtocolJavaAdapter.java | 52 -
.../protocol/ProtocolMediasoupAdapter.java | 3 +-
.../client/ClientRegisterProtocol.java | 11 +-
.../meeting/MeetingClientListProtocol.java | 5 -
.../meeting/MeetingCloseProtocol.java | 5 -
.../meeting/MeetingExpelProtocol.java | 5 -
.../meeting/MeetingInviteProtocol.java | 5 -
.../meeting/MeetingLeaveProtocol.java | 5 -
.../protocol/meeting/MeetingListProtocol.java | 5 -
.../meeting/MeetingStatusProtocol.java | 5 -
.../protocol/room/RoomClientListProtocol.java | 5 +
.../protocol/room/RoomCloseProtocol.java | 5 +
.../RoomCreateProtocol.java} | 14 +-
.../RoomEnterProtocol.java} | 14 +-
.../protocol/room/RoomExpelProtocol.java | 5 +
.../protocol/room/RoomInviteProtocol.java | 5 +
.../protocol/room/RoomLeaveProtocol.java | 5 +
.../protocol/room/RoomListProtocol.java | 5 +
.../protocol/room/RoomStatusProtocol.java | 5 +
.../Meeting.java => signal/room/Room.java} | 28 +-
.../taoyao/signal/room/RoomManager.java | 77 +
.../signal/service/SecurityService.java | 10 +
.../service/impl/SecurityServiceImpl.java | 24 +-
137 files changed, 2255 insertions(+), 940 deletions(-)
delete mode 100644 taoyao-client-web/.vscode/extensions.json
rename taoyao-client-web/{src/static/fonts => public}/taoyao.svg (100%)
rename taoyao-client-web/{src/static/fonts => public}/taoyao.ttf (100%)
rename taoyao-client-web/{src/static/fonts => public}/taoyao.woff (100%)
create mode 100644 taoyao-client-web/src/assets/font.taoyao.css
delete mode 100644 taoyao-client-web/src/assets/logo.svg
create mode 100644 taoyao-client-web/src/components/Config.js
delete mode 100644 taoyao-client-web/src/components/HelloWorld.vue
create mode 100644 taoyao-client-web/src/components/LocalClient.vue
create mode 100644 taoyao-client-web/src/components/RemoteClient.vue
create mode 100644 taoyao-client-web/src/components/Taoyao.js
delete mode 100644 taoyao-client-web/src/components/TheWelcome.vue
delete mode 100644 taoyao-client-web/src/components/WelcomeItem.vue
delete mode 100644 taoyao-client-web/src/components/icons/IconCommunity.vue
delete mode 100644 taoyao-client-web/src/components/icons/IconDocumentation.vue
delete mode 100644 taoyao-client-web/src/components/icons/IconEcosystem.vue
delete mode 100644 taoyao-client-web/src/components/icons/IconSupport.vue
delete mode 100644 taoyao-client-web/src/components/icons/IconTooling.vue
create mode 100644 taoyao-signal-server/taoyao-server/src/main/resources/static/favicon.ico
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/MeetingListenerAdapter.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/MeetingManager.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/listener/MeetingCreateListener.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/listener/MeetingEnterListener.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClientManager.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Router.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Stream.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Transport.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/client/ClientStream.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ApplyNetworkThrottleProtocol.java
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/{client => }/AuthorizeProtocol.java (64%)
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ChangeDisplayNameProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CloseProducerProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ConnectWebRtcTransportProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CreateWebRtcTransportProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetConsumerStatsProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataConsumerStatsProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataProducerStatsProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetProducerStatsProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetTransportStatsProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/NewPeerProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseConsumerProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseProducerProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceDataProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProducerScoreProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RequestConsumerKeyFrameProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResetNetworkThrottleProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RestartIceProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeConsumerProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeProducerProtocol.java
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/{media => }/SetConsumerPreferredLayersProtocol.java (50%)
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPriorityProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/VideoorientationchangeProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ApplyNetworkThrottleProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ChangeDisplayNameProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/CloseProducerProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ConnectWebRtcTransportProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/CreateWebRtcTransportProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetConsumerStatsProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetDataConsumerStatsProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetDataProducerStatsProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetProducerStatsProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetTransportStatsProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/NewPeerProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/PauseConsumerProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/PauseProducerProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ProduceDataProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ProduceProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ProducerScoreProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/RequestConsumerKeyFrameProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ResetNetworkThrottleProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/RestartIceProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ResumeConsumerProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ResumeProducerProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/SetConsumerPriorityProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/VideoorientationchangeProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/router/Router.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/transport/Transport.java
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/{media/meeting/controller/MeetingController.java => signal/controller/RoomController.java} (57%)
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/{meeting/MeetingEnterEvent.java => room/RoomCreateEvent.java} (61%)
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/{meeting/MeetingCreateEvent.java => room/RoomEnterEvent.java} (61%)
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/RoomListenerAdapter.java
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/{media/listener => signal/listener/media}/MediaAnswerListener.java (94%)
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/{media/listener => signal/listener/media}/MediaCandidateListener.java (94%)
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/{media/listener => signal/listener/media}/MediaOfferListener.java (94%)
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/{media/listener => signal/listener/media}/MediaPublishListener.java (94%)
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/{media/listener => signal/listener/media}/MediaSubscribeListener.java (94%)
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/room/RoomCreateListener.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/room/RoomEnterListener.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolJavaAdapter.java
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/{mediasoup => signal}/protocol/ProtocolMediasoupAdapter.java (89%)
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingClientListProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingCloseProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingExpelProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingInviteProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingLeaveProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingListProtocol.java
delete mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingStatusProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomClientListProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCloseProtocol.java
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/{meeting/MeetingCreateProtocol.java => room/RoomCreateProtocol.java} (55%)
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/{meeting/MeetingEnterProtocol.java => room/RoomEnterProtocol.java} (55%)
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomExpelProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomInviteProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomLeaveProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomListProtocol.java
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomStatusProtocol.java
rename taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/{media/meeting/Meeting.java => signal/room/Room.java} (58%)
create mode 100644 taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomManager.java
diff --git a/README.md b/README.md
index 3350435..b28ec56 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,8 @@
|taoyao-media-server|媒体服务|Mediasoup媒体服务|
|taoyao-signal-server|信令服务|信令业务逻辑|
+> 注意:只有Web实现完成信令控制,桌面还有安卓仅仅实现媒体收发。
+
## 部署
[部署文档](./docs/Deploy.md)
@@ -50,3 +52,4 @@
* 信令服务集群
* 媒体交互式启动
* 一个信令服务多个媒体服务
+* 会议调整为房间
diff --git a/taoyao-client-web/.gitignore b/taoyao-client-web/.gitignore
index 3656759..1b2055a 100644
--- a/taoyao-client-web/.gitignore
+++ b/taoyao-client-web/.gitignore
@@ -2,6 +2,4 @@
logs
dist
-.vscode/*
-!.vscode/extensions.json
node_modules
diff --git a/taoyao-client-web/.vscode/extensions.json b/taoyao-client-web/.vscode/extensions.json
deleted file mode 100644
index c0a6e5a..0000000
--- a/taoyao-client-web/.vscode/extensions.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"]
-}
diff --git a/taoyao-client-web/index.html b/taoyao-client-web/index.html
index 99f583a..cfbe37c 100644
--- a/taoyao-client-web/index.html
+++ b/taoyao-client-web/index.html
@@ -1,10 +1,10 @@
-
-
-
- Vite App
+
+
+
+ 桃夭终端
diff --git a/taoyao-client-web/public/favicon.ico b/taoyao-client-web/public/favicon.ico
index df36fcfb72584e00488330b560ebcf34a41c64c2..e7cf988d07ffe5c6b007459e6794f0d1f4e06368 100644
GIT binary patch
literal 16958
zcmeI4d+c3B5yvkAB9LeV1O-tL&>9hAj4^?jR1h&V5{wWrm>@oRDlrNaS_&dkT0sP*
zvCs#|qx@PPmPcuM{CLQ#Ahy&}3YDf%ftEL=Ev1xkK0Uw5nY(w-IeYFszy9-MnsfKu
zduC_nyJu&2W_EvVwKmg#!-u!@bGO#8{adXaTdmeGz4WKnnR@a2MjD&g6`&wE~m9Pz$w+;0l}@4PGWq_%nOe38rMicEN@{kl|tn>J5m
z;fo^cly|UcuznV5!NSiw
z{^dVJwmUNoYf7Jd_zaO>Trct;9UDzi)A;B8PvkpOGn-1m)D6#OI)1)&naG37dhdm%
z@UK{vy_*l{8d`>lG5z%kBFEhzGPYmjoV#-V(X&Oy-7Rv$jUvPUmS!tQ^@%Khz59M>
z0{^YLhU|P!jw8gsI`VASzuU=f-9`nt+%2$WF#lKeH
zTTmJFYDr8tJq@L_Z%nk$aCdw#h!MH-(;~C
z?tMX|4|M)a83%RnGxiR=i$)f%A~dJN3dAs^)___(#v_Y~yh4
zkFxo#syCXzPaEL;*>#=zov3qS8KvT%^His7*1TS@qgPY-k;Q!bg@`Sbt&J)8UtTS;
zOTqen&oi{#JvE7c*=r(Op4R!EwpagP`5SQ^Q}DB{ny*1g8|LR7s&>~4HHrUt^&3sk
z4+i~k)U|OftMEUuBFAd7$IQume7@t0!_zG_g@5H+B3lh${>nun=ii(6h3Wm!vQ90l
z@Q3sLXU-F0{h#}6F8|1BopMuuX$t>YcjWq9Gf!l_`Ujzpbdau7A(i1@`l`qlBXha*
z!STNdTde>F2imiD~~{O4)RXnIb3IByq!C5#uyA9yOlzd_g2j|VZ=q`AIkc8{&m
zHh$T
zw9Wf@vmoXwo=?=t?~bu85JiF?6MJ{cX!slE7Sr(X68
zcI)%b#ObDE4F3x%%dk^^`OhY)xb*fi<7mx0-?6=qjLGWlqj|4X>K4D{AQ+oqsG<`BA08hGis9$|`Mw%8JL9eT{Pj(F
zy_ru`ac9rF!TKm#+&l_(;4l3=likgd;ITIx@~d0
zUUl%ZSD8xmXVW-~|I#q9rX
z^^Z*_$|?+*r1npXjftP1d8PfC|CWk>)w(>!-D_NX9O~s2-TT}Sn9QbQ_*brK$Im`i
zUGhG}NxCi;Q7V2P=8~JKMXY^mAtsem~x*!#+n{A|Jnp+A8&VZ>!aYL#o10d`(UZ8D%kUDA#{y@16Q~
zaTdp@2>$~0F^!*+yh%)dlT%dU)0vzL|Jlh^g`c?F>KBcnPO14XjB{_x$nxt<5q{p?
zC;yPQO})B)09p`xn(b1W-I<0}`1f-$F8+003fFzc5V>KaBK$n(Jc{)_Nd6~MzJG432yg!?G;XI*+l*A9z~KYxDvxrj3S
z2V9!rC&ncgUza$8VYn$-#}*H)dnT(4KRicX(=G#>NZD66`BwUKGCnpg!q53f;yd(a
z52h|*cQ$WYA8;-$q$>PNUe^6S_2EngCFc?A(sMeNOb)(?Q4xOft=1+yb%}E*R-cl-
zjLE6OPrKwxy)0r7pF>X7?dNWP{;q-8EruW8%;KC8Q&Oepe4Ile$LDnp_dSd|1wUsy
z$ZL9eyQ&?OLow`y^=Q6PI5I=K^wZZ(IO2h==UNv&6e5N}1(dFpATtCwjABCKGDjhhmt}!3_H3~l+
z{{*>vjZgPAUR@*d%>kLF6D8*piNngME`G)sv4C%f`%j&lJ}1szoY(hp>30Wg19`E%
z)))@XG}!)|*NOOzGn!RY7eDeCYq35c*KxA0733H<FToNJX
z6O-|G3n$IYeSG7?M?89Zw&z+ju8f!G_)2wibH0a~!f!I4)_CEE)AF-urfZWW>n8Ir
zF;cJ8G=9^E*cp3dE^G=r=aEjGRi00`_EXEj!f)-9gJ8dwd6G3b%te*;4QDV8nw0&G
z5a*HXT${;mq8x1ep^n-e8)FgnSlDM`AIe|k_SrkYpR7BVhi#>N-_-b1blQ|W9zXed
f;*p_r@i*VZwalrML-E>}m-7D^!29<@t_S`Pa1+=1
literal 4286
zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj
zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56
zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy
zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei
z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX
zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm
zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp=
zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8
zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO
z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3
z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD
zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6
z={Xwx{T%b6i9IjI)Ls)S{-*mq<@~R{?$}ZKjf;^k75i_}(2MXt}^SEBVg7AI@28
zo_uPg2V)_e-`2Ois=PYoe%9u*n9({PFR)OnHJPi{dNx>KxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S
diff --git a/taoyao-client-web/src/static/fonts/taoyao.svg b/taoyao-client-web/public/taoyao.svg
similarity index 100%
rename from taoyao-client-web/src/static/fonts/taoyao.svg
rename to taoyao-client-web/public/taoyao.svg
diff --git a/taoyao-client-web/src/static/fonts/taoyao.ttf b/taoyao-client-web/public/taoyao.ttf
similarity index 100%
rename from taoyao-client-web/src/static/fonts/taoyao.ttf
rename to taoyao-client-web/public/taoyao.ttf
diff --git a/taoyao-client-web/src/static/fonts/taoyao.woff b/taoyao-client-web/public/taoyao.woff
similarity index 100%
rename from taoyao-client-web/src/static/fonts/taoyao.woff
rename to taoyao-client-web/public/taoyao.woff
diff --git a/taoyao-client-web/src/App.vue b/taoyao-client-web/src/App.vue
index 633a5df..7bf5905 100644
--- a/taoyao-client-web/src/App.vue
+++ b/taoyao-client-web/src/App.vue
@@ -1,47 +1,11 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
diff --git a/taoyao-client-web/src/assets/base.css b/taoyao-client-web/src/assets/base.css
index 71dc55a..2fd3009 100644
--- a/taoyao-client-web/src/assets/base.css
+++ b/taoyao-client-web/src/assets/base.css
@@ -3,36 +3,28 @@
--vt-c-white: #ffffff;
--vt-c-white-soft: #f8f8f8;
--vt-c-white-mute: #f2f2f2;
-
--vt-c-black: #181818;
--vt-c-black-soft: #222222;
--vt-c-black-mute: #282828;
-
--vt-c-indigo: #2c3e50;
-
--vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
--vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
--vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
--vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
-
--vt-c-text-light-1: var(--vt-c-indigo);
--vt-c-text-light-2: rgba(60, 60, 60, 0.66);
--vt-c-text-dark-1: var(--vt-c-white);
--vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
}
-/* semantic color variables for this project */
:root {
--color-background: var(--vt-c-white);
--color-background-soft: var(--vt-c-white-soft);
--color-background-mute: var(--vt-c-white-mute);
-
--color-border: var(--vt-c-divider-light-2);
--color-border-hover: var(--vt-c-divider-light-1);
-
--color-heading: var(--vt-c-text-light-1);
--color-text: var(--vt-c-text-light-1);
-
--section-gap: 160px;
}
@@ -41,10 +33,8 @@
--color-background: var(--vt-c-black);
--color-background-soft: var(--vt-c-black-soft);
--color-background-mute: var(--vt-c-black-mute);
-
--color-border: var(--vt-c-divider-dark-2);
--color-border-hover: var(--vt-c-divider-dark-1);
-
--color-heading: var(--vt-c-text-dark-1);
--color-text: var(--vt-c-text-dark-2);
}
@@ -65,8 +55,7 @@ body {
background: var(--color-background);
transition: color 0.5s, background-color 0.5s;
line-height: 1.6;
- font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
- Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
+ font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
font-size: 15px;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
diff --git a/taoyao-client-web/src/assets/font.taoyao.css b/taoyao-client-web/src/assets/font.taoyao.css
new file mode 100644
index 0000000..4b25797
--- /dev/null
+++ b/taoyao-client-web/src/assets/font.taoyao.css
@@ -0,0 +1,1492 @@
+@font-face {
+ font-family: taoyao;
+ src: url(./taoyao.ttf?oc7k8r) format("truetype"), url(./taoyao.woff?oc7k8r) format("woff"), url(./taoyao.svg?oc7k8r#taoyao) format("svg");
+ font-weight: 400;
+ font-style: normal;
+ font-display: block;
+}
+[class*=" icon-"],
+[class^="icon-"] {
+ font-family: taoyao !important;
+ speak: never;
+ font-style: normal;
+ font-weight: 400;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.icon-home:before {
+ content: "\e900";
+}
+.icon-home2:before {
+ content: "\e901";
+}
+.icon-home3:before {
+ content: "\e902";
+}
+.icon-office:before {
+ content: "\e903";
+}
+.icon-newspaper:before {
+ content: "\e904";
+}
+.icon-pencil:before {
+ content: "\e905";
+}
+.icon-pencil2:before {
+ content: "\e906";
+}
+.icon-quill:before {
+ content: "\e907";
+}
+.icon-pen:before {
+ content: "\e908";
+}
+.icon-blog:before {
+ content: "\e909";
+}
+.icon-eyedropper:before {
+ content: "\e90a";
+}
+.icon-droplet:before {
+ content: "\e90b";
+}
+.icon-paint-format:before {
+ content: "\e90c";
+}
+.icon-image:before {
+ content: "\e90d";
+}
+.icon-images:before {
+ content: "\e90e";
+}
+.icon-camera:before {
+ content: "\e90f";
+}
+.icon-headphones:before {
+ content: "\e910";
+}
+.icon-music:before {
+ content: "\e911";
+}
+.icon-play:before {
+ content: "\e912";
+}
+.icon-film:before {
+ content: "\e913";
+}
+.icon-video-camera:before {
+ content: "\e914";
+}
+.icon-dice:before {
+ content: "\e915";
+}
+.icon-pacman:before {
+ content: "\e916";
+}
+.icon-spades:before {
+ content: "\e917";
+}
+.icon-clubs:before {
+ content: "\e918";
+}
+.icon-diamonds:before {
+ content: "\e919";
+}
+.icon-bullhorn:before {
+ content: "\e91a";
+}
+.icon-connection:before {
+ content: "\e91b";
+}
+.icon-podcast:before {
+ content: "\e91c";
+}
+.icon-feed:before {
+ content: "\e91d";
+}
+.icon-mic:before {
+ content: "\e91e";
+}
+.icon-book:before {
+ content: "\e91f";
+}
+.icon-books:before {
+ content: "\e920";
+}
+.icon-library:before {
+ content: "\e921";
+}
+.icon-file-text:before {
+ content: "\e922";
+}
+.icon-profile:before {
+ content: "\e923";
+}
+.icon-file-empty:before {
+ content: "\e924";
+}
+.icon-files-empty:before {
+ content: "\e925";
+}
+.icon-file-text2:before {
+ content: "\e926";
+}
+.icon-file-picture:before {
+ content: "\e927";
+}
+.icon-file-music:before {
+ content: "\e928";
+}
+.icon-file-play:before {
+ content: "\e929";
+}
+.icon-file-video:before {
+ content: "\e92a";
+}
+.icon-file-zip:before {
+ content: "\e92b";
+}
+.icon-copy:before {
+ content: "\e92c";
+}
+.icon-paste:before {
+ content: "\e92d";
+}
+.icon-stack:before {
+ content: "\e92e";
+}
+.icon-folder:before {
+ content: "\e92f";
+}
+.icon-folder-open:before {
+ content: "\e930";
+}
+.icon-folder-plus:before {
+ content: "\e931";
+}
+.icon-folder-minus:before {
+ content: "\e932";
+}
+.icon-folder-download:before {
+ content: "\e933";
+}
+.icon-folder-upload:before {
+ content: "\e934";
+}
+.icon-price-tag:before {
+ content: "\e935";
+}
+.icon-price-tags:before {
+ content: "\e936";
+}
+.icon-barcode:before {
+ content: "\e937";
+}
+.icon-qrcode:before {
+ content: "\e938";
+}
+.icon-ticket:before {
+ content: "\e939";
+}
+.icon-cart:before {
+ content: "\e93a";
+}
+.icon-coin-dollar:before {
+ content: "\e93b";
+}
+.icon-coin-euro:before {
+ content: "\e93c";
+}
+.icon-coin-pound:before {
+ content: "\e93d";
+}
+.icon-coin-yen:before {
+ content: "\e93e";
+}
+.icon-credit-card:before {
+ content: "\e93f";
+}
+.icon-calculator:before {
+ content: "\e940";
+}
+.icon-lifebuoy:before {
+ content: "\e941";
+}
+.icon-phone:before {
+ content: "\e942";
+}
+.icon-phone-hang-up:before {
+ content: "\e943";
+}
+.icon-address-book:before {
+ content: "\e944";
+}
+.icon-envelop:before {
+ content: "\e945";
+}
+.icon-pushpin:before {
+ content: "\e946";
+}
+.icon-location:before {
+ content: "\e947";
+}
+.icon-location2:before {
+ content: "\e948";
+}
+.icon-compass:before {
+ content: "\e949";
+}
+.icon-compass2:before {
+ content: "\e94a";
+}
+.icon-map:before {
+ content: "\e94b";
+}
+.icon-map2:before {
+ content: "\e94c";
+}
+.icon-history:before {
+ content: "\e94d";
+}
+.icon-clock:before {
+ content: "\e94e";
+}
+.icon-clock2:before {
+ content: "\e94f";
+}
+.icon-alarm:before {
+ content: "\e950";
+}
+.icon-bell:before {
+ content: "\e951";
+}
+.icon-stopwatch:before {
+ content: "\e952";
+}
+.icon-calendar:before {
+ content: "\e953";
+}
+.icon-printer:before {
+ content: "\e954";
+}
+.icon-keyboard:before {
+ content: "\e955";
+}
+.icon-display:before {
+ content: "\e956";
+}
+.icon-laptop:before {
+ content: "\e957";
+}
+.icon-mobile:before {
+ content: "\e958";
+}
+.icon-mobile2:before {
+ content: "\e959";
+}
+.icon-tablet:before {
+ content: "\e95a";
+}
+.icon-tv:before {
+ content: "\e95b";
+}
+.icon-drawer:before {
+ content: "\e95c";
+}
+.icon-drawer2:before {
+ content: "\e95d";
+}
+.icon-box-add:before {
+ content: "\e95e";
+}
+.icon-box-remove:before {
+ content: "\e95f";
+}
+.icon-download:before {
+ content: "\e960";
+}
+.icon-upload:before {
+ content: "\e961";
+}
+.icon-floppy-disk:before {
+ content: "\e962";
+}
+.icon-drive:before {
+ content: "\e963";
+}
+.icon-database:before {
+ content: "\e964";
+}
+.icon-undo:before {
+ content: "\e965";
+}
+.icon-redo:before {
+ content: "\e966";
+}
+.icon-undo2:before {
+ content: "\e967";
+}
+.icon-redo2:before {
+ content: "\e968";
+}
+.icon-forward:before {
+ content: "\e969";
+}
+.icon-reply:before {
+ content: "\e96a";
+}
+.icon-bubble:before {
+ content: "\e96b";
+}
+.icon-bubbles:before {
+ content: "\e96c";
+}
+.icon-bubbles2:before {
+ content: "\e96d";
+}
+.icon-bubble2:before {
+ content: "\e96e";
+}
+.icon-bubbles3:before {
+ content: "\e96f";
+}
+.icon-bubbles4:before {
+ content: "\e970";
+}
+.icon-user:before {
+ content: "\e971";
+}
+.icon-users:before {
+ content: "\e972";
+}
+.icon-user-plus:before {
+ content: "\e973";
+}
+.icon-user-minus:before {
+ content: "\e974";
+}
+.icon-user-check:before {
+ content: "\e975";
+}
+.icon-user-tie:before {
+ content: "\e976";
+}
+.icon-quotes-left:before {
+ content: "\e977";
+}
+.icon-quotes-right:before {
+ content: "\e978";
+}
+.icon-hour-glass:before {
+ content: "\e979";
+}
+.icon-spinner:before {
+ content: "\e97a";
+}
+.icon-spinner2:before {
+ content: "\e97b";
+}
+.icon-spinner3:before {
+ content: "\e97c";
+}
+.icon-spinner4:before {
+ content: "\e97d";
+}
+.icon-spinner5:before {
+ content: "\e97e";
+}
+.icon-spinner6:before {
+ content: "\e97f";
+}
+.icon-spinner7:before {
+ content: "\e980";
+}
+.icon-spinner8:before {
+ content: "\e981";
+}
+.icon-spinner9:before {
+ content: "\e982";
+}
+.icon-spinner10:before {
+ content: "\e983";
+}
+.icon-spinner11:before {
+ content: "\e984";
+}
+.icon-binoculars:before {
+ content: "\e985";
+}
+.icon-search:before {
+ content: "\e986";
+}
+.icon-zoom-in:before {
+ content: "\e987";
+}
+.icon-zoom-out:before {
+ content: "\e988";
+}
+.icon-enlarge:before {
+ content: "\e989";
+}
+.icon-shrink:before {
+ content: "\e98a";
+}
+.icon-enlarge2:before {
+ content: "\e98b";
+}
+.icon-shrink2:before {
+ content: "\e98c";
+}
+.icon-key:before {
+ content: "\e98d";
+}
+.icon-key2:before {
+ content: "\e98e";
+}
+.icon-lock:before {
+ content: "\e98f";
+}
+.icon-unlocked:before {
+ content: "\e990";
+}
+.icon-wrench:before {
+ content: "\e991";
+}
+.icon-equalizer:before {
+ content: "\e992";
+}
+.icon-equalizer2:before {
+ content: "\e993";
+}
+.icon-cog:before {
+ content: "\e994";
+}
+.icon-cogs:before {
+ content: "\e995";
+}
+.icon-hammer:before {
+ content: "\e996";
+}
+.icon-magic-wand:before {
+ content: "\e997";
+}
+.icon-aid-kit:before {
+ content: "\e998";
+}
+.icon-bug:before {
+ content: "\e999";
+}
+.icon-pie-chart:before {
+ content: "\e99a";
+}
+.icon-stats-dots:before {
+ content: "\e99b";
+}
+.icon-stats-bars:before {
+ content: "\e99c";
+}
+.icon-stats-bars2:before {
+ content: "\e99d";
+}
+.icon-trophy:before {
+ content: "\e99e";
+}
+.icon-gift:before {
+ content: "\e99f";
+}
+.icon-glass:before {
+ content: "\e9a0";
+}
+.icon-glass2:before {
+ content: "\e9a1";
+}
+.icon-mug:before {
+ content: "\e9a2";
+}
+.icon-spoon-knife:before {
+ content: "\e9a3";
+}
+.icon-leaf:before {
+ content: "\e9a4";
+}
+.icon-rocket:before {
+ content: "\e9a5";
+}
+.icon-meter:before {
+ content: "\e9a6";
+}
+.icon-meter2:before {
+ content: "\e9a7";
+}
+.icon-hammer2:before {
+ content: "\e9a8";
+}
+.icon-fire:before {
+ content: "\e9a9";
+}
+.icon-lab:before {
+ content: "\e9aa";
+}
+.icon-magnet:before {
+ content: "\e9ab";
+}
+.icon-bin:before {
+ content: "\e9ac";
+}
+.icon-bin2:before {
+ content: "\e9ad";
+}
+.icon-briefcase:before {
+ content: "\e9ae";
+}
+.icon-airplane:before {
+ content: "\e9af";
+}
+.icon-truck:before {
+ content: "\e9b0";
+}
+.icon-road:before {
+ content: "\e9b1";
+}
+.icon-accessibility:before {
+ content: "\e9b2";
+}
+.icon-target:before {
+ content: "\e9b3";
+}
+.icon-shield:before {
+ content: "\e9b4";
+}
+.icon-power:before {
+ content: "\e9b5";
+}
+.icon-switch:before {
+ content: "\e9b6";
+}
+.icon-power-cord:before {
+ content: "\e9b7";
+}
+.icon-clipboard:before {
+ content: "\e9b8";
+}
+.icon-list-numbered:before {
+ content: "\e9b9";
+}
+.icon-list:before {
+ content: "\e9ba";
+}
+.icon-list2:before {
+ content: "\e9bb";
+}
+.icon-tree:before {
+ content: "\e9bc";
+}
+.icon-menu:before {
+ content: "\e9bd";
+}
+.icon-menu2:before {
+ content: "\e9be";
+}
+.icon-menu3:before {
+ content: "\e9bf";
+}
+.icon-menu4:before {
+ content: "\e9c0";
+}
+.icon-cloud:before {
+ content: "\e9c1";
+}
+.icon-cloud-download:before {
+ content: "\e9c2";
+}
+.icon-cloud-upload:before {
+ content: "\e9c3";
+}
+.icon-cloud-check:before {
+ content: "\e9c4";
+}
+.icon-download2:before {
+ content: "\e9c5";
+}
+.icon-upload2:before {
+ content: "\e9c6";
+}
+.icon-download3:before {
+ content: "\e9c7";
+}
+.icon-upload3:before {
+ content: "\e9c8";
+}
+.icon-sphere:before {
+ content: "\e9c9";
+}
+.icon-earth:before {
+ content: "\e9ca";
+}
+.icon-link:before {
+ content: "\e9cb";
+}
+.icon-flag:before {
+ content: "\e9cc";
+}
+.icon-attachment:before {
+ content: "\e9cd";
+}
+.icon-eye:before {
+ content: "\e9ce";
+}
+.icon-eye-plus:before {
+ content: "\e9cf";
+}
+.icon-eye-minus:before {
+ content: "\e9d0";
+}
+.icon-eye-blocked:before {
+ content: "\e9d1";
+}
+.icon-bookmark:before {
+ content: "\e9d2";
+}
+.icon-bookmarks:before {
+ content: "\e9d3";
+}
+.icon-sun:before {
+ content: "\e9d4";
+}
+.icon-contrast:before {
+ content: "\e9d5";
+}
+.icon-brightness-contrast:before {
+ content: "\e9d6";
+}
+.icon-star-empty:before {
+ content: "\e9d7";
+}
+.icon-star-half:before {
+ content: "\e9d8";
+}
+.icon-star-full:before {
+ content: "\e9d9";
+}
+.icon-heart:before {
+ content: "\e9da";
+}
+.icon-heart-broken:before {
+ content: "\e9db";
+}
+.icon-man:before {
+ content: "\e9dc";
+}
+.icon-woman:before {
+ content: "\e9dd";
+}
+.icon-man-woman:before {
+ content: "\e9de";
+}
+.icon-happy:before {
+ content: "\e9df";
+}
+.icon-happy2:before {
+ content: "\e9e0";
+}
+.icon-smile:before {
+ content: "\e9e1";
+}
+.icon-smile2:before {
+ content: "\e9e2";
+}
+.icon-tongue:before {
+ content: "\e9e3";
+}
+.icon-tongue2:before {
+ content: "\e9e4";
+}
+.icon-sad:before {
+ content: "\e9e5";
+}
+.icon-sad2:before {
+ content: "\e9e6";
+}
+.icon-wink:before {
+ content: "\e9e7";
+}
+.icon-wink2:before {
+ content: "\e9e8";
+}
+.icon-grin:before {
+ content: "\e9e9";
+}
+.icon-grin2:before {
+ content: "\e9ea";
+}
+.icon-cool:before {
+ content: "\e9eb";
+}
+.icon-cool2:before {
+ content: "\e9ec";
+}
+.icon-angry:before {
+ content: "\e9ed";
+}
+.icon-angry2:before {
+ content: "\e9ee";
+}
+.icon-evil:before {
+ content: "\e9ef";
+}
+.icon-evil2:before {
+ content: "\e9f0";
+}
+.icon-shocked:before {
+ content: "\e9f1";
+}
+.icon-shocked2:before {
+ content: "\e9f2";
+}
+.icon-baffled:before {
+ content: "\e9f3";
+}
+.icon-baffled2:before {
+ content: "\e9f4";
+}
+.icon-confused:before {
+ content: "\e9f5";
+}
+.icon-confused2:before {
+ content: "\e9f6";
+}
+.icon-neutral:before {
+ content: "\e9f7";
+}
+.icon-neutral2:before {
+ content: "\e9f8";
+}
+.icon-hipster:before {
+ content: "\e9f9";
+}
+.icon-hipster2:before {
+ content: "\e9fa";
+}
+.icon-wondering:before {
+ content: "\e9fb";
+}
+.icon-wondering2:before {
+ content: "\e9fc";
+}
+.icon-sleepy:before {
+ content: "\e9fd";
+}
+.icon-sleepy2:before {
+ content: "\e9fe";
+}
+.icon-frustrated:before {
+ content: "\e9ff";
+}
+.icon-frustrated2:before {
+ content: "\ea00";
+}
+.icon-crying:before {
+ content: "\ea01";
+}
+.icon-crying2:before {
+ content: "\ea02";
+}
+.icon-point-up:before {
+ content: "\ea03";
+}
+.icon-point-right:before {
+ content: "\ea04";
+}
+.icon-point-down:before {
+ content: "\ea05";
+}
+.icon-point-left:before {
+ content: "\ea06";
+}
+.icon-warning:before {
+ content: "\ea07";
+}
+.icon-notification:before {
+ content: "\ea08";
+}
+.icon-question:before {
+ content: "\ea09";
+}
+.icon-plus:before {
+ content: "\ea0a";
+}
+.icon-minus:before {
+ content: "\ea0b";
+}
+.icon-info:before {
+ content: "\ea0c";
+}
+.icon-cancel-circle:before {
+ content: "\ea0d";
+}
+.icon-blocked:before {
+ content: "\ea0e";
+}
+.icon-cross:before {
+ content: "\ea0f";
+}
+.icon-checkmark:before {
+ content: "\ea10";
+}
+.icon-checkmark2:before {
+ content: "\ea11";
+}
+.icon-spell-check:before {
+ content: "\ea12";
+}
+.icon-enter:before {
+ content: "\ea13";
+}
+.icon-exit:before {
+ content: "\ea14";
+}
+.icon-play2:before {
+ content: "\ea15";
+}
+.icon-pause:before {
+ content: "\ea16";
+}
+.icon-stop:before {
+ content: "\ea17";
+}
+.icon-previous:before {
+ content: "\ea18";
+}
+.icon-next:before {
+ content: "\ea19";
+}
+.icon-backward:before {
+ content: "\ea1a";
+}
+.icon-forward2:before {
+ content: "\ea1b";
+}
+.icon-play3:before {
+ content: "\ea1c";
+}
+.icon-pause2:before {
+ content: "\ea1d";
+}
+.icon-stop2:before {
+ content: "\ea1e";
+}
+.icon-backward2:before {
+ content: "\ea1f";
+}
+.icon-forward3:before {
+ content: "\ea20";
+}
+.icon-first:before {
+ content: "\ea21";
+}
+.icon-last:before {
+ content: "\ea22";
+}
+.icon-previous2:before {
+ content: "\ea23";
+}
+.icon-next2:before {
+ content: "\ea24";
+}
+.icon-eject:before {
+ content: "\ea25";
+}
+.icon-volume-high:before {
+ content: "\ea26";
+}
+.icon-volume-medium:before {
+ content: "\ea27";
+}
+.icon-volume-low:before {
+ content: "\ea28";
+}
+.icon-volume-mute:before {
+ content: "\ea29";
+}
+.icon-volume-mute2:before {
+ content: "\ea2a";
+}
+.icon-volume-increase:before {
+ content: "\ea2b";
+}
+.icon-volume-decrease:before {
+ content: "\ea2c";
+}
+.icon-loop:before {
+ content: "\ea2d";
+}
+.icon-loop2:before {
+ content: "\ea2e";
+}
+.icon-infinite:before {
+ content: "\ea2f";
+}
+.icon-shuffle:before {
+ content: "\ea30";
+}
+.icon-arrow-up-left:before {
+ content: "\ea31";
+}
+.icon-arrow-up:before {
+ content: "\ea32";
+}
+.icon-arrow-up-right:before {
+ content: "\ea33";
+}
+.icon-arrow-right:before {
+ content: "\ea34";
+}
+.icon-arrow-down-right:before {
+ content: "\ea35";
+}
+.icon-arrow-down:before {
+ content: "\ea36";
+}
+.icon-arrow-down-left:before {
+ content: "\ea37";
+}
+.icon-arrow-left:before {
+ content: "\ea38";
+}
+.icon-arrow-up-left2:before {
+ content: "\ea39";
+}
+.icon-arrow-up2:before {
+ content: "\ea3a";
+}
+.icon-arrow-up-right2:before {
+ content: "\ea3b";
+}
+.icon-arrow-right2:before {
+ content: "\ea3c";
+}
+.icon-arrow-down-right2:before {
+ content: "\ea3d";
+}
+.icon-arrow-down2:before {
+ content: "\ea3e";
+}
+.icon-arrow-down-left2:before {
+ content: "\ea3f";
+}
+.icon-arrow-left2:before {
+ content: "\ea40";
+}
+.icon-circle-up:before {
+ content: "\ea41";
+}
+.icon-circle-right:before {
+ content: "\ea42";
+}
+.icon-circle-down:before {
+ content: "\ea43";
+}
+.icon-circle-left:before {
+ content: "\ea44";
+}
+.icon-tab:before {
+ content: "\ea45";
+}
+.icon-move-up:before {
+ content: "\ea46";
+}
+.icon-move-down:before {
+ content: "\ea47";
+}
+.icon-sort-alpha-asc:before {
+ content: "\ea48";
+}
+.icon-sort-alpha-desc:before {
+ content: "\ea49";
+}
+.icon-sort-numeric-asc:before {
+ content: "\ea4a";
+}
+.icon-sort-numberic-desc:before {
+ content: "\ea4b";
+}
+.icon-sort-amount-asc:before {
+ content: "\ea4c";
+}
+.icon-sort-amount-desc:before {
+ content: "\ea4d";
+}
+.icon-command:before {
+ content: "\ea4e";
+}
+.icon-shift:before {
+ content: "\ea4f";
+}
+.icon-ctrl:before {
+ content: "\ea50";
+}
+.icon-opt:before {
+ content: "\ea51";
+}
+.icon-checkbox-checked:before {
+ content: "\ea52";
+}
+.icon-checkbox-unchecked:before {
+ content: "\ea53";
+}
+.icon-radio-checked:before {
+ content: "\ea54";
+}
+.icon-radio-checked2:before {
+ content: "\ea55";
+}
+.icon-radio-unchecked:before {
+ content: "\ea56";
+}
+.icon-crop:before {
+ content: "\ea57";
+}
+.icon-make-group:before {
+ content: "\ea58";
+}
+.icon-ungroup:before {
+ content: "\ea59";
+}
+.icon-scissors:before {
+ content: "\ea5a";
+}
+.icon-filter:before {
+ content: "\ea5b";
+}
+.icon-font:before {
+ content: "\ea5c";
+}
+.icon-ligature:before {
+ content: "\ea5d";
+}
+.icon-ligature2:before {
+ content: "\ea5e";
+}
+.icon-text-height:before {
+ content: "\ea5f";
+}
+.icon-text-width:before {
+ content: "\ea60";
+}
+.icon-font-size:before {
+ content: "\ea61";
+}
+.icon-bold:before {
+ content: "\ea62";
+}
+.icon-underline:before {
+ content: "\ea63";
+}
+.icon-italic:before {
+ content: "\ea64";
+}
+.icon-strikethrough:before {
+ content: "\ea65";
+}
+.icon-omega:before {
+ content: "\ea66";
+}
+.icon-sigma:before {
+ content: "\ea67";
+}
+.icon-page-break:before {
+ content: "\ea68";
+}
+.icon-superscript:before {
+ content: "\ea69";
+}
+.icon-subscript:before {
+ content: "\ea6a";
+}
+.icon-superscript2:before {
+ content: "\ea6b";
+}
+.icon-subscript2:before {
+ content: "\ea6c";
+}
+.icon-text-color:before {
+ content: "\ea6d";
+}
+.icon-pagebreak:before {
+ content: "\ea6e";
+}
+.icon-clear-formatting:before {
+ content: "\ea6f";
+}
+.icon-table:before {
+ content: "\ea70";
+}
+.icon-table2:before {
+ content: "\ea71";
+}
+.icon-insert-template:before {
+ content: "\ea72";
+}
+.icon-pilcrow:before {
+ content: "\ea73";
+}
+.icon-ltr:before {
+ content: "\ea74";
+}
+.icon-rtl:before {
+ content: "\ea75";
+}
+.icon-section:before {
+ content: "\ea76";
+}
+.icon-paragraph-left:before {
+ content: "\ea77";
+}
+.icon-paragraph-center:before {
+ content: "\ea78";
+}
+.icon-paragraph-right:before {
+ content: "\ea79";
+}
+.icon-paragraph-justify:before {
+ content: "\ea7a";
+}
+.icon-indent-increase:before {
+ content: "\ea7b";
+}
+.icon-indent-decrease:before {
+ content: "\ea7c";
+}
+.icon-share:before {
+ content: "\ea7d";
+}
+.icon-new-tab:before {
+ content: "\ea7e";
+}
+.icon-embed:before {
+ content: "\ea7f";
+}
+.icon-embed2:before {
+ content: "\ea80";
+}
+.icon-terminal:before {
+ content: "\ea81";
+}
+.icon-share2:before {
+ content: "\ea82";
+}
+.icon-mail:before {
+ content: "\ea83";
+}
+.icon-mail2:before {
+ content: "\ea84";
+}
+.icon-mail3:before {
+ content: "\ea85";
+}
+.icon-mail4:before {
+ content: "\ea86";
+}
+.icon-amazon:before {
+ content: "\ea87";
+}
+.icon-google:before {
+ content: "\ea88";
+}
+.icon-google2:before {
+ content: "\ea89";
+}
+.icon-google3:before {
+ content: "\ea8a";
+}
+.icon-google-plus:before {
+ content: "\ea8b";
+}
+.icon-google-plus2:before {
+ content: "\ea8c";
+}
+.icon-google-plus3:before {
+ content: "\ea8d";
+}
+.icon-hangouts:before {
+ content: "\ea8e";
+}
+.icon-google-drive:before {
+ content: "\ea8f";
+}
+.icon-facebook:before {
+ content: "\ea90";
+}
+.icon-facebook2:before {
+ content: "\ea91";
+}
+.icon-instagram:before {
+ content: "\ea92";
+}
+.icon-whatsapp:before {
+ content: "\ea93";
+}
+.icon-spotify:before {
+ content: "\ea94";
+}
+.icon-telegram:before {
+ content: "\ea95";
+}
+.icon-twitter:before {
+ content: "\ea96";
+}
+.icon-vine:before {
+ content: "\ea97";
+}
+.icon-vk:before {
+ content: "\ea98";
+}
+.icon-renren:before {
+ content: "\ea99";
+}
+.icon-sina-weibo:before {
+ content: "\ea9a";
+}
+.icon-rss:before {
+ content: "\ea9b";
+}
+.icon-rss2:before {
+ content: "\ea9c";
+}
+.icon-youtube:before {
+ content: "\ea9d";
+}
+.icon-youtube2:before {
+ content: "\ea9e";
+}
+.icon-twitch:before {
+ content: "\ea9f";
+}
+.icon-vimeo:before {
+ content: "\eaa0";
+}
+.icon-vimeo2:before {
+ content: "\eaa1";
+}
+.icon-lanyrd:before {
+ content: "\eaa2";
+}
+.icon-flickr:before {
+ content: "\eaa3";
+}
+.icon-flickr2:before {
+ content: "\eaa4";
+}
+.icon-flickr3:before {
+ content: "\eaa5";
+}
+.icon-flickr4:before {
+ content: "\eaa6";
+}
+.icon-dribbble:before {
+ content: "\eaa7";
+}
+.icon-behance:before {
+ content: "\eaa8";
+}
+.icon-behance2:before {
+ content: "\eaa9";
+}
+.icon-deviantart:before {
+ content: "\eaaa";
+}
+.icon-500px:before {
+ content: "\eaab";
+}
+.icon-steam:before {
+ content: "\eaac";
+}
+.icon-steam2:before {
+ content: "\eaad";
+}
+.icon-dropbox:before {
+ content: "\eaae";
+}
+.icon-onedrive:before {
+ content: "\eaaf";
+}
+.icon-github:before {
+ content: "\eab0";
+}
+.icon-npm:before {
+ content: "\eab1";
+}
+.icon-basecamp:before {
+ content: "\eab2";
+}
+.icon-trello:before {
+ content: "\eab3";
+}
+.icon-wordpress:before {
+ content: "\eab4";
+}
+.icon-joomla:before {
+ content: "\eab5";
+}
+.icon-ello:before {
+ content: "\eab6";
+}
+.icon-blogger:before {
+ content: "\eab7";
+}
+.icon-blogger2:before {
+ content: "\eab8";
+}
+.icon-tumblr:before {
+ content: "\eab9";
+}
+.icon-tumblr2:before {
+ content: "\eaba";
+}
+.icon-yahoo:before {
+ content: "\eabb";
+}
+.icon-yahoo2:before {
+ content: "\eabc";
+}
+.icon-tux:before {
+ content: "\eabd";
+}
+.icon-appleinc:before {
+ content: "\eabe";
+}
+.icon-finder:before {
+ content: "\eabf";
+}
+.icon-android:before {
+ content: "\eac0";
+}
+.icon-windows:before {
+ content: "\eac1";
+}
+.icon-windows8:before {
+ content: "\eac2";
+}
+.icon-soundcloud:before {
+ content: "\eac3";
+}
+.icon-soundcloud2:before {
+ content: "\eac4";
+}
+.icon-skype:before {
+ content: "\eac5";
+}
+.icon-reddit:before {
+ content: "\eac6";
+}
+.icon-hackernews:before {
+ content: "\eac7";
+}
+.icon-wikipedia:before {
+ content: "\eac8";
+}
+.icon-linkedin:before {
+ content: "\eac9";
+}
+.icon-linkedin2:before {
+ content: "\eaca";
+}
+.icon-lastfm:before {
+ content: "\eacb";
+}
+.icon-lastfm2:before {
+ content: "\eacc";
+}
+.icon-delicious:before {
+ content: "\eacd";
+}
+.icon-stumbleupon:before {
+ content: "\eace";
+}
+.icon-stumbleupon2:before {
+ content: "\eacf";
+}
+.icon-stackoverflow:before {
+ content: "\ead0";
+}
+.icon-pinterest:before {
+ content: "\ead1";
+}
+.icon-pinterest2:before {
+ content: "\ead2";
+}
+.icon-xing:before {
+ content: "\ead3";
+}
+.icon-xing2:before {
+ content: "\ead4";
+}
+.icon-flattr:before {
+ content: "\ead5";
+}
+.icon-foursquare:before {
+ content: "\ead6";
+}
+.icon-yelp:before {
+ content: "\ead7";
+}
+.icon-paypal:before {
+ content: "\ead8";
+}
+.icon-chrome:before {
+ content: "\ead9";
+}
+.icon-firefox:before {
+ content: "\eada";
+}
+.icon-IE:before {
+ content: "\eadb";
+}
+.icon-edge:before {
+ content: "\eadc";
+}
+.icon-safari:before {
+ content: "\eadd";
+}
+.icon-opera:before {
+ content: "\eade";
+}
+.icon-file-pdf:before {
+ content: "\eadf";
+}
+.icon-file-openoffice:before {
+ content: "\eae0";
+}
+.icon-file-word:before {
+ content: "\eae1";
+}
+.icon-file-excel:before {
+ content: "\eae2";
+}
+.icon-libreoffice:before {
+ content: "\eae3";
+}
+.icon-html-five:before {
+ content: "\eae4";
+}
+.icon-html-five2:before {
+ content: "\eae5";
+}
+.icon-css3:before {
+ content: "\eae6";
+}
+.icon-git:before {
+ content: "\eae7";
+}
+.icon-codepen:before {
+ content: "\eae8";
+}
+.icon-svg:before {
+ content: "\eae9";
+}
+.icon-IcoMoon:before {
+ content: "\eaea";
+}
diff --git a/taoyao-client-web/src/assets/logo.svg b/taoyao-client-web/src/assets/logo.svg
deleted file mode 100644
index bc826fe..0000000
--- a/taoyao-client-web/src/assets/logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/taoyao-client-web/src/assets/main.css b/taoyao-client-web/src/assets/main.css
index e8667cd..7dd1f29 100644
--- a/taoyao-client-web/src/assets/main.css
+++ b/taoyao-client-web/src/assets/main.css
@@ -1,10 +1,10 @@
-@import './base.css';
+@import "./base.css";
+@import "./font.taoyao.css";
#app {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
-
font-weight: normal;
}
diff --git a/taoyao-client-web/src/components/Config.js b/taoyao-client-web/src/components/Config.js
new file mode 100644
index 0000000..e69de29
diff --git a/taoyao-client-web/src/components/HelloWorld.vue b/taoyao-client-web/src/components/HelloWorld.vue
deleted file mode 100644
index 0a0988b..0000000
--- a/taoyao-client-web/src/components/HelloWorld.vue
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
-
{{ msg }}
-
- You’ve successfully created a project with
- Vite +
- Vue 3 .
-
-
-
-
-
diff --git a/taoyao-client-web/src/components/LocalClient.vue b/taoyao-client-web/src/components/LocalClient.vue
new file mode 100644
index 0000000..84d30f5
--- /dev/null
+++ b/taoyao-client-web/src/components/LocalClient.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/taoyao-client-web/src/components/RemoteClient.vue b/taoyao-client-web/src/components/RemoteClient.vue
new file mode 100644
index 0000000..d84bf19
--- /dev/null
+++ b/taoyao-client-web/src/components/RemoteClient.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/taoyao-client-web/src/components/Taoyao.js b/taoyao-client-web/src/components/Taoyao.js
new file mode 100644
index 0000000..e69de29
diff --git a/taoyao-client-web/src/components/TheWelcome.vue b/taoyao-client-web/src/components/TheWelcome.vue
deleted file mode 100644
index 5e64625..0000000
--- a/taoyao-client-web/src/components/TheWelcome.vue
+++ /dev/null
@@ -1,86 +0,0 @@
-
-
-
-
-
-
-
- Documentation
-
- Vue’s
- official documentation
- provides you with all information you need to get started.
-
-
-
-
-
-
- Tooling
-
- This project is served and bundled with
- Vite . The
- recommended IDE setup is
- VSCode +
- Volar . If
- you need to test your components and web pages, check out
- Cypress and
- Cypress Component Testing .
-
-
-
- More instructions are available in README.md.
-
-
-
-
-
-
- Ecosystem
-
- Get official tools and libraries for your project:
- Pinia ,
- Vue Router ,
- Vue Test Utils , and
- Vue Dev Tools . If
- you need more resources, we suggest paying
- Awesome Vue
- a visit.
-
-
-
-
-
-
- Community
-
- Got stuck? Ask your question on
- Vue Land , our official
- Discord server, or
- StackOverflow . You should also subscribe to
- our mailing list and follow
- the official
- @vuejs
- twitter account for latest news in the Vue world.
-
-
-
-
-
-
- Support Vue
-
- As an independent project, Vue relies on community backing for its sustainability. You can help
- us by
- becoming a sponsor .
-
-
diff --git a/taoyao-client-web/src/components/WelcomeItem.vue b/taoyao-client-web/src/components/WelcomeItem.vue
deleted file mode 100644
index ba0def3..0000000
--- a/taoyao-client-web/src/components/WelcomeItem.vue
+++ /dev/null
@@ -1,86 +0,0 @@
-
-
-
-
-
diff --git a/taoyao-client-web/src/components/icons/IconCommunity.vue b/taoyao-client-web/src/components/icons/IconCommunity.vue
deleted file mode 100644
index 2dc8b05..0000000
--- a/taoyao-client-web/src/components/icons/IconCommunity.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/taoyao-client-web/src/components/icons/IconDocumentation.vue b/taoyao-client-web/src/components/icons/IconDocumentation.vue
deleted file mode 100644
index 6d4791c..0000000
--- a/taoyao-client-web/src/components/icons/IconDocumentation.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/taoyao-client-web/src/components/icons/IconEcosystem.vue b/taoyao-client-web/src/components/icons/IconEcosystem.vue
deleted file mode 100644
index c3a4f07..0000000
--- a/taoyao-client-web/src/components/icons/IconEcosystem.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/taoyao-client-web/src/components/icons/IconSupport.vue b/taoyao-client-web/src/components/icons/IconSupport.vue
deleted file mode 100644
index 7452834..0000000
--- a/taoyao-client-web/src/components/icons/IconSupport.vue
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/taoyao-client-web/src/components/icons/IconTooling.vue b/taoyao-client-web/src/components/icons/IconTooling.vue
deleted file mode 100644
index 660598d..0000000
--- a/taoyao-client-web/src/components/icons/IconTooling.vue
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
diff --git a/taoyao-client-web/vite.config.js b/taoyao-client-web/vite.config.js
index 80580b0..7486105 100644
--- a/taoyao-client-web/vite.config.js
+++ b/taoyao-client-web/vite.config.js
@@ -7,11 +7,11 @@ import vue from "@vitejs/plugin-vue";
export default defineConfig({
plugins: [vue()],
server: {
- host: "0.0.0.0"
+ host: "0.0.0.0",
},
resolve: {
alias: {
"@": fileURLToPath(new URL("./src", import.meta.url)),
},
- },
+ }
});
diff --git a/taoyao-media-server/src/Config.js b/taoyao-media-server/src/Config.js
index 268f646..e0c2699 100644
--- a/taoyao-media-server/src/Config.js
+++ b/taoyao-media-server/src/Config.js
@@ -1,5 +1,5 @@
/**
- * 配置
+ * 服务配置
*/
const os = require("os");
@@ -12,7 +12,7 @@ module.exports = {
logLevel: 'DEBUG',
// 信令服务
https: {
- listenIp: "0.0.0.0",
+ listenIp: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0",
listenPort: process.env.HTTPS_LISTEN_PORT || 4443,
// WebSocket连接密码
username: "taoyao",
@@ -20,7 +20,7 @@ module.exports = {
tls: {
cert: process.env.HTTPS_CERT_PUBLIC_KEY || `${__dirname}/certs/publicKey.pem`,
key: process.env.HTTPS_CERT_PRIVATE_KEY || `${__dirname}/certs/privateKey.pem`,
- },
+ }
},
// Mediasoup
mediasoup: {
@@ -37,15 +37,15 @@ module.exports = {
"svc",
"dtls",
"info",
+ "rtcp",
"sctp",
"srtp",
- "rtcp",
"score",
"message",
- "simulcast",
+ "simulcast"
],
rtcMinPort: process.env.MEDIASOUP_MIN_PORT || 40000,
- rtcMaxPort: process.env.MEDIASOUP_MAX_PORT || 49999,
+ rtcMaxPort: process.env.MEDIASOUP_MAX_PORT || 49999
},
// Router:https://mediasoup.org/documentation/v3/mediasoup/api/#RouterOptions
routerOptions: {
@@ -54,7 +54,7 @@ module.exports = {
kind: "audio",
mimeType: "audio/opus",
clockRate: 48000,
- channels: 2,
+ channels: 2
},
{
kind: "video",
@@ -62,7 +62,7 @@ module.exports = {
clockRate: 90000,
parameters: {
"x-google-start-bitrate": 1000,
- },
+ }
},
{
kind: "video",
@@ -70,8 +70,8 @@ module.exports = {
clockRate: 90000,
parameters: {
"profile-id": 2,
- "x-google-start-bitrate": 1000,
- },
+ "x-google-start-bitrate": 1000
+ }
},
{
kind: "video",
@@ -81,8 +81,8 @@ module.exports = {
"packetization-mode": 1,
"profile-level-id": "4d0032",
"level-asymmetry-allowed": 1,
- "x-google-start-bitrate": 1000,
- },
+ "x-google-start-bitrate": 1000
+ }
},
{
kind: "video",
@@ -92,10 +92,10 @@ module.exports = {
"packetization-mode": 1,
"profile-level-id": "42e01f",
"level-asymmetry-allowed": 1,
- "x-google-start-bitrate": 1000,
- },
- },
- ],
+ "x-google-start-bitrate": 1000
+ }
+ }
+ ]
},
// WebRtcServer:https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcServerOptions
webRtcServerOptions: {
@@ -103,38 +103,42 @@ module.exports = {
{
protocol: "udp",
ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0",
- announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP,
port: 44444,
+ // 公网地址
+ announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP
},
{
protocol: "tcp",
ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0",
- announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP,
port: 44444,
- },
- ],
+ // 公网地址
+ announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP
+ }
+ ]
},
// WebRtcTransport:https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcTransportOptions
webRtcTransportOptions: {
listenIps: [
{
ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0",
- announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP,
- },
+ // 公网地址
+ announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP
+ }
],
initialAvailableOutgoingBitrate: 1000000,
minimumAvailableOutgoingBitrate: 600000,
maxSctpMessageSize: 262144,
- maxIncomingBitrate: 1500000,
+ maxIncomingBitrate: 1500000
},
// PlainTransport:https://mediasoup.org/documentation/v3/mediasoup/api/#PlainTransportOptions
plainTransportOptions: {
listenIp: {
ip: process.env.MEDIASOUP_LISTEN_IP || "0.0.0.0",
+ // 公网地址
announcedIp: process.env.MEDIASOUP_ANNOUNCED_IP,
},
- maxSctpMessageSize: 262144,
- },
+ maxSctpMessageSize: 262144
+ }
},
wellcome: `
@@ -150,5 +154,5 @@ module.exports = {
taoyao-media-server
acgist
- `,
+ `
};
diff --git a/taoyao-media-server/src/Server.js b/taoyao-media-server/src/Server.js
index 55c07df..63eddfa 100644
--- a/taoyao-media-server/src/Server.js
+++ b/taoyao-media-server/src/Server.js
@@ -5,7 +5,7 @@
const fs = require("fs");
const ws = require("ws");
const https = require("https");
-// const mediasoup = require("mediasoup");
+const mediasoup = require("mediasoup");
const config = require("./Config");
const Logger = require("./Logger");
const Signal = require("./Signal");
@@ -212,7 +212,7 @@ async function onmessage(message, session) {
async function main() {
logger.debug("DEBUG").info("INFO").warn("WARN").error("ERROR");
logger.info("开始启动:%s", config.name);
- // await buildMediasoupWorker();
+ await buildMediasoupWorker();
await buildSignalServer();
await buildCommandConsole();
await buildClientInterval();
diff --git a/taoyao-signal-server/README.md b/taoyao-signal-server/README.md
index cb7ea64..8a5f76a 100644
--- a/taoyao-signal-server/README.md
+++ b/taoyao-signal-server/README.md
@@ -10,21 +10,27 @@
|taoyao-signal|信令|信令服务|
|taoyao-server|服务|启动服务|
+## 模式
+
+### 直播模式
+
+### 监控模式
+
### 会议模式
所有人员均能视频通话对讲
-### 对讲模式
+### 会议广播模式
-两个人员之间对讲
+会议模式中只能单人讲话
-### 广播模式
+### 会议对讲模式
-单个人员能够讲话并且能够听到其他人员讲话,其他人员之间不能讲话。
+会议模式中只能两个人员之间对讲
### 本地视频模式
-使用本地文件作为音频视频信息
+使用本地文件作为音频视频来源
## 模块关系
diff --git a/taoyao-signal-server/pom.xml b/taoyao-signal-server/pom.xml
index a53d9a3..46e8ffb 100644
--- a/taoyao-signal-server/pom.xml
+++ b/taoyao-signal-server/pom.xml
@@ -6,7 +6,7 @@
org.springframework.boot
spring-boot-starter-parent
- 3.0.0
+ 3.0.2
@@ -24,7 +24,6 @@
17
1.18.24
- 6.18.0
2.0.0
1.5.3.Final
4.4
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/config/SpringDocAutoConfiguration.java
index 360b3a8..d2f6aa5 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/config/SpringDocAutoConfiguration.java
@@ -38,11 +38,11 @@ public class SpringDocAutoConfiguration {
private TaoyaoProperties taoyaoProperties;
@Bean
- public GroupedOpenApi meetingApi() {
+ public GroupedOpenApi roomApi() {
return GroupedOpenApi.builder()
- .group("meeting")
- .displayName("会议")
- .packagesToScan("com.acgist.taoyao.meeting")
+ .group("signal")
+ .displayName("信令")
+ .packagesToScan("com.acgist.taoyao.signal")
.build();
}
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 16c546d..1f34570 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
@@ -27,6 +27,11 @@ public class MediaProperties {
*/
@Schema(title = "视频配置", description = "视频配置")
private MediaVideoProperties video;
+ /**
+ * 超清视频
+ */
+ @Schema(title = "超清视频", description = "超清视频")
+ private MediaVideoProperties mostVideo;
/**
* 高清视频
*/
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 ddd557a..475a065 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
@@ -41,11 +41,4 @@ public class SecurityProperties {
*/
private String password;
- /**
- * @return 授权信息
- */
- public String getAuthorization() {
- return this.username + ":" + this.password;
- }
-
}
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 50e5a21..0c491b8 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
@@ -1,5 +1,7 @@
package com.acgist.taoyao.boot.property;
+import java.util.List;
+
import org.springframework.boot.context.properties.ConfigurationProperties;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -69,6 +71,6 @@ public class WebrtcProperties {
* Mediasoup配置
*/
@Schema(title = "Mediasoup配置", description = "Mediasoup配置")
- private MediasoupProperties mediasoup;
+ private List mediasoupList;
}
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 63c72c6..00b80e5 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
@@ -7,9 +7,11 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
+import org.springframework.util.AntPathMatcher;
import com.acgist.taoyao.boot.interceptor.InterceptorAdapter;
import com.acgist.taoyao.boot.property.SecurityProperties;
+import com.acgist.taoyao.signal.service.SecurityService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@@ -23,6 +25,10 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class SecurityInterceptor extends InterceptorAdapter {
+ private AntPathMatcher matcher = new AntPathMatcher();
+
+ @Autowired
+ private SecurityService securityService;
@Autowired
private SecurityProperties securityProperties;
@@ -46,6 +52,9 @@ public class SecurityInterceptor extends InterceptorAdapter {
if(this.permit(request) || this.authorization(request)) {
return true;
}
+ if(log.isInfoEnabled()) {
+ log.info("授权失败:{}", request.getRequestURL());
+ }
response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.setHeader(HttpHeaders.WWW_AUTHENTICATE, "Basic Realm=\"" + this.securityProperties.getRealm() + "\"");
return false;
@@ -58,12 +67,12 @@ public class SecurityInterceptor extends InterceptorAdapter {
*/
private boolean permit(HttpServletRequest request) {
final String uri = request.getRequestURI();
- if(ArrayUtils.isEmpty(this.securityProperties.getPermit())) {
+ final String[] permit = this.securityProperties.getPermit();
+ if(ArrayUtils.isEmpty(permit)) {
return false;
}
- for (String permit : this.securityProperties.getPermit()) {
- if(StringUtils.startsWith(uri, permit)) {
- log.debug("授权成功(许可请求):{}-{}", uri, permit);
+ for (String pattern : permit) {
+ if(this.matcher.match(pattern, uri)) {
return true;
}
}
@@ -76,7 +85,6 @@ public class SecurityInterceptor extends InterceptorAdapter {
* @return 是否授权成功
*/
private boolean authorization(HttpServletRequest request) {
- final String uri = request.getRequestURI();
String authorization = request.getHeader(HttpHeaders.AUTHORIZATION);
if(StringUtils.isEmpty(authorization)) {
return false;
@@ -86,11 +94,13 @@ public class SecurityInterceptor extends InterceptorAdapter {
}
authorization = authorization.substring(SecurityProperties.BASIC.length()).strip();
authorization = new String(Base64.getDecoder().decode(authorization));
- if(!authorization.equals(this.securityProperties.getAuthorization())) {
+ final int index = authorization.indexOf(':');
+ if(index < 0) {
return false;
}
- log.debug("授权成功(Basic):{}-{}", uri, authorization);
- return true;
+ final String username = authorization.substring(0, index);
+ final String password = authorization.substring(index + 1);
+ return this.securityService.authenticate(username, password);
}
}
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 e69de29..78ea350 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
@@ -0,0 +1,4 @@
+taoyao:
+ security:
+ permit: /v3/api-docs/**,/swagger-ui/**,/swagger-ui.html,/,/error,/index.html,/favicon.ico
+
\ No newline at end of file
diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/application-release.yml b/taoyao-signal-server/taoyao-server/src/main/resources/application-release.yml
index 62fcb53..e69de29 100644
--- a/taoyao-signal-server/taoyao-server/src/main/resources/application-release.yml
+++ b/taoyao-signal-server/taoyao-server/src/main/resources/application-release.yml
@@ -1,3 +0,0 @@
-taoyao:
- security:
- permit: /favicon.ico,/error
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 6be3678..28ed0fd 100644
--- a/taoyao-signal-server/taoyao-server/src/main/resources/application.yml
+++ b/taoyao-signal-server/taoyao-server/src/main/resources/application.yml
@@ -67,6 +67,12 @@ taoyao:
bitrate: 1200
frame-rate: 24
resolution: 1920*1080
+ # 超清视频
+ most-video:
+ format: H264
+ bitrate: 1200
+ frame-rate: 24
+ resolution: 1920*1080
# 高清视频
high-video:
format: H264
@@ -87,18 +93,13 @@ taoyao:
resolution: 640*480
# WebRTC配置
webrtc:
- # 架构模式
- framework: MESH
- # 媒体端口范围
- min-port: 40000
- max-port: 49999
- # 公共服务
+ # STUN服务
stun:
- stun:stun1.l.google.com:19302
- stun:stun2.l.google.com:19302
- stun:stun3.l.google.com:19302
- stun:stun4.l.google.com:19302
- # 自己搭建:coturn
+ # TURN服务:coturn
turn:
- turn:127.0.0.1:8888
- turn:127.0.0.1:8888
@@ -111,24 +112,35 @@ taoyao:
schema: wss
websocket: /websocket.signal
# Mediasoup服务配置:可以部署多个简单实现负载均衡
- mediasoup:
- host: 127.0.0.1
- #host: 192.168.8.110
- port: 4443
- schema: wss
- websocket: /websocket.signal
- username: taoyao
- password: taoyao
+ mediasoup-list:
+ - host: 127.0.0.1
+ #host: 192.168.8.110
+ port: 4443
+ schema: wss
+ websocket: /websocket.signal
+ username: taoyao
+ password: taoyao
+ - host: 127.0.0.1
+ #host: 192.168.8.110
+ port: 4443
+ schema: wss
+ websocket: /websocket.signal
+ username: taoyao
+ password: taoyao
+ # 录像配置
record:
storage: /data/record
+ # 安全配置
security:
enabled: true
realm: taoyao
- permit: /v3/api-docs/,/swagger-ui/,/swagger-ui.html,/favicon.ico,/error
+ permit: /,/error,/index.html,/favicon.ico
username: taoyao
password: taoyao
+ # 定时任务
scheduled:
session: 0 * * * * ?
+ # 集群节点
node-list:
- host: localhost
port: 8888
diff --git a/taoyao-signal-server/taoyao-server/src/main/resources/static/favicon.ico b/taoyao-signal-server/taoyao-server/src/main/resources/static/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..e7cf988d07ffe5c6b007459e6794f0d1f4e06368
GIT binary patch
literal 16958
zcmeI4d+c3B5yvkAB9LeV1O-tL&>9hAj4^?jR1h&V5{wWrm>@oRDlrNaS_&dkT0sP*
zvCs#|qx@PPmPcuM{CLQ#Ahy&}3YDf%ftEL=Ev1xkK0Uw5nY(w-IeYFszy9-MnsfKu
zduC_nyJu&2W_EvVwKmg#!-u!@bGO#8{adXaTdmeGz4WKnnR@a2MjD&g6`&wE~m9Pz$w+;0l}@4PGWq_%nOe38rMicEN@{kl|tn>J5m
z;fo^cly|UcuznV5!NSiw
z{^dVJwmUNoYf7Jd_zaO>Trct;9UDzi)A;B8PvkpOGn-1m)D6#OI)1)&naG37dhdm%
z@UK{vy_*l{8d`>lG5z%kBFEhzGPYmjoV#-V(X&Oy-7Rv$jUvPUmS!tQ^@%Khz59M>
z0{^YLhU|P!jw8gsI`VASzuU=f-9`nt+%2$WF#lKeH
zTTmJFYDr8tJq@L_Z%nk$aCdw#h!MH-(;~C
z?tMX|4|M)a83%RnGxiR=i$)f%A~dJN3dAs^)___(#v_Y~yh4
zkFxo#syCXzPaEL;*>#=zov3qS8KvT%^His7*1TS@qgPY-k;Q!bg@`Sbt&J)8UtTS;
zOTqen&oi{#JvE7c*=r(Op4R!EwpagP`5SQ^Q}DB{ny*1g8|LR7s&>~4HHrUt^&3sk
z4+i~k)U|OftMEUuBFAd7$IQume7@t0!_zG_g@5H+B3lh${>nun=ii(6h3Wm!vQ90l
z@Q3sLXU-F0{h#}6F8|1BopMuuX$t>YcjWq9Gf!l_`Ujzpbdau7A(i1@`l`qlBXha*
z!STNdTde>F2imiD~~{O4)RXnIb3IByq!C5#uyA9yOlzd_g2j|VZ=q`AIkc8{&m
zHh$T
zw9Wf@vmoXwo=?=t?~bu85JiF?6MJ{cX!slE7Sr(X68
zcI)%b#ObDE4F3x%%dk^^`OhY)xb*fi<7mx0-?6=qjLGWlqj|4X>K4D{AQ+oqsG<`BA08hGis9$|`Mw%8JL9eT{Pj(F
zy_ru`ac9rF!TKm#+&l_(;4l3=likgd;ITIx@~d0
zUUl%ZSD8xmXVW-~|I#q9rX
z^^Z*_$|?+*r1npXjftP1d8PfC|CWk>)w(>!-D_NX9O~s2-TT}Sn9QbQ_*brK$Im`i
zUGhG}NxCi;Q7V2P=8~JKMXY^mAtsem~x*!#+n{A|Jnp+A8&VZ>!aYL#o10d`(UZ8D%kUDA#{y@16Q~
zaTdp@2>$~0F^!*+yh%)dlT%dU)0vzL|Jlh^g`c?F>KBcnPO14XjB{_x$nxt<5q{p?
zC;yPQO})B)09p`xn(b1W-I<0}`1f-$F8+003fFzc5V>KaBK$n(Jc{)_Nd6~MzJG432yg!?G;XI*+l*A9z~KYxDvxrj3S
z2V9!rC&ncgUza$8VYn$-#}*H)dnT(4KRicX(=G#>NZD66`BwUKGCnpg!q53f;yd(a
z52h|*cQ$WYA8;-$q$>PNUe^6S_2EngCFc?A(sMeNOb)(?Q4xOft=1+yb%}E*R-cl-
zjLE6OPrKwxy)0r7pF>X7?dNWP{;q-8EruW8%;KC8Q&Oepe4Ile$LDnp_dSd|1wUsy
z$ZL9eyQ&?OLow`y^=Q6PI5I=K^wZZ(IO2h==UNv&6e5N}1(dFpATtCwjABCKGDjhhmt}!3_H3~l+
z{{*>vjZgPAUR@*d%>kLF6D8*piNngME`G)sv4C%f`%j&lJ}1szoY(hp>30Wg19`E%
z)))@XG}!)|*NOOzGn!RY7eDeCYq35c*KxA0733H<FToNJX
z6O-|G3n$IYeSG7?M?89Zw&z+ju8f!G_)2wibH0a~!f!I4)_CEE)AF-urfZWW>n8Ir
zF;cJ8G=9^E*cp3dE^G=r=aEjGRi00`_EXEj!f)-9gJ8dwd6G3b%te*;4QDV8nw0&G
z5a*HXT${;mq8x1ep^n-e8)FgnSlDM`AIe|k_SrkYpR7BVhi#>N-_-b1blQ|W9zXed
f;*p_r@i*VZwalrML-E>}m-7D^!29<@t_S`Pa1+=1
literal 0
HcmV?d00001
diff --git a/taoyao-signal-server/taoyao-signal/README.md b/taoyao-signal-server/taoyao-signal/README.md
index 9bb9cc1..6e15dee 100644
--- a/taoyao-signal-server/taoyao-signal/README.md
+++ b/taoyao-signal-server/taoyao-signal/README.md
@@ -281,9 +281,9 @@
响应所有终端状态列表
-## 会议信令(4000~4999)
+## 房间信令(4000~4999)
-### 创建会议信令(4000)
+### 创建房间信令(4000)
#### 消息主体
@@ -291,55 +291,55 @@
{}
----
{
- "id": "会议标识"
+ "id": "房间标识"
}
```
#### 消息流程:终端->服务端+)终端
-### 关闭会议信令(4001)
+### 关闭房间信令(4001)
释放资源、广播广播
-### 进入会议信令(4002)
+### 进入房间信令(4002)
#### 消息主体
```
# 请求
{
- "id": "会议标识"
+ "id": "房间标识"
}
# 广播
{
- "id": "会议标识",
+ "id": "房间标识",
"sn": "终端标识"
}
```
#### 消息流程:终端->服务端-)终端
-终端进入会议,广播通知其他终端。
+终端进入房间,广播通知其他终端。
-### 离开会议信令(4003)
+### 离开房间信令(4003)
广播
### 邀请终端信令(4004)
-邀请终端进入会议,终端确认进入发送进入会议信令。
+邀请终端进入房间,终端确认进入发送进入房间信令。
### 踢出终端信令(4005)
广播
-### 会议广播信令(4006)
+### 房间广播信令(4006)
-### 会议终端列表信令(4997)
+### 房间终端列表信令(4997)
-### 会议状态信令(4998)
+### 房间状态信令(4998)
-### 会议列表信令(4999)
+### 房间列表信令(4999)
## 媒体信令(5000~5999)
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/MeetingListenerAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/MeetingListenerAdapter.java
deleted file mode 100644
index 5dd27b8..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/MeetingListenerAdapter.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.acgist.taoyao.media.meeting;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
-import com.acgist.taoyao.signal.listener.ApplicationListenerAdapter;
-
-/**
- * 会议事件监听适配器
- *
- * @param 事件泛型
- *
- * @author acgist
- */
-public abstract class MeetingListenerAdapter extends ApplicationListenerAdapter {
-
- @Autowired
- protected MeetingManager meetingManager;
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/MeetingManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/MeetingManager.java
deleted file mode 100644
index 8f6667c..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/MeetingManager.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package com.acgist.taoyao.media.meeting;
-
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import com.acgist.taoyao.boot.annotation.Manager;
-import com.acgist.taoyao.boot.service.IdService;
-
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 会议管理
- *
- * @author acgist
- */
-@Slf4j
-@Manager
-public class MeetingManager {
-
- @Autowired
- private IdService idService;
-
- /**
- * 会议列表
- */
- private List meetings = new CopyOnWriteArrayList<>();
-
- /**
- * @return 所有会议列表
- */
- public List meetings() {
- return this.meetings;
- }
-
- /**
- * @param id 会议标识
- *
- * @return 会议信息
- */
- public Meeting meeting(String id) {
- return this.meetings.stream()
- .filter(v -> v.getId().equals(id))
- .findFirst()
- .orElse(null);
- }
-
- /**
- * @param id 会议标识
- *
- * @return 会议所有终端标识
- */
- public List sns(String id) {
- final Meeting meeting = this.meeting(id);
- return meeting == null ? List.of() : meeting.getSns();
- }
-
- /**
- * 创建会议
- *
- * @param sn 创建会议终端标识
- *
- * @return 会议信息
- */
- public Meeting create(String sn) {
- final Meeting meeting = new Meeting();
- meeting.setId(this.idService.buildIdToString());
- meeting.setSns(new CopyOnWriteArrayList<>());
- meeting.setCreator(sn);
- meeting.addSn(sn);
- this.meetings.add(meeting);
- log.info("创建会议:{}", meeting.getId());
- return meeting;
- }
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/listener/MeetingCreateListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/listener/MeetingCreateListener.java
deleted file mode 100644
index d8e9a28..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/listener/MeetingCreateListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.acgist.taoyao.media.meeting.listener;
-
-import java.util.Map;
-
-import com.acgist.taoyao.boot.annotation.EventListener;
-import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.media.meeting.Meeting;
-import com.acgist.taoyao.media.meeting.MeetingListenerAdapter;
-import com.acgist.taoyao.signal.event.meeting.MeetingCreateEvent;
-
-/**
- * 创建会议监听
- *
- * @author acgist
- */
-@EventListener
-public class MeetingCreateListener extends MeetingListenerAdapter {
-
- @Override
- public void onApplicationEvent(MeetingCreateEvent event) {
- final Meeting meeting = this.meetingManager.create(event.getSn());
- final Message message = event.getMessage();
- message.setBody(Map.of("id", meeting.getId()));
- this.clientSessionManager.broadcast(message);
- }
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/listener/MeetingEnterListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/listener/MeetingEnterListener.java
deleted file mode 100644
index 5d76e06..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/listener/MeetingEnterListener.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.acgist.taoyao.media.meeting.listener;
-
-import java.util.Map;
-
-import com.acgist.taoyao.boot.annotation.EventListener;
-import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.boot.model.MessageCode;
-import com.acgist.taoyao.boot.model.MessageCodeException;
-import com.acgist.taoyao.media.meeting.Meeting;
-import com.acgist.taoyao.media.meeting.MeetingListenerAdapter;
-import com.acgist.taoyao.signal.event.meeting.MeetingEnterEvent;
-
-/**
- * 进入会议监听
- *
- * @author acgist
- */
-@EventListener
-public class MeetingEnterListener extends MeetingListenerAdapter {
-
- @Override
- public void onApplicationEvent(MeetingEnterEvent event) {
- final String sn = event.getSn();
- final String id = event.get("id");
- final Meeting meeting = this.meetingManager.meeting(id);
- if(meeting == null) {
- throw MessageCodeException.of(MessageCode.CODE_3400, "无效会议");
- }
- meeting.addSn(sn);
- final Message message = event.getMessage();
- message.setBody(Map.of(
- "id", meeting.getId(),
- "sn", sn
- ));
- // TODO:返回房间列表
- meeting.getSns().stream()
- .filter(v -> !sn.equals(v))
- .forEach(v -> this.clientSessionManager.unicast(v, message));
- }
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClient.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClient.java
index 0e6877f..2eb31a0 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClient.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClient.java
@@ -22,6 +22,8 @@ import javax.net.ssl.X509TrustManager;
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 org.springframework.stereotype.Service;
@@ -29,14 +31,12 @@ import com.acgist.taoyao.boot.model.Header;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.property.MediasoupProperties;
import com.acgist.taoyao.boot.property.TaoyaoProperties;
-import com.acgist.taoyao.boot.property.WebrtcProperties;
import com.acgist.taoyao.boot.utils.JSONUtils;
-import com.acgist.taoyao.mediasoup.protocol.ProtocolMediasoupAdapter;
-import com.acgist.taoyao.mediasoup.protocol.client.AuthorizeProtocol;
+import com.acgist.taoyao.mediasoup.protocol.AuthorizeProtocol;
import com.acgist.taoyao.signal.protocol.Protocol;
import com.acgist.taoyao.signal.protocol.ProtocolManager;
+import com.acgist.taoyao.signal.protocol.ProtocolMediasoupAdapter;
-import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
/**
@@ -45,6 +45,7 @@ import lombok.extern.slf4j.Slf4j;
* @author acgist
*/
@Slf4j
+@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Service
public class MediasoupClient {
@@ -55,8 +56,6 @@ public class MediasoupClient {
@Autowired
private TaoyaoProperties taoyaoProperties;
@Autowired
- private WebrtcProperties webrtcProperties;
- @Autowired
private AuthorizeProtocol authorizeProtocol;
/**
@@ -81,9 +80,13 @@ public class MediasoupClient {
*/
private Map syncMessage = new ConcurrentHashMap<>();
- @PostConstruct
- public void init() {
- this.mediasoupProperties = this.webrtcProperties.getMediasoup();
+ /**
+ * 初始化客户端
+ *
+ * @param mediasoupProperties Mediasoup配置
+ */
+ public void init(MediasoupProperties mediasoupProperties) {
+ this.mediasoupProperties = mediasoupProperties;
this.buildClient();
}
@@ -147,6 +150,22 @@ public class MediasoupClient {
return response;
}
+ /**
+ * 打开通道
+ */
+ private void open(WebSocket webSocket) {
+ // 关闭旧的通道
+ if(this.webSocket != null && !(this.webSocket.isInputClosed() && this.webSocket.isOutputClosed())) {
+ this.webSocket.abort();
+ }
+ // 重置重试次数
+ this.retry = 1;
+ // 设置新的通道
+ this.webSocket = webSocket;
+ // 发送授权消息
+ this.send(this.authorizeProtocol.build(this.mediasoupProperties));
+ }
+
/**
* 处理消息
*
@@ -189,16 +208,7 @@ public class MediasoupClient {
public void onOpen(WebSocket webSocket) {
log.info("Mediasoup通道打开:{}", webSocket);
Listener.super.onOpen(webSocket);
- // 关闭旧的通道
- if(MediasoupClient.this.webSocket != null && !(MediasoupClient.this.webSocket.isInputClosed() && MediasoupClient.this.webSocket.isOutputClosed())) {
- MediasoupClient.this.webSocket.abort();
- }
- // 重置重试次数
- MediasoupClient.this.retry = 1;
- // 设置新的通道
- MediasoupClient.this.webSocket = webSocket;
- // 发送授权消息
- MediasoupClient.this.send(MediasoupClient.this.authorizeProtocol.build());
+ MediasoupClient.this.open(webSocket);
}
@Override
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClientManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClientManager.java
new file mode 100644
index 0000000..2f29c4f
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/MediasoupClientManager.java
@@ -0,0 +1,44 @@
+package com.acgist.taoyao.mediasoup;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+
+import com.acgist.taoyao.boot.annotation.Manager;
+import com.acgist.taoyao.boot.property.WebrtcProperties;
+
+import jakarta.annotation.PostConstruct;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Mediasoup客户端管理
+ *
+ * @author acgist
+ */
+@Slf4j
+@Manager
+public class MediasoupClientManager {
+
+ @Autowired
+ private WebrtcProperties webrtcProperties;
+ @Autowired
+ private ApplicationContext applicationContext;
+
+ /**
+ * Mediasoup客户端列表
+ */
+ private List clientList = new ArrayList<>();
+
+ @PostConstruct
+ public void init() {
+ this.webrtcProperties.getMediasoupList().forEach(v -> {
+ final MediasoupClient client = this.applicationContext.getBean(MediasoupClient.class);
+ client.init(v);
+ this.clientList.add(client);
+ log.info("新建MediasoupClient:{}-{}", v.getAddress(), client);
+ });
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Router.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Router.java
new file mode 100644
index 0000000..ea9bc7f
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Router.java
@@ -0,0 +1,33 @@
+package com.acgist.taoyao.mediasoup;
+
+import java.io.Closeable;
+import java.util.List;
+
+import com.acgist.taoyao.signal.room.Room;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 路由
+ *
+ * @author acgist
+ */
+@Slf4j
+public class Router implements Closeable {
+
+ /**
+ * 房间
+ */
+ private Room room;
+ /**
+ * 传输通道列表
+ */
+ private List transportList;
+
+ @Override
+ public void close() {
+ log.info("关闭路由:{}", this.room.getId());
+ this.transportList.forEach(Transport::close);
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Stream.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Stream.java
new file mode 100644
index 0000000..67cf05c
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Stream.java
@@ -0,0 +1,52 @@
+package com.acgist.taoyao.mediasoup;
+
+import java.io.Closeable;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 终端媒体流
+ *
+ * @author acgist
+ */
+@Slf4j
+@Getter
+@Setter
+public class Stream implements Closeable {
+
+ /**
+ * 类型
+ *
+ * @author acgist
+ */
+ public enum Kind {
+
+ /**
+ * 音频
+ */
+ AUDIO,
+ /**
+ * 视频
+ */
+ VIDEO;
+
+ }
+
+ /**
+ * 媒体流ID
+ */
+ private String streamId;
+ /**
+ * 媒体流描述
+ */
+ private String description;
+
+ @Override
+ public void close() {
+ log.info("关闭媒体:{}", this.streamId);
+ // TODO:发送
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Transport.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Transport.java
new file mode 100644
index 0000000..c4f4137
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/Transport.java
@@ -0,0 +1,34 @@
+package com.acgist.taoyao.mediasoup;
+
+import java.io.Closeable;
+import java.util.List;
+
+import com.acgist.taoyao.signal.client.ClientSession;
+
+/**
+ * 传输通道
+ *
+ * @author acgist
+ */
+public class Transport implements Closeable {
+
+ /**
+ * 终端
+ */
+ private ClientSession clientSession;
+ /**
+ * 生产者列表
+ */
+ private List producerList;
+ /**
+ * 消费者列表
+ */
+ private List consumerList;
+
+ @Override
+ public void close() {
+ this.producerList.forEach(Stream::close);
+ this.consumerList.forEach(Stream::close);
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/client/ClientStream.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/client/ClientStream.java
deleted file mode 100644
index 655eaf4..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/client/ClientStream.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package com.acgist.taoyao.mediasoup.client;
-
-/**
- * 终端媒体:producer、consumer
- *
- * @author acgist
- */
-public class ClientStream {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ApplyNetworkThrottleProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ApplyNetworkThrottleProtocol.java
new file mode 100644
index 0000000..3e7be30
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ApplyNetworkThrottleProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class ApplyNetworkThrottleProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/client/AuthorizeProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/AuthorizeProtocol.java
similarity index 64%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/client/AuthorizeProtocol.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/AuthorizeProtocol.java
index 6a2744c..aeb562c 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/client/AuthorizeProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/AuthorizeProtocol.java
@@ -1,15 +1,12 @@
-package com.acgist.taoyao.mediasoup.protocol.client;
+package com.acgist.taoyao.mediasoup.protocol;
import java.net.http.WebSocket;
import java.util.Map;
-import org.springframework.beans.factory.annotation.Autowired;
-
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.property.MediasoupProperties;
-import com.acgist.taoyao.boot.property.WebrtcProperties;
-import com.acgist.taoyao.mediasoup.protocol.ProtocolMediasoupAdapter;
+import com.acgist.taoyao.signal.protocol.ProtocolMediasoupAdapter;
import lombok.extern.slf4j.Slf4j;
@@ -24,16 +21,18 @@ public class AuthorizeProtocol extends ProtocolMediasoupAdapter {
public static final Integer PID = 6000;
- @Autowired
- private WebrtcProperties webrtcProperties;
-
public AuthorizeProtocol() {
super(PID, "Mediasoup终端授权信令");
}
- @Override
- public Message build() {
- final MediasoupProperties mediasoup = this.webrtcProperties.getMediasoup();
+ /**
+ * 创建信令消息
+ *
+ * @param mediasoup Mediasoup配置
+ *
+ * @return 信令消息
+ */
+ public Message build(MediasoupProperties mediasoup) {
return super.build(Map.of(
"username", mediasoup.getUsername(),
"password", mediasoup.getPassword()
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ChangeDisplayNameProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ChangeDisplayNameProtocol.java
new file mode 100644
index 0000000..2709281
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ChangeDisplayNameProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class ChangeDisplayNameProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CloseProducerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CloseProducerProtocol.java
new file mode 100644
index 0000000..a9c7ce8
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CloseProducerProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class CloseProducerProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ConnectWebRtcTransportProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ConnectWebRtcTransportProtocol.java
new file mode 100644
index 0000000..528fed5
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ConnectWebRtcTransportProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class ConnectWebRtcTransportProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CreateWebRtcTransportProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CreateWebRtcTransportProtocol.java
new file mode 100644
index 0000000..4361b75
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/CreateWebRtcTransportProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class CreateWebRtcTransportProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetConsumerStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetConsumerStatsProtocol.java
new file mode 100644
index 0000000..4ffb921
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetConsumerStatsProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class GetConsumerStatsProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataConsumerStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataConsumerStatsProtocol.java
new file mode 100644
index 0000000..fc42014
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataConsumerStatsProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class GetDataConsumerStatsProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataProducerStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataProducerStatsProtocol.java
new file mode 100644
index 0000000..e417781
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetDataProducerStatsProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class GetDataProducerStatsProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetProducerStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetProducerStatsProtocol.java
new file mode 100644
index 0000000..e4a634c
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetProducerStatsProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class GetProducerStatsProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetTransportStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetTransportStatsProtocol.java
new file mode 100644
index 0000000..9266934
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/GetTransportStatsProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class GetTransportStatsProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/NewPeerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/NewPeerProtocol.java
new file mode 100644
index 0000000..b77f3d0
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/NewPeerProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class NewPeerProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseConsumerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseConsumerProtocol.java
new file mode 100644
index 0000000..85468da
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseConsumerProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class PauseConsumerProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseProducerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseProducerProtocol.java
new file mode 100644
index 0000000..2d04561
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/PauseProducerProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class PauseProducerProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceDataProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceDataProtocol.java
new file mode 100644
index 0000000..0b6edbc
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceDataProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class ProduceDataProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceProtocol.java
new file mode 100644
index 0000000..e542bd7
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProduceProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class ProduceProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProducerScoreProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProducerScoreProtocol.java
new file mode 100644
index 0000000..8dc8c69
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProducerScoreProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class ProducerScoreProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RequestConsumerKeyFrameProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RequestConsumerKeyFrameProtocol.java
new file mode 100644
index 0000000..d858452
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RequestConsumerKeyFrameProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class RequestConsumerKeyFrameProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResetNetworkThrottleProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResetNetworkThrottleProtocol.java
new file mode 100644
index 0000000..78a6a3a
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResetNetworkThrottleProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class ResetNetworkThrottleProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RestartIceProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RestartIceProtocol.java
new file mode 100644
index 0000000..b917f5e
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/RestartIceProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class RestartIceProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeConsumerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeConsumerProtocol.java
new file mode 100644
index 0000000..65d7953
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeConsumerProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class ResumeConsumerProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeProducerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeProducerProtocol.java
new file mode 100644
index 0000000..c308e52
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ResumeProducerProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class ResumeProducerProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/SetConsumerPreferredLayersProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPreferredLayersProtocol.java
similarity index 50%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/SetConsumerPreferredLayersProtocol.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPreferredLayersProtocol.java
index aee56cf..87c59be 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/SetConsumerPreferredLayersProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPreferredLayersProtocol.java
@@ -1,4 +1,4 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
+package com.acgist.taoyao.mediasoup.protocol;
public class SetConsumerPreferredLayersProtocol {
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPriorityProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPriorityProtocol.java
new file mode 100644
index 0000000..618d9cc
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/SetConsumerPriorityProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class SetConsumerPriorityProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/VideoorientationchangeProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/VideoorientationchangeProtocol.java
new file mode 100644
index 0000000..0e8bb45
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/VideoorientationchangeProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.mediasoup.protocol;
+
+public class VideoorientationchangeProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ApplyNetworkThrottleProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ApplyNetworkThrottleProtocol.java
deleted file mode 100644
index e24afa8..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ApplyNetworkThrottleProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class ApplyNetworkThrottleProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ChangeDisplayNameProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ChangeDisplayNameProtocol.java
deleted file mode 100644
index 975ef2f..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ChangeDisplayNameProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class ChangeDisplayNameProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/CloseProducerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/CloseProducerProtocol.java
deleted file mode 100644
index 86913fc..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/CloseProducerProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class CloseProducerProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ConnectWebRtcTransportProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ConnectWebRtcTransportProtocol.java
deleted file mode 100644
index 8f5bd83..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ConnectWebRtcTransportProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class ConnectWebRtcTransportProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/CreateWebRtcTransportProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/CreateWebRtcTransportProtocol.java
deleted file mode 100644
index 8cf3b22..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/CreateWebRtcTransportProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class CreateWebRtcTransportProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetConsumerStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetConsumerStatsProtocol.java
deleted file mode 100644
index c0e19a1..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetConsumerStatsProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class GetConsumerStatsProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetDataConsumerStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetDataConsumerStatsProtocol.java
deleted file mode 100644
index 10ba2af..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetDataConsumerStatsProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class GetDataConsumerStatsProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetDataProducerStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetDataProducerStatsProtocol.java
deleted file mode 100644
index 9f86633..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetDataProducerStatsProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class GetDataProducerStatsProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetProducerStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetProducerStatsProtocol.java
deleted file mode 100644
index 7132837..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetProducerStatsProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class GetProducerStatsProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetTransportStatsProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetTransportStatsProtocol.java
deleted file mode 100644
index 9c6d916..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/GetTransportStatsProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class GetTransportStatsProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/NewPeerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/NewPeerProtocol.java
deleted file mode 100644
index 503b363..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/NewPeerProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class NewPeerProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/PauseConsumerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/PauseConsumerProtocol.java
deleted file mode 100644
index 6643c12..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/PauseConsumerProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class PauseConsumerProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/PauseProducerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/PauseProducerProtocol.java
deleted file mode 100644
index 0e5dcfb..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/PauseProducerProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class PauseProducerProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ProduceDataProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ProduceDataProtocol.java
deleted file mode 100644
index fd59597..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ProduceDataProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class ProduceDataProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ProduceProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ProduceProtocol.java
deleted file mode 100644
index f0f8e44..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ProduceProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class ProduceProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ProducerScoreProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ProducerScoreProtocol.java
deleted file mode 100644
index 06481ea..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ProducerScoreProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class ProducerScoreProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/RequestConsumerKeyFrameProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/RequestConsumerKeyFrameProtocol.java
deleted file mode 100644
index 5a1ec76..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/RequestConsumerKeyFrameProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class RequestConsumerKeyFrameProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ResetNetworkThrottleProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ResetNetworkThrottleProtocol.java
deleted file mode 100644
index 24b8f16..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ResetNetworkThrottleProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class ResetNetworkThrottleProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/RestartIceProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/RestartIceProtocol.java
deleted file mode 100644
index b176c40..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/RestartIceProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class RestartIceProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ResumeConsumerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ResumeConsumerProtocol.java
deleted file mode 100644
index 5bafa8b..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ResumeConsumerProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class ResumeConsumerProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ResumeProducerProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ResumeProducerProtocol.java
deleted file mode 100644
index 8e7294d..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/ResumeProducerProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class ResumeProducerProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/SetConsumerPriorityProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/SetConsumerPriorityProtocol.java
deleted file mode 100644
index 53ebe3d..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/SetConsumerPriorityProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class SetConsumerPriorityProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/VideoorientationchangeProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/VideoorientationchangeProtocol.java
deleted file mode 100644
index bb1f123..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/media/VideoorientationchangeProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.mediasoup.protocol.media;
-
-public class VideoorientationchangeProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/router/Router.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/router/Router.java
deleted file mode 100644
index 2618322..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/router/Router.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.acgist.taoyao.mediasoup.router;
-
-import java.util.List;
-
-import com.acgist.taoyao.mediasoup.transport.Transport;
-
-/**
- * 路由
- *
- * @author acgist
- */
-public final class Router {
-
- /**
- * 传输通道列表
- */
- private List transportList;
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/transport/Transport.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/transport/Transport.java
deleted file mode 100644
index ff27f13..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/transport/Transport.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.acgist.taoyao.mediasoup.transport;
-
-import java.util.List;
-
-import com.acgist.taoyao.mediasoup.client.ClientStream;
-import com.acgist.taoyao.signal.client.ClientSession;
-
-/**
- * 传输通道
- *
- * @author acgist
- */
-public final class Transport {
-
- /**
- * 终端
- */
- private ClientSession clientSession;
- /**
- * 生产者列表
- */
- private List producerList;
- /**
- * 消费者列表
- */
- private List consumerList;
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/controller/MeetingController.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/RoomController.java
similarity index 57%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/controller/MeetingController.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/RoomController.java
index 71f792f..7dfdce7 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/controller/MeetingController.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/controller/RoomController.java
@@ -1,4 +1,4 @@
-package com.acgist.taoyao.media.meeting.controller;
+package com.acgist.taoyao.signal.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@@ -7,8 +7,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.media.meeting.Meeting;
-import com.acgist.taoyao.media.meeting.MeetingManager;
+import com.acgist.taoyao.signal.room.Room;
+import com.acgist.taoyao.signal.room.RoomManager;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
@@ -17,35 +17,35 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
/**
- * 会议
+ * 房间
*
* @author acgist
*/
-@Tag(name = "会议", description = "会议管理")
+@Tag(name = "房间", description = "房间管理")
@RestController
-@RequestMapping("/meeting")
-public class MeetingController {
+@RequestMapping("/room")
+public class RoomController {
@Autowired
- private MeetingManager meetingManager;
+ private RoomManager roomManager;
- @Operation(summary = "会议列表", description = "会议列表")
+ @Operation(summary = "房间列表", description = "房间列表")
@GetMapping("/list")
- @ApiResponse(content = @Content(schema = @Schema(implementation = Meeting.class)))
+ @ApiResponse(content = @Content(schema = @Schema(implementation = Room.class)))
public Message list() {
- return Message.success(this.meetingManager.meetings());
+ return Message.success(this.roomManager.roomList());
}
- @Operation(summary = "会议状态", description = "会议状态")
+ @Operation(summary = "房间状态", description = "房间状态")
@GetMapping("/status/{id}")
public Message status(@PathVariable String id) {
- return Message.success(this.meetingManager.meeting(id));
+ return Message.success(this.roomManager.room(id));
}
- @Operation(summary = "会议终端列表", description = "会议终端列表")
+ @Operation(summary = "房间终端列表", description = "房间终端列表")
@GetMapping("/list/client/{id}")
public Message listClient(@PathVariable String id) {
- return Message.success(this.meetingManager.sns(id));
+ return Message.success(this.roomManager.snList(id));
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingEnterEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomCreateEvent.java
similarity index 61%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingEnterEvent.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomCreateEvent.java
index 7ce5df1..9e24eeb 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingEnterEvent.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomCreateEvent.java
@@ -1,4 +1,4 @@
-package com.acgist.taoyao.signal.event.meeting;
+package com.acgist.taoyao.signal.event.room;
import java.util.Map;
@@ -10,17 +10,17 @@ import lombok.Getter;
import lombok.Setter;
/**
- * 进入会议事件
+ * 创建房间事件
*
* @author acgist
*/
@Getter
@Setter
-public class MeetingEnterEvent extends ApplicationEventAdapter {
+public class RoomCreateEvent extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
- public MeetingEnterEvent(String sn, Map, ?> body, Message message, ClientSession session) {
+ public RoomCreateEvent(String sn, Map, ?> body, Message message, ClientSession session) {
super(sn, body, message, session);
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingCreateEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomEnterEvent.java
similarity index 61%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingCreateEvent.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomEnterEvent.java
index 82949e1..2f06a77 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/meeting/MeetingCreateEvent.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomEnterEvent.java
@@ -1,4 +1,4 @@
-package com.acgist.taoyao.signal.event.meeting;
+package com.acgist.taoyao.signal.event.room;
import java.util.Map;
@@ -10,17 +10,17 @@ import lombok.Getter;
import lombok.Setter;
/**
- * 创建会议事件
+ * 进入房间事件
*
* @author acgist
*/
@Getter
@Setter
-public class MeetingCreateEvent extends ApplicationEventAdapter {
+public class RoomEnterEvent extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
- public MeetingCreateEvent(String sn, Map, ?> body, Message message, ClientSession session) {
+ public RoomEnterEvent(String sn, Map, ?> body, Message message, ClientSession session) {
super(sn, body, message, session);
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/RoomListenerAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/RoomListenerAdapter.java
new file mode 100644
index 0000000..deddcc6
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/RoomListenerAdapter.java
@@ -0,0 +1,20 @@
+package com.acgist.taoyao.signal.listener;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
+import com.acgist.taoyao.signal.room.RoomManager;
+
+/**
+ * 房间事件监听适配器
+ *
+ * @param 事件泛型
+ *
+ * @author acgist
+ */
+public abstract class RoomListenerAdapter extends ApplicationListenerAdapter {
+
+ @Autowired
+ protected RoomManager roomManager;
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientCloseListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientCloseListener.java
index 48ea8ac..46cd2e5 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientCloseListener.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/client/ClientCloseListener.java
@@ -40,7 +40,7 @@ public class ClientCloseListener extends ApplicationListenerAdapter {
+
+ @Override
+ public void onApplicationEvent(RoomCreateEvent event) {
+ final Room room = this.roomManager.create(event.getSn());
+ final Message message = event.getMessage();
+ message.setBody(Map.of("id", room.getId()));
+ this.clientSessionManager.broadcast(message);
+ }
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/room/RoomEnterListener.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/room/RoomEnterListener.java
new file mode 100644
index 0000000..a502f46
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/listener/room/RoomEnterListener.java
@@ -0,0 +1,41 @@
+package com.acgist.taoyao.signal.listener.room;
+
+import java.util.Map;
+
+import com.acgist.taoyao.boot.annotation.EventListener;
+import com.acgist.taoyao.boot.model.Message;
+import com.acgist.taoyao.boot.model.MessageCode;
+import com.acgist.taoyao.boot.model.MessageCodeException;
+import com.acgist.taoyao.signal.event.room.RoomEnterEvent;
+import com.acgist.taoyao.signal.listener.RoomListenerAdapter;
+import com.acgist.taoyao.signal.room.Room;
+
+/**
+ * 进入房间监听
+ *
+ * @author acgist
+ */
+@EventListener
+public class RoomEnterListener extends RoomListenerAdapter {
+
+ @Override
+ public void onApplicationEvent(RoomEnterEvent event) {
+ final String sn = event.getSn();
+ final String id = event.get("id");
+ final Room room = this.roomManager.room(id);
+ if(room == null) {
+ throw MessageCodeException.of(MessageCode.CODE_3400, "无效房间");
+ }
+ room.addSn(sn);
+ final Message message = event.getMessage();
+ message.setBody(Map.of(
+ "id", room.getId(),
+ "sn", sn
+ ));
+ // TODO:返回房间列表
+ room.getSnList().stream()
+ .filter(v -> !sn.equals(v))
+ .forEach(v -> this.clientSessionManager.unicast(v, message));
+ }
+
+}
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 9a06489..37b1325 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
@@ -12,7 +12,7 @@ import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
*
* 1000~1999:平台信令
* 2000~2999:终端信令
- * 3000~3999:会议信令
+ * 3000~3999:房间信令
* 5000~5999:媒体信令
* 6000~6999:媒体信令(Mediasoup)
*
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolJavaAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolJavaAdapter.java
deleted file mode 100644
index a6c394f..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolJavaAdapter.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.acgist.taoyao.signal.protocol;
-
-import java.util.Map;
-
-import org.springframework.cglib.beans.BeanMap;
-
-import com.acgist.taoyao.boot.model.Message;
-import com.acgist.taoyao.boot.model.MessageCodeException;
-import com.acgist.taoyao.boot.utils.BeanUtils;
-import com.acgist.taoyao.signal.client.ClientSession;
-
-/**
- * Java主体信令适配器
- *
- * @author acgist
- */
-public abstract class ProtocolJavaAdapter extends ProtocolAdapter {
-
- /**
- * 对象类型
- */
- private final Class clazz;
-
- protected ProtocolJavaAdapter(Integer pid, String name, Class clazz) {
- super(pid, name);
- this.clazz = clazz;
- }
-
- @Override
- public void execute(String sn, Message message, ClientSession session) {
- final Object body = message.getBody();
- if(body instanceof Map, ?> map) {
- final T t = BeanUtils.newInstance(this.clazz);
- final BeanMap beanMap = BeanMap.create(t);
- beanMap.putAll(map);
- this.execute(sn, t, message, session);
- } else {
- throw MessageCodeException.of("信令主体类型错误:" + message);
- }
- }
-
- /**
- * 处理信令消息
- *
- * @param sn 终端标识
- * @param body 消息主体
- * @param message 信令消息
- * @param session 会话
- */
- public abstract void execute(String sn, T body, Message message, ClientSession session);
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProtocolMediasoupAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediasoupAdapter.java
similarity index 89%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProtocolMediasoupAdapter.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediasoupAdapter.java
index 02291b4..61031d0 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/mediasoup/protocol/ProtocolMediasoupAdapter.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolMediasoupAdapter.java
@@ -1,4 +1,4 @@
-package com.acgist.taoyao.mediasoup.protocol;
+package com.acgist.taoyao.signal.protocol;
import java.net.http.WebSocket;
@@ -8,7 +8,6 @@ import org.springframework.context.annotation.Lazy;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.mediasoup.MediasoupClient;
import com.acgist.taoyao.signal.client.ClientSession;
-import com.acgist.taoyao.signal.protocol.ProtocolAdapter;
/**
* Mediasoup信令适配器
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 6c42d6a..f69c0a5 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
@@ -2,16 +2,15 @@ package com.acgist.taoyao.signal.protocol.client;
import java.util.Map;
-import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.model.MessageCode;
-import com.acgist.taoyao.boot.property.SecurityProperties;
import com.acgist.taoyao.signal.client.ClientSession;
import com.acgist.taoyao.signal.event.client.ClientRegisterEvent;
import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
+import com.acgist.taoyao.signal.service.SecurityService;
import lombok.extern.slf4j.Slf4j;
@@ -27,7 +26,7 @@ public class ClientRegisterProtocol extends ProtocolMapAdapter {
public static final Integer PID = 2000;
@Autowired
- private SecurityProperties securityProperties;
+ private SecurityService securityService;
public ClientRegisterProtocol() {
super(PID, "终端注册信令");
@@ -38,11 +37,7 @@ public class ClientRegisterProtocol extends ProtocolMapAdapter {
final String username = (String) body.get("username");
final String password = (String) body.get("password");
// 如果需要终端鉴权在此实现
- if(
- Boolean.FALSE.equals(this.securityProperties.getEnabled()) ||
- StringUtils.equals(this.securityProperties.getUsername(), username) &&
- StringUtils.equals(this.securityProperties.getPassword(), password)
- ) {
+ if(this.securityService.authenticate(username, password)) {
log.info("终端注册:{}", sn);
session.authorize(sn);
message.setCode(MessageCode.CODE_0000);
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingClientListProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingClientListProtocol.java
deleted file mode 100644
index 289b02f..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingClientListProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.signal.protocol.meeting;
-
-public class MeetingClientListProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingCloseProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingCloseProtocol.java
deleted file mode 100644
index 5a028a8..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingCloseProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.signal.protocol.meeting;
-
-public class MeetingCloseProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingExpelProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingExpelProtocol.java
deleted file mode 100644
index 0617b8b..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingExpelProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.signal.protocol.meeting;
-
-public class MeetingExpelProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingInviteProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingInviteProtocol.java
deleted file mode 100644
index 5e9d70e..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingInviteProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.signal.protocol.meeting;
-
-public class MeetingInviteProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingLeaveProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingLeaveProtocol.java
deleted file mode 100644
index 0844aba..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingLeaveProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.signal.protocol.meeting;
-
-public class MeetingLeaveProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingListProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingListProtocol.java
deleted file mode 100644
index 76adcf4..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingListProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.signal.protocol.meeting;
-
-public class MeetingListProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingStatusProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingStatusProtocol.java
deleted file mode 100644
index a7d6fd3..0000000
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingStatusProtocol.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.acgist.taoyao.signal.protocol.meeting;
-
-public class MeetingStatusProtocol {
-
-}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomClientListProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomClientListProtocol.java
new file mode 100644
index 0000000..f22db8b
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomClientListProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.signal.protocol.room;
+
+public class RoomClientListProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCloseProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCloseProtocol.java
new file mode 100644
index 0000000..4e4e382
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCloseProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.signal.protocol.room;
+
+public class RoomCloseProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingCreateProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCreateProtocol.java
similarity index 55%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingCreateProtocol.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCreateProtocol.java
index d395cf6..5d0360b 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingCreateProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomCreateProtocol.java
@@ -1,30 +1,30 @@
-package com.acgist.taoyao.signal.protocol.meeting;
+package com.acgist.taoyao.signal.protocol.room;
import java.util.Map;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.client.ClientSession;
-import com.acgist.taoyao.signal.event.meeting.MeetingCreateEvent;
+import com.acgist.taoyao.signal.event.room.RoomCreateEvent;
import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
/**
- * 创建会议信令
+ * 创建房间信令
*
* @author acgist
*/
@Protocol
-public class MeetingCreateProtocol extends ProtocolMapAdapter {
+public class RoomCreateProtocol extends ProtocolMapAdapter {
public static final Integer PID = 4000;
- public MeetingCreateProtocol() {
- super(PID, "创建会议信令");
+ public RoomCreateProtocol() {
+ super(PID, "创建房间信令");
}
@Override
public void execute(String sn, Map, ?> body, Message message, ClientSession session) {
- this.publishEvent(new MeetingCreateEvent(sn, body, message, session));
+ this.publishEvent(new RoomCreateEvent(sn, body, message, session));
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingEnterProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomEnterProtocol.java
similarity index 55%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingEnterProtocol.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomEnterProtocol.java
index 87f3c06..1b05e6a 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/meeting/MeetingEnterProtocol.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomEnterProtocol.java
@@ -1,30 +1,30 @@
-package com.acgist.taoyao.signal.protocol.meeting;
+package com.acgist.taoyao.signal.protocol.room;
import java.util.Map;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.client.ClientSession;
-import com.acgist.taoyao.signal.event.meeting.MeetingEnterEvent;
+import com.acgist.taoyao.signal.event.room.RoomEnterEvent;
import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
/**
- * 进入会议信令
+ * 进入房间信令
*
* @author acgist
*/
@Protocol
-public class MeetingEnterProtocol extends ProtocolMapAdapter {
+public class RoomEnterProtocol extends ProtocolMapAdapter {
public static final Integer PID = 4002;
- public MeetingEnterProtocol() {
- super(PID, "进入会议信令");
+ public RoomEnterProtocol() {
+ super(PID, "进入房间信令");
}
@Override
public void execute(String sn, Map, ?> body, Message message, ClientSession session) {
- this.publishEvent(new MeetingEnterEvent(sn, body, message, session));
+ this.publishEvent(new RoomEnterEvent(sn, body, message, session));
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomExpelProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomExpelProtocol.java
new file mode 100644
index 0000000..c706742
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomExpelProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.signal.protocol.room;
+
+public class RoomExpelProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomInviteProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomInviteProtocol.java
new file mode 100644
index 0000000..0e3db77
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomInviteProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.signal.protocol.room;
+
+public class RoomInviteProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomLeaveProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomLeaveProtocol.java
new file mode 100644
index 0000000..0d46b8b
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomLeaveProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.signal.protocol.room;
+
+public class RoomLeaveProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomListProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomListProtocol.java
new file mode 100644
index 0000000..e80a6c5
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomListProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.signal.protocol.room;
+
+public class RoomListProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomStatusProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomStatusProtocol.java
new file mode 100644
index 0000000..a4ef99b
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/room/RoomStatusProtocol.java
@@ -0,0 +1,5 @@
+package com.acgist.taoyao.signal.protocol.room;
+
+public class RoomStatusProtocol {
+
+}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/Meeting.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/Room.java
similarity index 58%
rename from taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/Meeting.java
rename to taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/Room.java
index de56d3a..a9b4775 100644
--- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/media/meeting/Meeting.java
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/Room.java
@@ -1,4 +1,4 @@
-package com.acgist.taoyao.media.meeting;
+package com.acgist.taoyao.signal.room;
import java.util.List;
@@ -7,35 +7,35 @@ import lombok.Getter;
import lombok.Setter;
/**
- * 会议
+ * 房间
*
* @author acgist
*/
@Getter
@Setter
-@Schema(title = "会议", description = "会议")
-public class Meeting {
+@Schema(title = "房间", description = "房间")
+public class Room {
/**
- * 会议标识
+ * 房间标识
*/
- @Schema(title = "会议标识", description = "会议标识")
+ @Schema(title = "房间标识", description = "房间标识")
private String id;
/**
- * 会议名称
+ * 房间名称
*/
- @Schema(title = "会议名称", description = "会议名称")
+ @Schema(title = "房间名称", description = "房间名称")
private String name;
/**
- * 会议密码
+ * 房间密码
*/
- @Schema(title = "会议密码", description = "会议密码")
+ @Schema(title = "房间密码", description = "房间密码")
private String password;
/**
* 终端会话标识列表
*/
@Schema(title = "终端会话标识列表", description = "终端会话标识列表")
- private List sns;
+ private List snList;
/**
* 创建终端标识
*/
@@ -48,11 +48,11 @@ public class Meeting {
* @param sn 终端会话标识
*/
public void addSn(String sn) {
- synchronized (this.sns) {
- if(this.sns.contains(sn)) {
+ synchronized (this.snList) {
+ if(this.snList.contains(sn)) {
return;
}
- this.sns.add(sn);
+ this.snList.add(sn);
}
}
diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomManager.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomManager.java
new file mode 100644
index 0000000..772771b
--- /dev/null
+++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/room/RoomManager.java
@@ -0,0 +1,77 @@
+package com.acgist.taoyao.signal.room;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.acgist.taoyao.boot.annotation.Manager;
+import com.acgist.taoyao.boot.service.IdService;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 房间管理
+ *
+ * @author acgist
+ */
+@Slf4j
+@Manager
+public class RoomManager {
+
+ @Autowired
+ private IdService idService;
+
+ /**
+ * 房间列表
+ */
+ private List roomList = new CopyOnWriteArrayList<>();
+
+ /**
+ * @return 所有房间列表
+ */
+ public List roomList() {
+ return this.roomList;
+ }
+
+ /**
+ * @param id 房间标识
+ *
+ * @return 房间信息
+ */
+ public Room room(String id) {
+ return this.roomList.stream()
+ .filter(v -> v.getId().equals(id))
+ .findFirst()
+ .orElse(null);
+ }
+
+ /**
+ * @param id 房间标识
+ *
+ * @return 房间所有终端标识
+ */
+ public List snList(String id) {
+ final Room room = this.room(id);
+ return room == null ? List.of() : room.getSnList();
+ }
+
+ /**
+ * 创建房间
+ *
+ * @param sn 创建房间终端标识
+ *
+ * @return 房间信息
+ */
+ public Room create(String sn) {
+ final Room room = new Room();
+ room.setId(this.idService.buildIdToString());
+ room.setSnList(new CopyOnWriteArrayList<>());
+ room.setCreator(sn);
+ room.addSn(sn);
+ this.roomList.add(room);
+ log.info("创建房间:{}", room.getId());
+ return room;
+ }
+
+}
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 a70276b..a6dc928 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
@@ -11,6 +11,16 @@ import com.acgist.taoyao.signal.protocol.Protocol;
*/
public interface SecurityService {
+ /**
+ * 鉴权
+ *
+ * @param username 用户名称
+ * @param password 用户密码
+ *
+ * @return 是否成功
+ */
+ boolean authenticate(String username, String password);
+
/**
* 鉴权
*
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 90d976c..5834e88 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
@@ -1,13 +1,34 @@
package com.acgist.taoyao.signal.service.impl;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
import com.acgist.taoyao.boot.model.Header;
import com.acgist.taoyao.boot.model.Message;
+import com.acgist.taoyao.boot.property.SecurityProperties;
import com.acgist.taoyao.signal.client.ClientSession;
import com.acgist.taoyao.signal.protocol.Protocol;
import com.acgist.taoyao.signal.service.SecurityService;
public class SecurityServiceImpl implements SecurityService {
+ @Autowired
+ private SecurityProperties securityProperties;
+
+ @Override
+ public boolean authenticate(String username, String password) {
+ if(
+ Boolean.FALSE.equals(this.securityProperties.getEnabled()) ||
+ (
+ StringUtils.equals(this.securityProperties.getUsername(), username) &&
+ StringUtils.equals(this.securityProperties.getPassword(), password)
+ )
+ ) {
+ return true;
+ }
+ return false;
+ }
+
@Override
public boolean authenticate(Message message, ClientSession session, Protocol protocol) {
if(!session.authorized()) {
@@ -15,13 +36,14 @@ public class SecurityServiceImpl implements SecurityService {
}
final Header header = message.getHeader();
final String sn = header.getSn();
+ // 验证信令终端
if(!sn.equals(session.sn())) {
return false;
}
+ // 信令权限鉴定
if(!protocol.authenticate(message)) {
return false;
}
- // 更多
return true;
}