@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,274 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IGMP = 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 BufferToIP_1 = require("../helper/BufferToIP");
8
+ const IPToBuffer_1 = require("../helper/IPToBuffer");
9
+ const BufferToNumber_1 = require("../helper/BufferToNumber");
10
+ const NumberToBuffer_1 = require("../helper/NumberToBuffer");
11
+ const StringContentEncodingEnum_1 = require("../lib/StringContentEncodingEnum");
12
+ /**
13
+ * IGMP — Internet Group Management Protocol (IGMPv2 RFC 2236, IGMPv3 RFC 3376), carried directly over
14
+ * IPv4 as protocol 2. Every message opens with a fixed 4-byte header — Type (1), Max Resp Code (1) and
15
+ * a 16-bit Checksum (ones-complement over the whole IGMP message) — followed by a type-driven body:
16
+ *
17
+ * - v1/v2 (Membership Query with total length 8 / Report 0x12 / Report 0x16 / Leave 0x17): a single
18
+ * 4-byte Group Address (dotted-quad).
19
+ * - v3 Membership Query (Type 0x11 with an IP payload ≥ 12 bytes): Group Address (4) + Resv/S/QRV (1) +
20
+ * QQIC (1) + Number of Sources (2) + that many 4-byte source addresses, kept verbatim as `sources`
21
+ * hex (bounded by the source count and the IP payload).
22
+ * - v3 Membership Report (Type 0x22): 2 reserved bytes + Number of Group Records (2) + the group
23
+ * records, kept verbatim as `records` hex (bounded by the IP payload).
24
+ *
25
+ * The Checksum is honored verbatim, never recomputed (encode is a faithful executor); a well-formed
26
+ * message round-trips byte-for-byte. The message is bounded by the enclosing IPv4 datagram (total
27
+ * length − IP header length) so trailing padding is left to the codec's recursion / RawData. The v3
28
+ * source/record counts are honor-else-derive; the v3 record structures are kept as bounded hex.
29
+ */
30
+ class IGMP extends BaseHeader_1.BaseHeader {
31
+ constructor() {
32
+ super(...arguments);
33
+ this.id = 'igmp';
34
+ this.name = 'Internet Group Management Protocol';
35
+ this.nickname = 'IGMP';
36
+ this.matchKeys = ['ipproto:2'];
37
+ //A leaf header — the v3 group-record structures are kept as bounded hex, nothing demuxes off IGMP.
38
+ this.demuxProducers = [];
39
+ }
40
+ static #schemaCache;
41
+ get SCHEMA() {
42
+ return (IGMP.#schemaCache ??= IGMP.#buildSchema());
43
+ }
44
+ /**
45
+ * Bytes of IGMP the IP layer below says are available: IPv4 carries a total-length field, so the
46
+ * IGMP payload is (total length − IP header length). Mirrors the GRE/OSPF #available() pattern so
47
+ * body reads are bounded by the real on-wire length rather than trusting a count field alone.
48
+ * Returns the captured-bytes remainder when no length is present (0 floor).
49
+ * @private
50
+ */
51
+ #available() {
52
+ const prev = this.prevCodecModule;
53
+ if (!prev)
54
+ return 0;
55
+ const ipv4TotalLength = prev.instance.length.getValue(0);
56
+ if (ipv4TotalLength) {
57
+ const payload = ipv4TotalLength - prev.length;
58
+ return payload < 0 ? 0 : payload;
59
+ }
60
+ const remaining = this.packet.length - this.startPos;
61
+ return remaining < 0 ? 0 : remaining;
62
+ }
63
+ /** True when this is an IGMPv3 Membership Query — Type 0x11 with an IP payload of at least 12 bytes. */
64
+ #isV3Query() {
65
+ const type = this.instance.type.getValue(0);
66
+ return type === 0x11 && this.#available() >= 12;
67
+ }
68
+ /** True when this is an IGMPv3 Membership Report (Type 0x22): reserved + group records, no group address. */
69
+ #isV3Report() {
70
+ const type = this.instance.type.getValue(0);
71
+ return type === 0x22;
72
+ }
73
+ static #buildSchema() {
74
+ return {
75
+ type: 'object',
76
+ summary: 'IGMP type=${type} group=${groupAddress}',
77
+ properties: {
78
+ //==== Fixed 4-byte header (RFC 2236 §2, RFC 3376 §4) ====
79
+ type: this.fieldUInt('type', 0, 1, 'Type'),
80
+ maxRespCode: this.fieldUInt('maxRespCode', 1, 1, 'Max Resp Code'),
81
+ //Honored verbatim: the IGMP checksum (ones-complement over the whole message) is never
82
+ //recomputed, so a captured packet round-trips byte-for-byte even if it lies.
83
+ checksum: this.fieldUInt('checksum', 2, 2, 'Checksum'),
84
+ //==== Group Address (offset 4): present for every type except the v3 Report (0x22),
85
+ //whose bytes 4-7 are reserved + record count instead. ====
86
+ groupAddress: {
87
+ type: 'string',
88
+ label: 'Multicast Address',
89
+ minLength: 7,
90
+ maxLength: 15,
91
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.IPv4,
92
+ decode: function () {
93
+ if (this.#isV3Report())
94
+ return;
95
+ this.instance.groupAddress.setValue((0, BufferToIP_1.BufferToIPv4)(this.readBytes(4, 4)));
96
+ },
97
+ encode: function () {
98
+ if (this.#isV3Report())
99
+ return;
100
+ const groupAddress = this.instance.groupAddress.getValue('0.0.0.0', (nodePath) => this.recordError(nodePath, 'Not Found'));
101
+ this.instance.groupAddress.setValue(groupAddress);
102
+ this.writeBytes(4, (0, IPToBuffer_1.IPv4ToBuffer)(groupAddress));
103
+ }
104
+ },
105
+ //==== IGMPv3 Membership Query body (RFC 3376 §4.1), decoded only when #isV3Query() ====
106
+ resvSQRV: {
107
+ type: 'integer',
108
+ label: 'Resv/S/QRV',
109
+ minimum: 0,
110
+ maximum: 255,
111
+ decode: function () {
112
+ if (!this.#isV3Query())
113
+ return;
114
+ this.instance.resvSQRV.setValue(this.readBytes(8, 1)[0] ?? 0);
115
+ },
116
+ encode: function () {
117
+ if (!this.#isV3Query())
118
+ return;
119
+ this.writeBytes(8, Buffer.from([this.instance.resvSQRV.getValue(0) & 0xff]));
120
+ }
121
+ },
122
+ qqic: {
123
+ type: 'integer',
124
+ label: 'QQIC',
125
+ minimum: 0,
126
+ maximum: 255,
127
+ decode: function () {
128
+ if (!this.#isV3Query())
129
+ return;
130
+ this.instance.qqic.setValue(this.readBytes(9, 1)[0] ?? 0);
131
+ },
132
+ encode: function () {
133
+ if (!this.#isV3Query())
134
+ return;
135
+ this.writeBytes(9, Buffer.from([this.instance.qqic.getValue(0) & 0xff]));
136
+ }
137
+ },
138
+ numSources: {
139
+ type: 'integer',
140
+ label: 'Number of Sources',
141
+ minimum: 0,
142
+ maximum: 65535,
143
+ decode: function () {
144
+ if (!this.#isV3Query())
145
+ return;
146
+ this.instance.numSources.setValue((0, BufferToNumber_1.BufferToUInt16)(this.readBytes(10, 2)));
147
+ },
148
+ encode: function () {
149
+ if (!this.#isV3Query())
150
+ return;
151
+ //honor-else-derive: honored when supplied (a crafted message may lie); else the
152
+ //number of 4-byte source addresses carried in the `sources` hex.
153
+ const provided = this.instance.numSources.getValue();
154
+ let value = (provided !== undefined && provided !== null)
155
+ ? provided
156
+ : Math.floor((0, HexToBuffer_1.HexToBuffer)(this.instance.sources.getValue('')).length / 4);
157
+ if (value > 65535) {
158
+ this.recordError(this.instance.numSources.getPath(), 'Maximum value is 65535');
159
+ value = 65535;
160
+ }
161
+ if (value < 0)
162
+ value = 0;
163
+ this.instance.numSources.setValue(value);
164
+ this.writeBytes(10, (0, NumberToBuffer_1.UInt16ToBuffer)(value));
165
+ }
166
+ },
167
+ //Source addresses (offset 12), Number-of-Sources × 4 bytes, kept verbatim. Bounded by
168
+ //both the source count and the IP payload so a lying count can't read past the datagram;
169
+ //any surplus is left to the codec's recursion / RawData.
170
+ sources: {
171
+ type: 'string',
172
+ label: 'Source Addresses',
173
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
174
+ decode: function () {
175
+ if (!this.#isV3Query())
176
+ return;
177
+ const available = this.#available();
178
+ let byteLength = this.instance.numSources.getValue(0) * 4;
179
+ const max = available - 12;
180
+ if (byteLength > max)
181
+ byteLength = max;
182
+ if (byteLength > 0)
183
+ this.instance.sources.setValue((0, BufferToHex_1.BufferToHex)(this.readBytes(12, byteLength)));
184
+ },
185
+ encode: function () {
186
+ if (!this.#isV3Query())
187
+ return;
188
+ const sources = this.instance.sources.getValue('');
189
+ if (sources)
190
+ this.writeBytes(12, (0, HexToBuffer_1.HexToBuffer)(sources));
191
+ }
192
+ },
193
+ //==== IGMPv3 Membership Report body (RFC 3376 §4.2), decoded only for Type 0x22 ====
194
+ reserved: {
195
+ type: 'string',
196
+ label: 'Reserved',
197
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
198
+ hidden: true,
199
+ decode: function () {
200
+ if (!this.#isV3Report())
201
+ return;
202
+ this.instance.reserved.setValue((0, BufferToHex_1.BufferToHex)(this.readBytes(4, 2)));
203
+ },
204
+ encode: function () {
205
+ if (!this.#isV3Report())
206
+ return;
207
+ this.writeBytes(4, (0, HexToBuffer_1.HexToBuffer)(this.instance.reserved.getValue('0000')));
208
+ }
209
+ },
210
+ numGroupRecords: {
211
+ type: 'integer',
212
+ label: 'Number of Group Records',
213
+ minimum: 0,
214
+ maximum: 65535,
215
+ decode: function () {
216
+ if (!this.#isV3Report())
217
+ return;
218
+ this.instance.numGroupRecords.setValue((0, BufferToNumber_1.BufferToUInt16)(this.readBytes(6, 2)));
219
+ },
220
+ encode: function () {
221
+ if (!this.#isV3Report())
222
+ return;
223
+ //Honored verbatim (a group record is variable-length, so the count is not derived
224
+ //from the bounded `records` hex); defaults to 0 when not supplied.
225
+ let value = this.instance.numGroupRecords.getValue(0);
226
+ if (value > 65535) {
227
+ this.recordError(this.instance.numGroupRecords.getPath(), 'Maximum value is 65535');
228
+ value = 65535;
229
+ }
230
+ if (value < 0)
231
+ value = 0;
232
+ this.instance.numGroupRecords.setValue(value);
233
+ this.writeBytes(6, (0, NumberToBuffer_1.UInt16ToBuffer)(value));
234
+ }
235
+ },
236
+ //Group records (offset 8), kept verbatim as bounded hex to the end of the IP payload —
237
+ //the group-record structures (record type, aux data, per-record sources) are not
238
+ //sub-decoded in this slice.
239
+ records: {
240
+ type: 'string',
241
+ label: 'Group Records',
242
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
243
+ decode: function () {
244
+ if (!this.#isV3Report())
245
+ return;
246
+ const available = this.#available();
247
+ if (available > 8)
248
+ this.instance.records.setValue((0, BufferToHex_1.BufferToHex)(this.readBytes(8, available - 8)));
249
+ },
250
+ encode: function () {
251
+ if (!this.#isV3Report())
252
+ return;
253
+ const records = this.instance.records.getValue('');
254
+ if (records)
255
+ this.writeBytes(8, (0, HexToBuffer_1.HexToBuffer)(records));
256
+ }
257
+ }
258
+ }
259
+ };
260
+ }
261
+ match() {
262
+ //IGMP sits directly on IPv4 with protocol 2 (accept an IPv6 next-header of 2 too, for symmetry
263
+ //with the other IP-borne codecs), and needs at least its fixed 4-byte header plus a group
264
+ //address (the smallest well-formed v1/v2 message is 8 bytes) within the IP payload.
265
+ if (!this.prevCodecModule)
266
+ return false;
267
+ const protocol = this.prevCodecModule.instance.protocol.getValue(0);
268
+ const nextHeader = this.prevCodecModule.instance.nxt.getValue(0);
269
+ if (protocol !== 2 && nextHeader !== 2)
270
+ return false;
271
+ return this.#available() >= 8;
272
+ }
273
+ }
274
+ exports.IGMP = IGMP;
@@ -0,0 +1,32 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * IMAP — the Internet Message Access Protocol version 4rev1 (RFC 3501), carried as US-ASCII text over TCP
6
+ * well-known port 143 (or 993 for the TLS-wrapped IMAPS bucket). The control channel is line-based and
7
+ * TAG-prefixed: a client sends `<tag> COMMAND args\r\n` (`a001 LOGIN alice secret\r\n`, `A2 SELECT INBOX\r\n`)
8
+ * and the server answers with either a tagged status completion (`a001 OK LOGIN completed\r\n`), an
9
+ * untagged response (`* OK IMAP4rev1 ready\r\n`, `* 18 EXISTS\r\n`), or a command continuation request
10
+ * (`+ Ready for literal data\r\n`).
11
+ *
12
+ * Like FTP, SMTP, POP3, Syslog, SIP and HTTP, the message is text whose full internal structure (arbitrary
13
+ * arguments, significant whitespace, literals, multi-line untagged responses) is richer than a form needs.
14
+ * So the ENTIRE raw message is kept verbatim as the authoritative `message` field (hex) and re-emitted
15
+ * untouched; only the first line is parsed on decode into display-only metadata (kind/tag/command/status/
16
+ * text). Encode never reconstructs the message from the parsed fields — it writes `message` back
17
+ * byte-for-byte — so any conformant (or even malformed) IMAP line round-trips exactly.
18
+ *
19
+ * Note: a single TCP segment may carry more than one line or only part of a multi-line/literal response;
20
+ * reassembly across segments is out of scope. This single-segment codec keeps whatever bytes are present
21
+ * verbatim, which is byte-perfect for the single-packet case.
22
+ */
23
+ export declare class IMAP 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,185 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.IMAP = 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
+ /** IMAP command verbs (RFC 3501 + STARTTLS/IDLE) used only to recognize a `<tag> VERB` command line. */
10
+ const IMAP_COMMANDS = ['CAPABILITY', 'NOOP', 'LOGOUT', 'STARTTLS', 'AUTHENTICATE', 'LOGIN', 'SELECT', 'EXAMINE', 'CREATE', 'DELETE', 'RENAME', 'SUBSCRIBE', 'UNSUBSCRIBE', 'LIST', 'LSUB', 'STATUS', 'APPEND', 'CHECK', 'CLOSE', 'EXPUNGE', 'SEARCH', 'FETCH', 'STORE', 'COPY', 'UID', 'IDLE'];
11
+ /** IMAP status conditions (RFC 3501 §7.1) that a tagged/untagged server response carries after its prefix. */
12
+ const IMAP_STATUSES = ['OK', 'NO', 'BAD', 'PREAUTH', 'BYE'];
13
+ /**
14
+ * IMAP — the Internet Message Access Protocol version 4rev1 (RFC 3501), carried as US-ASCII text over TCP
15
+ * well-known port 143 (or 993 for the TLS-wrapped IMAPS bucket). The control channel is line-based and
16
+ * TAG-prefixed: a client sends `<tag> COMMAND args\r\n` (`a001 LOGIN alice secret\r\n`, `A2 SELECT INBOX\r\n`)
17
+ * and the server answers with either a tagged status completion (`a001 OK LOGIN completed\r\n`), an
18
+ * untagged response (`* OK IMAP4rev1 ready\r\n`, `* 18 EXISTS\r\n`), or a command continuation request
19
+ * (`+ Ready for literal data\r\n`).
20
+ *
21
+ * Like FTP, SMTP, POP3, Syslog, SIP and HTTP, the message is text whose full internal structure (arbitrary
22
+ * arguments, significant whitespace, literals, multi-line untagged responses) is richer than a form needs.
23
+ * So the ENTIRE raw message is kept verbatim as the authoritative `message` field (hex) and re-emitted
24
+ * untouched; only the first line is parsed on decode into display-only metadata (kind/tag/command/status/
25
+ * text). Encode never reconstructs the message from the parsed fields — it writes `message` back
26
+ * byte-for-byte — so any conformant (or even malformed) IMAP line round-trips exactly.
27
+ *
28
+ * Note: a single TCP segment may carry more than one line or only part of a multi-line/literal response;
29
+ * reassembly across segments is out of scope. This single-segment codec keeps whatever bytes are present
30
+ * verbatim, which is byte-perfect for the single-packet case.
31
+ */
32
+ class IMAP extends BaseHeader_1.BaseHeader {
33
+ constructor() {
34
+ super(...arguments);
35
+ this.id = 'imap';
36
+ this.name = 'Internet Message Access Protocol';
37
+ this.nickname = 'IMAP';
38
+ //IMAP is recognized ONLY on its well-known port buckets 143 (cleartext) and 993 (TLS-wrapped IMAPS) —
39
+ //deliberately NOT via heuristicFallback. Like SMTP/POP3, and unlike HTTP/RTSP (whose method sets are
40
+ //distinctive), IMAP's line signature is a generic `<tag> VERB`/`<tag> OK` shape whose second token
41
+ //(LOGIN/SELECT/LIST/STATUS/SEARCH/OK/NO/BAD/…) is SHARED with other US-ASCII line protocols this codec
42
+ //models — FTP (LIST/STATUS as STAT-family, generic verbs) and the plain OK/NO/BAD status words appear
43
+ //in many text protocols. Joining the global heuristic chain would let IMAP mislabel such a line on
44
+ //another protocol's port as IMAP (and vice-versa). Confining IMAP to its tcp:143/tcp:993 buckets keeps
45
+ //that collision impossible; alt-port IMAP is rare and falls losslessly to raw. (IMAPS on 993 is
46
+ //normally TLS-wrapped, so the bucket rarely carries plain IMAP text, but is listed for completeness.)
47
+ this.matchKeys = ['tcpport:143', 'tcpport:993'];
48
+ //A leaf header — the IMAP session it belongs to is a higher-layer concern.
49
+ this.demuxProducers = [];
50
+ }
51
+ static #schemaCache;
52
+ get SCHEMA() {
53
+ return (_a.#schemaCache ??= _a.#buildSchema());
54
+ }
55
+ /**
56
+ * Bytes of this header: IMAP rides on TCP, which has no per-message length, so take the rest of the
57
+ * segment. Reassembly across segments is out of scope (see class doc).
58
+ */
59
+ #payloadLength() {
60
+ const available = this.packet.length - this.startPos;
61
+ return available < 0 ? 0 : available;
62
+ }
63
+ /** The first line of the message (up to the first CRLF, or the whole payload if none). */
64
+ static #firstLine(text) {
65
+ const idx = text.indexOf('\r\n');
66
+ return idx >= 0 ? text.slice(0, idx) : text;
67
+ }
68
+ /**
69
+ * Parse the first line into the display-only metadata fields. The first token selects the shape:
70
+ * `*` → an untagged server response; `+` → a continuation request; anything else is a TAG, and the
71
+ * second token then decides between a tagged RESPONSE (when it is an OK/NO/BAD/PREAUTH/BYE status) and
72
+ * a client COMMAND (when it is a verb). Populated on decode only — these fields have no encode, so they
73
+ * never affect the re-emitted bytes and never mutate `message`. Never throws: missing/garbage tokens
74
+ * yield empty strings.
75
+ */
76
+ #parseFirstLine(text) {
77
+ const line = _a.#firstLine(text);
78
+ const sp1 = line.indexOf(' ');
79
+ const first = sp1 >= 0 ? line.slice(0, sp1) : line;
80
+ const rest = sp1 >= 0 ? line.slice(sp1 + 1) : '';
81
+ if (first === '*') {
82
+ //Untagged server response: `* <status?> <text>` (e.g. `* OK ...`, `* 18 EXISTS`).
83
+ const sp2 = rest.indexOf(' ');
84
+ const second = (sp2 >= 0 ? rest.slice(0, sp2) : rest).toUpperCase();
85
+ const isStatus = IMAP_STATUSES.includes(second);
86
+ this.instance.kind.setValue('untagged');
87
+ this.instance.tag.setValue('');
88
+ this.instance.command.setValue('');
89
+ this.instance.status.setValue(isStatus ? second : '');
90
+ this.instance.text.setValue(isStatus ? (sp2 >= 0 ? rest.slice(sp2 + 1) : '') : rest);
91
+ return;
92
+ }
93
+ if (first === '+') {
94
+ //Continuation request: `+ <text>` — the server asks the client to send more (e.g. a literal).
95
+ this.instance.kind.setValue('continuation');
96
+ this.instance.tag.setValue('');
97
+ this.instance.command.setValue('');
98
+ this.instance.status.setValue('');
99
+ this.instance.text.setValue(rest);
100
+ return;
101
+ }
102
+ //Tagged line: the first token is the TAG. The second token is either a status (tagged response) or
103
+ //a verb (client command).
104
+ const sp2 = rest.indexOf(' ');
105
+ const second = (sp2 >= 0 ? rest.slice(0, sp2) : rest).toUpperCase();
106
+ const remainder = sp2 >= 0 ? rest.slice(sp2 + 1) : '';
107
+ this.instance.tag.setValue(first);
108
+ if (IMAP_STATUSES.includes(second)) {
109
+ this.instance.kind.setValue('tagged');
110
+ this.instance.command.setValue('');
111
+ this.instance.status.setValue(second);
112
+ this.instance.text.setValue(remainder);
113
+ return;
114
+ }
115
+ this.instance.kind.setValue('command');
116
+ this.instance.command.setValue(second);
117
+ this.instance.status.setValue('');
118
+ this.instance.text.setValue(remainder);
119
+ }
120
+ static #buildSchema() {
121
+ return {
122
+ type: 'object',
123
+ summary: 'IMAP ${command}${status}',
124
+ properties: {
125
+ //The whole raw message is the single source of truth: decoded verbatim to hex and
126
+ //re-emitted untouched (byte-perfect for any IMAP control text). The first line is parsed
127
+ //into the display-only metadata below, which carry no codec of their own.
128
+ message: {
129
+ type: 'string',
130
+ label: 'Message',
131
+ contentEncoding: StringContentEncodingEnum_1.StringContentEncodingEnum.HEX,
132
+ decode: function () {
133
+ const available = this.#payloadLength();
134
+ if (available <= 0) {
135
+ this.instance.message.setValue('');
136
+ this.#parseFirstLine('');
137
+ return;
138
+ }
139
+ const raw = this.readBytes(0, available);
140
+ this.instance.message.setValue((0, BufferToHex_1.BufferToHex)(raw));
141
+ this.#parseFirstLine(raw.toString('latin1'));
142
+ },
143
+ encode: function () {
144
+ //Re-emit the authoritative message verbatim — never reconstruct from metadata.
145
+ this.writeBytes(0, (0, HexToBuffer_1.HexToBuffer)(this.instance.message.getValue('')));
146
+ }
147
+ },
148
+ //Display-only metadata parsed from the first line on decode (no encode — populated by the
149
+ //message field above, never read back). kind distinguishes the four line shapes; tag is the
150
+ //command/response tag (empty for untagged/continuation); command/status/text describe the
151
+ //recognized tokens.
152
+ kind: { type: 'string', label: 'Kind' },
153
+ tag: { type: 'string', label: 'Tag' },
154
+ command: { type: 'string', label: 'Command' },
155
+ status: { type: 'string', label: 'Status' },
156
+ text: { type: 'string', label: 'Text' }
157
+ }
158
+ };
159
+ }
160
+ match() {
161
+ //IMAP rides on TCP as US-ASCII, TAG-prefixed text. Recognize it by the line signature: an `* `
162
+ //(untagged) or `+ ` (continuation) server prefix, or a `<tag> <VERB-or-status>` shape whose second
163
+ //token is a known IMAP verb or an OK/NO/BAD/PREAUTH/BYE status — so non-IMAP traffic on port
164
+ //143/993 falls through to raw rather than claiming an un-decodable text layer.
165
+ if (!this.prevCodecModule)
166
+ return false;
167
+ if (this.prevCodecModule.id !== 'tcp')
168
+ return false;
169
+ if (this.#payloadLength() < 3)
170
+ return false;
171
+ const lead = this.readBytes(0, 32, true).toString('latin1');
172
+ if (/^\* /.test(lead))
173
+ return true;
174
+ if (/^\+ /.test(lead))
175
+ return true;
176
+ const line = _a.#firstLine(lead);
177
+ const sp1 = line.indexOf(' ');
178
+ if (sp1 < 0)
179
+ return false;
180
+ const second = (line.slice(sp1 + 1).split(/[ \r]/)[0] || '').toUpperCase();
181
+ return IMAP_COMMANDS.includes(second) || IMAP_STATUSES.includes(second);
182
+ }
183
+ }
184
+ exports.IMAP = IMAP;
185
+ _a = IMAP;
@@ -0,0 +1,29 @@
1
+ import { BaseHeader } from '../abstracts/BaseHeader';
2
+ import { ProtocolJSONSchema } from '../schema/ProtocolJSONSchema';
3
+ import { DemuxProducer } from '../types/DemuxProducer';
4
+ /**
5
+ * IPFIX — IP Flow Information Export (RFC 7011, also known as NetFlow v10), UDP port 4739. Every IPFIX
6
+ * Message begins with a fixed 16-byte Message Header (all big-endian) — Version (always 10), Length (the
7
+ * total message octet count including this header), Export Time, Sequence Number and Observation Domain
8
+ * ID — followed by one or more Sets. Each Set is a 4-byte header — Set ID (2 = Template Set, 3 = Options
9
+ * Template Set, >= 256 = a Data Set keyed by the Template ID) plus Set Length (the octet count of the
10
+ * whole Set including its 4-byte header) — followed by the Set records.
11
+ *
12
+ * The record layout of a Set is template-driven: a Data Set can only be parsed against the Template Set
13
+ * that defined its Template ID, which is cross-message, session-scoped state. So this single-message
14
+ * codec keeps each Set structured only down to {Set ID, Set Length, verbatim hex body} — byte-perfect —
15
+ * and does not sub-decode the records. The message Length is auto-computed on encode when not supplied,
16
+ * else honored verbatim (a crafted message may lie); each Set Length is honored verbatim, and the Sets
17
+ * walk is bounded by BOTH the message Length and the captured UDP payload, so trailing bytes are left to
18
+ * the codec's recursion / RawData. A well-formed message round-trips byte-for-byte.
19
+ */
20
+ export declare class IPFIX extends BaseHeader {
21
+ #private;
22
+ get SCHEMA(): ProtocolJSONSchema;
23
+ readonly id: string;
24
+ readonly name: string;
25
+ readonly nickname: string;
26
+ readonly matchKeys: string[];
27
+ match(): boolean;
28
+ readonly demuxProducers: DemuxProducer[];
29
+ }