diff --git a/taoyao-client-media/src/Server.js b/taoyao-client-media/src/Server.js index 6921cea..db96572 100644 --- a/taoyao-client-media/src/Server.js +++ b/taoyao-client-media/src/Server.js @@ -39,16 +39,31 @@ async function buildMediasoupWorkers() { const webRtcServer = await worker.createWebRtcServer(webRtcServerOptions); worker.appData.webRtcServer = webRtcServer; mediasoupWorkers.push(worker); - // 监听事件 worker.on("died", (error) => { - console.warn("Mediasoup Worker停止服务:", worker.pid, error); + console.warn("worker died:", worker.pid, error); setTimeout(() => process.exit(1), 2000); }); worker.observer.on("close", () => { - console.warn("Mediasoup Worker关闭服务:", worker.pid); + console.info("worker close:", worker.pid); }); - // worker.observer.on("newrouter", fn(router)); - // worker.observer.on("newwebrtcserver", fn(router)); + // worker.observer.on("newrouter", (router) => { + // console.info("worker newrouter:", worker.pid, router.id); + // }); + // worker.observer.on("newwebrtcserver", (webRtcServer) => { + // console.info("worker newwebrtcserver:", worker.pid, webRtcServer.id); + // }); + // webRtcServer.on("workerclose", () => { + // console.info("webRtcServer workerclose:", worker.pid, webRtcServer.id); + // }); + // webRtcServer.observer.on("close", () => { + // console.info("webRtcServer close:", worker.pid, webRtcServer.id); + // }); + // webRtcServer.observer.on("webrtctransporthandled", (webRtcTransport) => { + // console.info("webRtcServer webrtctransporthandled:", worker.pid, webRtcServer.id, webRtcTransport.id); + // }); + // webRtcServer.observer.on("webrtctransportunhandled", (webRtcTransport) => { + // console.info("webRtcServer webrtctransportunhandled:", worker.pid, webRtcServer.id, webRtcTransport.id); + // }); } } diff --git a/taoyao-client-media/src/Taoyao.js b/taoyao-client-media/src/Taoyao.js index 74ba948..7f5d276 100644 --- a/taoyao-client-media/src/Taoyao.js +++ b/taoyao-client-media/src/Taoyao.js @@ -278,6 +278,7 @@ class Room { }) ); }); + // me.audioLevelObserver.observer.on("silence", fn()); // 音量 me.audioLevelObserver.on("volumes", (volumes) => { const volumeArray = []; @@ -292,6 +293,7 @@ class Room { }) ); }); + // me.audioLevelObserver.observer.on("volumes", fn(volumes)); } /** * 采样监控 @@ -305,6 +307,7 @@ class Room { dominantSpeaker.producer.clientId ); }); + // me.activeSpeakerObserver.observer.on("dominantspeaker", fn(dominantSpeaker)); } /** * 使用情况 @@ -327,6 +330,7 @@ class Room { return; } me.close = true; + // TODO:测试是否需要这里释放 // me.producers.forEach(v => v.close()); // me.consumers.forEach(v => v.close()); // me.dataProducers.forEach(v => v.close()); @@ -560,7 +564,10 @@ class Taoyao { producer.clientId = clientId; producer.streamId = streamId; room.producers.set(producer.id, producer); - // 打分 + producer.on("transportclose", () => { + console.info("producer transportclose:", producer.id); + producer.close(); + }); producer.on("score", (score) => { self.push( protocol.buildMessage("media::producer::score", { @@ -570,23 +577,34 @@ class Taoyao { }) ); }); - producer.on("videoorientationchange", (videoOrientation) => { - logger.debug( - 'producer "videoorientationchange" event [producerId:%s, videoOrientation:%o]', - producer.id, - videoOrientation - ); + console.info("producer videoorientationchange:", producer.id, videoOrientation); }); - producer.on("trace", (trace) => { - logger.debug( - 'producer "trace" event [producerId:%s, trace.type:%s, trace:%o]', - producer.id, - trace.type, - trace - ); + console.info("producer trace:", producer.id, trace); }); + producer.observer.on("close", () => { + if(me.producers.delete(producer.id)) { + console.info("producer close:", producer.id); + this.push( + protocol.buildMessage("media::producer::close", { + roomId: roomId, + producerId: producer.id + }) + ); + } else { + console.info("producer close non:", producer.id); + } + }); + producer.observer.on("pause", () => { + console.info("producer pause:", producer.id); + }); + producer.observer.on("resume", () => { + console.info("producer resume:", producer.id); + }); + // producer.observer.on("score", fn(score)); + // producer.observer.on("videoorientationchange", fn(videoOrientation)); + // producer.observer.on("trace", fn(trace)); message.body = { kind: kind, producerId: producer.id }; this.push(message); if (producer.kind === "audio") { @@ -661,18 +679,19 @@ class Taoyao { consumer.streamId = streamId; room.consumers.set(consumer.id, consumer); consumer.on("transportclose", () => { - console.info("通道关闭同时关闭消费者:", consumer.id); + console.info("consumer transportclose:", consumer.id); // 信令服务统一调度关闭 // consumer.close(); // room.consumers.delete(consumer.id); }); consumer.on("producerclose", () => { - console.info("生产者关闭同时关闭消费者:", consumer.id); + console.info("consumer producerclose:", consumer.id); // 信令服务统一调度关闭 // consumer.close(); // room.consumers.delete(consumer.id); }); consumer.on("producerpause", () => { + console.info("consumer producerpause:", consumer.id); this.push( protocol.buildMessage("media::consumer::pause", { consumerId: consumer.id, @@ -680,6 +699,7 @@ class Taoyao { ); }); consumer.on("producerresume", () => { + console.info("consumer producerresume:", consumer.id); this.push( protocol.buildMessage("media::consumer::resume", { consumerId: consumer.id, @@ -687,6 +707,7 @@ class Taoyao { ); }); consumer.on("score", (score) => { + console.info("consumer score:", consumer.id, score); this.push( protocol.buildMessage("media::consumer::score", { score: score, @@ -696,6 +717,7 @@ class Taoyao { ); }); consumer.on("layerschange", (layers) => { + console.info("consumer layerschange:", consumer.id, layers); this.push( protocol.buildMessage("media::consumer::layers::change", { consumerId: consumer.id, @@ -705,21 +727,43 @@ class Taoyao { ); }); consumer.on("trace", (trace) => { - logger.debug( - 'consumer "trace" event [producerId:%s, trace.type:%s, trace:%o]', - consumer.id, - trace.type, - trace - ); + console.info("consumer trace:", consumer.id, trace); }); + // consumer.on("rtp", (rtpPacket) => { + // console.info("consumer rtp:", consumer.id, rtpPacket); + // }); consumer.observer.on("close", () => { + if(room.consumers.delete(consumer.id)) { + console.debug("consumer close:", consumer.id); + this.push( + protocol.buildMessage("media::consumer::close", { + roomId: roomId, + consumerId: consumer.id + }) + ); + } else { + console.debug("consumer close non:", consumer.id); + } + }); + consumer.observer.on("pause", () => { this.push( - protocol.buildMessage("media::consumer::close", { + protocol.buildMessage("media::consumer::pause", { roomId: roomId, consumerId: consumer.id }) ); }); + consumer.observer.on("resume", () => { + this.push( + protocol.buildMessage("media::consumer::resume", { + roomId: roomId, + consumerId: consumer.id + }) + ); + }); + // consumer.observer.on("score", fn(score)); + // consumer.observer.on("layerschange", fn(layers)); + // consumer.observer.on("trace", fn(trace)); // 等待终端准备就绪 this.request( protocol.buildMessage("media::consume", { @@ -768,7 +812,6 @@ class Taoyao { if(consumer) { console.info("关闭消费者:", consumerId); consumer.close(); - room.consumers.delete(consumerId); } else { console.debug("关闭消费者无效:", consumerId); } @@ -834,41 +877,65 @@ class Taoyao { webRtcServer: room.webRtcServer, }); transport.clientId = clientId; - transport.on("icestatechange", (iceState) => { - console.debug( - "WebRtcTransport icestatechange event:", - iceState, - transport.id - ); + // 通用事件 + transport.on("routerclose", () => { + console.info("transport routerclose:", transport.id); + transport.close(); }); - transport.on("dtlsstatechange", (dtlsState) => { - console.debug( - "WebRtcTransport dtlsstatechange event:", - dtlsState, - transport.id - ); - }); - transport.on("sctpstatechange", (sctpState) => { - console.debug( - "WebRtcTransport sctpstatechange event:", - sctpState, - transport.id - ); + transport.on("listenserverclose", () => { + console.info("transport listenserverclose:", transport.id); + transport.close(); }); await transport.enableTraceEvent(["bwe"]); // await transport.enableTraceEvent([ 'probation', 'bwe' ]); transport.on("trace", (trace) => { - console.debug("transport trace event:", transport.id, trace.type, trace); + console.debug("transport trace:", transport.id, trace); + }); + transport.observer.on("close", () => { + console.info("transport close:", transport.id); + }); + transport.observer.on("newproducer", (producer) => { + console.info("transport newproducer:", transport.id, producer.id); + }); + transport.observer.on("newconsumer", (consumer) => { + console.info("transport newconsumer:", transport.id, consumer.id); + }); + transport.observer.on("newdataproducer", (dataProducer) => { + console.info("transport newdataproducer:", transport.id, dataProducer.id); + }); + transport.observer.on("newdataconsumer", (dataConsumer) => { + console.info("transport newdataconsumer:", transport.id, dataProducer.id); }); - // 可配置的事件 - // transport.on("routerclose", fn()); - // transport.on("listenserverclose", fn()); - // transport.observer.on("close", fn()); - // transport.observer.on("newproducer", fn(producer)); - // transport.observer.on("newconsumer", fn(consumer)); - // transport.observer.on("newdataproducer", fn(dataProducer)); - // transport.observer.on("newdataconsumer", fn(dataConsumer)); // transport.observer.on("trace", fn(trace)); + /********************* webRtcTransport通道事件 *********************/ + // transport.on("icestatechange", (iceState) => { + // console.info("transport icestatechange:", transport.id, iceState); + // }); + // transport.on("iceselectedtuplechange", (iceSelectedTuple) => { + // console.info("transport iceselectedtuplechange:", transport.id, iceSelectedTuple); + // }); + // transport.on("dtlsstatechange", (dtlsState) => { + // console.info("transport dtlsstatechange:", transport.id, dtlsState); + // }); + // transport.on("sctpstatechange", (sctpState) => { + // console.info("transport sctpstatechange:", transport.id, sctpState); + // }); + // transport.observer.on("icestatechange", fn(iceState)); + // transport.observer.on("iceselectedtuplechange", fn(iceSelectedTuple)); + // transport.observer.on("dtlsstatechange", fn(dtlsState)); + // transport.observer.on("sctpstatechange", fn(sctpState)); + /********************* plainTransport通道事件 *********************/ + // transport.on("tuple", fn(tuple)); + // transport.on("rtcptuple", fn(rtcpTuple)); + // transport.on("sctpstatechange", fn(sctpState)); + // transport.observer.on("tuple", fn(tuple)); + // transport.observer.on("rtcptuple", fn(rtcpTuple)); + // transport.observer.on("sctpstatechange", fn(sctpState)); + /********************* pipeTransport通道事件 *********************/ + // transport.on("sctpstatechange", fn(sctpState)); + // transport.observer.on("sctpstatechange", fn(sctpState)); + /********************* directTransport通道事件 *********************/ + // transport.on("rtcp", fn(rtcpPacket)); room.transports.set(transport.id, transport); message.body = { transportId: transport.id, @@ -913,7 +980,6 @@ class Taoyao { } console.info("关闭房间:", roomId); room.closeAll(); - this.rooms.delete(roomId); } /** @@ -954,21 +1020,30 @@ class Taoyao { activeSpeakerObserver, }); me.rooms.set(roomId, room); - console.info("创建房间", roomId); + console.info("roomCreate:", roomId, mediasoupRouter.id); me.push(message); - // 监听事件 - mediasoupRouter.observer.on("close", () => { - console.info("房间路由关闭:", roomId, mediasoupRouter); + mediasoupRouter.on("workerclose", () => { + console.info("mediasoupRouter workerclose:", roomId, mediasoupRouter.id); room.closeAll(); - me.rooms.delete(roomId); - me.push( - protocol.buildMessage("room::close", { - roomId: roomId - }) - ); }); - // mediasoupRouter.on("workerclose", () => {}); - // mediasoupRouter.observer.on("newtransport", fn(transport)); + mediasoupRouter.observer.on("close", () => { + if(me.rooms.delete(roomId)) { + console.info("mediasoupRouter close:", roomId, mediasoupRouter.id); + me.push( + protocol.buildMessage("room::close", { + roomId: roomId + }) + ); + } else { + console.info("mediasoupRouter close non:", roomId, mediasoupRouter.id); + } + }); + // mediasoupRouter.observer.on("newtransport", (transport) => { + // console.info("mediasoupRouter newtransport:", roomId, mediasoupRouter.id, transport.id); + // }); + // mediasoupRouter.observer.on("newrtpobserver", (rtpObserver) => { + // console.info("mediasoupRouter newrtpobserver:", roomId, mediasoupRouter.id, rtpObserver.id); + // }); } } diff --git a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/Constant.java b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/Constant.java index 2864b5a..f47dbdd 100644 --- a/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/Constant.java +++ b/taoyao-signal-server/taoyao-boot/src/main/java/com/acgist/taoyao/boot/config/Constant.java @@ -19,10 +19,6 @@ public interface Constant { * IP */ String IP = "ip"; - /** - * 动作 - */ - String ACTIVE = "active"; /** * 状态对象 */ @@ -219,6 +215,10 @@ public interface Constant { * SCTP协商 */ String SCTP_CAPABILITIES = "sctpCapabilities"; + /** + * 状态 + */ + String ENABLED = "enabled"; /** * 是否是消费者 */ diff --git a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/controller/ControlController.java b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/controller/ControlController.java index 90b6abf..4d2f887 100644 --- a/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/controller/ControlController.java +++ b/taoyao-signal-server/taoyao-server/src/main/java/com/acgist/taoyao/controller/ControlController.java @@ -6,14 +6,22 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.acgist.taoyao.boot.config.MediaAudioProperties; +import com.acgist.taoyao.boot.config.MediaVideoProperties; import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.signal.config.camera.AiProperties; +import com.acgist.taoyao.signal.config.camera.BeautyProperties; +import com.acgist.taoyao.signal.config.camera.WatermarkProperties; import com.acgist.taoyao.signal.model.control.PtzControl; import com.acgist.taoyao.signal.protocol.control.ControlAiProtocol; +import com.acgist.taoyao.signal.protocol.control.ControlBeautyProtocol; import com.acgist.taoyao.signal.protocol.control.ControlBellProtocol; +import com.acgist.taoyao.signal.protocol.control.ControlConfigAudioProtocol; +import com.acgist.taoyao.signal.protocol.control.ControlConfigVideoProtocol; import com.acgist.taoyao.signal.protocol.control.ControlPhotographProtocol; import com.acgist.taoyao.signal.protocol.control.ControlPtzProtocol; import com.acgist.taoyao.signal.protocol.control.ControlRecordProtocol; +import com.acgist.taoyao.signal.protocol.control.ControlWatermarkProtocol; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -34,51 +42,87 @@ public class ControlController { private final ControlAiProtocol controlAiProtocol; private final ControlPtzProtocol controlPtzProtocol; private final ControlBellProtocol controlBellProtocol; + private final ControlBeautyProtocol controlBeautyProtocol; private final ControlRecordProtocol controlRecordProtocol; + private final ControlWatermarkProtocol controlWatermarkProtocol; private final ControlPhotographProtocol controlPhotographProtocol; + private final ControlConfigAudioProtocol controlConfigAudioProtocol; + private final ControlConfigVideoProtocol controlConfigVideoProtocol; public ControlController( ControlAiProtocol controlAiProtocol, ControlPtzProtocol controlPtzProtocol, ControlBellProtocol controlBellProtocol, + ControlBeautyProtocol controlBeautyProtocol, ControlRecordProtocol controlRecordProtocol, - ControlPhotographProtocol controlPhotographProtocol + ControlWatermarkProtocol controlWatermarkProtocol, + ControlPhotographProtocol controlPhotographProtocol, + ControlConfigAudioProtocol controlConfigAudioProtocol, + ControlConfigVideoProtocol controlConfigVideoProtocol ) { this.controlAiProtocol = controlAiProtocol; this.controlPtzProtocol = controlPtzProtocol; this.controlBellProtocol = controlBellProtocol; + this.controlBeautyProtocol = controlBeautyProtocol; this.controlRecordProtocol = controlRecordProtocol; + this.controlWatermarkProtocol = controlWatermarkProtocol; this.controlPhotographProtocol = controlPhotographProtocol; + this.controlConfigAudioProtocol = controlConfigAudioProtocol; + this.controlConfigVideoProtocol = controlConfigVideoProtocol; } - @Operation(summary = "AI识别", description = "AI识别") + @Operation(summary = "AI识别", description = "AI识别控制") @GetMapping("/ai/{clientId}") public Message ai(@PathVariable String clientId, @Valid AiProperties aiProperties) { return Message.success(this.controlAiProtocol.execute(clientId, aiProperties)); } - @Operation(summary = "PTZ", description = "PTZ") + @Operation(summary = "PTZ", description = "PTZ控制") @GetMapping("/ptz/{clientId}") public Message ptz(@PathVariable String clientId, @Valid PtzControl ptzControl) { return Message.success(this.controlPtzProtocol.execute(clientId, ptzControl)); } - @Operation(summary = "响铃", description = "响铃") + @Operation(summary = "响铃", description = "响铃控制") @GetMapping("/bell/{clientId}") - public Message bell(@PathVariable String clientId, @NotNull(message = "没有指定操作") Boolean active) { - return Message.success(this.controlBellProtocol.execute(clientId, active)); + public Message bell(@PathVariable String clientId, @NotNull(message = "没有指定操作状态") Boolean enabled) { + return Message.success(this.controlBellProtocol.execute(clientId, enabled)); } - @Operation(summary = "录像", description = "录像") + @Operation(summary = "美颜", description = "美颜控制") + @GetMapping("/beauty/{clientId}") + public Message beauty(@PathVariable String clientId, @Valid BeautyProperties beautyProperties) { + return Message.success(this.controlBeautyProtocol.execute(clientId, beautyProperties)); + } + + @Operation(summary = "录像", description = "录像控制") @GetMapping("/record/{clientId}") - public Message record(@PathVariable String clientId, @NotNull(message = "没有指定操作") Boolean active) { - return Message.success(this.controlRecordProtocol.execute(clientId, active)); + public Message record(@PathVariable String clientId, @NotNull(message = "没有指定操作状态") Boolean enabled) { + return Message.success(this.controlRecordProtocol.execute(clientId, enabled)); } - @Operation(summary = "拍照", description = "拍照") + @Operation(summary = "水印", description = "水印控制") + @GetMapping("/watermark/{clientId}") + public Message watermark(@PathVariable String clientId, @Valid WatermarkProperties watermarkProperties) { + return Message.success(this.controlWatermarkProtocol.execute(clientId, watermarkProperties)); + } + + @Operation(summary = "拍照", description = "拍照控制") @GetMapping("/photograph/{clientId}") public Message photograph(@PathVariable String clientId) { return Message.success(this.controlPhotographProtocol.execute(clientId)); } + @Operation(summary = "配置音频", description = "配置音频") + @GetMapping("/config/audio/{clientId}") + public Message configAudio(@PathVariable String clientId, @Valid MediaAudioProperties mediaAudioProperties) { + return Message.success(this.controlConfigAudioProtocol.execute(clientId, mediaAudioProperties)); + } + + @Operation(summary = "配置视频", description = "配置视频") + @GetMapping("/config/video/{clientId}") + public Message configVideo(@PathVariable String clientId, @Valid MediaVideoProperties mediaVideoProperties) { + return Message.success(this.controlConfigVideoProtocol.execute(clientId, mediaVideoProperties)); + } + } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignal.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignal.java index ee683e7..662466e 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignal.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/client/socket/SocketSignal.java @@ -22,6 +22,8 @@ import lombok.extern.slf4j.Slf4j; /** * Socket信令 * + * TODO:加密 + * * @author acgist */ @Slf4j diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/camera/AiProperties.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/camera/AiProperties.java index b31dc75..5234cb9 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/camera/AiProperties.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/camera/AiProperties.java @@ -28,10 +28,9 @@ public class AiProperties { } @Schema(title = "是否开启", description = "是否开启") - @NotNull(message = "没有指定操作") + @NotNull(message = "没有指定操作状态") private Boolean enabled; @Schema(title = "识别类型", description = "识别类型") - @NotNull(message = "无效识别类型") private Type type; } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/camera/BeautyProperties.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/camera/BeautyProperties.java index a4bdfef..99cc00c 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/camera/BeautyProperties.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/camera/BeautyProperties.java @@ -1,6 +1,7 @@ package com.acgist.taoyao.signal.config.camera; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @@ -15,6 +16,7 @@ import lombok.Setter; public class BeautyProperties { @Schema(title = "是否开启", description = "是否开启") + @NotNull(message = "没有指定操作状态") private Boolean enabled; @Schema(title = "美颜级别", description = "美颜级别") private Integer level; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/camera/WatermarkProperties.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/camera/WatermarkProperties.java index ee97aeb..6d0e7fe 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/camera/WatermarkProperties.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/config/camera/WatermarkProperties.java @@ -1,6 +1,7 @@ package com.acgist.taoyao.signal.config.camera; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @@ -15,6 +16,7 @@ import lombok.Setter; public class WatermarkProperties { @Schema(title = "是否开启", description = "是否开启") + @NotNull(message = "没有指定操作状态") private Boolean enabled; @Schema(title = "水印内容", description = "水印内容") private String text; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/RoomEventAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/RoomEventAdapter.java index ab976fc..60e271f 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/RoomEventAdapter.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/RoomEventAdapter.java @@ -3,6 +3,7 @@ package com.acgist.taoyao.signal.event; import java.util.Map; import com.acgist.taoyao.boot.model.Message; +import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.party.media.Room; import lombok.Getter; @@ -34,5 +35,12 @@ public class RoomEventAdapter extends ApplicationEventAdapter { super(room, message, body); this.room = room; } + + /** + * @return 房间媒体服务终端 + */ + public Client getMediaClient() { + return this.room.getMediaClient(); + } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomCloseEvent.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomCloseEvent.java new file mode 100644 index 0000000..31c740f --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/event/room/RoomCloseEvent.java @@ -0,0 +1,19 @@ +package com.acgist.taoyao.signal.event.room; + +import com.acgist.taoyao.signal.event.RoomEventAdapter; +import com.acgist.taoyao.signal.party.media.Room; + +/** + * 关闭房间事件 + * + * @author acgist + */ +public class RoomCloseEvent extends RoomEventAdapter { + + private static final long serialVersionUID = 1L; + + public RoomCloseEvent(Room room) { + super(room); + } + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/ClientWrapper.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/ClientWrapper.java index 1656f69..af0638e 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/ClientWrapper.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/ClientWrapper.java @@ -152,7 +152,7 @@ public class ClientWrapper implements AutoCloseable { } @Override - public void close() throws Exception { + public void close() { // TODO:释放资源:通道、消费者、生产者 this.consumers.forEach((k, v) -> v.close()); this.producers.forEach((k, v) -> v.close()); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Consumer.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Consumer.java index 040e8e5..6ff4e4b 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Consumer.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Consumer.java @@ -1,7 +1,5 @@ package com.acgist.taoyao.signal.party.media; -import java.io.Closeable; - import com.acgist.taoyao.signal.event.EventPublisher; import com.acgist.taoyao.signal.event.media.MediaConsumerCloseEvent; @@ -17,12 +15,8 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Getter @Setter -public class Consumer implements Closeable { +public class Consumer extends OperatorAdapter { - /** - * 是否关闭 - */ - private volatile boolean close = false; /** * 媒体类型 */ @@ -59,14 +53,18 @@ public class Consumer implements Closeable { @Override public void close() { - if(this.close) { + if(this.markClose()) { return; } - this.close = true; log.info("关闭消费者:{} - {}", this.streamId, this.consumerId); + EventPublisher.publishEvent(new MediaConsumerCloseEvent(this.consumerId, this.room)); + } + + @Override + public void remove() { this.getProducer().remove(this.consumerId); this.consumerClient.getConsumers().remove(this.consumerId); - EventPublisher.publishEvent(new MediaConsumerCloseEvent(this.consumerId, this.room)); + log.info("移除消费者:{} - {}", this.streamId, this.consumerId); } /** diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Operator.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Operator.java new file mode 100644 index 0000000..13a2cbc --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Operator.java @@ -0,0 +1,34 @@ +package com.acgist.taoyao.signal.party.media; + +import java.io.Closeable; + +/** + * 操作接口 + * 所有操作直接发出事件 + * + * @author acgist + */ +public interface Operator extends Closeable { + + /** + * 关闭资源 + */ + @Override + void close(); + + /** + * 移除资源 + */ + void remove(); + + /** + * 暂停资源 + */ + void pause(); + + /** + * 恢复资源 + */ + void resume(); + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/OperatorAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/OperatorAdapter.java new file mode 100644 index 0000000..4992dec --- /dev/null +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/OperatorAdapter.java @@ -0,0 +1,34 @@ +package com.acgist.taoyao.signal.party.media; + +/** + * 关闭移除接口适配器 + * + * @author acgist + */ +public abstract class OperatorAdapter implements Operator { + + /** + * 是否关闭 + */ + protected volatile boolean close = false; + + @Override + public void pause() { + } + + @Override + public void resume() { + } + + /** + * 标记关闭 + * + * @return 是否已经关闭 + */ + protected boolean markClose() { + final boolean old = this.close; + this.close = true; + return old; + } + +} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Room.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Room.java index 100a655..63ab00f 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Room.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Room.java @@ -1,6 +1,5 @@ package com.acgist.taoyao.signal.party.media; -import java.io.Closeable; import java.util.List; import java.util.Map; import java.util.Objects; @@ -10,6 +9,7 @@ import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.client.ClientStatus; import com.acgist.taoyao.signal.event.EventPublisher; +import com.acgist.taoyao.signal.event.room.RoomCloseEvent; import com.acgist.taoyao.signal.event.room.RoomLeaveEvent; import lombok.Getter; @@ -25,12 +25,8 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Getter @Setter -public class Room implements Closeable { +public class Room extends OperatorAdapter { - /** - * 是否关闭 - */ - private volatile boolean close = false; /** * 房间标识 */ @@ -230,14 +226,18 @@ public class Room implements Closeable { @Override public void close() { - if(this.close) { + if(this.markClose()) { return; } - this.close = true; log.info("关闭房间:{}", this.roomId); - // TODO:关闭房间 - // TODO:媒体服务:直接没提服务关闭所有资源(通道、生产者、消费者) - this.roomManager.remove(this); + this.clients.values().forEach(ClientWrapper::close); + EventPublisher.publishEvent(new RoomCloseEvent(this)); + } + + @Override + public void remove() { + log.info("移除房间:{}", this.roomId); + this.roomManager.remove(this); } /** diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Transport.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Transport.java index 2618a4b..34e8721 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Transport.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/party/media/Transport.java @@ -78,7 +78,7 @@ public class Transport implements Closeable { @Override public void close() { - // TODO:发送事件 + // TODO:实现 } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ControlProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ControlProtocol.java deleted file mode 100644 index 6fa5c25..0000000 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ControlProtocol.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.acgist.taoyao.signal.protocol; - -/** - * 控制信令 - * 直接通过平台发出控制信令 - * - * @author acgist - */ -public interface ControlProtocol { - -} diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolControlAdapter.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolControlAdapter.java index 4d14e6e..d771ceb 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolControlAdapter.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/ProtocolControlAdapter.java @@ -14,7 +14,7 @@ import com.acgist.taoyao.signal.client.ClientType; * * @author acgist */ -public class ProtocolControlAdapter extends ProtocolClientAdapter { +public abstract class ProtocolControlAdapter extends ProtocolClientAdapter { protected ProtocolControlAdapter(String name, String signal) { super(name, signal); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRebootProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRebootProtocol.java index 9962b37..2bc63c5 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRebootProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientRebootProtocol.java @@ -2,7 +2,6 @@ package com.acgist.taoyao.signal.protocol.client; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; -import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; /** @@ -14,7 +13,7 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; @Description( flow = "信令服务->终端" ) -public class ClientRebootProtocol extends ProtocolClientAdapter implements ControlProtocol { +public class ClientRebootProtocol extends ProtocolClientAdapter { public static final String SIGNAL = "client::reboot"; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientShutdownProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientShutdownProtocol.java index b5fd32d..4ceba6b 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientShutdownProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/client/ClientShutdownProtocol.java @@ -2,7 +2,6 @@ package com.acgist.taoyao.signal.protocol.client; import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; -import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; /** @@ -14,7 +13,7 @@ import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; @Description( flow = "信令服务->终端" ) -public class ClientShutdownProtocol extends ProtocolClientAdapter implements ControlProtocol { +public class ClientShutdownProtocol extends ProtocolClientAdapter { public static final String SIGNAL = "client::shutdown"; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlBeautyProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlBeautyProtocol.java index af90cbc..6f3e71d 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlBeautyProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlBeautyProtocol.java @@ -1,7 +1,14 @@ package com.acgist.taoyao.signal.protocol.control; +import java.util.Map; + import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.model.Message; +import com.acgist.taoyao.signal.client.Client; +import com.acgist.taoyao.signal.client.ClientType; +import com.acgist.taoyao.signal.config.camera.BeautyProperties; +import com.acgist.taoyao.signal.protocol.ProtocolControlAdapter; /** * 打开美颜信令 @@ -10,7 +17,38 @@ import com.acgist.taoyao.boot.annotation.Protocol; */ @Protocol @Description( + body = """ + { + "to": "目标终端ID", + ...BeautyProperties + } + """, + flow = { + "信令服务->终端", + "终端=>信令服务->终端" + } ) -public class ControlBeautyProtocol { +public class ControlBeautyProtocol extends ProtocolControlAdapter { + public static final String SIGNAL = "control::beauty"; + + public ControlBeautyProtocol() { + super("打开美颜信令", SIGNAL); + } + + @Override + public void execute(String clientId, ClientType clientType, Client client, Client targetClient, Message message, Map body) { + client.push(targetClient.request(message)); + } + + /** + * @param clientId 终端ID + * @param beautyProperties 美颜配置 + * + * @return 执行结果 + */ + public Message execute(String clientId, BeautyProperties beautyProperties) { + return this.request(clientId, this.build(beautyProperties)); + } + } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlBellProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlBellProtocol.java index badd8b9..fa0054a 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlBellProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlBellProtocol.java @@ -20,7 +20,7 @@ import com.acgist.taoyao.signal.protocol.ProtocolControlAdapter; body = """ { "to": "目标终端ID", - "active": 是否响铃(true|false) + "enabled": 是否响铃(true|false) } """, flow = { @@ -43,12 +43,12 @@ public class ControlBellProtocol extends ProtocolControlAdapter { /** * @param clientId 终端ID - * @param active 操作 + * @param enabled 状态 * * @return 执行结果 */ - public Message execute(String clientId, Boolean active) { - return this.request(clientId, this.build(Map.of(Constant.ACTIVE, active))); + public Message execute(String clientId, Boolean enabled) { + return this.request(clientId, this.build(Map.of(Constant.ENABLED, enabled))); } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlConfigAudioProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlConfigAudioProtocol.java index da405b1..29570c3 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlConfigAudioProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlConfigAudioProtocol.java @@ -1,10 +1,55 @@ package com.acgist.taoyao.signal.protocol.control; +import java.util.Map; + +import com.acgist.taoyao.boot.annotation.Description; +import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.MediaAudioProperties; +import com.acgist.taoyao.boot.model.Message; +import com.acgist.taoyao.signal.client.Client; +import com.acgist.taoyao.signal.client.ClientType; +import com.acgist.taoyao.signal.protocol.ProtocolControlAdapter; + /** - * 配置音频 + * 配置音频信令 * * @author acgist */ -public class ControlConfigAudioProtocol { +@Protocol +@Description( + memo = "如果没有指定参数使用默认参数配置", + body = """ + { + "to": "目标终端ID", + ...MediaAudioProperties + } + """, + flow = { + "信令服务->终端", + "终端=>信令服务->终端" + } +) +public class ControlConfigAudioProtocol extends ProtocolControlAdapter { + + public static final String SIGNAL = "control::config::audio"; + + public ControlConfigAudioProtocol() { + super("配置音频信令", SIGNAL); + } + + @Override + public void execute(String clientId, ClientType clientType, Client client, Client targetClient, Message message, Map body) { + client.push(targetClient.request(message)); + } + + /** + * @param clientId 终端ID + * @param mediaAudioProperties 音频配置 + * + * @return 执行结果 + */ + public Message execute(String clientId, MediaAudioProperties mediaAudioProperties) { + return this.request(clientId, this.build(mediaAudioProperties)); + } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlConfigVideoProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlConfigVideoProtocol.java index 5c9491a..c9a4e95 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlConfigVideoProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlConfigVideoProtocol.java @@ -1,10 +1,55 @@ package com.acgist.taoyao.signal.protocol.control; +import java.util.Map; + +import com.acgist.taoyao.boot.annotation.Description; +import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.config.MediaVideoProperties; +import com.acgist.taoyao.boot.model.Message; +import com.acgist.taoyao.signal.client.Client; +import com.acgist.taoyao.signal.client.ClientType; +import com.acgist.taoyao.signal.protocol.ProtocolControlAdapter; + /** - * 配置视频 + * 配置视频信令 * * @author acgist */ -public class ControlConfigVideoProtocol { +@Protocol +@Description( + memo = "如果没有指定参数使用默认参数配置", + body = """ + { + "to": "目标终端ID", + ...MediaVideoProperties + } + """, + flow = { + "信令服务->终端", + "终端=>信令服务->终端" + } +) +public class ControlConfigVideoProtocol extends ProtocolControlAdapter { + + public static final String SIGNAL = "control::config::video"; + + public ControlConfigVideoProtocol() { + super("配置视频信令", SIGNAL); + } + + @Override + public void execute(String clientId, ClientType clientType, Client client, Client targetClient, Message message, Map body) { + client.push(targetClient.request(message)); + } + + /** + * @param clientId 终端ID + * @param mediaVideoProperties 视频配置 + * + * @return 执行结果 + */ + public Message execute(String clientId, MediaVideoProperties mediaVideoProperties) { + return this.request(clientId, this.build(mediaVideoProperties)); + } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlRecordProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlRecordProtocol.java index 879c022..224dc9b 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlRecordProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlRecordProtocol.java @@ -20,7 +20,7 @@ import com.acgist.taoyao.signal.protocol.ProtocolControlAdapter; body = """ { "to": "目标终端ID", - "active": 是否录像(true|false) + "enabled": 是否录像(true|false) } """, flow = { @@ -42,13 +42,13 @@ public class ControlRecordProtocol extends ProtocolControlAdapter { } /** - * @param clientId 终端标识 - * @param active 操作 + * @param clientId 终端ID + * @param enabled 状态 * * @return 执行结果 */ - public Message execute(String clientId, Boolean active) { - return this.request(clientId, this.build(Map.of(Constant.ACTIVE, active))); + public Message execute(String clientId, Boolean enabled) { + return this.request(clientId, this.build(Map.of(Constant.ENABLED, enabled))); } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlWatermarkProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlWatermarkProtocol.java index 9ef3a41..1e1173b 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlWatermarkProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/control/ControlWatermarkProtocol.java @@ -1,16 +1,55 @@ package com.acgist.taoyao.signal.protocol.control; +import java.util.Map; + import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; +import com.acgist.taoyao.boot.model.Message; +import com.acgist.taoyao.signal.client.Client; +import com.acgist.taoyao.signal.client.ClientType; +import com.acgist.taoyao.signal.config.camera.WatermarkProperties; +import com.acgist.taoyao.signal.protocol.ProtocolControlAdapter; /** - * 打开水印信令 + * 配置水印信令 * * @author acgist */ @Protocol @Description( + memo = "如果没有指定参数使用默认参数配置", + body = """ + { + "to": "目标终端ID", + ...WatermarkProperties + } + """, + flow = { + "信令服务->终端", + "终端=>信令服务->终端" + } ) -public class ControlWatermarkProtocol { +public class ControlWatermarkProtocol extends ProtocolControlAdapter { + public static final String SIGNAL = "control::watermark"; + + public ControlWatermarkProtocol() { + super("配置水印信令", SIGNAL); + } + + @Override + public void execute(String clientId, ClientType clientType, Client client, Client targetClient, Message message, Map body) { + client.push(targetClient.request(message)); + } + + /** + * @param clientId 终端ID + * @param watermarkProperties 水印配置 + * + * @return 执行结果 + */ + public Message execute(String clientId, WatermarkProperties watermarkProperties) { + return this.request(clientId, this.build(watermarkProperties)); + } + } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerCloseProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerCloseProtocol.java index 0aa05d3..240d730 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerCloseProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/media/MediaConsumerCloseProtocol.java @@ -17,15 +17,12 @@ import com.acgist.taoyao.signal.party.media.Consumer; import com.acgist.taoyao.signal.party.media.Room; import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; -import lombok.extern.slf4j.Slf4j; - /** * 关闭消费者信令 * 注意:正常情况不会存在关闭消费者的情况,所以一般不用处理关闭消费者信令。 * * @author acgist */ -@Slf4j @Protocol @Description( body = """ @@ -34,7 +31,10 @@ import lombok.extern.slf4j.Slf4j; "consumerId": "消费者ID" } """, - flow = "终端->信令服务+)终端" + flow = { + "媒体服务->信令服务-)终端", + "终端->信令服务->媒体服务->信令服务+)终端" + } ) public class MediaConsumerCloseProtocol extends ProtocolRoomAdapter implements ApplicationListener { @@ -48,21 +48,25 @@ public class MediaConsumerCloseProtocol extends ProtocolRoomAdapter implements A @Override public void onApplicationEvent(MediaConsumerCloseEvent event) { final Room room = event.getRoom(); + final Client mediaClient = event.getMediaClient(); final Map body = Map.of( Constant.ROOM_ID, room.getRoomId(), Constant.CONSUMER_ID, event.getConsumerId() ); - room.broadcastAll(this.build(body)); + mediaClient.push(this.build(body)); } @Override public void execute(String clientId, ClientType clientType, Room room, Client client, Client mediaClient, Message message, Map body) { final String consumerId = MapUtils.get(body, Constant.CONSUMER_ID); final Consumer consumer = room.consumer(consumerId); - if(consumer == null) { - log.debug("关闭消费者无效:{}", consumerId); - } else { + if(clientType.mediaClient()) { consumer.close(); + } else if(clientType.mediaServer()) { + consumer.remove(); + room.broadcast(message); + } else { + this.logNoAdapter(clientType); } } diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java index 4cbe30d..933a209 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformRebootProtocol.java @@ -8,7 +8,6 @@ import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.utils.ScriptUtils; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.client.ClientType; -import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; import lombok.extern.slf4j.Slf4j; @@ -25,7 +24,7 @@ import lombok.extern.slf4j.Slf4j; "终端->信令服务+)终端" } ) -public class PlatformRebootProtocol extends ProtocolClientAdapter implements ControlProtocol { +public class PlatformRebootProtocol extends ProtocolClientAdapter { public static final String SIGNAL = "platform::reboot"; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java index 7bf0841..2ac3374 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/platform/PlatformShutdownProtocol.java @@ -10,7 +10,6 @@ import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.utils.ScriptUtils; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.client.ClientType; -import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; import lombok.extern.slf4j.Slf4j; @@ -27,7 +26,7 @@ import lombok.extern.slf4j.Slf4j; "终端->信令服务+)终端" } ) -public class PlatformShutdownProtocol extends ProtocolClientAdapter implements ControlProtocol { +public class PlatformShutdownProtocol extends ProtocolClientAdapter { public static final String SIGNAL = "platform::shutdown"; 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 index 29c621b..ce6a384 100644 --- 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 @@ -2,12 +2,15 @@ package com.acgist.taoyao.signal.protocol.room; import java.util.Map; +import org.springframework.context.ApplicationListener; + import com.acgist.taoyao.boot.annotation.Description; import com.acgist.taoyao.boot.annotation.Protocol; import com.acgist.taoyao.boot.config.Constant; import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.client.ClientType; +import com.acgist.taoyao.signal.event.room.RoomCloseEvent; import com.acgist.taoyao.signal.party.media.Room; import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; @@ -25,21 +28,28 @@ import com.acgist.taoyao.signal.protocol.ProtocolRoomAdapter; """, flow = "终端->信令服务+)终端" ) -public class RoomCloseProtocol extends ProtocolRoomAdapter { +public class RoomCloseProtocol extends ProtocolRoomAdapter implements ApplicationListener { private static final String SIGNAL = "room::close"; public RoomCloseProtocol() { super("关闭房间信令", SIGNAL); } + + @Override + public void onApplicationEvent(RoomCloseEvent event) { + final Room room = event.getRoom(); + final Client mediaClient = room.getMediaClient(); + final Map body = Map.of(Constant.ROOM_ID, room.getRoomId()); + mediaClient.push(this.build(body)); + } @Override public void execute(String clientId, ClientType clientType, Room room, Client client, Client mediaClient, Message message, Map body) { - // TODO:改为星型 - if(clientType.web()) { - mediaClient.push(this.build(Map.of(Constant.ROOM_ID, room.getRoomId()))); - } else if(clientType.mediaServer()) { + if(clientType.mediaClient()) { room.close(); + } else if(clientType.mediaServer()) { + room.remove(); room.broadcast(message); } else { this.logNoAdapter(clientType); diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java index 04389c8..df13712 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemRebootProtocol.java @@ -8,7 +8,6 @@ import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.utils.ScriptUtils; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.client.ClientType; -import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; import lombok.extern.slf4j.Slf4j; @@ -25,7 +24,7 @@ import lombok.extern.slf4j.Slf4j; "终端->信令服务+)终端" } ) -public class SystemRebootProtocol extends ProtocolClientAdapter implements ControlProtocol { +public class SystemRebootProtocol extends ProtocolClientAdapter { public static final String SIGNAL = "system::reboot"; diff --git a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java index 029f9ec..b5f6faa 100644 --- a/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java +++ b/taoyao-signal-server/taoyao-signal/src/main/java/com/acgist/taoyao/signal/protocol/system/SystemShutdownProtocol.java @@ -8,7 +8,6 @@ import com.acgist.taoyao.boot.model.Message; import com.acgist.taoyao.boot.utils.ScriptUtils; import com.acgist.taoyao.signal.client.Client; import com.acgist.taoyao.signal.client.ClientType; -import com.acgist.taoyao.signal.protocol.ControlProtocol; import com.acgist.taoyao.signal.protocol.ProtocolClientAdapter; import lombok.extern.slf4j.Slf4j; @@ -25,7 +24,7 @@ import lombok.extern.slf4j.Slf4j; "终端->信令服务+)终端" } ) -public class SystemShutdownProtocol extends ProtocolClientAdapter implements ControlProtocol { +public class SystemShutdownProtocol extends ProtocolClientAdapter { public static final String SIGNAL = "system::shutdown";