This commit is contained in:
acgist
2022-11-26 12:20:05 +08:00
parent 0f339f4aea
commit 474be08cc9
21 changed files with 493 additions and 362 deletions

View File

@@ -52,14 +52,14 @@ public interface ClientSession extends AutoCloseable {
*
* @return 终端标识是否匹配
*/
boolean matchSn(String sn);
boolean filterSn(String sn);
/**
* @param sn 终端标识
*
* @return 终端标识是否匹配失败
*/
boolean matchNoneSn(String sn);
boolean filterNoneSn(String sn);
/**
* @param instance 会话实例

View File

@@ -64,12 +64,12 @@ public abstract class ClientSessionAdapter<T extends AutoCloseable> implements C
}
@Override
public boolean matchSn(String sn) {
public boolean filterSn(String sn) {
return StringUtils.equals(sn, this.sn);
}
@Override
public boolean matchNoneSn(String sn) {
public boolean filterNoneSn(String sn) {
return !StringUtils.equals(sn, this.sn);
}

View File

@@ -65,7 +65,7 @@ public class ClientSessionManager {
* @param message 消息
*/
public void unicast(String to, Message message) {
this.sessions.stream().filter(v -> v.matchSn(to)).forEach(v -> {
this.sessions.stream().filter(v -> v.filterSn(to)).forEach(v -> {
message.getHeader().setSn(v.sn());
v.push(message);
});
@@ -90,7 +90,7 @@ public class ClientSessionManager {
* @param message 消息
*/
public void broadcast(String from, Message message) {
this.sessions.stream().filter(v -> v.matchNoneSn(from)).forEach(v -> {
this.sessions.stream().filter(v -> v.filterNoneSn(from)).forEach(v -> {
message.getHeader().setSn(v.sn());
v.push(message);
});

View File

@@ -3,6 +3,7 @@ package com.acgist.taoyao.signal.client.websocket;
import org.springframework.beans.factory.annotation.Autowired;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.model.MessageCodeException;
import com.acgist.taoyao.signal.client.ClientSessionManager;
import com.acgist.taoyao.signal.protocol.ProtocolManager;
import com.acgist.taoyao.signal.protocol.platform.ErrorProtocol;
@@ -42,6 +43,9 @@ public class WebSocketSignal {
} catch (Exception e) {
log.error("处理会话消息异常", e);
final Message errorMessage = WebSocketSignal.errorProtocol.build();
if(e instanceof MessageCodeException code) {
errorMessage.setCode(code.getCode(), code.getMessage());
}
errorMessage.setBody(e.getMessage());
this.push(session, errorMessage);
}

View File

@@ -1,6 +1,8 @@
package com.acgist.taoyao.signal.event;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import org.springframework.context.ApplicationEvent;
@@ -86,4 +88,16 @@ public abstract class ApplicationEventAdapter extends ApplicationEvent {
return t == null ? defaultValue : t;
}
/**
* @return 新的主体
*/
public Map<String, Object> mergeBody() {
final Map<String, Object> body = new HashMap<>();
if(this.body != null) {
this.body.forEach((k, v) -> body.put(Objects.toString(k), v));
}
this.message.setBody(body);
return body;
}
}

View File

@@ -0,0 +1,35 @@
package com.acgist.taoyao.signal.event.media;
import java.util.List;
import java.util.Map;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.client.ClientSession;
import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
import lombok.Getter;
import lombok.Setter;
/**
* 候选事件
*
* @author acgist
*/
@Getter
@Setter
public class MediaCandidateEvent extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
public MediaCandidateEvent(String sn, Map<?, ?> body, Message message, ClientSession session) {
super(sn, body, message, session);
}
/**
* @return 终端列表
*/
public List<String> getSns() {
return this.get("sns");
}
}

View File

@@ -0,0 +1,34 @@
package com.acgist.taoyao.signal.event.media;
import java.util.Map;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.client.ClientSession;
import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
import lombok.Getter;
import lombok.Setter;
/**
* 发布事件
*
* @author acgist
*/
@Getter
@Setter
public class MediaPublishEvent extends ApplicationEventAdapter {
private static final long serialVersionUID = 1L;
public MediaPublishEvent(String sn, Map<?, ?> body, Message message, ClientSession session) {
super(sn, body, message, session);
}
/**
* @return 终端标识(发布给谁)
*/
public String getTo() {
return this.get("to");
}
}

View File

@@ -23,5 +23,12 @@ public class MediaSubscribeEvent extends ApplicationEventAdapter {
public MediaSubscribeEvent(String sn, Map<?, ?> body, Message message, ClientSession session) {
super(sn, body, message, session);
}
/**
* @return 终端标识(订阅的谁)
*/
public String getTo() {
return this.get("to");
}
}

View File

@@ -99,7 +99,7 @@ public class ProtocolManager {
final Protocol protocol = this.protocolMapping.get(pid);
if(protocol == null) {
log.warn("不支持的信令协议:{}", message);
session.push(this.errorProtocol.build("不支持的信令协议"));
session.push(this.errorProtocol.build("不支持的信令协议" + pid));
return;
}
if(protocol instanceof ClientRegisterProtocol) {

View File

@@ -0,0 +1,30 @@
package com.acgist.taoyao.signal.protocol.media;
import java.util.Map;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.client.ClientSession;
import com.acgist.taoyao.signal.event.media.MediaCandidateEvent;
import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
/**
* 候选信令
*
* @author acgist
*/
@Protocol
public class MediaCandidateProtocol extends ProtocolMapAdapter {
public static final Integer PID = 5004;
public MediaCandidateProtocol() {
super(PID, "候选信令");
}
@Override
public void execute(String sn, Map<?, ?> body, Message message, ClientSession session) {
this.publishEvent(new MediaCandidateEvent(sn, body, message, session));
}
}

View File

@@ -1,5 +1,30 @@
package com.acgist.taoyao.signal.protocol.media;
public class MediaPublishProtocol {
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.media.MediaPublishEvent;
import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
/**
* 发布信令
*
* @author acgist
*/
@Protocol
public class MediaPublishProtocol extends ProtocolMapAdapter {
public static final Integer PID = 5000;
public MediaPublishProtocol() {
super(PID, "发布信令");
}
@Override
public void execute(String sn, Map<?, ?> body, Message message, ClientSession session) {
this.publishEvent(new MediaPublishEvent(sn, body, message, session));
}
}

View File

@@ -2,6 +2,7 @@ package com.acgist.taoyao.signal.protocol.media;
import java.util.Map;
import com.acgist.taoyao.boot.annotation.Protocol;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.client.ClientSession;
import com.acgist.taoyao.signal.event.media.MediaSubscribeEvent;
@@ -12,6 +13,7 @@ import com.acgist.taoyao.signal.protocol.ProtocolMapAdapter;
*
* @author acgist
*/
@Protocol
public class MediaSubscribeProtocol extends ProtocolMapAdapter {
public static final Integer PID = 5002;