[+] Web端P2P监控

This commit is contained in:
acgist
2023-04-01 23:21:16 +08:00
parent ed66875a47
commit 1d79de3ef7
27 changed files with 922 additions and 265 deletions

View File

@@ -1,5 +0,0 @@
package com.acgist.taoyao.signal.party.p2p;
public class Session {
}

View File

@@ -1,5 +0,0 @@
package com.acgist.taoyao.signal.party.p2p;
public class SessionManager {
}

View File

@@ -0,0 +1,57 @@
package com.acgist.taoyao.signal.party.session;
import java.io.Closeable;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.signal.client.Client;
import lombok.Getter;
/**
* P2P会话
*
* @author acgist
*/
@Getter
public class Session implements Closeable {
/**
* ID
*/
private final String id;
/**
* 发起者
*/
private final Client source;
/**
* 接收者
*/
private final Client target;
public Session(String id, Client source, Client target) {
this.id = id;
this.source = source;
this.target = target;
}
/**
* 发送消息给对方终端
*
* @param clientId 当前终端ID
* @param message 消息
*/
public void pushRemote(String clientId, Message message) {
if(this.source.clientId().equals(clientId)) {
this.target.push(message);
} else {
this.source.push(message);
}
}
@Override
public void close() {
}
}

View File

@@ -0,0 +1,47 @@
package com.acgist.taoyao.signal.party.session;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.acgist.taoyao.boot.annotation.Manager;
import com.acgist.taoyao.boot.service.IdService;
import com.acgist.taoyao.signal.client.Client;
/**
* P2P会话管理器
*
* @author acgist
*/
@Manager
public class SessionManager {
private final IdService idService;
private final Map<String, Session> sessions;
public SessionManager(IdService idService) {
this.idService = idService;
this.sessions = new ConcurrentHashMap<>();
}
/**
* @param source 发起者
* @param target 接收者
*
* @return 会话
*/
public Session call(Client source, Client target) {
final Session session = new Session(this.idService.buildUuid(), source, target);
this.sessions.put(session.getId(), session);
return session;
}
/**
* @param sessionId 会话ID
*
* @return 会话
*/
public Session get(String sessionId) {
return this.sessions.get(sessionId);
}
}

View File

@@ -14,6 +14,7 @@ import com.acgist.taoyao.boot.service.IdService;
import com.acgist.taoyao.signal.client.ClientManager;
import com.acgist.taoyao.signal.event.ApplicationEventAdapter;
import com.acgist.taoyao.signal.party.media.RoomManager;
import com.acgist.taoyao.signal.party.session.SessionManager;
import lombok.extern.slf4j.Slf4j;

View File

@@ -0,0 +1,54 @@
package com.acgist.taoyao.signal.protocol;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import com.acgist.taoyao.boot.config.Constant;
import com.acgist.taoyao.boot.model.Message;
import com.acgist.taoyao.boot.model.MessageCodeException;
import com.acgist.taoyao.boot.utils.MapUtils;
import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.client.ClientType;
import com.acgist.taoyao.signal.party.media.Room;
import com.acgist.taoyao.signal.party.session.Session;
import com.acgist.taoyao.signal.party.session.SessionManager;
/**
* 会话信令适配器
*
* @author acgist
*/
public abstract class ProtocolSessionAdapter extends ProtocolClientAdapter {
@Autowired
protected SessionManager sessionManager;
protected ProtocolSessionAdapter(String name, String signal) {
super(name, signal);
}
@Override
public void execute(String clientId, ClientType clientType, Client client, Message message, Map<String, Object> body) {
final String sessionId = MapUtils.get(body, Constant.SESSION_ID);
final Session session = this.sessionManager.get(sessionId);
if(session == null) {
throw MessageCodeException.of("无效会话:" + sessionId);
}
this.execute(clientId, clientType, session, client, message, body);
}
/**
* 处理终端会话信令
*
* @param clientId 终端标识
* @param clientType 终端类型
* @param session 会话
* @param client 终端
* @param message 消息
* @param body 消息主体
*/
public void execute(String clientId, ClientType clientType, Session session, Client client, Message message, Map<String, Object> body) {
}
}

