@netkitty/codec 1.0.0

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 (463) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/README.md +352 -0
  4. package/README.zh-CN.md +342 -0
  5. package/dist/Codec.d.ts +133 -0
  6. package/dist/Codec.js +632 -0
  7. package/dist/PacketHeaders.d.ts +189 -0
  8. package/dist/PacketHeaders.js +384 -0
  9. package/dist/abstracts/BaseHeader.d.ts +325 -0
  10. package/dist/abstracts/BaseHeader.js +734 -0
  11. package/dist/errors/CodecSchemaValidateError.d.ts +4 -0
  12. package/dist/errors/CodecSchemaValidateError.js +11 -0
  13. package/dist/headers/ADSAMS.d.ts +33 -0
  14. package/dist/headers/ADSAMS.js +208 -0
  15. package/dist/headers/AH.d.ts +28 -0
  16. package/dist/headers/AH.js +137 -0
  17. package/dist/headers/AMQP.d.ts +31 -0
  18. package/dist/headers/AMQP.js +316 -0
  19. package/dist/headers/ARP.d.ts +26 -0
  20. package/dist/headers/ARP.js +243 -0
  21. package/dist/headers/BACnetIP.d.ts +27 -0
  22. package/dist/headers/BACnetIP.js +97 -0
  23. package/dist/headers/BFD.d.ts +28 -0
  24. package/dist/headers/BFD.js +155 -0
  25. package/dist/headers/BGP.d.ts +27 -0
  26. package/dist/headers/BGP.js +111 -0
  27. package/dist/headers/BSAPIP.d.ts +33 -0
  28. package/dist/headers/BSAPIP.js +78 -0
  29. package/dist/headers/Babel.d.ts +32 -0
  30. package/dist/headers/Babel.js +224 -0
  31. package/dist/headers/BitTorrent.d.ts +28 -0
  32. package/dist/headers/BitTorrent.js +72 -0
  33. package/dist/headers/C37118.d.ts +26 -0
  34. package/dist/headers/C37118.js +147 -0
  35. package/dist/headers/CAPWAP.d.ts +38 -0
  36. package/dist/headers/CAPWAP.js +275 -0
  37. package/dist/headers/CDP.d.ts +25 -0
  38. package/dist/headers/CDP.js +117 -0
  39. package/dist/headers/CMS.d.ts +33 -0
  40. package/dist/headers/CMS.js +238 -0
  41. package/dist/headers/COTP.d.ts +30 -0
  42. package/dist/headers/COTP.js +193 -0
  43. package/dist/headers/CassandraCQL.d.ts +28 -0
  44. package/dist/headers/CassandraCQL.js +117 -0
  45. package/dist/headers/CoAP.d.ts +29 -0
  46. package/dist/headers/CoAP.js +140 -0
  47. package/dist/headers/Codesys.d.ts +32 -0
  48. package/dist/headers/Codesys.js +119 -0
  49. package/dist/headers/Collectd.d.ts +29 -0
  50. package/dist/headers/Collectd.js +154 -0
  51. package/dist/headers/DCCP.d.ts +30 -0
  52. package/dist/headers/DCCP.js +204 -0
  53. package/dist/headers/DHCP.d.ts +26 -0
  54. package/dist/headers/DHCP.js +148 -0
  55. package/dist/headers/DHCPFailover.d.ts +30 -0
  56. package/dist/headers/DHCPFailover.js +104 -0
  57. package/dist/headers/DHCPv6.d.ts +25 -0
  58. package/dist/headers/DHCPv6.js +145 -0
  59. package/dist/headers/DNP3.d.ts +27 -0
  60. package/dist/headers/DNP3.js +150 -0
  61. package/dist/headers/DNS.d.ts +55 -0
  62. package/dist/headers/DNS.js +309 -0
  63. package/dist/headers/DTLS.d.ts +33 -0
  64. package/dist/headers/DTLS.js +142 -0
  65. package/dist/headers/Diameter.d.ts +34 -0
  66. package/dist/headers/Diameter.js +229 -0
  67. package/dist/headers/EAPOL.d.ts +32 -0
  68. package/dist/headers/EAPOL.js +135 -0
  69. package/dist/headers/EIGRP.d.ts +28 -0
  70. package/dist/headers/EIGRP.js +165 -0
  71. package/dist/headers/ENIP.d.ts +31 -0
  72. package/dist/headers/ENIP.js +164 -0
  73. package/dist/headers/ESP.d.ts +27 -0
  74. package/dist/headers/ESP.js +140 -0
  75. package/dist/headers/Elasticsearch.d.ts +30 -0
  76. package/dist/headers/Elasticsearch.js +125 -0
  77. package/dist/headers/EtherCAT.d.ts +35 -0
  78. package/dist/headers/EtherCAT.js +150 -0
  79. package/dist/headers/EthernetII.d.ts +28 -0
  80. package/dist/headers/EthernetII.js +117 -0
  81. package/dist/headers/FCoE.d.ts +38 -0
  82. package/dist/headers/FCoE.js +210 -0
  83. package/dist/headers/FTP.d.ts +34 -0
  84. package/dist/headers/FTP.js +158 -0
  85. package/dist/headers/Finger.d.ts +41 -0
  86. package/dist/headers/Finger.js +135 -0
  87. package/dist/headers/FoundationFieldbusHSE.d.ts +43 -0
  88. package/dist/headers/FoundationFieldbusHSE.js +163 -0
  89. package/dist/headers/GELF.d.ts +35 -0
  90. package/dist/headers/GELF.js +261 -0
  91. package/dist/headers/GENEVE.d.ts +26 -0
  92. package/dist/headers/GENEVE.js +209 -0
  93. package/dist/headers/GESRTP.d.ts +32 -0
  94. package/dist/headers/GESRTP.js +141 -0
  95. package/dist/headers/GLBP.d.ts +29 -0
  96. package/dist/headers/GLBP.js +159 -0
  97. package/dist/headers/GRE.d.ts +27 -0
  98. package/dist/headers/GRE.js +181 -0
  99. package/dist/headers/GTPU.d.ts +25 -0
  100. package/dist/headers/GTPU.js +203 -0
  101. package/dist/headers/GTPv2C.d.ts +30 -0
  102. package/dist/headers/GTPv2C.js +281 -0
  103. package/dist/headers/GitProtocol.d.ts +34 -0
  104. package/dist/headers/GitProtocol.js +141 -0
  105. package/dist/headers/Goose.d.ts +115 -0
  106. package/dist/headers/Goose.js +1067 -0
  107. package/dist/headers/Gopher.d.ts +43 -0
  108. package/dist/headers/Gopher.js +182 -0
  109. package/dist/headers/HARTIP.d.ts +30 -0
  110. package/dist/headers/HARTIP.js +145 -0
  111. package/dist/headers/HSR.d.ts +27 -0
  112. package/dist/headers/HSR.js +105 -0
  113. package/dist/headers/HSRP.d.ts +26 -0
  114. package/dist/headers/HSRP.js +173 -0
  115. package/dist/headers/HTTP.d.ts +32 -0
  116. package/dist/headers/HTTP.js +153 -0
  117. package/dist/headers/HTTP2.d.ts +34 -0
  118. package/dist/headers/HTTP2.js +190 -0
  119. package/dist/headers/IAX2.d.ts +33 -0
  120. package/dist/headers/IAX2.js +274 -0
  121. package/dist/headers/ICMP.d.ts +15 -0
  122. package/dist/headers/ICMP.js +148 -0
  123. package/dist/headers/ICMPv6.d.ts +15 -0
  124. package/dist/headers/ICMPv6.js +129 -0
  125. package/dist/headers/IEC104_I_Frame.d.ts +23 -0
  126. package/dist/headers/IEC104_I_Frame.js +6489 -0
  127. package/dist/headers/IEC104_S_Frame.d.ts +26 -0
  128. package/dist/headers/IEC104_S_Frame.js +135 -0
  129. package/dist/headers/IEC104_U_Frame.d.ts +27 -0
  130. package/dist/headers/IEC104_U_Frame.js +176 -0
  131. package/dist/headers/IEC61850SampledValues.d.ts +20 -0
  132. package/dist/headers/IEC61850SampledValues.js +420 -0
  133. package/dist/headers/IGMP.d.ts +31 -0
  134. package/dist/headers/IGMP.js +274 -0
  135. package/dist/headers/IMAP.d.ts +32 -0
  136. package/dist/headers/IMAP.js +185 -0
  137. package/dist/headers/IPFIX.d.ts +29 -0
  138. package/dist/headers/IPFIX.js +156 -0
  139. package/dist/headers/IPv4.d.ts +20 -0
  140. package/dist/headers/IPv4.js +370 -0
  141. package/dist/headers/IPv6.d.ts +29 -0
  142. package/dist/headers/IPv6.js +209 -0
  143. package/dist/headers/IPv6HopByHopOptions.d.ts +81 -0
  144. package/dist/headers/IPv6HopByHopOptions.js +495 -0
  145. package/dist/headers/IRC.d.ts +34 -0
  146. package/dist/headers/IRC.js +175 -0
  147. package/dist/headers/ISAKMP.d.ts +29 -0
  148. package/dist/headers/ISAKMP.js +197 -0
  149. package/dist/headers/ISCSI.d.ts +39 -0
  150. package/dist/headers/ISCSI.js +289 -0
  151. package/dist/headers/ISIS.d.ts +25 -0
  152. package/dist/headers/ISIS.js +79 -0
  153. package/dist/headers/ISOSession.d.ts +27 -0
  154. package/dist/headers/ISOSession.js +343 -0
  155. package/dist/headers/Ident.d.ts +42 -0
  156. package/dist/headers/Ident.js +184 -0
  157. package/dist/headers/KNXnetIP.d.ts +30 -0
  158. package/dist/headers/KNXnetIP.js +135 -0
  159. package/dist/headers/Kafka.d.ts +35 -0
  160. package/dist/headers/Kafka.js +128 -0
  161. package/dist/headers/Kerberos.d.ts +30 -0
  162. package/dist/headers/Kerberos.js +217 -0
  163. package/dist/headers/L2TP.d.ts +26 -0
  164. package/dist/headers/L2TP.js +297 -0
  165. package/dist/headers/LACP.d.ts +31 -0
  166. package/dist/headers/LACP.js +151 -0
  167. package/dist/headers/LDAP.d.ts +31 -0
  168. package/dist/headers/LDAP.js +226 -0
  169. package/dist/headers/LDP.d.ts +31 -0
  170. package/dist/headers/LDP.js +138 -0
  171. package/dist/headers/LISP.d.ts +30 -0
  172. package/dist/headers/LISP.js +103 -0
  173. package/dist/headers/LLC.d.ts +27 -0
  174. package/dist/headers/LLC.js +81 -0
  175. package/dist/headers/LLDP.d.ts +26 -0
  176. package/dist/headers/LLDP.js +126 -0
  177. package/dist/headers/LLMNR.d.ts +23 -0
  178. package/dist/headers/LLMNR.js +40 -0
  179. package/dist/headers/LPD.d.ts +31 -0
  180. package/dist/headers/LPD.js +159 -0
  181. package/dist/headers/MACsec.d.ts +34 -0
  182. package/dist/headers/MACsec.js +178 -0
  183. package/dist/headers/MDNS.d.ts +26 -0
  184. package/dist/headers/MDNS.js +45 -0
  185. package/dist/headers/MGCP.d.ts +30 -0
  186. package/dist/headers/MGCP.js +155 -0
  187. package/dist/headers/MMS.d.ts +29 -0
  188. package/dist/headers/MMS.js +243 -0
  189. package/dist/headers/MPLS.d.ts +31 -0
  190. package/dist/headers/MPLS.js +145 -0
  191. package/dist/headers/MQTT.d.ts +30 -0
  192. package/dist/headers/MQTT.js +173 -0
  193. package/dist/headers/MQTTSN.d.ts +34 -0
  194. package/dist/headers/MQTTSN.js +177 -0
  195. package/dist/headers/MarkerProtocol.d.ts +32 -0
  196. package/dist/headers/MarkerProtocol.js +153 -0
  197. package/dist/headers/Megaco.d.ts +32 -0
  198. package/dist/headers/Megaco.js +144 -0
  199. package/dist/headers/Memcached.d.ts +44 -0
  200. package/dist/headers/Memcached.js +285 -0
  201. package/dist/headers/ModbusTCP.d.ts +25 -0
  202. package/dist/headers/ModbusTCP.js +99 -0
  203. package/dist/headers/ModbusUDP.d.ts +26 -0
  204. package/dist/headers/ModbusUDP.js +100 -0
  205. package/dist/headers/MongoDB.d.ts +33 -0
  206. package/dist/headers/MongoDB.js +143 -0
  207. package/dist/headers/MySQL.d.ts +30 -0
  208. package/dist/headers/MySQL.js +114 -0
  209. package/dist/headers/NATS.d.ts +29 -0
  210. package/dist/headers/NATS.js +135 -0
  211. package/dist/headers/NBDS.d.ts +34 -0
  212. package/dist/headers/NBDS.js +176 -0
  213. package/dist/headers/NBNS.d.ts +34 -0
  214. package/dist/headers/NBNS.js +78 -0
  215. package/dist/headers/NBSS.d.ts +36 -0
  216. package/dist/headers/NBSS.js +137 -0
  217. package/dist/headers/NFS.d.ts +36 -0
  218. package/dist/headers/NFS.js +273 -0
  219. package/dist/headers/NHRP.d.ts +32 -0
  220. package/dist/headers/NHRP.js +154 -0
  221. package/dist/headers/NNTP.d.ts +35 -0
  222. package/dist/headers/NNTP.js +162 -0
  223. package/dist/headers/NTP.d.ts +18 -0
  224. package/dist/headers/NTP.js +73 -0
  225. package/dist/headers/NetFlowV5.d.ts +28 -0
  226. package/dist/headers/NetFlowV5.js +205 -0
  227. package/dist/headers/OLSR.d.ts +31 -0
  228. package/dist/headers/OLSR.js +213 -0
  229. package/dist/headers/OPCUA.d.ts +33 -0
  230. package/dist/headers/OPCUA.js +165 -0
  231. package/dist/headers/OPCUAPubSub.d.ts +33 -0
  232. package/dist/headers/OPCUAPubSub.js +144 -0
  233. package/dist/headers/OSPF.d.ts +31 -0
  234. package/dist/headers/OSPF.js +365 -0
  235. package/dist/headers/OmronFINS.d.ts +31 -0
  236. package/dist/headers/OmronFINS.js +90 -0
  237. package/dist/headers/OpenFlow.d.ts +30 -0
  238. package/dist/headers/OpenFlow.js +113 -0
  239. package/dist/headers/OpenVPN.d.ts +35 -0
  240. package/dist/headers/OpenVPN.js +214 -0
  241. package/dist/headers/PCWorx.d.ts +35 -0
  242. package/dist/headers/PCWorx.js +115 -0
  243. package/dist/headers/PIM.d.ts +27 -0
  244. package/dist/headers/PIM.js +129 -0
  245. package/dist/headers/POP3.d.ts +31 -0
  246. package/dist/headers/POP3.js +152 -0
  247. package/dist/headers/POWERLINK.d.ts +28 -0
  248. package/dist/headers/POWERLINK.js +116 -0
  249. package/dist/headers/PPPoEDiscovery.d.ts +29 -0
  250. package/dist/headers/PPPoEDiscovery.js +198 -0
  251. package/dist/headers/PPPoESession.d.ts +28 -0
  252. package/dist/headers/PPPoESession.js +125 -0
  253. package/dist/headers/PPTP.d.ts +30 -0
  254. package/dist/headers/PPTP.js +122 -0
  255. package/dist/headers/PROFINETRT.d.ts +28 -0
  256. package/dist/headers/PROFINETRT.js +74 -0
  257. package/dist/headers/PTP.d.ts +34 -0
  258. package/dist/headers/PTP.js +213 -0
  259. package/dist/headers/PostgreSQL.d.ts +40 -0
  260. package/dist/headers/PostgreSQL.js +236 -0
  261. package/dist/headers/QUIC.d.ts +34 -0
  262. package/dist/headers/QUIC.js +308 -0
  263. package/dist/headers/RADIUS.d.ts +24 -0
  264. package/dist/headers/RADIUS.js +138 -0
  265. package/dist/headers/RDP.d.ts +27 -0
  266. package/dist/headers/RDP.js +93 -0
  267. package/dist/headers/RFB.d.ts +39 -0
  268. package/dist/headers/RFB.js +151 -0
  269. package/dist/headers/RGoose.d.ts +72 -0
  270. package/dist/headers/RGoose.js +340 -0
  271. package/dist/headers/RIP.d.ts +29 -0
  272. package/dist/headers/RIP.js +133 -0
  273. package/dist/headers/RIPng.d.ts +26 -0
  274. package/dist/headers/RIPng.js +140 -0
  275. package/dist/headers/RMCP.d.ts +26 -0
  276. package/dist/headers/RMCP.js +155 -0
  277. package/dist/headers/RSVP.d.ts +31 -0
  278. package/dist/headers/RSVP.js +263 -0
  279. package/dist/headers/RTCP.d.ts +34 -0
  280. package/dist/headers/RTCP.js +217 -0
  281. package/dist/headers/RTP.d.ts +33 -0
  282. package/dist/headers/RTP.js +291 -0
  283. package/dist/headers/RTPS.d.ts +33 -0
  284. package/dist/headers/RTPS.js +182 -0
  285. package/dist/headers/RTSP.d.ts +36 -0
  286. package/dist/headers/RTSP.js +184 -0
  287. package/dist/headers/RawData.d.ts +17 -0
  288. package/dist/headers/RawData.js +43 -0
  289. package/dist/headers/Redis.d.ts +32 -0
  290. package/dist/headers/Redis.js +202 -0
  291. package/dist/headers/Rlogin.d.ts +42 -0
  292. package/dist/headers/Rlogin.js +139 -0
  293. package/dist/headers/Rsync.d.ts +28 -0
  294. package/dist/headers/Rsync.js +117 -0
  295. package/dist/headers/S7comm.d.ts +36 -0
  296. package/dist/headers/S7comm.js +244 -0
  297. package/dist/headers/SCTP.d.ts +35 -0
  298. package/dist/headers/SCTP.js +174 -0
  299. package/dist/headers/SFlow.d.ts +29 -0
  300. package/dist/headers/SFlow.js +242 -0
  301. package/dist/headers/SIP.d.ts +27 -0
  302. package/dist/headers/SIP.js +146 -0
  303. package/dist/headers/SLMP.d.ts +36 -0
  304. package/dist/headers/SLMP.js +154 -0
  305. package/dist/headers/SLP.d.ts +30 -0
  306. package/dist/headers/SLP.js +207 -0
  307. package/dist/headers/SLPv1.d.ts +32 -0
  308. package/dist/headers/SLPv1.js +138 -0
  309. package/dist/headers/SMB1.d.ts +37 -0
  310. package/dist/headers/SMB1.js +200 -0
  311. package/dist/headers/SMB2.d.ts +36 -0
  312. package/dist/headers/SMB2.js +203 -0
  313. package/dist/headers/SMPP.d.ts +33 -0
  314. package/dist/headers/SMPP.js +119 -0
  315. package/dist/headers/SMTP.d.ts +33 -0
  316. package/dist/headers/SMTP.js +157 -0
  317. package/dist/headers/SNAP.d.ts +22 -0
  318. package/dist/headers/SNAP.js +68 -0
  319. package/dist/headers/SNMP.d.ts +28 -0
  320. package/dist/headers/SNMP.js +302 -0
  321. package/dist/headers/SOCKS4.d.ts +42 -0
  322. package/dist/headers/SOCKS4.js +302 -0
  323. package/dist/headers/SOCKS5.d.ts +45 -0
  324. package/dist/headers/SOCKS5.js +223 -0
  325. package/dist/headers/SSDP.d.ts +27 -0
  326. package/dist/headers/SSDP.js +161 -0
  327. package/dist/headers/SSH.d.ts +44 -0
  328. package/dist/headers/SSH.js +274 -0
  329. package/dist/headers/STOMP.d.ts +48 -0
  330. package/dist/headers/STOMP.js +177 -0
  331. package/dist/headers/STP.d.ts +26 -0
  332. package/dist/headers/STP.js +150 -0
  333. package/dist/headers/STUN.d.ts +25 -0
  334. package/dist/headers/STUN.js +183 -0
  335. package/dist/headers/SercosIII.d.ts +43 -0
  336. package/dist/headers/SercosIII.js +199 -0
  337. package/dist/headers/Skinny.d.ts +32 -0
  338. package/dist/headers/Skinny.js +139 -0
  339. package/dist/headers/StatsD.d.ts +27 -0
  340. package/dist/headers/StatsD.js +134 -0
  341. package/dist/headers/SunRPC.d.ts +34 -0
  342. package/dist/headers/SunRPC.js +268 -0
  343. package/dist/headers/Syslog.d.ts +21 -0
  344. package/dist/headers/Syslog.js +91 -0
  345. package/dist/headers/TCP.d.ts +19 -0
  346. package/dist/headers/TCP.js +905 -0
  347. package/dist/headers/TFTP.d.ts +28 -0
  348. package/dist/headers/TFTP.js +224 -0
  349. package/dist/headers/TLS_Alert.d.ts +24 -0
  350. package/dist/headers/TLS_Alert.js +639 -0
  351. package/dist/headers/TLS_ApplicationData.d.ts +24 -0
  352. package/dist/headers/TLS_ApplicationData.js +170 -0
  353. package/dist/headers/TLS_ChangeCipherSpec.d.ts +23 -0
  354. package/dist/headers/TLS_ChangeCipherSpec.js +168 -0
  355. package/dist/headers/TLS_Handshake.d.ts +65 -0
  356. package/dist/headers/TLS_Handshake.js +860 -0
  357. package/dist/headers/TLS_Heartbeat.d.ts +27 -0
  358. package/dist/headers/TLS_Heartbeat.js +247 -0
  359. package/dist/headers/TPKT.d.ts +26 -0
  360. package/dist/headers/TPKT.js +99 -0
  361. package/dist/headers/TacacsPlus.d.ts +27 -0
  362. package/dist/headers/TacacsPlus.js +133 -0
  363. package/dist/headers/Telnet.d.ts +40 -0
  364. package/dist/headers/Telnet.js +193 -0
  365. package/dist/headers/Teredo.d.ts +40 -0
  366. package/dist/headers/Teredo.js +251 -0
  367. package/dist/headers/TimeProtocol.d.ts +25 -0
  368. package/dist/headers/TimeProtocol.js +53 -0
  369. package/dist/headers/UDP.d.ts +19 -0
  370. package/dist/headers/UDP.js +171 -0
  371. package/dist/headers/VLAN_802dot1Q.d.ts +24 -0
  372. package/dist/headers/VLAN_802dot1Q.js +96 -0
  373. package/dist/headers/VRRP.d.ts +26 -0
  374. package/dist/headers/VRRP.js +309 -0
  375. package/dist/headers/VXLAN.d.ts +24 -0
  376. package/dist/headers/VXLAN.js +75 -0
  377. package/dist/headers/WCCP.d.ts +29 -0
  378. package/dist/headers/WCCP.js +117 -0
  379. package/dist/headers/WHOIS.d.ts +37 -0
  380. package/dist/headers/WHOIS.js +126 -0
  381. package/dist/headers/WSDiscovery.d.ts +29 -0
  382. package/dist/headers/WSDiscovery.js +118 -0
  383. package/dist/headers/WakeOnLAN.d.ts +30 -0
  384. package/dist/headers/WakeOnLAN.js +126 -0
  385. package/dist/headers/WebSocket.d.ts +26 -0
  386. package/dist/headers/WebSocket.js +173 -0
  387. package/dist/headers/WireGuard.d.ts +38 -0
  388. package/dist/headers/WireGuard.js +216 -0
  389. package/dist/headers/XMPP.d.ts +37 -0
  390. package/dist/headers/XMPP.js +149 -0
  391. package/dist/headers/Zabbix.d.ts +35 -0
  392. package/dist/headers/Zabbix.js +153 -0
  393. package/dist/headers/cms/AcsiPdu.d.ts +45 -0
  394. package/dist/headers/cms/AcsiPdu.js +112 -0
  395. package/dist/headers/cms/PerDecoder.d.ts +68 -0
  396. package/dist/headers/cms/PerDecoder.js +211 -0
  397. package/dist/headers/cms/PerReader.d.ts +64 -0
  398. package/dist/headers/cms/PerReader.js +155 -0
  399. package/dist/helper/BufferToHex.d.ts +5 -0
  400. package/dist/helper/BufferToHex.js +10 -0
  401. package/dist/helper/BufferToIP.d.ts +12 -0
  402. package/dist/helper/BufferToIP.js +23 -0
  403. package/dist/helper/BufferToNumber.d.ts +18 -0
  404. package/dist/helper/BufferToNumber.js +47 -0
  405. package/dist/helper/HexToBuffer.d.ts +7 -0
  406. package/dist/helper/HexToBuffer.js +27 -0
  407. package/dist/helper/HexToNumber.d.ts +18 -0
  408. package/dist/helper/HexToNumber.js +48 -0
  409. package/dist/helper/IPToBuffer.d.ts +12 -0
  410. package/dist/helper/IPToBuffer.js +34 -0
  411. package/dist/helper/NumberToBERBuffer.d.ts +18 -0
  412. package/dist/helper/NumberToBERBuffer.js +31 -0
  413. package/dist/helper/NumberToBERHex.d.ts +18 -0
  414. package/dist/helper/NumberToBERHex.js +52 -0
  415. package/dist/helper/NumberToBuffer.d.ts +18 -0
  416. package/dist/helper/NumberToBuffer.js +38 -0
  417. package/dist/helper/NumberToHex.d.ts +18 -0
  418. package/dist/helper/NumberToHex.js +35 -0
  419. package/dist/index.d.ts +52 -0
  420. package/dist/index.js +113 -0
  421. package/dist/lib/FlexibleObject.d.ts +27 -0
  422. package/dist/lib/FlexibleObject.js +113 -0
  423. package/dist/lib/GetBERIntegerLengthFromBuffer.d.ts +6 -0
  424. package/dist/lib/GetBERIntegerLengthFromBuffer.js +16 -0
  425. package/dist/lib/ProcessPacketPostHandlers.d.ts +13 -0
  426. package/dist/lib/ProcessPacketPostHandlers.js +53 -0
  427. package/dist/lib/SortPostHandlers.d.ts +7 -0
  428. package/dist/lib/SortPostHandlers.js +11 -0
  429. package/dist/lib/StringContentEncodingEnum.d.ts +10 -0
  430. package/dist/lib/StringContentEncodingEnum.js +14 -0
  431. package/dist/schema/ProtocolFieldJSONSchema.d.ts +35 -0
  432. package/dist/schema/ProtocolFieldJSONSchema.js +2 -0
  433. package/dist/schema/ProtocolFieldJSONSchemaDefinition.d.ts +2 -0
  434. package/dist/schema/ProtocolFieldJSONSchemaDefinition.js +2 -0
  435. package/dist/schema/ProtocolJSONSchema.d.ts +32 -0
  436. package/dist/schema/ProtocolJSONSchema.js +2 -0
  437. package/dist/types/CodecData.d.ts +7 -0
  438. package/dist/types/CodecData.js +2 -0
  439. package/dist/types/CodecDecodeResult.d.ts +10 -0
  440. package/dist/types/CodecDecodeResult.js +2 -0
  441. package/dist/types/CodecEncodeInput.d.ts +2 -0
  442. package/dist/types/CodecEncodeInput.js +2 -0
  443. package/dist/types/CodecEncodeResult.d.ts +5 -0
  444. package/dist/types/CodecEncodeResult.js +2 -0
  445. package/dist/types/CodecErrorInfo.d.ts +5 -0
  446. package/dist/types/CodecErrorInfo.js +2 -0
  447. package/dist/types/CodecModule.d.ts +2 -0
  448. package/dist/types/CodecModule.js +2 -0
  449. package/dist/types/CodecModuleConstructor.d.ts +2 -0
  450. package/dist/types/CodecModuleConstructor.js +2 -0
  451. package/dist/types/CodecSchema.d.ts +6 -0
  452. package/dist/types/CodecSchema.js +2 -0
  453. package/dist/types/DemuxProducer.d.ts +23 -0
  454. package/dist/types/DemuxProducer.js +2 -0
  455. package/dist/types/Dissection.d.ts +23 -0
  456. package/dist/types/Dissection.js +2 -0
  457. package/dist/types/HeaderTreeNode.d.ts +4 -0
  458. package/dist/types/HeaderTreeNode.js +2 -0
  459. package/dist/types/LayerGraph.d.ts +32 -0
  460. package/dist/types/LayerGraph.js +2 -0
  461. package/dist/types/PostHandlerItem.d.ts +4 -0
  462. package/dist/types/PostHandlerItem.js +2 -0
  463. package/package.json +141 -0
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CoAP = void 0;
4
+ const BaseHeader_1 = require("../abstracts/BaseHeader");
5
+ const BufferToHex_1 = require("../helper/BufferToHex");
6
+ const HexToBuffer_1 = require("../helper/HexToBuffer");
7
+ const StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
8
+ /**
9
+ * CoAP — Constrained Application Protocol (RFC 7252), a RESTful transfer protocol for constrained nodes
10
+ * and networks (IoT), riding on UDP port 5683. Every message opens with a 4-byte fixed header: byte 0
11
+ * holds the 2-bit Version (always 1), a 2-bit Type (0 CON, 1 NON, 2 ACK, 3 RST) and a 4-bit Token
12
+ * Length (TKL, 0-8); byte 1 is the 8-bit Code (a 3-bit class '.' 5-bit detail, e.g. 0.01 GET = 0x01,
13
+ * 2.05 Content = 0x45); bytes 2-3 are the big-endian Message ID. The fixed header is followed by a
14
+ * Token of TKL octets, then a sequence of Options, then optionally a 0xFF payload marker and the
15
+ * payload.
16
+ *
17
+ * This codec decodes the fixed header and the Token structurally and keeps everything after the Token
18
+ * (the Options plus the optional payload-marker-and-payload) verbatim as `payload` hex — de-structuring
19
+ * CoAP's option deltas / TLV encoding is a later slice, so those bytes are preserved untouched and the
20
+ * message round-trips byte-for-byte. The region is bounded by the UDP datagram length so any trailing
21
+ * padding is not absorbed. version === 1 is the content signature that separates a real CoAP datagram
22
+ * on port 5683 from arbitrary traffic.
23
+ */
24
+ class CoAP extends BaseHeader_1.BaseHeader {
25
+ constructor() {
26
+ super(...arguments);
27
+ this.id = 'coap';
28
+ this.name = 'Constrained Application Protocol';
29
+ this.nickname = 'CoAP';
30
+ this.matchKeys = ['udpport:5683'];
31
+ //A leaf header — CoAP option/payload TLV de-structuring is deferred to a later slice.
32
+ this.demuxProducers = [];
33
+ }
34
+ static #schemaCache;
35
+ get SCHEMA() {
36
+ return (CoAP.#schemaCache ??= CoAP.#buildSchema());
37
+ }
38
+ /** The UDP payload length bounded by the datagram (so retained padding is not absorbed). */
39
+ #payloadLength() {
40
+ let available = this.packet.length - this.startPos;
41
+ if (this.prevCodecModule && this.prevCodecModule.id === 'udp') {
42
+ const udpLength = this.prevCodecModule.instance.length.getValue(0);
43
+ if (udpLength >= 8 && udpLength - 8 < available)
44
+ available = udpLength - 8;
45
+ }
46
+ return available < 0 ? 0 : available;
47
+ }
48
+ /** The Token octet count, clamped to the spec's 0-8 range and to the bytes actually available. */
49
+ #tokenBytes() {
50
+ let count = this.instance.tokenLength.getValue(0);
51
+ if (count > 8)
52
+ count = 8;
53
+ if (count < 0)
54
+ count = 0;
55
+ const available = this.#payloadLength();
56
+ if (4 + count > available)
57
+ count = available - 4;
58
+ return count < 0 ? 0 : count;
59
+ }
60
+ /** A fixed-width big-endian bit field within byte 0 (bitOffset 0 = MSB). */
61
+ static #bitField(name, bitOffset, bitLength, maximum, label) {
62
+ return {
63
+ type: 'integer',
64
+ label: label,
65
+ minimum: 0,
66
+ maximum: maximum,
67
+ decode: function () {
68
+ this.instance[name].setValue(this.readBits(0, 1, bitOffset, bitLength));
69
+ },
70
+ encode: function () {
71
+ this.writeBits(0, 1, bitOffset, bitLength, this.instance[name].getValue(0));
72
+ }
73
+ };
74
+ }
75
+ static #buildSchema() {
76
+ return {
77
+ type: 'object',
78
+ summary: 'CoAP type=${type} code=${code}',
79
+ properties: {
80
+ //Byte 0 (MSB first): Version (bits 7:6, always 1), Type (bits 5:4), Token Length (bits 3:0).
81
+ version: this.#bitField('version', 0, 2, 3, 'Version'),
82
+ type: this.#bitField('type', 2, 2, 3, 'Type'),
83
+ tokenLength: this.#bitField('tokenLength', 4, 4, 15, 'Token Length'),
84
+ //Byte 1: Code — a 3-bit class and 5-bit detail packed as one octet (e.g. 0x01 = 0.01 GET).
85
+ code: this.fieldUInt('code', 1, 1, 'Code'),
86
+ //Bytes 2-3: Message ID (big-endian uint16).
87
+ messageId: this.fieldUInt('messageId', 2, 2, 'Message ID'),
88
+ //Token: TKL octets immediately after the fixed header, kept verbatim as hex ('' when TKL 0).
89
+ token: {
90
+ type: 'string',
91
+ label: 'Token',
92
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
93
+ decode: function () {
94
+ const count = this.#tokenBytes();
95
+ this.instance.token.setValue(count > 0 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(4, count)) : '');
96
+ },
97
+ encode: function () {
98
+ const token = this.instance.token.getValue('');
99
+ if (token)
100
+ this.writeBytes(4, (0, HexToBuffer_1.HexToBuffer)(token));
101
+ }
102
+ },
103
+ //Options + optional payload-marker-and-payload, kept verbatim (TLV de-structuring is a later
104
+ //slice). Bounded by the UDP datagram, and placed right after the Token (offset 4 + TKL).
105
+ payload: {
106
+ type: 'string',
107
+ label: 'Payload',
108
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
109
+ decode: function () {
110
+ const available = this.#payloadLength();
111
+ const start = 4 + this.#tokenBytes();
112
+ this.instance.payload.setValue(start < available ? (0, BufferToHex_1.BufferToHex)(this.readBytes(start, available - start)) : '');
113
+ },
114
+ encode: function () {
115
+ const payload = this.instance.payload.getValue('');
116
+ if (payload) {
117
+ //The actual token bytes are authoritative for where the payload starts (the
118
+ //token field writes its own bytes at offset 4), so the payload cannot overlap
119
+ //or gap the token even when a crafted Token Length disagrees with the token.
120
+ const tokenBytes = (0, HexToBuffer_1.HexToBuffer)(this.instance.token.getValue('')).length;
121
+ this.writeBytes(4 + tokenBytes, (0, HexToBuffer_1.HexToBuffer)(payload));
122
+ }
123
+ }
124
+ }
125
+ }
126
+ };
127
+ }
128
+ match() {
129
+ //CoAP rides on UDP port 5683. Require the 4-byte fixed header within the datagram and the
130
+ //Version == 1 content signature (bits 7:6 of byte 0) so a non-CoAP datagram on 5683 falls
131
+ //through to raw rather than claiming an un-decodable layer.
132
+ if (!this.prevCodecModule || this.prevCodecModule.id !== 'udp')
133
+ return false;
134
+ if (this.#payloadLength() < 4)
135
+ return false;
136
+ const version = this.readBits(0, 1, 0, 2);
137
+ return version === 1;
138
+ }
139
+ }
140
+ exports.CoAP = CoAP;
@@ -0,0 +1,32 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * CODESYS V3 (3S-Smart Software Solutions runtime) communication, TCP port 2455. CODESYS wraps its
6
+ * multi-layer message stack (an L3 datagram/router layer, an L4 channel layer and an L7 service layer)
7
+ * inside an outer "block driver" frame: a fixed 8-byte header — a 4-byte magic (`00 01 17 e8`) and a
8
+ * LITTLE-ENDIAN 32-bit Length — followed by the block-driver payload.
9
+ *
10
+ * ⚠️ No authoritative public specification of the CODESYS wire format exists. The block-driver framing
11
+ * used here (magic + little-endian length) is inferred from the community Wireshark dissector
12
+ * `fridgebuyer/codesys3-dissector` (and the ICS-pcap CODESYS notes), not from a vendor spec — so this
13
+ * codec surfaces only the two determinable header fields and keeps the entire block-driver payload
14
+ * (the L3/L4/L7 stack, which needs cross-message / session context) verbatim as `payload` hex
15
+ * (byte-perfect). The Length is auto-computed from the payload on encode when not supplied, else honored
16
+ * verbatim (a crafted frame may carry any Length); the payload is bounded by the Length so a second
17
+ * pipelined block-driver frame or trailing bytes are left to the codec's recursion / RawData. A
18
+ * well-formed frame round-trips byte-for-byte.
19
+ *
20
+ * Like the other multi-byte CODESYS/CIP-style protocols, the Length is little-endian; there is no
21
+ * little-endian helper in this codebase, so it is read/written byte-by-byte in its closures.
22
+ */
23
+ export declare class Codesys extends BaseHeader {
24
+ #private;
25
+ get SCHEMA(): ProtocolJSONSchema;
26
+ readonly id: string;
27
+ readonly name: string;
28
+ readonly nickname: string;
29
+ readonly matchKeys: string[];
30
+ match(): boolean;
31
+ readonly demuxProducers: DemuxProducer[];
32
+ }
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Codesys = void 0;
4
+ const BaseHeader_1 = require("../abstracts/BaseHeader");
5
+ const BufferToHex_1 = require("../helper/BufferToHex");
6
+ const HexToBuffer_1 = require("../helper/HexToBuffer");
7
+ const StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
8
+ /**
9
+ * CODESYS V3 (3S-Smart Software Solutions runtime) communication, TCP port 2455. CODESYS wraps its
10
+ * multi-layer message stack (an L3 datagram/router layer, an L4 channel layer and an L7 service layer)
11
+ * inside an outer "block driver" frame: a fixed 8-byte header — a 4-byte magic (`00 01 17 e8`) and a
12
+ * LITTLE-ENDIAN 32-bit Length — followed by the block-driver payload.
13
+ *
14
+ * ⚠️ No authoritative public specification of the CODESYS wire format exists. The block-driver framing
15
+ * used here (magic + little-endian length) is inferred from the community Wireshark dissector
16
+ * `fridgebuyer/codesys3-dissector` (and the ICS-pcap CODESYS notes), not from a vendor spec — so this
17
+ * codec surfaces only the two determinable header fields and keeps the entire block-driver payload
18
+ * (the L3/L4/L7 stack, which needs cross-message / session context) verbatim as `payload` hex
19
+ * (byte-perfect). The Length is auto-computed from the payload on encode when not supplied, else honored
20
+ * verbatim (a crafted frame may carry any Length); the payload is bounded by the Length so a second
21
+ * pipelined block-driver frame or trailing bytes are left to the codec's recursion / RawData. A
22
+ * well-formed frame round-trips byte-for-byte.
23
+ *
24
+ * Like the other multi-byte CODESYS/CIP-style protocols, the Length is little-endian; there is no
25
+ * little-endian helper in this codebase, so it is read/written byte-by-byte in its closures.
26
+ */
27
+ class Codesys extends BaseHeader_1.BaseHeader {
28
+ constructor() {
29
+ super(...arguments);
30
+ this.id = 'codesys';
31
+ this.name = 'CODESYS V3';
32
+ this.nickname = 'CODESYS';
33
+ this.matchKeys = ['tcpport:2455'];
34
+ //A leaf header — the block-driver payload (L3/L4/L7) requires cross-message / session parsing that
35
+ //has no authoritative public spec, so it is kept as hex rather than demuxed further.
36
+ this.demuxProducers = [];
37
+ }
38
+ static #schemaCache;
39
+ get SCHEMA() {
40
+ return (Codesys.#schemaCache ??= Codesys.#buildSchema());
41
+ }
42
+ /** The 4-byte block-driver magic that prefixes every frame, as a wire-order byte sequence. */
43
+ static #MAGIC = '000117e8';
44
+ static #buildSchema() {
45
+ return {
46
+ type: 'object',
47
+ summary: 'CODESYS len=${length}',
48
+ properties: {
49
+ //The 4-byte block-driver magic (00 01 17 e8). Kept verbatim (not enum-constrained) so any
50
+ //observed frame round-trips even if a variant carries a different signature.
51
+ magic: this.fieldHex('magic', 0, 4, 'Block Driver Magic'),
52
+ //Block-driver payload byte count that follows the 8-byte header. LITTLE-ENDIAN 32-bit.
53
+ //Honored when supplied (a crafted frame may lie); else derived from the payload bytes.
54
+ length: {
55
+ type: 'integer',
56
+ label: 'Length',
57
+ minimum: 0,
58
+ maximum: 4294967295,
59
+ decode: function () {
60
+ const b = this.readBytes(4, 4);
61
+ //`|` yields a signed int32, so `>>> 0` over the WHOLE expression keeps it unsigned.
62
+ this.instance.length.setValue((b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0);
63
+ },
64
+ encode: function () {
65
+ const provided = this.instance.length.getValue();
66
+ let value = (provided !== undefined && provided !== null)
67
+ ? provided
68
+ : (0, HexToBuffer_1.HexToBuffer)(this.instance.payload.getValue('')).length;
69
+ if (value > 4294967295) {
70
+ this.recordError(this.instance.length.getPath(), 'Maximum value is 4294967295');
71
+ value = 4294967295;
72
+ }
73
+ if (value < 0) {
74
+ this.recordError(this.instance.length.getPath(), 'Minimum value is 0');
75
+ value = 0;
76
+ }
77
+ this.instance.length.setValue(value);
78
+ this.writeBytes(4, Buffer.from([value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, (value >>> 24) & 0xff]));
79
+ }
80
+ },
81
+ //The block-driver payload (the CODESYS L3/L4/L7 stack), kept verbatim. Bounded by the
82
+ //Length field (payload ends at offset 8 + Length) when the Length is sane and the captured
83
+ //bytes, so a trailing / pipelined frame is left to the codec's recursion / RawData.
84
+ payload: {
85
+ type: 'string',
86
+ label: 'Payload',
87
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
88
+ decode: function () {
89
+ const available = this.packet.length - this.startPos;
90
+ const length = this.instance.length.getValue(0);
91
+ //Honor the Length to bound the payload when it fits within the captured bytes;
92
+ //otherwise (0, or a lying/oversized Length) consume the rest so nothing is lost.
93
+ let end = 8 + length;
94
+ if (length <= 0 || end > available)
95
+ end = available;
96
+ this.instance.payload.setValue(end > 8 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(8, end - 8)) : '');
97
+ },
98
+ encode: function () {
99
+ const payload = this.instance.payload.getValue('');
100
+ if (payload)
101
+ this.writeBytes(8, (0, HexToBuffer_1.HexToBuffer)(payload));
102
+ }
103
+ }
104
+ }
105
+ };
106
+ }
107
+ match() {
108
+ //CODESYS V3 rides on TCP port 2455 (an observed runtime/gateway port). Require the full 8-byte
109
+ //block-driver header and the 4-byte magic signature (00 01 17 e8) so non-CODESYS 2455 traffic
110
+ //falls through to raw. The magic is a strong 32-bit content signature, but selection stays
111
+ //port-bucketed (matchKeys) like the other length-bounded TCP-payload codecs.
112
+ if (!this.prevCodecModule || this.prevCodecModule.id !== 'tcp')
113
+ return false;
114
+ if (this.packet.length - this.startPos < 8)
115
+ return false;
116
+ return (0, BufferToHex_1.BufferToHex)(this.readBytes(0, 4, true)) === Codesys.#MAGIC;
117
+ }
118
+ }
119
+ exports.Codesys = Codesys;
@@ -0,0 +1,29 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * collectd binary network protocol (the monitoring daemon's UDP transport, well-known UDP port 25826,
6
+ * default multicast group 239.192.74.66). A collectd datagram is a flat sequence of parts; each part is
7
+ * a 4-byte header — a 2-byte Type and a 2-byte Length, both big-endian — followed by Length − 4 value
8
+ * bytes (the Length field COUNTS its own 4-byte header). Common part types: 0x0000 Host, 0x0001 Time,
9
+ * 0x0002 Plugin, 0x0004 PluginInstance, 0x0008 Type, 0x0009 Values. There is no top-level length — the
10
+ * datagram owns the whole UDP payload and parts run to its end.
11
+ *
12
+ * Parts are carried generically (Type + on-wire Length + verbatim hex value) so every part — string,
13
+ * numeric, values, or unknown — round-trips byte-for-byte; per-type semantic decoding (string bodies,
14
+ * uint64 times, the Values type/count/data layout) is a later enrichment. The walk peeks each 4-byte
15
+ * header (dry-run), stops at a part that overruns the payload or declares a Length < 4 (its own header),
16
+ * and keeps any bytes after the last complete part verbatim in `trailer` so the datagram is reproduced
17
+ * exactly. Each part's Length is honored verbatim on encode (a crafted part may lie) or derived from the
18
+ * value byte count when absent; the part layout always advances by the actual value bytes written.
19
+ */
20
+ export declare class Collectd extends BaseHeader {
21
+ #private;
22
+ get SCHEMA(): ProtocolJSONSchema;
23
+ readonly id: string;
24
+ readonly name: string;
25
+ readonly nickname: string;
26
+ readonly matchKeys: string[];
27
+ match(): boolean;
28
+ readonly demuxProducers: DemuxProducer[];
29
+ }
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Collectd = void 0;
4
+ const BaseHeader_1 = require("../abstracts/BaseHeader");
5
+ const BufferToHex_1 = require("../helper/BufferToHex");
6
+ const HexToBuffer_1 = require("../helper/HexToBuffer");
7
+ const NumberToBuffer_1 = require("../helper/NumberToBuffer");
8
+ const StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
9
+ /**
10
+ * collectd binary network protocol (the monitoring daemon's UDP transport, well-known UDP port 25826,
11
+ * default multicast group 239.192.74.66). A collectd datagram is a flat sequence of parts; each part is
12
+ * a 4-byte header — a 2-byte Type and a 2-byte Length, both big-endian — followed by Length − 4 value
13
+ * bytes (the Length field COUNTS its own 4-byte header). Common part types: 0x0000 Host, 0x0001 Time,
14
+ * 0x0002 Plugin, 0x0004 PluginInstance, 0x0008 Type, 0x0009 Values. There is no top-level length — the
15
+ * datagram owns the whole UDP payload and parts run to its end.
16
+ *
17
+ * Parts are carried generically (Type + on-wire Length + verbatim hex value) so every part — string,
18
+ * numeric, values, or unknown — round-trips byte-for-byte; per-type semantic decoding (string bodies,
19
+ * uint64 times, the Values type/count/data layout) is a later enrichment. The walk peeks each 4-byte
20
+ * header (dry-run), stops at a part that overruns the payload or declares a Length < 4 (its own header),
21
+ * and keeps any bytes after the last complete part verbatim in `trailer` so the datagram is reproduced
22
+ * exactly. Each part's Length is honored verbatim on encode (a crafted part may lie) or derived from the
23
+ * value byte count when absent; the part layout always advances by the actual value bytes written.
24
+ */
25
+ class Collectd extends BaseHeader_1.BaseHeader {
26
+ constructor() {
27
+ super(...arguments);
28
+ this.id = 'collectd';
29
+ this.name = 'collectd Network Protocol';
30
+ this.nickname = 'collectd';
31
+ this.matchKeys = ['udpport:25826'];
32
+ //A leaf header — the per-type part bodies are kept verbatim for now.
33
+ this.demuxProducers = [];
34
+ }
35
+ static #schemaCache;
36
+ get SCHEMA() {
37
+ return (Collectd.#schemaCache ??= Collectd.#buildSchema());
38
+ }
39
+ static #buildSchema() {
40
+ return {
41
+ type: 'object',
42
+ summary: 'collectd ${parts.length} parts',
43
+ properties: {
44
+ parts: {
45
+ type: 'array',
46
+ label: 'Parts',
47
+ items: {
48
+ type: 'object',
49
+ label: 'Part',
50
+ properties: {
51
+ type: { type: 'integer', label: 'Type', minimum: 0, maximum: 65535 },
52
+ //On-wire Length INCLUDING the 4-byte part header (Type + Length). Honored
53
+ //verbatim on encode; derived as 4 + value bytes when omitted.
54
+ length: { type: 'integer', label: 'Length', minimum: 0, maximum: 65535 },
55
+ value: { type: 'string', label: 'Value', contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX }
56
+ }
57
+ },
58
+ decode: function () {
59
+ //The datagram owns the whole UDP payload — there is no outer length, so bound the
60
+ //walk by the remaining payload bytes. Each part is Type(2) Length(2) Value(Length−4).
61
+ const available = this.packet.length - this.startPos;
62
+ const parts = [];
63
+ let offset = 0;
64
+ while (offset + 4 <= available) {
65
+ //Peek the 4-byte header (dry-run) before committing so a truncated / malformed
66
+ //part is NOT consumed by the header length — its bytes fall through to `trailer`.
67
+ const header = this.readBytes(offset, 4, true);
68
+ const type = header.readUInt16BE(0);
69
+ const length = header.readUInt16BE(2);
70
+ //Length counts its own 4-byte header: a value below 4 cannot delimit the part
71
+ //(and would not advance the offset), so stop and keep the rest as trailer.
72
+ if (length < 4)
73
+ break;
74
+ //A part that overruns the payload (truncation) is not consumed — stop and leave
75
+ //the remaining bytes to `trailer`, keeping the round-trip exact.
76
+ if (offset + length > available)
77
+ break;
78
+ //Commit-read the whole part so the header length covers exactly what is consumed.
79
+ const partBuffer = this.readBytes(offset, length);
80
+ const value = length > 4 ? (0, BufferToHex_1.BufferToHex)(partBuffer.subarray(4)) : '';
81
+ parts.push({ type: type, length: length, value: value });
82
+ offset += length;
83
+ }
84
+ this.instance.parts.setValue(parts);
85
+ //Any bytes after the last complete part (a truncated / malformed final part, or
86
+ //padding) are kept verbatim and consumed, so the datagram is reproduced exactly and
87
+ //collectd always advances to the end of its UDP payload.
88
+ this.instance.trailer.setValue(offset < available ? (0, BufferToHex_1.BufferToHex)(this.readBytes(offset, available - offset)) : '');
89
+ },
90
+ encode: function () {
91
+ const parts = this.instance.parts.getValue([]);
92
+ let offset = 0;
93
+ if (parts) {
94
+ for (let i = 0; i < parts.length; i++) {
95
+ const part = parts[i];
96
+ let type = part.type ? part.type : 0;
97
+ if (type > 65535) {
98
+ this.recordError(`parts[${i}].type`, 'Maximum value is 65535');
99
+ type = 65535;
100
+ }
101
+ if (type < 0) {
102
+ this.recordError(`parts[${i}].type`, 'Minimum value is 0');
103
+ type = 0;
104
+ }
105
+ const value = (0, HexToBuffer_1.HexToBuffer)(part.value ? part.value : '');
106
+ //Length is honored when supplied (a crafted part may lie); else derived as
107
+ //the 4-byte header + value bytes. The layout always advances by the actual
108
+ //value bytes written, so a lying Length does not shift the next part.
109
+ const provided = part.length;
110
+ let length = (provided !== undefined && provided !== null) ? provided : 4 + value.length;
111
+ if (length > 65535) {
112
+ this.recordError(`parts[${i}].length`, 'Maximum value is 65535');
113
+ length = 65535;
114
+ }
115
+ if (length < 0) {
116
+ this.recordError(`parts[${i}].length`, 'Minimum value is 0');
117
+ length = 0;
118
+ }
119
+ this.writeBytes(offset, (0, NumberToBuffer_1.UInt16ToBuffer)(type));
120
+ this.writeBytes(offset + 2, (0, NumberToBuffer_1.UInt16ToBuffer)(length));
121
+ offset += 4;
122
+ if (value.length) {
123
+ this.writeBytes(offset, value);
124
+ offset += value.length;
125
+ }
126
+ }
127
+ }
128
+ const trailer = this.instance.trailer.getValue('');
129
+ if (trailer)
130
+ this.writeBytes(offset, (0, HexToBuffer_1.HexToBuffer)(trailer));
131
+ }
132
+ },
133
+ //Bytes after the last complete part (a truncated/malformed final part, or padding), kept
134
+ //verbatim. No codec of its own — it is set/read by the `parts` field (which owns the single
135
+ //offset walk); this entry is metadata so the editor sees the trailing bytes.
136
+ trailer: {
137
+ type: 'string',
138
+ label: 'Trailer',
139
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX
140
+ }
141
+ }
142
+ };
143
+ }
144
+ match() {
145
+ //collectd rides on UDP port 25826 (selected via the udpport:25826 bucket). Require the 4-byte
146
+ //minimum for one part header. The binary header carries no strong content magic, so the
147
+ //well-known port is the signature — stays a port-bucket protocol (matchKeys only, NO
148
+ //heuristicFallback: a 2-byte part type is far too weak to claim collectd off its port).
149
+ if (!this.prevCodecModule || this.prevCodecModule.id !== 'udp')
150
+ return false;
151
+ return this.packet.length - this.startPos >= 4;
152
+ }
153
+ }
154
+ exports.Collectd = Collectd;
@@ -0,0 +1,30 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * DCCP — Datagram Congestion Control Protocol (RFC 4340), carried directly over IP as protocol 33. The
6
+ * generic header begins with Source Port (2), Destination Port (2), Data Offset (1, in 32-bit words —
7
+ * the length of the whole DCCP header including options), a byte split into CCVal (high 4 bits) and
8
+ * CsCov (low 4 bits), a 2-byte Checksum, and a byte split into Res (3 bits), Type (4 bits — 0 Request,
9
+ * 1 Response, 2 Data, 3 Ack, 4 DataAck, 5 CloseReq, 6 Close, 7 Reset) and X (1 bit, Extended Sequence
10
+ * Numbers). After that byte come the (X-dependent-width) Reserved + Sequence Number and any type-specific
11
+ * fields / options — everything up to Data Offset*4.
12
+ *
13
+ * To sidestep the X sequence-width branch and stay byte-perfect, this codec structures only the fixed
14
+ * 9-byte prefix (ports / data offset / ccval+cscov / checksum / res+type+x) and keeps the remainder of
15
+ * the header — Reserved, the Sequence/Ack numbers, per-type fields and options — verbatim as
16
+ * `headerOptions` hex (bytes 9 .. DataOffset*4). Application data after the header is kept as `payload`
17
+ * hex, bounded by the enclosing IP datagram so an inflated Data Offset can't read past the IP payload.
18
+ * The Checksum is honored verbatim, never recomputed; Data Offset is honored when supplied, else derived
19
+ * from the actual bytes. A well-formed datagram round-trips byte-for-byte.
20
+ */
21
+ export declare class DCCP extends BaseHeader {
22
+ #private;
23
+ get SCHEMA(): ProtocolJSONSchema;
24
+ readonly id: string;
25
+ readonly name: string;
26
+ readonly nickname: string;
27
+ readonly matchKeys: string[];
28
+ match(): boolean;
29
+ readonly demuxProducers: DemuxProducer[];
30
+ }