添加项目文件。
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>象棋 Hub 流程测试</title>
|
||||
<style>
|
||||
body { font-family: Consolas, monospace; font-size: 13px; background: #111; color: #ddd; padding: 12px; }
|
||||
button { cursor: pointer; padding: 6px 12px; margin: 3px; }
|
||||
.log { background: #000; border: 1px solid #333; height: 50vh; overflow-y: auto; margin-top: 10px; padding: 8px; white-space: pre-wrap; font-size: 12px; }
|
||||
.ok { color: #0f0; } .bad { color: #f55; } .info { color: #9ad; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h3>象棋 Hub 流程测试</h3>
|
||||
<div>
|
||||
<label>Hub地址: <input id="hub" value="" placeholder="请输入测试环境 Hub 地址" style="width:260px"></label>
|
||||
<button onclick="connAll()">1. 连接 L1/A/B</button>
|
||||
<button onclick="createRoom()">2. A 建房</button>
|
||||
<button onclick="joinRoom()">3. B 加入</button>
|
||||
<button onclick="readyAll()">4. 双方Ready</button>
|
||||
<button onclick="bExit()">5. B退出</button>
|
||||
<button onclick="bJoin()">6. B重新加入</button>
|
||||
<button onclick="afkA()">7. A挂起</button>
|
||||
<button onclick="afkB()">8. B挂起(等5s)</button>
|
||||
<br>
|
||||
<label>RoomID: <input id="room" name="room" value="" style="width:200px"></label>
|
||||
<label>密码: <input id="password" name="password" value="" placeholder="请输入测试房间密码" style="width:180px"></label>
|
||||
<label>UID-A: <input id="a" name="a" value="" style="width:280px"></label>
|
||||
<label>UID-B: <input id="b" name="b" value="" style="width:280px"></label>
|
||||
<button onclick="clearLog()">清空日志</button>
|
||||
</div>
|
||||
<div class="log" id="log"></div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/@microsoft/signalr@8.0.7/dist/browser/signalr.min.js"></script>
|
||||
<script>
|
||||
const logEl = document.getElementById('log');
|
||||
function log(msg) { logEl.innerHTML += msg + '\n'; logEl.scrollTop = logEl.scrollHeight; }
|
||||
function ok(m) { log('<span class="ok">[OK]</span> ' + m); }
|
||||
function bad(m) { log('<span class="bad">[FAIL]</span> ' + m); }
|
||||
function info(m) { log('<span class="info">[INFO]</span> ' + m); }
|
||||
|
||||
let L1, A, B;
|
||||
const roomQ = () => document.getElementById('room').value;
|
||||
const passwordQ = () => document.getElementById('password').value;
|
||||
const uidA = () => document.getElementById('a').value;
|
||||
const uidB = () => document.getElementById('b').value;
|
||||
const hubUrl = () => document.getElementById('hub').value;
|
||||
|
||||
function newTestId(prefix) {
|
||||
const value = window.crypto && crypto.randomUUID ? crypto.randomUUID().replace(/-/g, '') : Date.now() + Math.random().toString(16).slice(2);
|
||||
return prefix + value;
|
||||
}
|
||||
|
||||
document.getElementById('hub').value = /^https?:$/.test(location.protocol) ? location.origin + '/chessgamehub' : '';
|
||||
document.getElementById('room').value = 'TEST_' + Date.now();
|
||||
document.getElementById('a').value = newTestId('A_');
|
||||
document.getElementById('b').value = newTestId('B_');
|
||||
|
||||
function evt(conn, name, cb) { conn.on(name, cb); }
|
||||
|
||||
function make(id, uid, tag) {
|
||||
const c = new signalR.HubConnectionBuilder()
|
||||
.withUrl(hubUrl() + '?userId=' + uid)
|
||||
.withAutomaticReconnect()
|
||||
.build();
|
||||
const events = ['GameError','BeginGame','CreateRoomNotice','JoinRoomNotice','ExitRoomNotice',
|
||||
'JoinRoom','Reconnect','ReadyNotice','AllBeginTime','GoldConfigRequired','ExitRoomSuccess',
|
||||
'GameEnd','Disconnect','PlayerAfkNotice','PlayerCancelAfkNotice','OpponentRequestEnd','EndGameRequestSent','RestartRoomNotice'];
|
||||
events.forEach(e => c.on(e, (arg) => {
|
||||
let s = typeof arg === 'object' ? JSON.stringify(arg) : arg;
|
||||
if (s && s.length > 140) s = s.substr(0, 140) + '…';
|
||||
log(`<span class="info">[${tag}]</span> 推送 <b>${e}</b>: ${s}`);
|
||||
}));
|
||||
c.onreconnected(() => log(`<span class="bad">[${tag}] 重连</span>`));
|
||||
return c;
|
||||
}
|
||||
|
||||
async function connAll() {
|
||||
L1 = make('L1', 'L1_' + uidA().substr(0,8), 'L1'); A = make('A', uidA(), 'A'); B = make('B', uidB(), 'B');
|
||||
for (const [tag, c] of [['L1', L1], ['A', A], ['B', B]]) {
|
||||
try { await c.start(); ok(`${tag} 连接成功 ${c.connectionId}`); }
|
||||
catch (e) { bad(`${tag} 连接失败: ${e}`); log(e.stack); }
|
||||
}
|
||||
}
|
||||
|
||||
async function createRoom() {
|
||||
try {
|
||||
await A.invoke('CreateRoom', { roomId: roomQ(), userId: uidA(), gameType: 1, password: passwordQ(), gold: 100 });
|
||||
ok('A invoke CreateRoom 已发送');
|
||||
} catch (e) { bad('CreateRoom 异常: ' + e); }
|
||||
}
|
||||
|
||||
async function joinRoom() {
|
||||
try { await B.invoke('JoinGame', roomQ(), passwordQ(), uidB()); ok('B invoke JoinGame 已发送'); }
|
||||
catch (e) { bad('JoinGame 异常: ' + e); }
|
||||
}
|
||||
|
||||
async function readyAll() {
|
||||
try { await A.invoke('GameReady', roomQ(), uidA()); await B.invoke('GameReady', roomQ(), uidB()); ok('双方 Ready 已发送'); }
|
||||
catch (e) { bad('Ready 异常: ' + e); }
|
||||
}
|
||||
|
||||
async function bExit() { try { await B.invoke('ExitRoom', roomQ(), uidB()); ok('B ExitRoom 已发送'); } catch (e) { bad('ExitRoom: ' + e); } }
|
||||
async function bJoin() { try { await B.invoke('JoinGame', roomQ(), passwordQ(), uidB()); ok('B 重新加入已发送'); } catch (e) { bad(e); } }
|
||||
async function afkA() { try { await A.invoke('SetPlayerAfk', roomQ(), uidA()); ok('A SetPlayerAfk 已发送'); } catch (e) { bad('afkA: ' + e); } }
|
||||
async function afkB() { try { await B.invoke('SetPlayerAfk', roomQ(), uidB()); ok('B SetPlayerAfk 已发送'); } catch (e) { bad('afkB: ' + e); } }
|
||||
|
||||
function clearLog(){ logEl.innerHTML=''; }
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user