View File

@@ -1,5 +0,0 @@
package com.acgist.taoyao.signal.protocol.p2p;
public class P2PAnswerProtocol {
}

View File

@@ -1,5 +0,0 @@
package com.acgist.taoyao.signal.protocol.p2p;
public class P2PCallProtocol {
}

View File

@@ -1,5 +0,0 @@
package com.acgist.taoyao.signal.protocol.p2p;
public class P2PCandidateProtocol {
}

View File

@@ -1,5 +0,0 @@
package com.acgist.taoyao.signal.protocol.p2p;
public class P2POfferProtocol {
}

View File

@@ -0,0 +1,65 @@
package com.acgist.taoyao.signal.protocol.session;
import java.util.Map;
import org.apache.tomcat.util.bcel.Const;
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.boot.utils.MapUtils;
import com.acgist.taoyao.signal.client.Client;
import com.acgist.taoyao.signal.client.ClientType;
import com.acgist.taoyao.signal.party.session.Session;
import com.acgist.taoyao.signal.protocol.ProtocolSessionAdapter;
import lombok.extern.slf4j.Slf4j;
/**
* 发起会话信令
*
* @author acgist
*/
@Slf4j
@Protocol
@Description(
body = """
{
"clientId": "接收者ID"
}
""",
flow = {
"终端->信令服务->终端",
"终端=>信令服务->终端"
}
)
public class SessionCallProtocol extends ProtocolSessionAdapter {
public static final String SIGNAL = "session::call";
public SessionCallProtocol() {
super("发起会话信令", SIGNAL);
}
@Override
public void execute(String clientId, ClientType clientType, Client client, Message message, Map<String, Object> body) {
final String targetId = MapUtils.get(body, Constant.CLIENT_ID);
final Client target = this.clientManager.clients(targetId);
final Session session = this.sessionManager.call(client, target);
message.setBody(Map.of(
Constant.NAME, target.status().getName(),
Constant.CLIENT_ID, target.clientId(),
Constant.SESSION_ID, session.getId()
));
client.push(message);
final Message callMessage = message.cloneWithoutBody();
callMessage.setBody(Map.of(
Constant.NAME, client.status().getName(),
Constant.CLIENT_ID, client.clientId(),
Constant.SESSION_ID, session.getId()
));
target.push(callMessage);
}
}

View File

@@ -0,0 +1,41 @@
package com.acgist.taoyao.signal.protocol.session;
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.party.session.Session;
import com.acgist.taoyao.signal.protocol.ProtocolSessionAdapter;
import lombok.extern.slf4j.Slf4j;
/**
* 关闭媒体信令
*
* @author acgist
*/
@Slf4j
@Protocol
@Description(
body = """
{
}
""",
flow = "终端->信令服务->终端"
)
public class SessionCloseProtocol extends ProtocolSessionAdapter {
public static final String SIGNAL = "session::close";
public SessionCloseProtocol() {
super("关闭媒体信令", SIGNAL);
}
@Override
public void execute(String clientId, ClientType clientType, Session session, Client client, Message message, Map<String, Object> body) {
}
}

View File

@@ -0,0 +1,42 @@
package com.acgist.taoyao.signal.protocol.session;
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.party.session.Session;
import com.acgist.taoyao.signal.protocol.ProtocolSessionAdapter;
import lombok.extern.slf4j.Slf4j;
/**
* 媒体交换信令
*
* @author acgist
*/
@Slf4j
@Protocol
@Description(
body = """
{
}
""",
flow = "终端->信令服务->终端"
)
public class SessionExchangeProtocol extends ProtocolSessionAdapter {
public static final String SIGNAL = "session::exchange";
public SessionExchangeProtocol() {
super("媒体交换信令", SIGNAL);
}
@Override
public void execute(String clientId, ClientType clientType, Session session, Client client, Message message, Map<String, Object> body) {
session.pushRemote(clientId, message);
}
}