feat: integrate login flow, lobby UI and bitmap font resources

This commit is contained in:
2026-09-06 13:46:57 +08:00
parent e1bcfd91ec
commit 842c68ef55
141 changed files with 11279 additions and 1717 deletions
@@ -0,0 +1,55 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import {readFileSync} from 'node:fs';
import {runInNewContext} from 'node:vm';
import ts from 'typescript';
test('wire logs correctly label both directions and preserve transmitted frames',()=>{
for(const debugIO of [false,true]){
const logs:unknown[][]=[],sent:string[]=[],received:string[]=[];
let socket:any;
class WebSocket {
constructor(readonly url:string){socket=this;}
send(frame:string){sent.push(frame);}
}
const exports:any={};
const source=readFileSync(new URL('../../YouleNexus/assets/framework/net/cocos-transport.ts',import.meta.url),'utf8');
runInNewContext(ts.transpileModule(source,{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2020}}).outputText,
{exports,WebSocket,console:{log:(...args:unknown[])=>logs.push(args)},require:()=>({STARTUP_CONFIG:{debugIO}})});
const transport=new exports.CocosWebSocketTransport();transport.onMessage((s:string)=>received.push(s));transport.connect('ws://test');
const frame='{"route":"agent","rpc":"player_login","data":{"state":0}}';
transport.send(frame);socket.onmessage({data:frame});socket.onmessage({data:'{"com":"@serverheartbeat"}'});
assert.deepEqual(sent,[frame]);assert.equal(received[0],frame);
const frames=logs.filter(args=>String(args[0]).includes('包 '));
assert.equal(frames.length,debugIO?3:0);
if(debugIO){
assert.equal(frames[0][0],'[发包 C→S] agent/player_login');
assert.equal(frames[1][0],'[收包 S→C] agent/player_login');
assert.equal(frames[2][0],'[收包 S→C] @serverheartbeat');
assert.equal(typeof frames[0][2],'object');
}
else assert.equal(logs.length,0);
}
});
test('connection debug logs preserve close evidence and are disabled by debugIO',()=>{
for(const debugIO of [false,true]){
const logs:any[][]=[];let socket:any,opened=0,closed=0;
class WebSocket {
readyState=0;
constructor(readonly url:string){socket=this;}
close(){this.readyState=3;this.onclose({code:1006,reason:'test disconnect',wasClean:false});}
onclose:any;
}
const exports:any={};
const source=readFileSync(new URL('../../YouleNexus/assets/framework/net/cocos-transport.ts',import.meta.url),'utf8');
runInNewContext(ts.transpileModule(source,{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2020}}).outputText,
{exports,WebSocket,console:{log:(...args:any[])=>logs.push(args)},require:()=>({STARTUP_CONFIG:{debugIO}})});
const transport=new exports.CocosWebSocketTransport();
transport.onOpen(()=>opened++);transport.onClose(()=>closed++);transport.connect('ws://test');
socket.readyState=1;socket.onopen();socket.onerror({type:'error'});
assert.equal(opened,1);assert.equal(closed,1);
assert.deepEqual(logs.map(x=>x[0]),debugIO?['[WebSocket] 连接中','[WebSocket] 已连接','[WebSocket] 连接错误','[WebSocket] 已断开']:[]);
if(debugIO){assert.equal(logs[3][1].code,1006);assert.equal(logs[3][1].reason,'test disconnect');assert.equal(logs[3][1].readyState,3);}
}
});