@pixelhue/event-controller-sdk 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/packages/tcp/ConnectManager.d.ts +66 -0
- package/dist/packages/tcp/ConnectManager.d.ts.map +1 -0
- package/dist/packages/tcp/ConnectManager.js +176 -0
- package/dist/packages/tcp/ConnectManager.js.map +1 -0
- package/dist/packages/tcp/QueueManager.d.ts +41 -0
- package/dist/packages/tcp/QueueManager.d.ts.map +1 -0
- package/dist/packages/tcp/QueueManager.js +102 -0
- package/dist/packages/tcp/QueueManager.js.map +1 -0
- package/dist/packages/tcp/SocketWrapper.d.ts +106 -0
- package/dist/packages/tcp/SocketWrapper.d.ts.map +1 -0
- package/dist/packages/tcp/SocketWrapper.js +281 -0
- package/dist/packages/tcp/SocketWrapper.js.map +1 -0
- package/dist/packages/tcp/constants.d.ts +25 -0
- package/dist/packages/tcp/constants.d.ts.map +1 -0
- package/dist/packages/tcp/constants.js +27 -0
- package/dist/packages/tcp/constants.js.map +1 -0
- package/dist/packages/tcp/demo.d.ts +3 -0
- package/dist/packages/tcp/demo.d.ts.map +1 -0
- package/dist/packages/tcp/demo.js +164 -0
- package/dist/packages/tcp/demo.js.map +1 -0
- package/dist/packages/tcp/discoveryService.d.ts +42 -0
- package/dist/packages/tcp/discoveryService.d.ts.map +1 -0
- package/dist/packages/tcp/discoveryService.js +166 -0
- package/dist/packages/tcp/discoveryService.js.map +1 -0
- package/dist/packages/tcp/protocolHandler.d.ts +64 -0
- package/dist/packages/tcp/protocolHandler.d.ts.map +1 -0
- package/dist/packages/tcp/protocolHandler.js +96 -0
- package/dist/packages/tcp/protocolHandler.js.map +1 -0
- package/dist/packages/tcp/tcpWrapper.d.ts +168 -0
- package/dist/packages/tcp/tcpWrapper.d.ts.map +1 -0
- package/dist/packages/tcp/tcpWrapper.js +472 -0
- package/dist/packages/tcp/tcpWrapper.js.map +1 -0
- package/dist/packages/tcp/test-build-parse-debug.d.ts +2 -0
- package/dist/packages/tcp/test-build-parse-debug.d.ts.map +1 -0
- package/dist/packages/tcp/test-build-parse-debug.js +73 -0
- package/dist/packages/tcp/test-build-parse-debug.js.map +1 -0
- package/dist/packages/tcp/test-packet-split.d.ts +43 -0
- package/dist/packages/tcp/test-packet-split.d.ts.map +1 -0
- package/dist/packages/tcp/test-packet-split.js +417 -0
- package/dist/packages/tcp/test-packet-split.js.map +1 -0
- package/dist/packages/tcp/test-protocol-handler.d.ts +6 -0
- package/dist/packages/tcp/test-protocol-handler.d.ts.map +1 -0
- package/dist/packages/tcp/test-protocol-handler.js +225 -0
- package/dist/packages/tcp/test-protocol-handler.js.map +1 -0
- package/dist/packages/tcp/test-server.d.ts +54 -0
- package/dist/packages/tcp/test-server.d.ts.map +1 -0
- package/dist/packages/tcp/test-server.js +412 -0
- package/dist/packages/tcp/test-server.js.map +1 -0
- package/dist/packages/tcp/types.d.ts +232 -0
- package/dist/packages/tcp/types.d.ts.map +1 -0
- package/dist/packages/tcp/types.js +13 -0
- package/dist/packages/tcp/types.js.map +1 -0
- package/dist/packages/tcp/utils.d.ts +14 -0
- package/dist/packages/tcp/utils.d.ts.map +1 -0
- package/dist/packages/tcp/utils.js +47 -0
- package/dist/packages/tcp/utils.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-packet-split.js","sourceRoot":"","sources":["../../../src/packages/tcp/test-packet-split.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * 半包和粘包测试\r\n *\r\n * 测试场景:\r\n * 1. 半包测试:将一个完整的数据包分成多个部分发送\r\n * 2. 粘包测试:将多个完整的数据包合并在一起发送\r\n * 3. 混合场景:半包 + 粘包\r\n *\r\n * 使用方式:\r\n * 1. 先启动测试服务器: npm run test-server\r\n * 2. 运行此测试: npx tsx src/packages/tcp/test-packet-split.ts\r\n */\r\n\r\nimport * as net from 'net';\r\nimport { ProtocolHandler } from './protocolHandler.js';\r\n\r\ninterface TestResult {\r\n\tname: string;\r\n\tpassed: boolean;\r\n\terror?: string;\r\n\treceivedPackets: number;\r\n\texpectedPackets: number;\r\n}\r\n\r\nclass PacketSplitTester {\r\n\tprivate protocolHandler: ProtocolHandler;\r\n\tprivate testResults: TestResult[] = [];\r\n\r\n\tconstructor() {\r\n\t\tthis.protocolHandler = new ProtocolHandler();\r\n\t}\r\n\r\n\t/**\r\n\t * 创建测试数据包\r\n\t */\r\n\tprivate createTestPacket(index: number): Buffer {\r\n\t\tconst data = {\r\n\t\t\tmessage: `Test packet ${index}`,\r\n\t\t\ttimestamp: Date.now(),\r\n\t\t\tindex: index,\r\n\t\t};\r\n\t\tconst header = {\r\n\t\t\tseq: index,\r\n\t\t\tsn: `test-${index}`,\r\n\t\t\tsource: 'test-client',\r\n\t\t};\r\n\t\treturn this.protocolHandler.build(data, header);\r\n\t}\r\n\r\n\t/**\r\n\t * 测试场景1:半包测试 - 将一个完整包分成多段发送\r\n\t */\r\n\tprivate async testHalfPacket(port: number): Promise<TestResult> {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tconst client = new net.Socket();\r\n\t\t\t// 禁用 Nagle 算法,确保小段数据立即发送\r\n\t\t\tclient.setNoDelay(true);\r\n\r\n\t\t\tlet receivedPackets = 0;\r\n\t\t\tconst expectedPackets = 1;\r\n\t\t\tconst testPacket = this.createTestPacket(1);\r\n\t\t\tconst splitPoints = [10, 30, 50, testPacket.length]; // 分段点\r\n\r\n\t\t\tclient.connect(port, '127.0.0.1', () => {\r\n\t\t\t\tconsole.log('📦 [半包测试] 连接成功,开始发送分段数据包...');\r\n\t\t\t\tconsole.log(` 完整包大小: ${testPacket.length} 字节`);\r\n\t\t\t\tconsole.log(` 分段点: ${splitPoints.join(', ')}`);\r\n\r\n\t\t\t\t// 分段发送,每段之间添加延迟\r\n\t\t\t\tlet lastIndex = 0;\r\n\t\t\t\tconst sendNextChunk = (i: number) => {\r\n\t\t\t\t\tif (i >= splitPoints.length) {\r\n\t\t\t\t\t\tconsole.log(` ✅ 所有分段已发送完成`);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst end = splitPoints[i];\r\n\t\t\t\t\tconst chunk = testPacket.slice(lastIndex, end);\r\n\t\t\t\t\tconsole.log(` 发送第 ${i + 1} 段: ${chunk.length} 字节 (${lastIndex}-${end})`);\r\n\r\n\t\t\t\t\t// 使用回调确保数据真正发送后再发送下一段\r\n\t\t\t\t\tclient.write(chunk, (err) => {\r\n\t\t\t\t\t\tif (err) {\r\n\t\t\t\t\t\t\tconsole.error(` ❌ 发送第 ${i + 1} 段失败:`, err.message);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tlastIndex = end;\r\n\r\n\t\t\t\t\t// 每段之间延迟,模拟网络延迟\r\n\t\t\t\t\tif (i < splitPoints.length - 1) {\r\n\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\tsendNextChunk(i + 1);\r\n\t\t\t\t\t\t}, 100); // 增加到 100ms 延迟,确保分段真正分开\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tconsole.log(` ✅ 所有分段已发送完成`);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// 开始发送第一段\r\n\t\t\t\tsendNextChunk(0);\r\n\t\t\t});\r\n\r\n\t\t\tconst receiveBuffer: Buffer[] = [];\r\n\t\t\tclient.on('data', (data: Buffer) => {\r\n\t\t\t\tconsole.log(` 📥 接收到原始数据: ${data.length} 字节`);\r\n\t\t\t\treceiveBuffer.push(data);\r\n\t\t\t\tconst fullBuffer = Buffer.concat(receiveBuffer);\r\n\t\t\t\tconsole.log(` 📦 当前缓冲区大小: ${fullBuffer.length} 字节`);\r\n\r\n\t\t\t\t// 尝试提取完整包\r\n\t\t\t\tconst { packets, remaining } = this.protocolHandler.extractAllCompletePackets(fullBuffer);\r\n\r\n\t\t\t\tif (packets.length > 0) {\r\n\t\t\t\t\treceivedPackets += packets.length;\r\n\t\t\t\t\tconsole.log(` ✅ 接收到 ${packets.length} 个完整包`);\r\n\r\n\t\t\t\t\t// 验证数据\r\n\t\t\t\t\tfor (const packet of packets) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tconst parseResult = this.protocolHandler.parse(packet);\r\n\t\t\t\t\t\t\tconsole.log(` ✅ 解析成功: ${JSON.stringify(parseResult.data)}`);\r\n\t\t\t\t\t\t} catch (error) {\r\n\t\t\t\t\t\t\tconsole.error(` ❌ 解析失败:`, error);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.log(` ⏳ 缓冲区中暂无完整包,剩余: ${remaining?.length || 0} 字节`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 更新接收缓冲区\r\n\t\t\t\treceiveBuffer.length = 0;\r\n\t\t\t\tif (remaining) {\r\n\t\t\t\t\treceiveBuffer.push(remaining);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tclient.on('error', (error) => {\r\n\t\t\t\tconsole.error(` ❌ 连接错误:`, error.message);\r\n\t\t\t\tresolve({\r\n\t\t\t\t\tname: '半包测试',\r\n\t\t\t\t\tpassed: false,\r\n\t\t\t\t\terror: error.message,\r\n\t\t\t\t\treceivedPackets: 0,\r\n\t\t\t\t\texpectedPackets,\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\t// 等待接收完成(增加等待时间,因为分段发送需要时间)\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tclient.destroy();\r\n\t\t\t\tconst passed = receivedPackets === expectedPackets;\r\n\t\t\t\tconsole.log(\r\n\t\t\t\t\t` ${passed ? '✅' : '❌'} 测试结果: 期望 ${expectedPackets} 个包,实际收到 ${receivedPackets} 个包\\n`\r\n\t\t\t\t);\r\n\t\t\t\tresolve({\r\n\t\t\t\t\tname: '半包测试',\r\n\t\t\t\t\tpassed,\r\n\t\t\t\t\treceivedPackets,\r\n\t\t\t\t\texpectedPackets,\r\n\t\t\t\t});\r\n\t\t\t}, 3000); // 增加到 3 秒,给分段发送和服务器响应更多时间\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * 测试场景2:粘包测试 - 将多个完整包合并发送\r\n\t */\r\n\tprivate async testStickyPacket(port: number): Promise<TestResult> {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tconst client = new net.Socket();\r\n\t\t\tlet receivedPackets = 0;\r\n\t\t\tconst expectedPackets = 3;\r\n\r\n\t\t\t// 创建3个测试包\r\n\t\t\tconst packets: Buffer[] = [];\r\n\t\t\tfor (let i = 1; i <= expectedPackets; i++) {\r\n\t\t\t\tpackets.push(this.createTestPacket(i));\r\n\t\t\t}\r\n\r\n\t\t\t// 合并所有包\r\n\t\t\tconst combinedPacket = Buffer.concat(packets);\r\n\t\t\tconsole.log(`📦 [粘包测试] 连接成功,发送 ${expectedPackets} 个合并的数据包...`);\r\n\t\t\tconsole.log(` 合并包总大小: ${combinedPacket.length} 字节`);\r\n\t\t\tconsole.log(` 单个包大小: ${packets.map((p) => p.length).join(', ')} 字节`);\r\n\r\n\t\t\tclient.connect(port, '127.0.0.1', () => {\r\n\t\t\t\t// 一次性发送所有包\r\n\t\t\t\tclient.write(combinedPacket);\r\n\t\t\t\tconsole.log(` ✅ 已发送合并包`);\r\n\t\t\t});\r\n\r\n\t\t\tconst receiveBuffer: Buffer[] = [];\r\n\t\t\tclient.on('data', (data: Buffer) => {\r\n\t\t\t\treceiveBuffer.push(data);\r\n\t\t\t\tconst fullBuffer = Buffer.concat(receiveBuffer);\r\n\r\n\t\t\t\t// 提取所有完整包\r\n\t\t\t\tconst { packets: extractedPackets, remaining } = this.protocolHandler.extractAllCompletePackets(fullBuffer);\r\n\r\n\t\t\t\tif (extractedPackets.length > 0) {\r\n\t\t\t\t\treceivedPackets += extractedPackets.length;\r\n\t\t\t\t\tconsole.log(` ✅ 接收到 ${extractedPackets.length} 个完整包 (累计: ${receivedPackets})`);\r\n\r\n\t\t\t\t\t// 验证每个包\r\n\t\t\t\t\tfor (const packet of extractedPackets) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tconst parseResult = this.protocolHandler.parse(packet);\r\n\t\t\t\t\t\t\tconsole.log(` - 包 ${parseResult.requestId}: ${JSON.stringify(parseResult.data)}`);\r\n\t\t\t\t\t\t} catch (error) {\r\n\t\t\t\t\t\t\tconsole.error(` - ❌ 解析失败:`, error);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 更新接收缓冲区\r\n\t\t\t\treceiveBuffer.length = 0;\r\n\t\t\t\tif (remaining) {\r\n\t\t\t\t\treceiveBuffer.push(remaining);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tclient.on('error', (error) => {\r\n\t\t\t\tconsole.error(` ❌ 连接错误:`, error.message);\r\n\t\t\t\tresolve({\r\n\t\t\t\t\tname: '粘包测试',\r\n\t\t\t\t\tpassed: false,\r\n\t\t\t\t\terror: error.message,\r\n\t\t\t\t\treceivedPackets: 0,\r\n\t\t\t\t\texpectedPackets,\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\t// 等待接收完成\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tclient.destroy();\r\n\t\t\t\tconst passed = receivedPackets === expectedPackets;\r\n\t\t\t\tconsole.log(\r\n\t\t\t\t\t` ${passed ? '✅' : '❌'} 测试结果: 期望 ${expectedPackets} 个包,实际收到 ${receivedPackets} 个包\\n`\r\n\t\t\t\t);\r\n\t\t\t\tresolve({\r\n\t\t\t\t\tname: '粘包测试',\r\n\t\t\t\t\tpassed,\r\n\t\t\t\t\treceivedPackets,\r\n\t\t\t\t\texpectedPackets,\r\n\t\t\t\t});\r\n\t\t\t}, 2000);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * 测试场景3:混合场景 - 半包 + 粘包\r\n\t */\r\n\tprivate async testMixedPacket(port: number): Promise<TestResult> {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tconst client = new net.Socket();\r\n\t\t\tlet receivedPackets = 0;\r\n\t\t\tconst expectedPackets = 3;\r\n\r\n\t\t\t// 创建3个测试包\r\n\t\t\tconst packets: Buffer[] = [];\r\n\t\t\tfor (let i = 1; i <= expectedPackets; i++) {\r\n\t\t\t\tpackets.push(this.createTestPacket(i));\r\n\t\t\t}\r\n\r\n\t\t\t// 第一个包:分成两段发送(半包)\r\n\t\t\t// 第二、三个包:合并发送(粘包)\r\n\t\t\tconst firstPacket = packets[0];\r\n\t\t\tconst firstHalf = firstPacket.slice(0, Math.floor(firstPacket.length / 2));\r\n\t\t\tconst secondHalf = firstPacket.slice(Math.floor(firstPacket.length / 2));\r\n\t\t\tconst remainingPackets = Buffer.concat(packets.slice(1));\r\n\r\n\t\t\tconsole.log(`📦 [混合场景测试] 连接成功,发送混合数据包...`);\r\n\t\t\tconsole.log(` 第1个包: 分成两段发送 (${firstHalf.length} + ${secondHalf.length} 字节)`);\r\n\t\t\tconsole.log(` 第2-3个包: 合并发送 (${remainingPackets.length} 字节)`);\r\n\r\n\t\t\tclient.connect(port, '127.0.0.1', () => {\r\n\t\t\t\t// 先发送第一个包的前半段\r\n\t\t\t\tclient.write(firstHalf);\r\n\t\t\t\tconsole.log(` ✅ 发送第1个包的前半段: ${firstHalf.length} 字节`);\r\n\r\n\t\t\t\t// 延迟后发送第一个包的后半段 + 其他包\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tconst combined = Buffer.concat([secondHalf, remainingPackets]);\r\n\t\t\t\t\tclient.write(combined);\r\n\t\t\t\t\tconsole.log(` ✅ 发送第1个包的后半段 + 第2-3个包: ${combined.length} 字节`);\r\n\t\t\t\t}, 50);\r\n\t\t\t});\r\n\r\n\t\t\tconst receiveBuffer: Buffer[] = [];\r\n\t\t\tclient.on('data', (data: Buffer) => {\r\n\t\t\t\treceiveBuffer.push(data);\r\n\t\t\t\tconst fullBuffer = Buffer.concat(receiveBuffer);\r\n\r\n\t\t\t\t// 提取所有完整包\r\n\t\t\t\tconst { packets: extractedPackets, remaining } = this.protocolHandler.extractAllCompletePackets(fullBuffer);\r\n\r\n\t\t\t\tif (extractedPackets.length > 0) {\r\n\t\t\t\t\treceivedPackets += extractedPackets.length;\r\n\t\t\t\t\tconsole.log(` ✅ 接收到 ${extractedPackets.length} 个完整包 (累计: ${receivedPackets})`);\r\n\r\n\t\t\t\t\t// 验证每个包\r\n\t\t\t\t\tfor (const packet of extractedPackets) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tconst parseResult = this.protocolHandler.parse(packet);\r\n\t\t\t\t\t\t\tconsole.log(` - 包 ${parseResult.requestId}: ${JSON.stringify(parseResult.data)}`);\r\n\t\t\t\t\t\t} catch (error) {\r\n\t\t\t\t\t\t\tconsole.error(` - ❌ 解析失败:`, error);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 更新接收缓冲区\r\n\t\t\t\treceiveBuffer.length = 0;\r\n\t\t\t\tif (remaining) {\r\n\t\t\t\t\treceiveBuffer.push(remaining);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tclient.on('error', (error) => {\r\n\t\t\t\tconsole.error(` ❌ 连接错误:`, error.message);\r\n\t\t\t\tresolve({\r\n\t\t\t\t\tname: '混合场景测试',\r\n\t\t\t\t\tpassed: false,\r\n\t\t\t\t\terror: error.message,\r\n\t\t\t\t\treceivedPackets: 0,\r\n\t\t\t\t\texpectedPackets,\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\t// 等待接收完成\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tclient.destroy();\r\n\t\t\t\tconst passed = receivedPackets === expectedPackets;\r\n\t\t\t\tconsole.log(\r\n\t\t\t\t\t` ${passed ? '✅' : '❌'} 测试结果: 期望 ${expectedPackets} 个包,实际收到 ${receivedPackets} 个包\\n`\r\n\t\t\t\t);\r\n\t\t\t\tresolve({\r\n\t\t\t\t\tname: '混合场景测试',\r\n\t\t\t\t\tpassed,\r\n\t\t\t\t\treceivedPackets,\r\n\t\t\t\t\texpectedPackets,\r\n\t\t\t\t});\r\n\t\t\t}, 3000);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * 测试场景4:大量粘包测试\r\n\t */\r\n\tprivate async testManyStickyPackets(port: number): Promise<TestResult> {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tconst client = new net.Socket();\r\n\t\t\tlet receivedPackets = 0;\r\n\t\t\tconst expectedPackets = 10;\r\n\r\n\t\t\t// 创建10个测试包\r\n\t\t\tconst packets: Buffer[] = [];\r\n\t\t\tfor (let i = 1; i <= expectedPackets; i++) {\r\n\t\t\t\tpackets.push(this.createTestPacket(i));\r\n\t\t\t}\r\n\r\n\t\t\t// 合并所有包\r\n\t\t\tconst combinedPacket = Buffer.concat(packets);\r\n\t\t\tconsole.log(`📦 [大量粘包测试] 连接成功,发送 ${expectedPackets} 个合并的数据包...`);\r\n\t\t\tconsole.log(` 合并包总大小: ${combinedPacket.length} 字节`);\r\n\r\n\t\t\tclient.connect(port, '127.0.0.1', () => {\r\n\t\t\t\tclient.write(combinedPacket);\r\n\t\t\t\tconsole.log(` ✅ 已发送合并包`);\r\n\t\t\t});\r\n\r\n\t\t\tconst receiveBuffer: Buffer[] = [];\r\n\t\t\tclient.on('data', (data: Buffer) => {\r\n\t\t\t\treceiveBuffer.push(data);\r\n\t\t\t\tconst fullBuffer = Buffer.concat(receiveBuffer);\r\n\r\n\t\t\t\t// 提取所有完整包\r\n\t\t\t\tconst { packets: extractedPackets, remaining } = this.protocolHandler.extractAllCompletePackets(fullBuffer);\r\n\r\n\t\t\t\tif (extractedPackets.length > 0) {\r\n\t\t\t\t\treceivedPackets += extractedPackets.length;\r\n\t\t\t\t\tconsole.log(` ✅ 接收到 ${extractedPackets.length} 个完整包 (累计: ${receivedPackets}/${expectedPackets})`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 更新接收缓冲区\r\n\t\t\t\treceiveBuffer.length = 0;\r\n\t\t\t\tif (remaining) {\r\n\t\t\t\t\treceiveBuffer.push(remaining);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tclient.on('error', (error) => {\r\n\t\t\t\tconsole.error(` ❌ 连接错误:`, error.message);\r\n\t\t\t\tresolve({\r\n\t\t\t\t\tname: '大量粘包测试',\r\n\t\t\t\t\tpassed: false,\r\n\t\t\t\t\terror: error.message,\r\n\t\t\t\t\treceivedPackets: 0,\r\n\t\t\t\t\texpectedPackets,\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\t// 等待接收完成\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tclient.destroy();\r\n\t\t\t\tconst passed = receivedPackets === expectedPackets;\r\n\t\t\t\tconsole.log(\r\n\t\t\t\t\t` ${passed ? '✅' : '❌'} 测试结果: 期望 ${expectedPackets} 个包,实际收到 ${receivedPackets} 个包\\n`\r\n\t\t\t\t);\r\n\t\t\t\tresolve({\r\n\t\t\t\t\tname: '大量粘包测试',\r\n\t\t\t\t\tpassed,\r\n\t\t\t\t\treceivedPackets,\r\n\t\t\t\t\texpectedPackets,\r\n\t\t\t\t});\r\n\t\t\t}, 3000);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * 运行所有测试\r\n\t */\r\n\tasync runAllTests(port: number = 8080): Promise<void> {\r\n\t\tconsole.log('🚀 开始半包和粘包测试\\n');\r\n\t\tconsole.log('='.repeat(60));\r\n\t\tconsole.log('');\r\n\r\n\t\t// 测试1:半包\r\n\t\tconst result1 = await this.testHalfPacket(port);\r\n\t\tthis.testResults.push(result1);\r\n\t\tawait new Promise((resolve) => setTimeout(resolve, 500));\r\n\r\n\t\t// 测试2:粘包\r\n\t\tconst result2 = await this.testStickyPacket(port);\r\n\t\tthis.testResults.push(result2);\r\n\t\tawait new Promise((resolve) => setTimeout(resolve, 500));\r\n\r\n\t\t// 测试3:混合场景\r\n\t\tconst result3 = await this.testMixedPacket(port);\r\n\t\tthis.testResults.push(result3);\r\n\t\tawait new Promise((resolve) => setTimeout(resolve, 500));\r\n\r\n\t\t// 测试4:大量粘包\r\n\t\tconst result4 = await this.testManyStickyPackets(port);\r\n\t\tthis.testResults.push(result4);\r\n\r\n\t\t// 打印测试总结\r\n\t\tconsole.log('='.repeat(60));\r\n\t\tconsole.log('📊 测试总结\\n');\r\n\r\n\t\tlet passedCount = 0;\r\n\t\tfor (const result of this.testResults) {\r\n\t\t\tconst status = result.passed ? '✅ 通过' : '❌ 失败';\r\n\t\t\tconsole.log(`${status} - ${result.name}`);\r\n\t\t\tconsole.log(` 期望: ${result.expectedPackets} 个包, 实际: ${result.receivedPackets} 个包`);\r\n\t\t\tif (result.error) {\r\n\t\t\t\tconsole.log(` 错误: ${result.error}`);\r\n\t\t\t}\r\n\t\t\tconsole.log('');\r\n\t\t\tif (result.passed) passedCount++;\r\n\t\t}\r\n\r\n\t\tconsole.log('='.repeat(60));\r\n\t\tconsole.log(`总计: ${passedCount}/${this.testResults.length} 个测试通过\\n`);\r\n\r\n\t\tif (passedCount === this.testResults.length) {\r\n\t\t\tconsole.log('🎉 所有测试通过!');\r\n\t\t} else {\r\n\t\t\tconsole.log('⚠️ 部分测试失败,请检查协议处理逻辑');\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// 主函数\r\nasync function main() {\r\n\tconst port = parseInt(process.env.PORT || '8080', 10);\r\n\tconst tester = new PacketSplitTester();\r\n\tawait tester.runAllTests(port);\r\n}\r\n\r\n// 如果直接运行此文件,执行测试\r\nif (\r\n\timport.meta.url === `file://${process.argv[1]?.replace(/\\\\/g, '/')}` ||\r\n\tprocess.argv[1]?.includes('test-packet-split.ts')\r\n) {\r\n\tmain().catch((error) => {\r\n\t\tconsole.error('测试执行错误:', error);\r\n\t\tprocess.exit(1);\r\n\t});\r\n}\r\n\r\nexport { PacketSplitTester };\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-protocol-handler.d.ts","sourceRoot":"","sources":["../../../src/packages/tcp/test-protocol-handler.ts"],"names":[],"mappings":"AAUA;;GAEG;AACH,iBAAS,gBAAgB,SAqOxB;AAKD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
// ALL_CODE_LINE: 145
|
|
2
|
+
// AI_CODE_LINE: 145
|
|
3
|
+
/**
|
|
4
|
+
* ProtocolHandler 编解码测试
|
|
5
|
+
* 测试 build 和 parse 方法的正确性,并展示 parse 返回的数据格式
|
|
6
|
+
*/
|
|
7
|
+
import { ProtocolHandler } from './protocolHandler.js';
|
|
8
|
+
/**
|
|
9
|
+
* 测试编解码功能
|
|
10
|
+
*/
|
|
11
|
+
function testEncodeDecode() {
|
|
12
|
+
console.log('='.repeat(80));
|
|
13
|
+
console.log('ProtocolHandler 编解码测试');
|
|
14
|
+
console.log('='.repeat(80));
|
|
15
|
+
console.log('');
|
|
16
|
+
const handler = new ProtocolHandler();
|
|
17
|
+
// 测试用例1: 简单的按键事件数据
|
|
18
|
+
console.log('📦 测试用例 1: 按键事件数据');
|
|
19
|
+
const testData1 = {
|
|
20
|
+
type: 0, // 0 = 按下, 1 = 释放
|
|
21
|
+
row: 2,
|
|
22
|
+
column: 3,
|
|
23
|
+
page: 0,
|
|
24
|
+
};
|
|
25
|
+
const testHeader1 = {
|
|
26
|
+
seq: 1,
|
|
27
|
+
sn: 'TEST001',
|
|
28
|
+
source: 'device',
|
|
29
|
+
};
|
|
30
|
+
try {
|
|
31
|
+
// 编码
|
|
32
|
+
const encoded1 = handler.build(testData1, testHeader1);
|
|
33
|
+
console.log(`✅ 编码成功: ${encoded1.length} 字节`);
|
|
34
|
+
console.log(` 原始数据:`, JSON.stringify(testData1, null, 2));
|
|
35
|
+
console.log(` 头部数据:`, JSON.stringify(testHeader1, null, 2));
|
|
36
|
+
console.log(` Hex (前64字节): ${encoded1.toString('hex').substring(0, 128)}...`);
|
|
37
|
+
// 解码
|
|
38
|
+
const decoded1 = handler.parse(encoded1);
|
|
39
|
+
console.log(`✅ 解码成功`);
|
|
40
|
+
console.log(` 解码结果:`, JSON.stringify(decoded1, null, 2));
|
|
41
|
+
console.log('');
|
|
42
|
+
// 验证数据一致性
|
|
43
|
+
const dataMatch = JSON.stringify(decoded1.data) === JSON.stringify(testData1);
|
|
44
|
+
const headerMatch = JSON.stringify(decoded1.header) === JSON.stringify(testHeader1);
|
|
45
|
+
console.log(` 🔍 数据一致性检查:`);
|
|
46
|
+
console.log(` - data 匹配: ${dataMatch ? '✅' : '❌'}`);
|
|
47
|
+
console.log(` - header 匹配: ${headerMatch ? '✅' : '❌'}`);
|
|
48
|
+
if (!dataMatch) {
|
|
49
|
+
console.log(` - 原始 data:`, JSON.stringify(testData1));
|
|
50
|
+
console.log(` - 解码 data:`, JSON.stringify(decoded1.data));
|
|
51
|
+
}
|
|
52
|
+
if (!headerMatch) {
|
|
53
|
+
console.log(` - 原始 header:`, JSON.stringify(testHeader1));
|
|
54
|
+
console.log(` - 解码 header:`, JSON.stringify(decoded1.header));
|
|
55
|
+
}
|
|
56
|
+
console.log('');
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error(`❌ 测试失败:`, error);
|
|
60
|
+
console.log('');
|
|
61
|
+
}
|
|
62
|
+
// 测试用例2: 图片数据(base64)
|
|
63
|
+
console.log('📦 测试用例 2: 图片数据(base64)');
|
|
64
|
+
const testData2 = {
|
|
65
|
+
page: 0,
|
|
66
|
+
column: 1,
|
|
67
|
+
row: 2,
|
|
68
|
+
png: true,
|
|
69
|
+
data: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==',
|
|
70
|
+
};
|
|
71
|
+
const testHeader2 = {
|
|
72
|
+
seq: 2,
|
|
73
|
+
sn: 'TEST002',
|
|
74
|
+
source: 'companion',
|
|
75
|
+
};
|
|
76
|
+
try {
|
|
77
|
+
// 编码
|
|
78
|
+
const encoded2 = handler.build(testData2, testHeader2);
|
|
79
|
+
console.log(`✅ 编码成功: ${encoded2.length} 字节`);
|
|
80
|
+
console.log(` 原始数据大小: ${JSON.stringify(testData2).length} 字符`);
|
|
81
|
+
console.log(` Hex (前64字节): ${encoded2.toString('hex').substring(0, 128)}...`);
|
|
82
|
+
// 解码
|
|
83
|
+
const decoded2 = handler.parse(encoded2);
|
|
84
|
+
console.log(`✅ 解码成功`);
|
|
85
|
+
console.log(` 解码结果:`, JSON.stringify(decoded2, null, 2));
|
|
86
|
+
console.log('');
|
|
87
|
+
// 验证数据一致性(只检查关键字段,因为 base64 可能略有不同)
|
|
88
|
+
const dataKeysMatch = decoded2.data.page === testData2.page &&
|
|
89
|
+
decoded2.data.column === testData2.column &&
|
|
90
|
+
decoded2.data.row === testData2.row &&
|
|
91
|
+
decoded2.data.png === testData2.png &&
|
|
92
|
+
decoded2.data.data?.startsWith('data:image/png;base64,');
|
|
93
|
+
console.log(` 🔍 数据一致性检查:`);
|
|
94
|
+
console.log(` - 关键字段匹配: ${dataKeysMatch ? '✅' : '❌'}`);
|
|
95
|
+
console.log('');
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error(`❌ 测试失败:`, error);
|
|
99
|
+
console.log('');
|
|
100
|
+
}
|
|
101
|
+
// 测试用例3: 复杂嵌套对象
|
|
102
|
+
console.log('📦 测试用例 3: 复杂嵌套对象');
|
|
103
|
+
const testData3 = {
|
|
104
|
+
action: 'setConfig',
|
|
105
|
+
config: {
|
|
106
|
+
brightness: 80,
|
|
107
|
+
rotation: 90,
|
|
108
|
+
settings: {
|
|
109
|
+
timeout: 5000,
|
|
110
|
+
retry: 3,
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
timestamp: Date.now(),
|
|
114
|
+
};
|
|
115
|
+
const testHeader3 = {
|
|
116
|
+
seq: 3,
|
|
117
|
+
sn: 'TEST003',
|
|
118
|
+
source: 'api',
|
|
119
|
+
};
|
|
120
|
+
try {
|
|
121
|
+
// 编码
|
|
122
|
+
const encoded3 = handler.build(testData3, testHeader3);
|
|
123
|
+
console.log(`✅ 编码成功: ${encoded3.length} 字节`);
|
|
124
|
+
console.log(` 原始数据:`, JSON.stringify(testData3, null, 2));
|
|
125
|
+
// 解码
|
|
126
|
+
const decoded3 = handler.parse(encoded3);
|
|
127
|
+
console.log(`✅ 解码成功`);
|
|
128
|
+
console.log(` 解码结果:`, JSON.stringify(decoded3, null, 2));
|
|
129
|
+
console.log('');
|
|
130
|
+
// 验证数据一致性
|
|
131
|
+
const dataMatch3 = JSON.stringify(decoded3.data) === JSON.stringify(testData3);
|
|
132
|
+
const headerMatch3 = JSON.stringify(decoded3.header) === JSON.stringify(testHeader3);
|
|
133
|
+
console.log(` 🔍 数据一致性检查:`);
|
|
134
|
+
console.log(` - data 匹配: ${dataMatch3 ? '✅' : '❌'}`);
|
|
135
|
+
console.log(` - header 匹配: ${headerMatch3 ? '✅' : '❌'}`);
|
|
136
|
+
console.log('');
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.error(`❌ 测试失败:`, error);
|
|
140
|
+
console.log('');
|
|
141
|
+
}
|
|
142
|
+
// 展示 parse 方法返回的数据格式
|
|
143
|
+
console.log('='.repeat(80));
|
|
144
|
+
console.log('📋 parse 方法返回的数据格式说明');
|
|
145
|
+
console.log('='.repeat(80));
|
|
146
|
+
console.log('');
|
|
147
|
+
console.log('ProtocolParseResult 接口定义:');
|
|
148
|
+
console.log('{');
|
|
149
|
+
console.log(' data: any; // TLV2 的业务数据(通常是 JSON 对象)');
|
|
150
|
+
console.log(' header: any; // TLV1 的头部数据(通常是 JSON 对象)');
|
|
151
|
+
console.log(' requestId: number; // 请求ID(seqId,3字节)');
|
|
152
|
+
console.log(' isResponse: boolean; // 是否为响应包');
|
|
153
|
+
console.log('}');
|
|
154
|
+
console.log('');
|
|
155
|
+
console.log('示例返回数据:');
|
|
156
|
+
const exampleData = {
|
|
157
|
+
type: 0,
|
|
158
|
+
row: 2,
|
|
159
|
+
column: 3,
|
|
160
|
+
page: 0,
|
|
161
|
+
};
|
|
162
|
+
const exampleHeader = {
|
|
163
|
+
seq: 1,
|
|
164
|
+
sn: 'TEST001',
|
|
165
|
+
source: 'device',
|
|
166
|
+
};
|
|
167
|
+
const exampleEncoded = handler.build(exampleData, exampleHeader);
|
|
168
|
+
const exampleDecoded = handler.parse(exampleEncoded);
|
|
169
|
+
console.log(JSON.stringify(exampleDecoded, null, 2));
|
|
170
|
+
console.log('');
|
|
171
|
+
console.log('字段说明:');
|
|
172
|
+
console.log(' - data: 业务数据,从 TLV2 中解析出的 JSON 对象');
|
|
173
|
+
console.log(' - header: 头部数据,从 TLV1 中解析出的 JSON 对象');
|
|
174
|
+
console.log(' - requestId: 请求序列ID,用于匹配请求和响应');
|
|
175
|
+
console.log(' - isResponse: 标识该数据包是请求(false)还是响应(true)');
|
|
176
|
+
console.log('');
|
|
177
|
+
// 测试用例4: 多次编解码循环测试
|
|
178
|
+
console.log('='.repeat(80));
|
|
179
|
+
console.log('📦 测试用例 4: 多次编解码循环测试(验证稳定性)');
|
|
180
|
+
console.log('='.repeat(80));
|
|
181
|
+
const testData4 = {
|
|
182
|
+
message: 'Hello Protocol Handler',
|
|
183
|
+
count: 42,
|
|
184
|
+
};
|
|
185
|
+
const testHeader4 = {
|
|
186
|
+
seq: 4,
|
|
187
|
+
sn: 'TEST004',
|
|
188
|
+
source: 'test',
|
|
189
|
+
};
|
|
190
|
+
let currentData = testData4;
|
|
191
|
+
let currentHeader = testHeader4;
|
|
192
|
+
let successCount = 0;
|
|
193
|
+
const iterations = 5;
|
|
194
|
+
for (let i = 0; i < iterations; i++) {
|
|
195
|
+
try {
|
|
196
|
+
const encoded = handler.build(currentData, currentHeader);
|
|
197
|
+
const decoded = handler.parse(encoded);
|
|
198
|
+
const dataMatch = JSON.stringify(decoded.data) === JSON.stringify(currentData);
|
|
199
|
+
const headerMatch = JSON.stringify(decoded.header) === JSON.stringify(currentHeader);
|
|
200
|
+
if (dataMatch && headerMatch) {
|
|
201
|
+
successCount++;
|
|
202
|
+
currentData = decoded.data;
|
|
203
|
+
currentHeader = decoded.header;
|
|
204
|
+
console.log(` 第 ${i + 1} 次循环: ✅ 成功`);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
console.log(` 第 ${i + 1} 次循环: ❌ 数据不匹配`);
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
console.log(` 第 ${i + 1} 次循环: ❌ 错误:`, error);
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
console.log(` 总成功次数: ${successCount}/${iterations}`);
|
|
217
|
+
console.log('');
|
|
218
|
+
console.log('='.repeat(80));
|
|
219
|
+
console.log('✅ 测试完成');
|
|
220
|
+
console.log('='.repeat(80));
|
|
221
|
+
}
|
|
222
|
+
// 运行测试
|
|
223
|
+
testEncodeDecode();
|
|
224
|
+
export { testEncodeDecode };
|
|
225
|
+
//# sourceMappingURL=test-protocol-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-protocol-handler.js","sourceRoot":"","sources":["../../../src/packages/tcp/test-protocol-handler.ts"],"names":[],"mappings":"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","sourcesContent":["// ALL_CODE_LINE: 145\r\n// AI_CODE_LINE: 145\r\n\r\n/**\r\n * ProtocolHandler 编解码测试\r\n * 测试 build 和 parse 方法的正确性,并展示 parse 返回的数据格式\r\n */\r\n\r\nimport { ProtocolHandler } from './protocolHandler.js';\r\n\r\n/**\r\n * 测试编解码功能\r\n */\r\nfunction testEncodeDecode() {\r\n\tconsole.log('='.repeat(80));\r\n\tconsole.log('ProtocolHandler 编解码测试');\r\n\tconsole.log('='.repeat(80));\r\n\tconsole.log('');\r\n\r\n\tconst handler = new ProtocolHandler();\r\n\r\n\t// 测试用例1: 简单的按键事件数据\r\n\tconsole.log('📦 测试用例 1: 按键事件数据');\r\n\tconst testData1 = {\r\n\t\ttype: 0, // 0 = 按下, 1 = 释放\r\n\t\trow: 2,\r\n\t\tcolumn: 3,\r\n\t\tpage: 0,\r\n\t};\r\n\r\n\tconst testHeader1 = {\r\n\t\tseq: 1,\r\n\t\tsn: 'TEST001',\r\n\t\tsource: 'device',\r\n\t};\r\n\r\n\ttry {\r\n\t\t// 编码\r\n\t\tconst encoded1 = handler.build(testData1, testHeader1);\r\n\t\tconsole.log(`✅ 编码成功: ${encoded1.length} 字节`);\r\n\t\tconsole.log(` 原始数据:`, JSON.stringify(testData1, null, 2));\r\n\t\tconsole.log(` 头部数据:`, JSON.stringify(testHeader1, null, 2));\r\n\t\tconsole.log(` Hex (前64字节): ${encoded1.toString('hex').substring(0, 128)}...`);\r\n\r\n\t\t// 解码\r\n\t\tconst decoded1 = handler.parse(encoded1);\r\n\t\tconsole.log(`✅ 解码成功`);\r\n\t\tconsole.log(` 解码结果:`, JSON.stringify(decoded1, null, 2));\r\n\t\tconsole.log('');\r\n\r\n\t\t// 验证数据一致性\r\n\t\tconst dataMatch = JSON.stringify(decoded1.data) === JSON.stringify(testData1);\r\n\t\tconst headerMatch = JSON.stringify(decoded1.header) === JSON.stringify(testHeader1);\r\n\t\tconsole.log(` 🔍 数据一致性检查:`);\r\n\t\tconsole.log(` - data 匹配: ${dataMatch ? '✅' : '❌'}`);\r\n\t\tconsole.log(` - header 匹配: ${headerMatch ? '✅' : '❌'}`);\r\n\t\tif (!dataMatch) {\r\n\t\t\tconsole.log(` - 原始 data:`, JSON.stringify(testData1));\r\n\t\t\tconsole.log(` - 解码 data:`, JSON.stringify(decoded1.data));\r\n\t\t}\r\n\t\tif (!headerMatch) {\r\n\t\t\tconsole.log(` - 原始 header:`, JSON.stringify(testHeader1));\r\n\t\t\tconsole.log(` - 解码 header:`, JSON.stringify(decoded1.header));\r\n\t\t}\r\n\t\tconsole.log('');\r\n\t} catch (error) {\r\n\t\tconsole.error(`❌ 测试失败:`, error);\r\n\t\tconsole.log('');\r\n\t}\r\n\r\n\t// 测试用例2: 图片数据(base64)\r\n\tconsole.log('📦 测试用例 2: 图片数据(base64)');\r\n\tconst testData2 = {\r\n\t\tpage: 0,\r\n\t\tcolumn: 1,\r\n\t\trow: 2,\r\n\t\tpng: true,\r\n\t\tdata: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==',\r\n\t};\r\n\r\n\tconst testHeader2 = {\r\n\t\tseq: 2,\r\n\t\tsn: 'TEST002',\r\n\t\tsource: 'companion',\r\n\t};\r\n\r\n\ttry {\r\n\t\t// 编码\r\n\t\tconst encoded2 = handler.build(testData2, testHeader2);\r\n\t\tconsole.log(`✅ 编码成功: ${encoded2.length} 字节`);\r\n\t\tconsole.log(` 原始数据大小: ${JSON.stringify(testData2).length} 字符`);\r\n\t\tconsole.log(` Hex (前64字节): ${encoded2.toString('hex').substring(0, 128)}...`);\r\n\r\n\t\t// 解码\r\n\t\tconst decoded2 = handler.parse(encoded2);\r\n\t\tconsole.log(`✅ 解码成功`);\r\n\t\tconsole.log(` 解码结果:`, JSON.stringify(decoded2, null, 2));\r\n\t\tconsole.log('');\r\n\r\n\t\t// 验证数据一致性(只检查关键字段,因为 base64 可能略有不同)\r\n\t\tconst dataKeysMatch =\r\n\t\t\tdecoded2.data.page === testData2.page &&\r\n\t\t\tdecoded2.data.column === testData2.column &&\r\n\t\t\tdecoded2.data.row === testData2.row &&\r\n\t\t\tdecoded2.data.png === testData2.png &&\r\n\t\t\tdecoded2.data.data?.startsWith('data:image/png;base64,');\r\n\t\tconsole.log(` 🔍 数据一致性检查:`);\r\n\t\tconsole.log(` - 关键字段匹配: ${dataKeysMatch ? '✅' : '❌'}`);\r\n\t\tconsole.log('');\r\n\t} catch (error) {\r\n\t\tconsole.error(`❌ 测试失败:`, error);\r\n\t\tconsole.log('');\r\n\t}\r\n\r\n\t// 测试用例3: 复杂嵌套对象\r\n\tconsole.log('📦 测试用例 3: 复杂嵌套对象');\r\n\tconst testData3 = {\r\n\t\taction: 'setConfig',\r\n\t\tconfig: {\r\n\t\t\tbrightness: 80,\r\n\t\t\trotation: 90,\r\n\t\t\tsettings: {\r\n\t\t\t\ttimeout: 5000,\r\n\t\t\t\tretry: 3,\r\n\t\t\t},\r\n\t\t},\r\n\t\ttimestamp: Date.now(),\r\n\t};\r\n\r\n\tconst testHeader3 = {\r\n\t\tseq: 3,\r\n\t\tsn: 'TEST003',\r\n\t\tsource: 'api',\r\n\t};\r\n\r\n\ttry {\r\n\t\t// 编码\r\n\t\tconst encoded3 = handler.build(testData3, testHeader3);\r\n\t\tconsole.log(`✅ 编码成功: ${encoded3.length} 字节`);\r\n\t\tconsole.log(` 原始数据:`, JSON.stringify(testData3, null, 2));\r\n\r\n\t\t// 解码\r\n\t\tconst decoded3 = handler.parse(encoded3);\r\n\t\tconsole.log(`✅ 解码成功`);\r\n\t\tconsole.log(` 解码结果:`, JSON.stringify(decoded3, null, 2));\r\n\t\tconsole.log('');\r\n\r\n\t\t// 验证数据一致性\r\n\t\tconst dataMatch3 = JSON.stringify(decoded3.data) === JSON.stringify(testData3);\r\n\t\tconst headerMatch3 = JSON.stringify(decoded3.header) === JSON.stringify(testHeader3);\r\n\t\tconsole.log(` 🔍 数据一致性检查:`);\r\n\t\tconsole.log(` - data 匹配: ${dataMatch3 ? '✅' : '❌'}`);\r\n\t\tconsole.log(` - header 匹配: ${headerMatch3 ? '✅' : '❌'}`);\r\n\t\tconsole.log('');\r\n\t} catch (error) {\r\n\t\tconsole.error(`❌ 测试失败:`, error);\r\n\t\tconsole.log('');\r\n\t}\r\n\r\n\t// 展示 parse 方法返回的数据格式\r\n\tconsole.log('='.repeat(80));\r\n\tconsole.log('📋 parse 方法返回的数据格式说明');\r\n\tconsole.log('='.repeat(80));\r\n\tconsole.log('');\r\n\tconsole.log('ProtocolParseResult 接口定义:');\r\n\tconsole.log('{');\r\n\tconsole.log(' data: any; // TLV2 的业务数据(通常是 JSON 对象)');\r\n\tconsole.log(' header: any; // TLV1 的头部数据(通常是 JSON 对象)');\r\n\tconsole.log(' requestId: number; // 请求ID(seqId,3字节)');\r\n\tconsole.log(' isResponse: boolean; // 是否为响应包');\r\n\tconsole.log('}');\r\n\tconsole.log('');\r\n\tconsole.log('示例返回数据:');\r\n\tconst exampleData = {\r\n\t\ttype: 0,\r\n\t\trow: 2,\r\n\t\tcolumn: 3,\r\n\t\tpage: 0,\r\n\t};\r\n\tconst exampleHeader = {\r\n\t\tseq: 1,\r\n\t\tsn: 'TEST001',\r\n\t\tsource: 'device',\r\n\t};\r\n\tconst exampleEncoded = handler.build(exampleData, exampleHeader);\r\n\tconst exampleDecoded = handler.parse(exampleEncoded);\r\n\tconsole.log(JSON.stringify(exampleDecoded, null, 2));\r\n\tconsole.log('');\r\n\tconsole.log('字段说明:');\r\n\tconsole.log(' - data: 业务数据,从 TLV2 中解析出的 JSON 对象');\r\n\tconsole.log(' - header: 头部数据,从 TLV1 中解析出的 JSON 对象');\r\n\tconsole.log(' - requestId: 请求序列ID,用于匹配请求和响应');\r\n\tconsole.log(' - isResponse: 标识该数据包是请求(false)还是响应(true)');\r\n\tconsole.log('');\r\n\r\n\t// 测试用例4: 多次编解码循环测试\r\n\tconsole.log('='.repeat(80));\r\n\tconsole.log('📦 测试用例 4: 多次编解码循环测试(验证稳定性)');\r\n\tconsole.log('='.repeat(80));\r\n\tconst testData4 = {\r\n\t\tmessage: 'Hello Protocol Handler',\r\n\t\tcount: 42,\r\n\t};\r\n\tconst testHeader4 = {\r\n\t\tseq: 4,\r\n\t\tsn: 'TEST004',\r\n\t\tsource: 'test',\r\n\t};\r\n\r\n\tlet currentData = testData4;\r\n\tlet currentHeader = testHeader4;\r\n\tlet successCount = 0;\r\n\tconst iterations = 5;\r\n\r\n\tfor (let i = 0; i < iterations; i++) {\r\n\t\ttry {\r\n\t\t\tconst encoded = handler.build(currentData, currentHeader);\r\n\t\t\tconst decoded = handler.parse(encoded);\r\n\t\t\tconst dataMatch = JSON.stringify(decoded.data) === JSON.stringify(currentData);\r\n\t\t\tconst headerMatch = JSON.stringify(decoded.header) === JSON.stringify(currentHeader);\r\n\r\n\t\t\tif (dataMatch && headerMatch) {\r\n\t\t\t\tsuccessCount++;\r\n\t\t\t\tcurrentData = decoded.data;\r\n\t\t\t\tcurrentHeader = decoded.header;\r\n\t\t\t\tconsole.log(` 第 ${i + 1} 次循环: ✅ 成功`);\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log(` 第 ${i + 1} 次循环: ❌ 数据不匹配`);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tconsole.log(` 第 ${i + 1} 次循环: ❌ 错误:`, error);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tconsole.log(` 总成功次数: ${successCount}/${iterations}`);\r\n\tconsole.log('');\r\n\r\n\tconsole.log('='.repeat(80));\r\n\tconsole.log('✅ 测试完成');\r\n\tconsole.log('='.repeat(80));\r\n}\r\n\r\n// 运行测试\r\ntestEncodeDecode();\r\n\r\nexport { testEncodeDecode };\r\n"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
declare class TestTCPServer {
|
|
2
|
+
private server;
|
|
3
|
+
private clients;
|
|
4
|
+
private port;
|
|
5
|
+
private host;
|
|
6
|
+
private protocolHandler;
|
|
7
|
+
/** 预设的测试数据包(十六进制) */
|
|
8
|
+
private readonly testDataPacket;
|
|
9
|
+
constructor(port?: number, host?: string);
|
|
10
|
+
/**
|
|
11
|
+
* 处理心跳(ping/pong)
|
|
12
|
+
*/
|
|
13
|
+
private handleHeartbeat;
|
|
14
|
+
/**
|
|
15
|
+
* 处理协议数据
|
|
16
|
+
*/
|
|
17
|
+
private handleProtocolData;
|
|
18
|
+
/**
|
|
19
|
+
* 发送响应
|
|
20
|
+
*/
|
|
21
|
+
private sendResponse;
|
|
22
|
+
/**
|
|
23
|
+
* 启动服务器
|
|
24
|
+
*/
|
|
25
|
+
start(): void;
|
|
26
|
+
/**
|
|
27
|
+
* 停止服务器
|
|
28
|
+
*/
|
|
29
|
+
stop(): void;
|
|
30
|
+
/**
|
|
31
|
+
* 获取连接的客户端数量
|
|
32
|
+
*/
|
|
33
|
+
getClientCount(): number;
|
|
34
|
+
/**
|
|
35
|
+
* 向所有客户端发送测试数据(使用 Uniform Protocol)
|
|
36
|
+
*/
|
|
37
|
+
broadcastTestData(data: any, header?: any): void;
|
|
38
|
+
/**
|
|
39
|
+
* 断开所有客户端连接(模拟服务器断开)
|
|
40
|
+
*/
|
|
41
|
+
disconnectAllClients(): void;
|
|
42
|
+
/**
|
|
43
|
+
* 向指定客户端发送预设的测试数据包(原始十六进制数据)
|
|
44
|
+
* @param clientId 客户端ID,如果为null则向所有客户端发送
|
|
45
|
+
*/
|
|
46
|
+
sendTestDataPacket(clientId?: string | null): void;
|
|
47
|
+
/**
|
|
48
|
+
* 向所有客户端发送原始十六进制数据
|
|
49
|
+
* @param hexString 十六进制字符串(空格分隔或连续)
|
|
50
|
+
*/
|
|
51
|
+
sendRawHexData(hexString: string, clientId?: string | null): void;
|
|
52
|
+
}
|
|
53
|
+
export { TestTCPServer };
|
|
54
|
+
//# sourceMappingURL=test-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-server.d.ts","sourceRoot":"","sources":["../../../src/packages/tcp/test-server.ts"],"names":[],"mappings":"AAgCA,cAAM,aAAa;IAClB,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,eAAe,CAAkB;IACzC,qBAAqB;IACrB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAE5B,IAAI,GAAE,MAAa,EAAE,IAAI,GAAE,MAAoB;IAY3D;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+C1B;;OAEG;IACH,OAAO,CAAC,YAAY;IA6BpB;;OAEG;IACH,KAAK,IAAI,IAAI;IA4Fb;;OAEG;IACH,IAAI,IAAI,IAAI;IAmBZ;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,GAAE,GAAQ,GAAG,IAAI;IA0BpD;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAQ5B;;;OAGG;IACH,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IA2ClD;;;OAGG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;CAoDjE;AAsDD,OAAO,EAAE,aAAa,EAAE,CAAC"}
|