@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.
Files changed (62) hide show
  1. package/README.md +76 -0
  2. package/dist/index.d.ts +17 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +18 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/packages/tcp/ConnectManager.d.ts +66 -0
  7. package/dist/packages/tcp/ConnectManager.d.ts.map +1 -0
  8. package/dist/packages/tcp/ConnectManager.js +176 -0
  9. package/dist/packages/tcp/ConnectManager.js.map +1 -0
  10. package/dist/packages/tcp/QueueManager.d.ts +41 -0
  11. package/dist/packages/tcp/QueueManager.d.ts.map +1 -0
  12. package/dist/packages/tcp/QueueManager.js +102 -0
  13. package/dist/packages/tcp/QueueManager.js.map +1 -0
  14. package/dist/packages/tcp/SocketWrapper.d.ts +106 -0
  15. package/dist/packages/tcp/SocketWrapper.d.ts.map +1 -0
  16. package/dist/packages/tcp/SocketWrapper.js +281 -0
  17. package/dist/packages/tcp/SocketWrapper.js.map +1 -0
  18. package/dist/packages/tcp/constants.d.ts +25 -0
  19. package/dist/packages/tcp/constants.d.ts.map +1 -0
  20. package/dist/packages/tcp/constants.js +27 -0
  21. package/dist/packages/tcp/constants.js.map +1 -0
  22. package/dist/packages/tcp/demo.d.ts +3 -0
  23. package/dist/packages/tcp/demo.d.ts.map +1 -0
  24. package/dist/packages/tcp/demo.js +164 -0
  25. package/dist/packages/tcp/demo.js.map +1 -0
  26. package/dist/packages/tcp/discoveryService.d.ts +42 -0
  27. package/dist/packages/tcp/discoveryService.d.ts.map +1 -0
  28. package/dist/packages/tcp/discoveryService.js +166 -0
  29. package/dist/packages/tcp/discoveryService.js.map +1 -0
  30. package/dist/packages/tcp/protocolHandler.d.ts +64 -0
  31. package/dist/packages/tcp/protocolHandler.d.ts.map +1 -0
  32. package/dist/packages/tcp/protocolHandler.js +96 -0
  33. package/dist/packages/tcp/protocolHandler.js.map +1 -0
  34. package/dist/packages/tcp/tcpWrapper.d.ts +168 -0
  35. package/dist/packages/tcp/tcpWrapper.d.ts.map +1 -0
  36. package/dist/packages/tcp/tcpWrapper.js +472 -0
  37. package/dist/packages/tcp/tcpWrapper.js.map +1 -0
  38. package/dist/packages/tcp/test-build-parse-debug.d.ts +2 -0
  39. package/dist/packages/tcp/test-build-parse-debug.d.ts.map +1 -0
  40. package/dist/packages/tcp/test-build-parse-debug.js +73 -0
  41. package/dist/packages/tcp/test-build-parse-debug.js.map +1 -0
  42. package/dist/packages/tcp/test-packet-split.d.ts +43 -0
  43. package/dist/packages/tcp/test-packet-split.d.ts.map +1 -0
  44. package/dist/packages/tcp/test-packet-split.js +417 -0
  45. package/dist/packages/tcp/test-packet-split.js.map +1 -0
  46. package/dist/packages/tcp/test-protocol-handler.d.ts +6 -0
  47. package/dist/packages/tcp/test-protocol-handler.d.ts.map +1 -0
  48. package/dist/packages/tcp/test-protocol-handler.js +225 -0
  49. package/dist/packages/tcp/test-protocol-handler.js.map +1 -0
  50. package/dist/packages/tcp/test-server.d.ts +54 -0
  51. package/dist/packages/tcp/test-server.d.ts.map +1 -0
  52. package/dist/packages/tcp/test-server.js +412 -0
  53. package/dist/packages/tcp/test-server.js.map +1 -0
  54. package/dist/packages/tcp/types.d.ts +232 -0
  55. package/dist/packages/tcp/types.d.ts.map +1 -0
  56. package/dist/packages/tcp/types.js +13 -0
  57. package/dist/packages/tcp/types.js.map +1 -0
  58. package/dist/packages/tcp/utils.d.ts +14 -0
  59. package/dist/packages/tcp/utils.d.ts.map +1 -0
  60. package/dist/packages/tcp/utils.js +47 -0
  61. package/dist/packages/tcp/utils.js.map +1 -0
  62. 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,6 @@
1
+ /**
2
+ * 测试编解码功能
3
+ */
4
+ declare function testEncodeDecode(): void;
5
+ export { testEncodeDecode };
6
+ //# sourceMappingURL=test-protocol-handler.d.ts.map
@@ -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"}