@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,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SercosIII = 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
+ * Sercos III — the real-time industrial Ethernet of the Sercos automation bus (IEC 61491 / IEC 61158,
10
+ * IEC 61784 CPF-16), carried directly in an Ethernet II frame with EtherType 0x88CD (an Ethernet child —
11
+ * no IP/UDP). Every communication cycle the master emits Master Data Telegrams (MDT) and the slaves answer
12
+ * with Acknowledge Telegrams (AT); both frame kinds share the same EtherType and are distinguished by the
13
+ * Telegram Type bit in the first header byte.
14
+ *
15
+ * The frame opens with the Sercos III telegram header. This minimal slice structures the fixed leading
16
+ * bytes and keeps the per-device payload verbatim:
17
+ *
18
+ * Byte 0 — Telegram Type field (a bitfield, MSB-first per the Wireshark `siii` dissector):
19
+ * - bit 7 (0x80) channel — 0 = P-Telegram (primary line), 1 = S-Telegram (secondary line)
20
+ * - bit 6 (0x40) telegramType — 0 = MDT (Master Data Telegram), 1 = AT (Acknowledge Telegram)
21
+ * - bit 5 (0x20) cycleCountValid — the MST cycle count is valid
22
+ * - bit 4 (0x10) reserved — preserved verbatim for a byte-perfect round-trip
23
+ * - bits 0..3 (0x0f) telegramNumber— MDT/AT index within the cycle (0..15)
24
+ * Byte 1 — Phase field (the Master Sync Telegram, MST):
25
+ * - the Phase occupies mask 0x8f (bit 7 = phase switching, bits 0..3 = communication phase CP0..CP4),
26
+ * a non-contiguous field kept as one value; the Cycle Count occupies mask 0x70 (bits 4..6).
27
+ * Bytes 2..5 — CRC32 of the MST, kept verbatim (little-endian on the wire per the dissector) and never
28
+ * recomputed, so a captured frame round-trips byte-for-byte.
29
+ *
30
+ * Everything after the 6-byte header (the phase-dependent per-device connection / service-channel data) is
31
+ * command- and topology-dependent, so this slice keeps it verbatim as `data` hex (byte-perfect), bounded by
32
+ * the end of the Ethernet payload (Sercos III has no length field of its own — it runs to the end of the
33
+ * frame, like LLDP/GOOSE). Structuring the per-device bodies (device control/status, service channel, hot
34
+ * plug) is a deferred slice. The MST header is genuine for the CP0–CP2 scanning phases and MDT0; for a
35
+ * CP3/CP4 operational device telegram the byte-1..5 labels are nominal but the bytes are still reproduced
36
+ * exactly because every header field is read and re-emitted verbatim.
37
+ */
38
+ class SercosIII extends BaseHeader_1.BaseHeader {
39
+ constructor() {
40
+ super(...arguments);
41
+ this.id = 'sercos3';
42
+ this.name = 'Sercos III';
43
+ this.nickname = 'SercosIII';
44
+ this.matchKeys = ['ethertype:88cd'];
45
+ //A leaf header — the per-device connection / service-channel bodies require phase- and topology-dependent
46
+ //parsing (deferred slice).
47
+ this.demuxProducers = [];
48
+ }
49
+ static #schemaCache;
50
+ get SCHEMA() {
51
+ return (SercosIII.#schemaCache ??= SercosIII.#buildSchema());
52
+ }
53
+ static #buildSchema() {
54
+ return {
55
+ type: 'object',
56
+ summary: 'Sercos III type=${telegramType} tel=${telegramNumber} phase=${phase}',
57
+ properties: {
58
+ //==== Byte 0: Telegram Type field ====
59
+ //Each sub-field owns its own bits of byte 0 via writeBits (which masks each field, so they
60
+ //never clobber). All 8 bits are accounted for (0x80 channel, 0x40 type, 0x20 cycleCountValid,
61
+ //0x10 reserved, 0x0f telegramNumber) so byte 0 round-trips exactly.
62
+ channel: {
63
+ type: 'integer',
64
+ label: 'Channel',
65
+ minimum: 0,
66
+ maximum: 1,
67
+ decode: function () {
68
+ this.instance.channel.setValue(this.readBits(0, 1, 0, 1));
69
+ },
70
+ encode: function () {
71
+ this.writeBits(0, 1, 0, 1, this.instance.channel.getValue(0) & 0x1);
72
+ }
73
+ },
74
+ telegramType: {
75
+ type: 'integer',
76
+ label: 'Telegram Type',
77
+ minimum: 0,
78
+ maximum: 1,
79
+ decode: function () {
80
+ this.instance.telegramType.setValue(this.readBits(0, 1, 1, 1));
81
+ },
82
+ encode: function () {
83
+ this.writeBits(0, 1, 1, 1, this.instance.telegramType.getValue(0) & 0x1);
84
+ }
85
+ },
86
+ cycleCountValid: {
87
+ type: 'integer',
88
+ label: 'Cycle Count Valid',
89
+ minimum: 0,
90
+ maximum: 1,
91
+ decode: function () {
92
+ this.instance.cycleCountValid.setValue(this.readBits(0, 1, 2, 1));
93
+ },
94
+ encode: function () {
95
+ this.writeBits(0, 1, 2, 1, this.instance.cycleCountValid.getValue(0) & 0x1);
96
+ }
97
+ },
98
+ //Bit 4 (0x10) of byte 0 is unassigned in the dissector — kept verbatim so no bit is lost.
99
+ reserved: {
100
+ type: 'integer',
101
+ label: 'Reserved',
102
+ minimum: 0,
103
+ maximum: 1,
104
+ default: 0,
105
+ decode: function () {
106
+ this.instance.reserved.setValue(this.readBits(0, 1, 3, 1));
107
+ },
108
+ encode: function () {
109
+ this.writeBits(0, 1, 3, 1, this.instance.reserved.getValue(0) & 0x1);
110
+ }
111
+ },
112
+ telegramNumber: {
113
+ type: 'integer',
114
+ label: 'Telegram Number',
115
+ minimum: 0,
116
+ maximum: 15,
117
+ decode: function () {
118
+ this.instance.telegramNumber.setValue(this.readBits(0, 1, 4, 4));
119
+ },
120
+ encode: function () {
121
+ this.writeBits(0, 1, 4, 4, this.instance.telegramNumber.getValue(0) & 0x0f);
122
+ }
123
+ },
124
+ //==== Byte 1: Phase field (MST) ====
125
+ //Phase is a non-contiguous field (mask 0x8f = bit 7 + bits 0..3); Cycle Count is mask 0x70
126
+ //(bits 4..6). `phase` owns the single write of byte 1, reassembling both values so they never
127
+ //clobber — phase's 0x8f and cycleCnt's 0x70 are disjoint and together cover all 8 bits.
128
+ phase: {
129
+ type: 'integer',
130
+ label: 'Phase',
131
+ minimum: 0,
132
+ maximum: 143,
133
+ decode: function () {
134
+ this.instance.phase.setValue(this.readBytes(1, 1)[0] & 0x8f);
135
+ },
136
+ encode: function () {
137
+ const node = this.instance.phase;
138
+ let phase = node.getValue(0, (nodePath) => this.recordError(nodePath, 'Not Found'));
139
+ if (phase > 0x8f) {
140
+ this.recordError(node.getPath(), 'Maximum value is 143');
141
+ phase = 0x8f;
142
+ }
143
+ if (phase < 0) {
144
+ this.recordError(node.getPath(), 'Minimum value is 0');
145
+ phase = 0;
146
+ }
147
+ node.setValue(phase);
148
+ const cycleCnt = this.instance.cycleCnt.getValue(0) & 0x07;
149
+ this.writeBytes(1, Buffer.from([(phase & 0x8f) | (cycleCnt << 4)]));
150
+ }
151
+ },
152
+ //Decode-only: bits 4..6 of byte 1. Written by `phase`'s encode (see above).
153
+ cycleCnt: {
154
+ type: 'integer',
155
+ label: 'Cycle Count',
156
+ minimum: 0,
157
+ maximum: 7,
158
+ default: 0,
159
+ decode: function () {
160
+ this.instance.cycleCnt.setValue((this.readBytes(1, 1)[0] >> 4) & 0x07);
161
+ }
162
+ },
163
+ //==== Bytes 2..5: MST CRC32 ====
164
+ //Honored verbatim (little-endian on the wire) and never recomputed, so a captured frame
165
+ //round-trips byte-for-byte.
166
+ crc32: this.fieldHex('crc32', 2, 4, 'CRC32'),
167
+ //==== Bytes 6..end: per-device payload ====
168
+ //Kept verbatim (byte-perfect). Sercos III has no length field of its own — it runs to the end
169
+ //of the Ethernet payload (like LLDP/GOOSE), so the body is bounded by the captured frame.
170
+ data: {
171
+ type: 'string',
172
+ label: 'Data',
173
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
174
+ decode: function () {
175
+ const remaining = this.packet.length - this.startPos;
176
+ this.instance.data.setValue(remaining > 6 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(6, remaining - 6)) : '');
177
+ },
178
+ encode: function () {
179
+ const data = this.instance.data.getValue('');
180
+ if (data)
181
+ this.writeBytes(6, (0, HexToBuffer_1.HexToBuffer)(data));
182
+ }
183
+ }
184
+ }
185
+ };
186
+ }
187
+ match() {
188
+ //An Ethernet child selected by EtherType 0x88CD (stored as a lowercase 4-hex string). 0x88CD is
189
+ //assigned exclusively to Sercos III, so the EtherType alone is a reliable discriminator. Require the
190
+ //full 6-byte MST header (Telegram Type + Phase field + CRC32) to be present so a tiny truncated
191
+ //fragment falls through to raw instead of being claimed.
192
+ if (!this.prevCodecModule || this.prevCodecModule.id !== 'eth')
193
+ return false;
194
+ if (this.prevCodecModule.instance.etherType.getValue() !== '88cd')
195
+ return false;
196
+ return this.packet.length - this.startPos >= 6;
197
+ }
198
+ }
199
+ exports.SercosIII = SercosIII;
@@ -0,0 +1,32 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * Skinny Client Control Protocol (SCCP / "Skinny", Cisco IP phone signalling), TCP port 2000. Every
6
+ * Skinny message begins with a fixed 12-byte header — Data Length, Header Version (a reserved field,
7
+ * conventionally 0) and Message Id — followed by the message-id-specific body. The whole message
8
+ * occupies `8 + dataLength` bytes: the Data Length counts every byte after the Data Length and Header
9
+ * Version fields, i.e. the 4-byte Message Id plus the body (so an empty-body KeepAlive carries
10
+ * dataLength = 4).
11
+ *
12
+ * ⚠️ Like EtherNet/IP, every multi-byte Skinny field is LITTLE-ENDIAN. There is no little-endian helper
13
+ * in this codebase, so the uint32 fields are read and written byte-by-byte in their closures (the `|`
14
+ * expression is coerced with `>>> 0` to avoid the sign-extension of a high bit).
15
+ *
16
+ * The body layout differs per Message Id (0x0000 KeepAlive, 0x0001 Register, 0x0002 IpPort, 0x0003
17
+ * KeypadButton, …) and several messages need cross-message device/call context, so this single-message
18
+ * codec keeps the body verbatim as `body` hex (byte-perfect) and does not sub-decode it. The Data Length
19
+ * is auto-computed from the body on encode when not supplied, else honored verbatim (a crafted message
20
+ * may lie); the message is bounded by Data Length so a second pipelined message or trailing bytes are
21
+ * left to the codec's recursion / RawData. A well-formed message round-trips byte-for-byte.
22
+ */
23
+ export declare class Skinny 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,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Skinny = 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
+ * Skinny Client Control Protocol (SCCP / "Skinny", Cisco IP phone signalling), TCP port 2000. Every
10
+ * Skinny message begins with a fixed 12-byte header — Data Length, Header Version (a reserved field,
11
+ * conventionally 0) and Message Id — followed by the message-id-specific body. The whole message
12
+ * occupies `8 + dataLength` bytes: the Data Length counts every byte after the Data Length and Header
13
+ * Version fields, i.e. the 4-byte Message Id plus the body (so an empty-body KeepAlive carries
14
+ * dataLength = 4).
15
+ *
16
+ * ⚠️ Like EtherNet/IP, every multi-byte Skinny field is LITTLE-ENDIAN. There is no little-endian helper
17
+ * in this codebase, so the uint32 fields are read and written byte-by-byte in their closures (the `|`
18
+ * expression is coerced with `>>> 0` to avoid the sign-extension of a high bit).
19
+ *
20
+ * The body layout differs per Message Id (0x0000 KeepAlive, 0x0001 Register, 0x0002 IpPort, 0x0003
21
+ * KeypadButton, …) and several messages need cross-message device/call context, so this single-message
22
+ * codec keeps the body verbatim as `body` hex (byte-perfect) and does not sub-decode it. The Data Length
23
+ * is auto-computed from the body on encode when not supplied, else honored verbatim (a crafted message
24
+ * may lie); the message is bounded by Data Length so a second pipelined message or trailing bytes are
25
+ * left to the codec's recursion / RawData. A well-formed message round-trips byte-for-byte.
26
+ */
27
+ class Skinny extends BaseHeader_1.BaseHeader {
28
+ constructor() {
29
+ super(...arguments);
30
+ this.id = 'skinny';
31
+ this.name = 'Skinny Client Control Protocol';
32
+ this.nickname = 'Skinny';
33
+ this.matchKeys = ['tcpport:2000'];
34
+ //A leaf header — the message-id-specific body requires per-message, cross-message context parsing.
35
+ this.demuxProducers = [];
36
+ }
37
+ static #schemaCache;
38
+ get SCHEMA() {
39
+ return (Skinny.#schemaCache ??= Skinny.#buildSchema());
40
+ }
41
+ /** A little-endian unsigned 32-bit field of 4 octets at `offset`. */
42
+ static #fieldUInt32LE(name, offset, label) {
43
+ return {
44
+ type: 'integer',
45
+ label: label,
46
+ minimum: 0,
47
+ maximum: 4294967295,
48
+ decode: function () {
49
+ const b = this.readBytes(offset, 4);
50
+ this.instance[name].setValue((b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0);
51
+ },
52
+ encode: function () {
53
+ const node = this.instance[name];
54
+ let value = node.getValue(0, (nodePath) => this.recordError(nodePath, 'Not Found'));
55
+ if (value > 4294967295) {
56
+ this.recordError(node.getPath(), 'Maximum value is 4294967295');
57
+ value = 4294967295;
58
+ }
59
+ if (value < 0) {
60
+ this.recordError(node.getPath(), 'Minimum value is 0');
61
+ value = 0;
62
+ }
63
+ node.setValue(value);
64
+ this.writeBytes(offset, Buffer.from([value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, (value >>> 24) & 0xff]));
65
+ }
66
+ };
67
+ }
68
+ static #buildSchema() {
69
+ return {
70
+ type: 'object',
71
+ summary: 'Skinny msg=${messageId} len=${dataLength}',
72
+ properties: {
73
+ //All multi-byte Skinny fields are LITTLE-ENDIAN.
74
+ dataLength: {
75
+ type: 'integer',
76
+ label: 'Data Length',
77
+ minimum: 0,
78
+ maximum: 4294967295,
79
+ decode: function () {
80
+ const b = this.readBytes(0, 4);
81
+ this.instance.dataLength.setValue((b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0);
82
+ },
83
+ encode: function () {
84
+ //Data Length counts the Message Id (4 bytes) plus the body — every byte after the
85
+ //Data Length and Header Version fields. Honored when supplied (a crafted message
86
+ //may lie); else derived from the body.
87
+ const provided = this.instance.dataLength.getValue();
88
+ let value = (provided !== undefined && provided !== null)
89
+ ? provided
90
+ : 4 + (0, HexToBuffer_1.HexToBuffer)(this.instance.body.getValue('')).length;
91
+ if (value > 4294967295) {
92
+ this.recordError(this.instance.dataLength.getPath(), 'Maximum value is 4294967295');
93
+ value = 4294967295;
94
+ }
95
+ if (value < 0) {
96
+ this.recordError(this.instance.dataLength.getPath(), 'Minimum value is 0');
97
+ value = 0;
98
+ }
99
+ this.instance.dataLength.setValue(value);
100
+ this.writeBytes(0, Buffer.from([value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, (value >>> 24) & 0xff]));
101
+ }
102
+ },
103
+ //A reserved field, conventionally 0; some builds carry a header/protocol version here.
104
+ headerVersion: this.#fieldUInt32LE('headerVersion', 4, 'Header Version'),
105
+ messageId: this.#fieldUInt32LE('messageId', 8, 'Message Id'),
106
+ //The message-id-specific body after the 12-byte header, kept verbatim. Bounded by the
107
+ //Data Length (the message ends at offset 8 + dataLength) and the captured bytes, so
108
+ //trailing / pipelined data is left to the codec's recursion / RawData.
109
+ body: {
110
+ type: 'string',
111
+ label: 'Body',
112
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
113
+ decode: function () {
114
+ const remaining = this.packet.length - this.startPos;
115
+ const dataLength = this.instance.dataLength.getValue(0);
116
+ let end = 8 + dataLength;
117
+ if (end > remaining)
118
+ end = remaining;
119
+ this.instance.body.setValue(end > 12 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(12, end - 12)) : '');
120
+ },
121
+ encode: function () {
122
+ const body = this.instance.body.getValue('');
123
+ if (body)
124
+ this.writeBytes(12, (0, HexToBuffer_1.HexToBuffer)(body));
125
+ }
126
+ }
127
+ }
128
+ };
129
+ }
130
+ match() {
131
+ //Skinny rides on TCP port 2000. The header carries no strong content magic (the Header Version
132
+ //is conventionally 0 but not guaranteed), so the well-known port is the signature: require the
133
+ //full 12-byte header to be present.
134
+ if (!this.prevCodecModule || this.prevCodecModule.id !== 'tcp')
135
+ return false;
136
+ return this.packet.length - this.startPos >= 12;
137
+ }
138
+ }
139
+ exports.Skinny = Skinny;
@@ -0,0 +1,27 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * StatsD — the Etsy/Graphite metrics line protocol, carried as plain text over UDP (well-known port
6
+ * 8125). A datagram carries one or more newline-separated metrics, each of the form
7
+ * `name:value|type[|@sampleRate]` (e.g. `gorets:1|c` a counter, `glork:320|ms` a timer). The type is a
8
+ * short tag: `c` counter, `g` gauge, `ms` timer, `s` set, `h` histogram.
9
+ *
10
+ * Like Syslog/SIP/HTTP, a StatsD datagram is free-form text whose full internal structure (multiple
11
+ * metrics, tag extensions, significant separators) is richer than a form needs, and the exact bytes are
12
+ * authoritative. So the ENTIRE raw payload is kept verbatim as the `message` field (hex) and re-emitted
13
+ * untouched — byte-perfect for any datagram, well-formed or not; only the FIRST metric line is parsed on
14
+ * decode into display-only metadata (name/value/type/sampleRate). Encode never reconstructs the message
15
+ * from the parsed fields — it writes `message` back byte-for-byte — so any StatsD datagram round-trips
16
+ * exactly. The payload is bounded by the UDP datagram length so a retained FCS/padding is not absorbed.
17
+ */
18
+ export declare class StatsD extends BaseHeader {
19
+ #private;
20
+ get SCHEMA(): ProtocolJSONSchema;
21
+ readonly id: string;
22
+ readonly name: string;
23
+ readonly nickname: string;
24
+ readonly matchKeys: string[];
25
+ match(): boolean;
26
+ readonly demuxProducers: DemuxProducer[];
27
+ }
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.StatsD = void 0;
5
+ const BaseHeader_1 = require("../abstracts/BaseHeader");
6
+ const BufferToHex_1 = require("../helper/BufferToHex");
7
+ const HexToBuffer_1 = require("../helper/HexToBuffer");
8
+ const StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
9
+ /**
10
+ * StatsD — the Etsy/Graphite metrics line protocol, carried as plain text over UDP (well-known port
11
+ * 8125). A datagram carries one or more newline-separated metrics, each of the form
12
+ * `name:value|type[|@sampleRate]` (e.g. `gorets:1|c` a counter, `glork:320|ms` a timer). The type is a
13
+ * short tag: `c` counter, `g` gauge, `ms` timer, `s` set, `h` histogram.
14
+ *
15
+ * Like Syslog/SIP/HTTP, a StatsD datagram is free-form text whose full internal structure (multiple
16
+ * metrics, tag extensions, significant separators) is richer than a form needs, and the exact bytes are
17
+ * authoritative. So the ENTIRE raw payload is kept verbatim as the `message` field (hex) and re-emitted
18
+ * untouched — byte-perfect for any datagram, well-formed or not; only the FIRST metric line is parsed on
19
+ * decode into display-only metadata (name/value/type/sampleRate). Encode never reconstructs the message
20
+ * from the parsed fields — it writes `message` back byte-for-byte — so any StatsD datagram round-trips
21
+ * exactly. The payload is bounded by the UDP datagram length so a retained FCS/padding is not absorbed.
22
+ */
23
+ class StatsD extends BaseHeader_1.BaseHeader {
24
+ constructor() {
25
+ super(...arguments);
26
+ this.id = 'statsd';
27
+ this.name = 'StatsD Metrics Protocol';
28
+ this.nickname = 'StatsD';
29
+ //StatsD rides on UDP, well-known port 8125. Port-bucketed only (no heuristicFallback): the line
30
+ //format has no distinctive magic, so claiming it off-port would risk stealing arbitrary UDP text.
31
+ this.matchKeys = ['udpport:8125'];
32
+ //A leaf header — a datagram may carry several metrics, but they are all held verbatim in `message`.
33
+ this.demuxProducers = [];
34
+ }
35
+ static #schemaCache;
36
+ get SCHEMA() {
37
+ return (_a.#schemaCache ??= _a.#buildSchema());
38
+ }
39
+ /**
40
+ * Bytes of this header: bounded by the UDP datagram length (payload = udpLength - 8) so a retained
41
+ * Ethernet FCS / padding is not absorbed into the message; never negative.
42
+ */
43
+ #payloadLength() {
44
+ let available = this.packet.length - this.startPos;
45
+ if (this.prevCodecModule && this.prevCodecModule.id === 'udp') {
46
+ const udpLength = this.prevCodecModule.instance.length.getValue(0);
47
+ if (udpLength >= 8 && udpLength - 8 < available)
48
+ available = udpLength - 8;
49
+ }
50
+ return available < 0 ? 0 : available;
51
+ }
52
+ /** The first line of the payload (up to the first newline, or the whole payload if none). */
53
+ static #firstLine(text) {
54
+ const idx = text.indexOf('\n');
55
+ return idx >= 0 ? text.slice(0, idx) : text;
56
+ }
57
+ /**
58
+ * Parse the first metric line into display-only metadata. Format: `name:value|type[|@rate]`.
59
+ * Populated on decode only — these fields have no encode, so they never affect the re-emitted bytes.
60
+ * Never throws: missing tokens yield empty strings / 0.
61
+ */
62
+ #parseFirstMetric(text) {
63
+ const line = _a.#firstLine(text).replace(/\r$/, '');
64
+ const colon = line.indexOf(':');
65
+ const name = colon >= 0 ? line.slice(0, colon) : line;
66
+ const rest = colon >= 0 ? line.slice(colon + 1) : '';
67
+ const fields = rest.split('|');
68
+ this.instance.metricName.setValue(name);
69
+ this.instance.metricValue.setValue(fields[0] ? fields[0] : '');
70
+ this.instance.metricType.setValue(fields.length > 1 && fields[1] ? fields[1] : '');
71
+ //An optional sampling-rate field is "@<rate>" (counters, RFC-less convention). Keep the raw text.
72
+ let sampleRate = '';
73
+ for (let i = 2; i < fields.length; i++) {
74
+ if (fields[i] && fields[i].startsWith('@')) {
75
+ sampleRate = fields[i].slice(1);
76
+ break;
77
+ }
78
+ }
79
+ this.instance.sampleRate.setValue(sampleRate);
80
+ }
81
+ static #buildSchema() {
82
+ return {
83
+ type: 'object',
84
+ summary: 'StatsD ${metricName}|${metricType}',
85
+ properties: {
86
+ //The whole raw payload is the single source of truth: decoded verbatim to hex and
87
+ //re-emitted untouched (byte-perfect for any datagram). The first metric line is parsed
88
+ //into the display-only metadata below, which carry no codec of their own.
89
+ message: {
90
+ type: 'string',
91
+ label: 'Message',
92
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
93
+ decode: function () {
94
+ const available = this.#payloadLength();
95
+ if (available <= 0) {
96
+ this.instance.message.setValue('');
97
+ this.#parseFirstMetric('');
98
+ return;
99
+ }
100
+ const raw = this.readBytes(0, available);
101
+ this.instance.message.setValue((0, BufferToHex_1.BufferToHex)(raw));
102
+ this.#parseFirstMetric(raw.toString('latin1'));
103
+ },
104
+ encode: function () {
105
+ //Re-emit the authoritative message verbatim — never reconstruct from metadata.
106
+ this.writeBytes(0, (0, HexToBuffer_1.HexToBuffer)(this.instance.message.getValue('')));
107
+ }
108
+ },
109
+ //Display-only metadata parsed from the first metric line on decode (no encode — populated
110
+ //by the message field above, never read back). sampleRate is empty when absent.
111
+ metricName: { type: 'string', label: 'Metric Name' },
112
+ metricValue: { type: 'string', label: 'Metric Value' },
113
+ metricType: { type: 'string', label: 'Metric Type' },
114
+ sampleRate: { type: 'string', label: 'Sample Rate' }
115
+ }
116
+ };
117
+ }
118
+ match() {
119
+ //StatsD rides on UDP port 8125 as plain text. Recognize it by the metric-line signature —
120
+ //`name:value|type` (a colon, then a value, then a pipe followed by a type letter) — so non-StatsD
121
+ //traffic on 8125 falls through to raw rather than claiming an un-decodable text layer. match()
122
+ //does not affect the re-emitted bytes; only the message field (verbatim) does.
123
+ if (!this.prevCodecModule || this.prevCodecModule.id !== 'udp')
124
+ return false;
125
+ if (this.#payloadLength() <= 0)
126
+ return false;
127
+ const lead = this.readBytes(0, 64, true).toString('latin1');
128
+ const line = _a.#firstLine(lead);
129
+ //name (no colon/pipe/newline) ':' value (no pipe/newline) '|' type-letter.
130
+ return /^[^:|\r\n]+:[^|\r\n]*\|[a-zA-Z]/.test(line);
131
+ }
132
+ }
133
+ exports.StatsD = StatsD;
134
+ _a = StatsD;
@@ -0,0 +1,34 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * ONC RPC / SunRPC (RFC 5531), the portmapper transport on TCP + UDP port 111. Every RPC message is a
6
+ * 4-byte XID followed by a 4-byte Message Type (0 CALL, 1 REPLY). A CALL body continues with the RPC
7
+ * version (== 2), the program number, the program version, the procedure, then the credential and
8
+ * verifier auth structures (each a 4-byte flavor + 4-byte length + body) and the procedure arguments.
9
+ * The portmapper program is 100000.
10
+ *
11
+ * Transport framing differs by L4 (RFC 5531 §11): over UDP the RPC message is the whole datagram; over
12
+ * TCP a 4-byte Record Marking prefix precedes it — the high bit is the last-fragment flag and the low 31
13
+ * bits are the fragment length. This header detects the transport via prevCodecModule.id and structures
14
+ * accordingly: TCP → recordMark (lastFragment + fragmentLength) then the message at offset 4; UDP → the
15
+ * message directly at offset 0.
16
+ *
17
+ * Byte-perfect strategy (minimal slice): structure the XID and Message Type, and for a CALL the four
18
+ * fixed program-identity words (rpcVersion / program / programVersion / procedure); the remainder — the
19
+ * credential, verifier and procedure arguments for a CALL, or the whole REPLY body — is kept verbatim as
20
+ * `body` hex, bounded by the transport payload (UDP length − 8, or the TCP Record Marking fragment
21
+ * length). The TCP fragmentLength is honored when supplied (a crafted frame may lie) else derived as the
22
+ * encoded message length; a well-formed message round-trips byte-for-byte. Trailing / pipelined bytes are
23
+ * left to the codec's recursion / RawData.
24
+ */
25
+ export declare class SunRPC extends BaseHeader {
26
+ #private;
27
+ get SCHEMA(): ProtocolJSONSchema;
28
+ readonly id: string;
29
+ readonly name: string;
30
+ readonly nickname: string;
31
+ readonly matchKeys: string[];
32
+ match(): boolean;
33
+ readonly demuxProducers: DemuxProducer[];
34
+ }