@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,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ENIP = 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
+ * EtherNet/IP encapsulation (ODVA / IEC 61158, IEC 61784), TCP & UDP port 44818. Every EtherNet/IP
10
+ * message begins with a fixed 24-byte encapsulation header — Command, Length (the count of bytes that
11
+ * follow the header), Session Handle, Status, an 8-byte Sender Context echoed back by the target, and an
12
+ * Options field — followed by `Length` bytes of command-specific data (the CIP Common Packet Format /
13
+ * encapsulated CIP request or reply).
14
+ *
15
+ * ⚠️ Unlike most of the codec's protocols, every multi-byte field in this header is LITTLE-ENDIAN (ODVA
16
+ * inherits the CIP on-wire byte order). There is no little-endian helper in this codebase, so the uint16
17
+ * / uint32 fields are read and written byte-by-byte in their closures.
18
+ *
19
+ * The command-specific data is the CIP/CPF payload; decoding it (item counts, address/data items, the
20
+ * embedded CIP service request) is cross-message and command-dependent state, so this single-message
21
+ * codec keeps it verbatim as `data` hex (byte-perfect). The Length is auto-computed from the data on
22
+ * encode when not supplied, else honored verbatim (a crafted message may carry any Length); the data is
23
+ * bounded by the Length field so a pipelined/trailing message is left to the codec's recursion / RawData.
24
+ * A well-formed message round-trips byte-for-byte.
25
+ */
26
+ class ENIP extends BaseHeader_1.BaseHeader {
27
+ constructor() {
28
+ super(...arguments);
29
+ this.id = 'enip';
30
+ this.name = 'EtherNet/IP';
31
+ this.nickname = 'ENIP';
32
+ this.matchKeys = ['tcpport:44818', 'udpport:44818'];
33
+ //A leaf header — the CIP/CPF data requires command-dependent, cross-message parsing.
34
+ this.demuxProducers = [];
35
+ }
36
+ static #schemaCache;
37
+ get SCHEMA() {
38
+ return (ENIP.#schemaCache ??= ENIP.#buildSchema());
39
+ }
40
+ /** A little-endian unsigned 16-bit field of 2 octets at `offset`. */
41
+ static #fieldUInt16LE(name, offset, label) {
42
+ return {
43
+ type: 'integer',
44
+ label: label,
45
+ minimum: 0,
46
+ maximum: 65535,
47
+ decode: function () {
48
+ const b = this.readBytes(offset, 2);
49
+ this.instance[name].setValue(b[0] | (b[1] << 8));
50
+ },
51
+ encode: function () {
52
+ const node = this.instance[name];
53
+ let value = node.getValue(0, (nodePath) => this.recordError(nodePath, 'Not Found'));
54
+ if (value > 65535) {
55
+ this.recordError(node.getPath(), 'Maximum value is 65535');
56
+ value = 65535;
57
+ }
58
+ if (value < 0) {
59
+ this.recordError(node.getPath(), 'Minimum value is 0');
60
+ value = 0;
61
+ }
62
+ node.setValue(value);
63
+ this.writeBytes(offset, Buffer.from([value & 0xff, (value >> 8) & 0xff]));
64
+ }
65
+ };
66
+ }
67
+ /** A little-endian unsigned 32-bit field of 4 octets at `offset`. */
68
+ static #fieldUInt32LE(name, offset, label) {
69
+ return {
70
+ type: 'integer',
71
+ label: label,
72
+ minimum: 0,
73
+ maximum: 4294967295,
74
+ decode: function () {
75
+ const b = this.readBytes(offset, 4);
76
+ this.instance[name].setValue((b[0] | (b[1] << 8) | (b[2] << 16) | (b[3] << 24)) >>> 0);
77
+ },
78
+ encode: function () {
79
+ const node = this.instance[name];
80
+ let value = node.getValue(0, (nodePath) => this.recordError(nodePath, 'Not Found'));
81
+ if (value > 4294967295) {
82
+ this.recordError(node.getPath(), 'Maximum value is 4294967295');
83
+ value = 4294967295;
84
+ }
85
+ if (value < 0) {
86
+ this.recordError(node.getPath(), 'Minimum value is 0');
87
+ value = 0;
88
+ }
89
+ node.setValue(value);
90
+ this.writeBytes(offset, Buffer.from([value & 0xff, (value >> 8) & 0xff, (value >> 16) & 0xff, (value >>> 24) & 0xff]));
91
+ }
92
+ };
93
+ }
94
+ static #buildSchema() {
95
+ return {
96
+ type: 'object',
97
+ summary: 'ENIP cmd=${command} session=${sessionHandle}',
98
+ properties: {
99
+ //All multi-byte encapsulation-header fields are LITTLE-ENDIAN (CIP on-wire byte order).
100
+ command: this.#fieldUInt16LE('command', 0, 'Command'),
101
+ length: {
102
+ type: 'integer',
103
+ label: 'Length',
104
+ minimum: 0,
105
+ maximum: 65535,
106
+ decode: function () {
107
+ const b = this.readBytes(2, 2);
108
+ this.instance.length.setValue(b[0] | (b[1] << 8));
109
+ },
110
+ encode: function () {
111
+ //Length counts only the command-specific data that follows the 24-byte header.
112
+ //Honored when supplied (a crafted message may lie); else derived from the data.
113
+ const provided = this.instance.length.getValue();
114
+ let value = (provided !== undefined && provided !== null)
115
+ ? provided
116
+ : (0, HexToBuffer_1.HexToBuffer)(this.instance.data.getValue('')).length;
117
+ if (value > 65535) {
118
+ this.recordError(this.instance.length.getPath(), 'Maximum value is 65535');
119
+ value = 65535;
120
+ }
121
+ this.instance.length.setValue(value);
122
+ this.writeBytes(2, Buffer.from([value & 0xff, (value >> 8) & 0xff]));
123
+ }
124
+ },
125
+ sessionHandle: this.#fieldUInt32LE('sessionHandle', 4, 'Session Handle'),
126
+ status: this.#fieldUInt32LE('status', 8, 'Status'),
127
+ //An 8-byte value the sender chooses and the target echoes back; opaque, kept verbatim.
128
+ senderContext: this.fieldHex('senderContext', 12, 8, 'Sender Context'),
129
+ options: this.#fieldUInt32LE('options', 20, 'Options'),
130
+ //The command-specific data (CIP Common Packet Format / encapsulated CIP), kept verbatim.
131
+ //Bounded by the Length field (data ends at offset 24 + Length) and the captured bytes,
132
+ //so trailing/pipelined data is left to the codec's recursion / RawData.
133
+ data: {
134
+ type: 'string',
135
+ label: 'Data',
136
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
137
+ decode: function () {
138
+ const remaining = this.packet.length - this.startPos;
139
+ const length = this.instance.length.getValue(0);
140
+ let end = 24 + length;
141
+ if (end > remaining)
142
+ end = remaining;
143
+ this.instance.data.setValue(end > 24 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(24, end - 24)) : '');
144
+ },
145
+ encode: function () {
146
+ const data = this.instance.data.getValue('');
147
+ if (data)
148
+ this.writeBytes(24, (0, HexToBuffer_1.HexToBuffer)(data));
149
+ }
150
+ }
151
+ }
152
+ };
153
+ }
154
+ match() {
155
+ //EtherNet/IP rides on TCP/UDP port 44818. The encapsulation header carries no strong content
156
+ //magic, so the well-known port is the signature: require the full 24-byte header to be present.
157
+ if (!this.prevCodecModule)
158
+ return false;
159
+ if (this.prevCodecModule.id !== 'tcp' && this.prevCodecModule.id !== 'udp')
160
+ return false;
161
+ return this.packet.length - this.startPos >= 24;
162
+ }
163
+ }
164
+ exports.ENIP = ENIP;
@@ -0,0 +1,27 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * ESP — IP Encapsulating Security Payload (RFC 4303), carried directly over IP as protocol 50 (both
6
+ * IPv4 `protocol` and IPv6 `nxt`). The cleartext header is just two big-endian 32-bit words: the SPI
7
+ * (Security Parameters Index — identifies the Security Association, together with the destination
8
+ * address and protocol) and a monotonic Sequence Number (anti-replay counter). Everything after those
9
+ * eight bytes — the encapsulated payload, the trailing Pad / Pad Length / Next Header, and the optional
10
+ * Integrity Check Value — is protected by the SA's cipher/authenticator and is opaque on the wire.
11
+ *
12
+ * A dissector cannot split that opaque region without the SA keys (which are out of band), so ESP is a
13
+ * leaf header: the SPI and Sequence Number are surfaced, and the remaining bytes are kept verbatim as
14
+ * `encryptedPayload` hex, bounded by the enclosing IP datagram so a trailing FCS/padding is not pulled
15
+ * in. Nothing is recomputed on encode (a faithful executor carries the ciphertext as-is), so a
16
+ * well-formed ESP packet round-trips byte-for-byte.
17
+ */
18
+ export declare class ESP 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,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ESP = 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 BufferToNumber_1 = require("../helper/BufferToNumber");
8
+ const NumberToBuffer_1 = require("../helper/NumberToBuffer");
9
+ const StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
10
+ /**
11
+ * ESP — IP Encapsulating Security Payload (RFC 4303), carried directly over IP as protocol 50 (both
12
+ * IPv4 `protocol` and IPv6 `nxt`). The cleartext header is just two big-endian 32-bit words: the SPI
13
+ * (Security Parameters Index — identifies the Security Association, together with the destination
14
+ * address and protocol) and a monotonic Sequence Number (anti-replay counter). Everything after those
15
+ * eight bytes — the encapsulated payload, the trailing Pad / Pad Length / Next Header, and the optional
16
+ * Integrity Check Value — is protected by the SA's cipher/authenticator and is opaque on the wire.
17
+ *
18
+ * A dissector cannot split that opaque region without the SA keys (which are out of band), so ESP is a
19
+ * leaf header: the SPI and Sequence Number are surfaced, and the remaining bytes are kept verbatim as
20
+ * `encryptedPayload` hex, bounded by the enclosing IP datagram so a trailing FCS/padding is not pulled
21
+ * in. Nothing is recomputed on encode (a faithful executor carries the ciphertext as-is), so a
22
+ * well-formed ESP packet round-trips byte-for-byte.
23
+ */
24
+ class ESP extends BaseHeader_1.BaseHeader {
25
+ constructor() {
26
+ super(...arguments);
27
+ this.id = 'esp';
28
+ this.name = 'IP Encapsulating Security Payload';
29
+ this.nickname = 'ESP';
30
+ this.matchKeys = ['ipproto:50'];
31
+ //A leaf header — the payload is encrypted and cannot be dissected further without the SA keys.
32
+ this.demuxProducers = [];
33
+ }
34
+ static #schemaCache;
35
+ get SCHEMA() {
36
+ return (ESP.#schemaCache ??= ESP.#buildSchema());
37
+ }
38
+ /**
39
+ * Bytes available to ESP within the enclosing IP datagram — so a short IP payload does not let the
40
+ * verbatim `encryptedPayload` read into a trailing Ethernet FCS or padding. Bounds the payload read.
41
+ */
42
+ #available() {
43
+ let available = this.packet.length - this.startPos;
44
+ const prev = this.prevCodecModule;
45
+ if (prev && prev.id === 'ipv4') {
46
+ const ipPayload = prev.instance.length.getValue(0) - prev.length;
47
+ if (ipPayload >= 0 && ipPayload < available)
48
+ available = ipPayload;
49
+ }
50
+ else if (prev && prev.id === 'ipv6') {
51
+ const ipPayload = prev.instance.plen.getValue(0);
52
+ if (ipPayload >= 0 && ipPayload < available)
53
+ available = ipPayload;
54
+ }
55
+ return available < 0 ? 0 : available;
56
+ }
57
+ static #buildSchema() {
58
+ return {
59
+ type: 'object',
60
+ summary: 'ESP spi=${spi} seq=${sequenceNumber}',
61
+ properties: {
62
+ //Security Parameters Index — big-endian 32-bit SA selector.
63
+ spi: {
64
+ type: 'integer',
65
+ label: 'SPI',
66
+ minimum: 0,
67
+ maximum: 4294967295,
68
+ decode: function () {
69
+ this.instance.spi.setValue((0, BufferToNumber_1.BufferToUInt32)(this.readBytes(0, 4)));
70
+ },
71
+ encode: function () {
72
+ const node = this.instance.spi;
73
+ let value = node.getValue(0, (nodePath) => this.recordError(nodePath, 'Not Found'));
74
+ if (value > 4294967295) {
75
+ this.recordError(node.getPath(), 'Maximum value is 4294967295');
76
+ value = 4294967295;
77
+ }
78
+ if (value < 0) {
79
+ this.recordError(node.getPath(), 'Minimum value is 0');
80
+ value = 0;
81
+ }
82
+ node.setValue(value);
83
+ this.writeBytes(0, (0, NumberToBuffer_1.UInt32ToBuffer)(value));
84
+ }
85
+ },
86
+ //Anti-replay sequence number — big-endian 32-bit, monotonically increasing per SA.
87
+ sequenceNumber: {
88
+ type: 'integer',
89
+ label: 'Sequence Number',
90
+ minimum: 0,
91
+ maximum: 4294967295,
92
+ decode: function () {
93
+ this.instance.sequenceNumber.setValue((0, BufferToNumber_1.BufferToUInt32)(this.readBytes(4, 4)));
94
+ },
95
+ encode: function () {
96
+ const node = this.instance.sequenceNumber;
97
+ let value = node.getValue(0, (nodePath) => this.recordError(nodePath, 'Not Found'));
98
+ if (value > 4294967295) {
99
+ this.recordError(node.getPath(), 'Maximum value is 4294967295');
100
+ value = 4294967295;
101
+ }
102
+ if (value < 0) {
103
+ this.recordError(node.getPath(), 'Minimum value is 0');
104
+ value = 0;
105
+ }
106
+ node.setValue(value);
107
+ this.writeBytes(4, (0, NumberToBuffer_1.UInt32ToBuffer)(value));
108
+ }
109
+ },
110
+ //The encrypted payload + padding + Pad Length + Next Header + optional ICV. Opaque without
111
+ //the SA keys, so it is kept verbatim as hex; bounded by the IP datagram so a trailing FCS/
112
+ //padding is left to the codec's recursion / RawData.
113
+ encryptedPayload: {
114
+ type: 'string',
115
+ label: 'Encrypted Payload',
116
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
117
+ decode: function () {
118
+ const end = this.#available();
119
+ this.instance.encryptedPayload.setValue(end > 8 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(8, end - 8)) : '');
120
+ },
121
+ encode: function () {
122
+ const data = this.instance.encryptedPayload.getValue('');
123
+ if (data)
124
+ this.writeBytes(8, (0, HexToBuffer_1.HexToBuffer)(data));
125
+ }
126
+ }
127
+ }
128
+ };
129
+ }
130
+ match() {
131
+ //ESP sits directly above IPv4 (protocol field) or IPv6 (next-header field) with protocol 50, and
132
+ //needs at least its 8-byte cleartext header (SPI + Sequence Number) within the IP payload.
133
+ if (!this.prevCodecModule)
134
+ return false;
135
+ if (this.prevCodecModule.instance.protocol.getValue() !== 0x32 && this.prevCodecModule.instance.nxt.getValue() !== 0x32)
136
+ return false;
137
+ return this.#available() >= 8;
138
+ }
139
+ }
140
+ exports.ESP = ESP;
@@ -0,0 +1,30 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * Elasticsearch transport protocol (internal node-to-node cluster traffic), TCP port 9300. Every
6
+ * transport message begins with a fixed prefix — the two ASCII bytes 'ES' (0x4553), a 4-byte
7
+ * big-endian Message Length (the count of bytes that follow the Length field: Request Id + Status +
8
+ * Version + the variable header + body), an 8-byte Request Id echoed between request and response, a
9
+ * 1-byte Status bitfield (bit0 request/response, bit1 error, bit2 compressed) and a 4-byte Version —
10
+ * followed by the message body (the variable header — feature set / action name — plus the serialized
11
+ * request or response object).
12
+ *
13
+ * The body layout is version-, action- and compression-dependent (StreamInput/StreamOutput vInt/vLong
14
+ * framing, optional DEFLATE, the action-specific TransportRequest/TransportResponse), so this
15
+ * single-message codec keeps it verbatim as `body` hex (byte-perfect) and does not sub-decode it. The
16
+ * Message Length is auto-computed from the fixed fields + body on encode when not supplied, else
17
+ * honored verbatim (a crafted message may lie); the message is bounded by the Length (total = 6 +
18
+ * messageLength) so a second pipelined message or trailing bytes are left to the codec's recursion /
19
+ * RawData. A well-formed message round-trips byte-for-byte.
20
+ */
21
+ export declare class Elasticsearch 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
+ }
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Elasticsearch = 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 BufferToNumber_1 = require("../helper/BufferToNumber");
8
+ const NumberToBuffer_1 = require("../helper/NumberToBuffer");
9
+ const StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
10
+ /**
11
+ * Elasticsearch transport protocol (internal node-to-node cluster traffic), TCP port 9300. Every
12
+ * transport message begins with a fixed prefix — the two ASCII bytes 'ES' (0x4553), a 4-byte
13
+ * big-endian Message Length (the count of bytes that follow the Length field: Request Id + Status +
14
+ * Version + the variable header + body), an 8-byte Request Id echoed between request and response, a
15
+ * 1-byte Status bitfield (bit0 request/response, bit1 error, bit2 compressed) and a 4-byte Version —
16
+ * followed by the message body (the variable header — feature set / action name — plus the serialized
17
+ * request or response object).
18
+ *
19
+ * The body layout is version-, action- and compression-dependent (StreamInput/StreamOutput vInt/vLong
20
+ * framing, optional DEFLATE, the action-specific TransportRequest/TransportResponse), so this
21
+ * single-message codec keeps it verbatim as `body` hex (byte-perfect) and does not sub-decode it. The
22
+ * Message Length is auto-computed from the fixed fields + body on encode when not supplied, else
23
+ * honored verbatim (a crafted message may lie); the message is bounded by the Length (total = 6 +
24
+ * messageLength) so a second pipelined message or trailing bytes are left to the codec's recursion /
25
+ * RawData. A well-formed message round-trips byte-for-byte.
26
+ */
27
+ class Elasticsearch extends BaseHeader_1.BaseHeader {
28
+ constructor() {
29
+ super(...arguments);
30
+ this.id = 'elasticsearch';
31
+ this.name = 'Elasticsearch Transport';
32
+ this.nickname = 'Elasticsearch';
33
+ this.matchKeys = ['tcpport:9300'];
34
+ //A leaf header — the body requires version/action/compression-dependent StreamInput parsing.
35
+ this.demuxProducers = [];
36
+ }
37
+ static #schemaCache;
38
+ get SCHEMA() {
39
+ return (Elasticsearch.#schemaCache ??= Elasticsearch.#buildSchema());
40
+ }
41
+ static #buildSchema() {
42
+ return {
43
+ type: 'object',
44
+ summary: 'Elasticsearch reqId=${requestId} len=${messageLength}',
45
+ properties: {
46
+ //The 'ES' magic (0x4553) — kept verbatim as hex so any prefix still round-trips.
47
+ magic: this.fieldHex('magic', 0, 2, 'Magic'),
48
+ messageLength: {
49
+ type: 'integer',
50
+ label: 'Message Length',
51
+ //Wire field: never constrain below the true lower bound. A truncated/crafted message
52
+ //may decode any value in [0, 0xffffffff]; keep the full uint32 range so a decoded
53
+ //value always re-encodes (clamped in the closure, never rejected by Ajv).
54
+ minimum: 0,
55
+ maximum: 4294967295,
56
+ decode: function () {
57
+ this.instance.messageLength.setValue((0, BufferToNumber_1.BufferToUInt32)(this.readBytes(2, 4)));
58
+ },
59
+ encode: function () {
60
+ //Length counts everything after the Length field = requestId(8) + status(1) +
61
+ //version(4) + body = 13 + body bytes. Honored when supplied (a crafted message
62
+ //may lie); else derived from the body.
63
+ const provided = this.instance.messageLength.getValue();
64
+ let value = (provided !== undefined && provided !== null)
65
+ ? provided
66
+ : 13 + (0, HexToBuffer_1.HexToBuffer)(this.instance.body.getValue('')).length;
67
+ if (value > 4294967295) {
68
+ this.recordError(this.instance.messageLength.getPath(), 'Maximum value is 4294967295');
69
+ value = 4294967295;
70
+ }
71
+ if (value < 0) {
72
+ this.recordError(this.instance.messageLength.getPath(), 'Minimum value is 0');
73
+ value = 0;
74
+ }
75
+ this.instance.messageLength.setValue(value);
76
+ this.writeBytes(2, (0, NumberToBuffer_1.UInt32ToBuffer)(value));
77
+ }
78
+ },
79
+ //An 8-byte correlation id (a Java long) matched across a request/response pair; opaque,
80
+ //kept verbatim so any value round-trips (no JS-number precision loss on 64 bits).
81
+ requestId: this.fieldHex('requestId', 6, 8, 'Request Id'),
82
+ //Status bitfield (bit0 request=0/response=1, bit1 error, bit2 compressed, bit3 handshake).
83
+ //Kept as a plain uint8 — byte-perfect and editable; the bit split is UI enrichment for later.
84
+ status: this.fieldUInt('status', 14, 1, 'Status'),
85
+ //Transport protocol version (an Elasticsearch internal version id).
86
+ version: this.fieldUInt('version', 15, 4, 'Version'),
87
+ //The variable header + serialized request/response body, kept verbatim. Bounded by the
88
+ //Message Length (message ends at offset 6 + messageLength) and the captured bytes, so
89
+ //trailing / pipelined data is left to the codec's recursion / RawData.
90
+ body: {
91
+ type: 'string',
92
+ label: 'Body',
93
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
94
+ decode: function () {
95
+ const remaining = this.packet.length - this.startPos;
96
+ const messageLength = this.instance.messageLength.getValue(0);
97
+ let end = 6 + messageLength;
98
+ if (end > remaining)
99
+ end = remaining;
100
+ this.instance.body.setValue(end > 19 ? (0, BufferToHex_1.BufferToHex)(this.readBytes(19, end - 19)) : '');
101
+ },
102
+ encode: function () {
103
+ const body = this.instance.body.getValue('');
104
+ if (body)
105
+ this.writeBytes(19, (0, HexToBuffer_1.HexToBuffer)(body));
106
+ }
107
+ }
108
+ }
109
+ };
110
+ }
111
+ match() {
112
+ //Elasticsearch transport rides on TCP port 9300. The 'ES' magic (0x4553) is only a 2-byte
113
+ //signature — too weak to claim traffic on any port — so selection stays port-bucketed
114
+ //(matchKeys) and the magic is an additional guard here. Require the full 19-byte fixed header
115
+ //(magic + length + requestId + status + version) so a short frame does not break byte-perfect
116
+ //round-trip, and reject a 9300 payload that is not 'ES' (falls through to raw).
117
+ if (!this.prevCodecModule || this.prevCodecModule.id !== 'tcp')
118
+ return false;
119
+ if (this.packet.length - this.startPos < 19)
120
+ return false;
121
+ const magic = this.readBytes(0, 2, true);
122
+ return magic[0] === 0x45 && magic[1] === 0x53;
123
+ }
124
+ }
125
+ exports.Elasticsearch = Elasticsearch;
@@ -0,0 +1,35 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * EtherCAT — Ethernet for Control Automation Technology (IEC 61158 Type 12), carried directly in an
6
+ * Ethernet II frame with EtherType 0x88A4 (an Ethernet child — no IP/UDP). Immediately after the Ethernet
7
+ * header comes a 2-byte EtherCAT header, then the EtherCAT datagram chain.
8
+ *
9
+ * ⚠️ Unlike most of the codec's protocols (which are big-endian), the 2-byte EtherCAT header is a single
10
+ * LITTLE-ENDIAN uint16. There is no little-endian helper in this codebase, so the header word is read and
11
+ * written byte-by-byte in the closures (see ENIP for the precedent). Within that 16-bit LE value `h`:
12
+ * - Length = bits 0..10 (11 bits) = byte count of all datagrams that follow the 2-byte header.
13
+ * - Reserved = bit 11 (1 bit) = preserved verbatim for a byte-perfect round-trip.
14
+ * - Type = bits 12..15 (4 bits) = 1 for EtherCAT commands (DLPDUs); other values exist.
15
+ * So `length = h & 0x07FF`, `reserved = (h >> 11) & 0x1`, `type = (h >> 12) & 0x0F`; and on encode
16
+ * `h = (length & 0x07FF) | ((reserved & 1) << 11) | ((type & 0x0F) << 12)`, written LITTLE-ENDIAN as
17
+ * `[h & 0xff, (h >> 8) & 0xff]`.
18
+ *
19
+ * The datagram chain (each datagram: 10-byte header + data + 2-byte working counter) is command-dependent,
20
+ * addressed, chainable state, so this minimal slice keeps it verbatim as `data` hex (byte-perfect), bounded
21
+ * by the Length field (data ends at offset 2 + Length, clamped to the captured bytes). Anything after the
22
+ * Length-bounded region is left to the codec's recursion / RawData (e.g. Ethernet padding). Structuring the
23
+ * datagram chain (Cmd/Idx/Address/Len/IRQ/WKC per datagram) is a deferred slice. Length is honor-else-derive
24
+ * on encode: honored when supplied (a crafted frame may carry any Length), else derived from the data.
25
+ */
26
+ export declare class EtherCAT extends BaseHeader {
27
+ #private;
28
+ get SCHEMA(): ProtocolJSONSchema;
29
+ readonly id: string;
30
+ readonly name: string;
31
+ readonly nickname: string;
32
+ readonly matchKeys: string[];
33
+ match(): boolean;
34
+ readonly demuxProducers: DemuxProducer[];
35
+ }