[+] Web端P2P监控
This commit is contained in:
@@ -1,5 +0,0 @@
|
||||
package com.acgist.taoyao.signal.party.p2p;
|
||||
|
||||
public class Session {
|
||||
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package com.acgist.taoyao.signal.party.p2p;
|
||||
|
||||
public class SessionManager {
|
||||
|
||||
}
|
||||
@@ -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() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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) {
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package com.acgist.taoyao.signal.protocol.p2p;
|
||||
|
||||
public class P2PAnswerProtocol {
|
||||
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package com.acgist.taoyao.signal.protocol.p2p;
|
||||
|
||||
public class P2PCallProtocol {
|
||||
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package com.acgist.taoyao.signal.protocol.p2p;
|
||||
|
||||
public class P2PCandidateProtocol {
|
||||
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package com.acgist.taoyao.signal.protocol.p2p;
|
||||
|
||||
public class P2POfferProtocol {
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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) {
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user