48 lines
2.1 KiB
TypeScript
48 lines
2.1 KiB
TypeScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { encodeOutbound, decodeFrame } from '../../YouleNexus/assets/framework/net/envelope-codec.ts';
|
|
|
|
test('encodeOutbound 产出单层信封字符串', () => {
|
|
const s = encodeOutbound('agent', 'player_login', { openid: 'o' });
|
|
assert.deepEqual(JSON.parse(s), { app: 'youle', route: 'agent', rpc: 'player_login', data: { openid: 'o' } });
|
|
});
|
|
|
|
// 服务器协议为单层:frame 即服务器实发帧(传输层已取 MessageEvent.data)。
|
|
|
|
test('decodeFrame:握手包 @toconcon 识别为 handshake', () => {
|
|
assert.deepEqual(decodeFrame('@toconconXYZ...'), { kind: 'handshake' });
|
|
});
|
|
|
|
test('decodeFrame:心跳包 @serverheartbeat 识别为 heartbeat', () => {
|
|
const frame = JSON.stringify({ com: '@serverheartbeat' });
|
|
assert.deepEqual(decodeFrame(frame), { kind: 'heartbeat' });
|
|
});
|
|
|
|
test('decodeFrame:特殊错误包 webserve-服务器未工作', () => {
|
|
assert.deepEqual(decodeFrame('webserve-服务器未工作'), { kind: 'serverDown' });
|
|
});
|
|
|
|
test('decodeFrame:正常业务包(单层)解出 {route,rpc,data}', () => {
|
|
const inner = { route: 'agent', rpc: 'player_login', data: { state: 0, playerid: 9 } };
|
|
assert.deepEqual(decodeFrame(JSON.stringify(inner)), { kind: 'message', message: inner });
|
|
});
|
|
|
|
test('decodeFrame:带 app 字段的单层业务包(服务器实测格式)', () => {
|
|
const frame = JSON.stringify({ app: 'youle', route: 'agent', rpc: 'kick_server', data: { msg: '检查到新版本' } });
|
|
const r = decodeFrame(frame);
|
|
assert.equal(r.kind, 'message');
|
|
assert.equal(r.kind === 'message' && r.message.rpc, 'kick_server');
|
|
});
|
|
|
|
test('decodeFrame:拒绝把双层 data 信封误当服务器业务包', () => {
|
|
const nested = JSON.stringify({
|
|
data: { route: 'agent', rpc: 'kick_server', data: { msg: '检查到新版本' } },
|
|
});
|
|
assert.deepEqual(decodeFrame(nested), { kind: 'ignore' });
|
|
});
|
|
|
|
test('decodeFrame:无法解析的帧安全忽略', () => {
|
|
assert.deepEqual(decodeFrame('not json'), { kind: 'ignore' });
|
|
assert.deepEqual(decodeFrame(JSON.stringify({ foo: 1 })), { kind: 'ignore' });
|
|
});
|