@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.
- package/CHANGELOG.md +17 -0
- package/LICENSE +21 -0
- package/README.md +352 -0
- package/README.zh-CN.md +342 -0
- package/dist/Codec.d.ts +133 -0
- package/dist/Codec.js +632 -0
- package/dist/PacketHeaders.d.ts +189 -0
- package/dist/PacketHeaders.js +384 -0
- package/dist/abstracts/BaseHeader.d.ts +325 -0
- package/dist/abstracts/BaseHeader.js +734 -0
- package/dist/errors/CodecSchemaValidateError.d.ts +4 -0
- package/dist/errors/CodecSchemaValidateError.js +11 -0
- package/dist/headers/ADSAMS.d.ts +33 -0
- package/dist/headers/ADSAMS.js +208 -0
- package/dist/headers/AH.d.ts +28 -0
- package/dist/headers/AH.js +137 -0
- package/dist/headers/AMQP.d.ts +31 -0
- package/dist/headers/AMQP.js +316 -0
- package/dist/headers/ARP.d.ts +26 -0
- package/dist/headers/ARP.js +243 -0
- package/dist/headers/BACnetIP.d.ts +27 -0
- package/dist/headers/BACnetIP.js +97 -0
- package/dist/headers/BFD.d.ts +28 -0
- package/dist/headers/BFD.js +155 -0
- package/dist/headers/BGP.d.ts +27 -0
- package/dist/headers/BGP.js +111 -0
- package/dist/headers/BSAPIP.d.ts +33 -0
- package/dist/headers/BSAPIP.js +78 -0
- package/dist/headers/Babel.d.ts +32 -0
- package/dist/headers/Babel.js +224 -0
- package/dist/headers/BitTorrent.d.ts +28 -0
- package/dist/headers/BitTorrent.js +72 -0
- package/dist/headers/C37118.d.ts +26 -0
- package/dist/headers/C37118.js +147 -0
- package/dist/headers/CAPWAP.d.ts +38 -0
- package/dist/headers/CAPWAP.js +275 -0
- package/dist/headers/CDP.d.ts +25 -0
- package/dist/headers/CDP.js +117 -0
- package/dist/headers/CMS.d.ts +33 -0
- package/dist/headers/CMS.js +238 -0
- package/dist/headers/COTP.d.ts +30 -0
- package/dist/headers/COTP.js +193 -0
- package/dist/headers/CassandraCQL.d.ts +28 -0
- package/dist/headers/CassandraCQL.js +117 -0
- package/dist/headers/CoAP.d.ts +29 -0
- package/dist/headers/CoAP.js +140 -0
- package/dist/headers/Codesys.d.ts +32 -0
- package/dist/headers/Codesys.js +119 -0
- package/dist/headers/Collectd.d.ts +29 -0
- package/dist/headers/Collectd.js +154 -0
- package/dist/headers/DCCP.d.ts +30 -0
- package/dist/headers/DCCP.js +204 -0
- package/dist/headers/DHCP.d.ts +26 -0
- package/dist/headers/DHCP.js +148 -0
- package/dist/headers/DHCPFailover.d.ts +30 -0
- package/dist/headers/DHCPFailover.js +104 -0
- package/dist/headers/DHCPv6.d.ts +25 -0
- package/dist/headers/DHCPv6.js +145 -0
- package/dist/headers/DNP3.d.ts +27 -0
- package/dist/headers/DNP3.js +150 -0
- package/dist/headers/DNS.d.ts +55 -0
- package/dist/headers/DNS.js +309 -0
- package/dist/headers/DTLS.d.ts +33 -0
- package/dist/headers/DTLS.js +142 -0
- package/dist/headers/Diameter.d.ts +34 -0
- package/dist/headers/Diameter.js +229 -0
- package/dist/headers/EAPOL.d.ts +32 -0
- package/dist/headers/EAPOL.js +135 -0
- package/dist/headers/EIGRP.d.ts +28 -0
- package/dist/headers/EIGRP.js +165 -0
- package/dist/headers/ENIP.d.ts +31 -0
- package/dist/headers/ENIP.js +164 -0
- package/dist/headers/ESP.d.ts +27 -0
- package/dist/headers/ESP.js +140 -0
- package/dist/headers/Elasticsearch.d.ts +30 -0
- package/dist/headers/Elasticsearch.js +125 -0
- package/dist/headers/EtherCAT.d.ts +35 -0
- package/dist/headers/EtherCAT.js +150 -0
- package/dist/headers/EthernetII.d.ts +28 -0
- package/dist/headers/EthernetII.js +117 -0
- package/dist/headers/FCoE.d.ts +38 -0
- package/dist/headers/FCoE.js +210 -0
- package/dist/headers/FTP.d.ts +34 -0
- package/dist/headers/FTP.js +158 -0
- package/dist/headers/Finger.d.ts +41 -0
- package/dist/headers/Finger.js +135 -0
- package/dist/headers/FoundationFieldbusHSE.d.ts +43 -0
- package/dist/headers/FoundationFieldbusHSE.js +163 -0
- package/dist/headers/GELF.d.ts +35 -0
- package/dist/headers/GELF.js +261 -0
- package/dist/headers/GENEVE.d.ts +26 -0
- package/dist/headers/GENEVE.js +209 -0
- package/dist/headers/GESRTP.d.ts +32 -0
- package/dist/headers/GESRTP.js +141 -0
- package/dist/headers/GLBP.d.ts +29 -0
- package/dist/headers/GLBP.js +159 -0
- package/dist/headers/GRE.d.ts +27 -0
- package/dist/headers/GRE.js +181 -0
- package/dist/headers/GTPU.d.ts +25 -0
- package/dist/headers/GTPU.js +203 -0
- package/dist/headers/GTPv2C.d.ts +30 -0
- package/dist/headers/GTPv2C.js +281 -0
- package/dist/headers/GitProtocol.d.ts +34 -0
- package/dist/headers/GitProtocol.js +141 -0
- package/dist/headers/Goose.d.ts +115 -0
- package/dist/headers/Goose.js +1067 -0
- package/dist/headers/Gopher.d.ts +43 -0
- package/dist/headers/Gopher.js +182 -0
- package/dist/headers/HARTIP.d.ts +30 -0
- package/dist/headers/HARTIP.js +145 -0
- package/dist/headers/HSR.d.ts +27 -0
- package/dist/headers/HSR.js +105 -0
- package/dist/headers/HSRP.d.ts +26 -0
- package/dist/headers/HSRP.js +173 -0
- package/dist/headers/HTTP.d.ts +32 -0
- package/dist/headers/HTTP.js +153 -0
- package/dist/headers/HTTP2.d.ts +34 -0
- package/dist/headers/HTTP2.js +190 -0
- package/dist/headers/IAX2.d.ts +33 -0
- package/dist/headers/IAX2.js +274 -0
- package/dist/headers/ICMP.d.ts +15 -0
- package/dist/headers/ICMP.js +148 -0
- package/dist/headers/ICMPv6.d.ts +15 -0
- package/dist/headers/ICMPv6.js +129 -0
- package/dist/headers/IEC104_I_Frame.d.ts +23 -0
- package/dist/headers/IEC104_I_Frame.js +6489 -0
- package/dist/headers/IEC104_S_Frame.d.ts +26 -0
- package/dist/headers/IEC104_S_Frame.js +135 -0
- package/dist/headers/IEC104_U_Frame.d.ts +27 -0
- package/dist/headers/IEC104_U_Frame.js +176 -0
- package/dist/headers/IEC61850SampledValues.d.ts +20 -0
- package/dist/headers/IEC61850SampledValues.js +420 -0
- package/dist/headers/IGMP.d.ts +31 -0
- package/dist/headers/IGMP.js +274 -0
- package/dist/headers/IMAP.d.ts +32 -0
- package/dist/headers/IMAP.js +185 -0
- package/dist/headers/IPFIX.d.ts +29 -0
- package/dist/headers/IPFIX.js +156 -0
- package/dist/headers/IPv4.d.ts +20 -0
- package/dist/headers/IPv4.js +370 -0
- package/dist/headers/IPv6.d.ts +29 -0
- package/dist/headers/IPv6.js +209 -0
- package/dist/headers/IPv6HopByHopOptions.d.ts +81 -0
- package/dist/headers/IPv6HopByHopOptions.js +495 -0
- package/dist/headers/IRC.d.ts +34 -0
- package/dist/headers/IRC.js +175 -0
- package/dist/headers/ISAKMP.d.ts +29 -0
- package/dist/headers/ISAKMP.js +197 -0
- package/dist/headers/ISCSI.d.ts +39 -0
- package/dist/headers/ISCSI.js +289 -0
- package/dist/headers/ISIS.d.ts +25 -0
- package/dist/headers/ISIS.js +79 -0
- package/dist/headers/ISOSession.d.ts +27 -0
- package/dist/headers/ISOSession.js +343 -0
- package/dist/headers/Ident.d.ts +42 -0
- package/dist/headers/Ident.js +184 -0
- package/dist/headers/KNXnetIP.d.ts +30 -0
- package/dist/headers/KNXnetIP.js +135 -0
- package/dist/headers/Kafka.d.ts +35 -0
- package/dist/headers/Kafka.js +128 -0
- package/dist/headers/Kerberos.d.ts +30 -0
- package/dist/headers/Kerberos.js +217 -0
- package/dist/headers/L2TP.d.ts +26 -0
- package/dist/headers/L2TP.js +297 -0
- package/dist/headers/LACP.d.ts +31 -0
- package/dist/headers/LACP.js +151 -0
- package/dist/headers/LDAP.d.ts +31 -0
- package/dist/headers/LDAP.js +226 -0
- package/dist/headers/LDP.d.ts +31 -0
- package/dist/headers/LDP.js +138 -0
- package/dist/headers/LISP.d.ts +30 -0
- package/dist/headers/LISP.js +103 -0
- package/dist/headers/LLC.d.ts +27 -0
- package/dist/headers/LLC.js +81 -0
- package/dist/headers/LLDP.d.ts +26 -0
- package/dist/headers/LLDP.js +126 -0
- package/dist/headers/LLMNR.d.ts +23 -0
- package/dist/headers/LLMNR.js +40 -0
- package/dist/headers/LPD.d.ts +31 -0
- package/dist/headers/LPD.js +159 -0
- package/dist/headers/MACsec.d.ts +34 -0
- package/dist/headers/MACsec.js +178 -0
- package/dist/headers/MDNS.d.ts +26 -0
- package/dist/headers/MDNS.js +45 -0
- package/dist/headers/MGCP.d.ts +30 -0
- package/dist/headers/MGCP.js +155 -0
- package/dist/headers/MMS.d.ts +29 -0
- package/dist/headers/MMS.js +243 -0
- package/dist/headers/MPLS.d.ts +31 -0
- package/dist/headers/MPLS.js +145 -0
- package/dist/headers/MQTT.d.ts +30 -0
- package/dist/headers/MQTT.js +173 -0
- package/dist/headers/MQTTSN.d.ts +34 -0
- package/dist/headers/MQTTSN.js +177 -0
- package/dist/headers/MarkerProtocol.d.ts +32 -0
- package/dist/headers/MarkerProtocol.js +153 -0
- package/dist/headers/Megaco.d.ts +32 -0
- package/dist/headers/Megaco.js +144 -0
- package/dist/headers/Memcached.d.ts +44 -0
- package/dist/headers/Memcached.js +285 -0
- package/dist/headers/ModbusTCP.d.ts +25 -0
- package/dist/headers/ModbusTCP.js +99 -0
- package/dist/headers/ModbusUDP.d.ts +26 -0
- package/dist/headers/ModbusUDP.js +100 -0
- package/dist/headers/MongoDB.d.ts +33 -0
- package/dist/headers/MongoDB.js +143 -0
- package/dist/headers/MySQL.d.ts +30 -0
- package/dist/headers/MySQL.js +114 -0
- package/dist/headers/NATS.d.ts +29 -0
- package/dist/headers/NATS.js +135 -0
- package/dist/headers/NBDS.d.ts +34 -0
- package/dist/headers/NBDS.js +176 -0
- package/dist/headers/NBNS.d.ts +34 -0
- package/dist/headers/NBNS.js +78 -0
- package/dist/headers/NBSS.d.ts +36 -0
- package/dist/headers/NBSS.js +137 -0
- package/dist/headers/NFS.d.ts +36 -0
- package/dist/headers/NFS.js +273 -0
- package/dist/headers/NHRP.d.ts +32 -0
- package/dist/headers/NHRP.js +154 -0
- package/dist/headers/NNTP.d.ts +35 -0
- package/dist/headers/NNTP.js +162 -0
- package/dist/headers/NTP.d.ts +18 -0
- package/dist/headers/NTP.js +73 -0
- package/dist/headers/NetFlowV5.d.ts +28 -0
- package/dist/headers/NetFlowV5.js +205 -0
- package/dist/headers/OLSR.d.ts +31 -0
- package/dist/headers/OLSR.js +213 -0
- package/dist/headers/OPCUA.d.ts +33 -0
- package/dist/headers/OPCUA.js +165 -0
- package/dist/headers/OPCUAPubSub.d.ts +33 -0
- package/dist/headers/OPCUAPubSub.js +144 -0
- package/dist/headers/OSPF.d.ts +31 -0
- package/dist/headers/OSPF.js +365 -0
- package/dist/headers/OmronFINS.d.ts +31 -0
- package/dist/headers/OmronFINS.js +90 -0
- package/dist/headers/OpenFlow.d.ts +30 -0
- package/dist/headers/OpenFlow.js +113 -0
- package/dist/headers/OpenVPN.d.ts +35 -0
- package/dist/headers/OpenVPN.js +214 -0
- package/dist/headers/PCWorx.d.ts +35 -0
- package/dist/headers/PCWorx.js +115 -0
- package/dist/headers/PIM.d.ts +27 -0
- package/dist/headers/PIM.js +129 -0
- package/dist/headers/POP3.d.ts +31 -0
- package/dist/headers/POP3.js +152 -0
- package/dist/headers/POWERLINK.d.ts +28 -0
- package/dist/headers/POWERLINK.js +116 -0
- package/dist/headers/PPPoEDiscovery.d.ts +29 -0
- package/dist/headers/PPPoEDiscovery.js +198 -0
- package/dist/headers/PPPoESession.d.ts +28 -0
- package/dist/headers/PPPoESession.js +125 -0
- package/dist/headers/PPTP.d.ts +30 -0
- package/dist/headers/PPTP.js +122 -0
- package/dist/headers/PROFINETRT.d.ts +28 -0
- package/dist/headers/PROFINETRT.js +74 -0
- package/dist/headers/PTP.d.ts +34 -0
- package/dist/headers/PTP.js +213 -0
- package/dist/headers/PostgreSQL.d.ts +40 -0
- package/dist/headers/PostgreSQL.js +236 -0
- package/dist/headers/QUIC.d.ts +34 -0
- package/dist/headers/QUIC.js +308 -0
- package/dist/headers/RADIUS.d.ts +24 -0
- package/dist/headers/RADIUS.js +138 -0
- package/dist/headers/RDP.d.ts +27 -0
- package/dist/headers/RDP.js +93 -0
- package/dist/headers/RFB.d.ts +39 -0
- package/dist/headers/RFB.js +151 -0
- package/dist/headers/RGoose.d.ts +72 -0
- package/dist/headers/RGoose.js +340 -0
- package/dist/headers/RIP.d.ts +29 -0
- package/dist/headers/RIP.js +133 -0
- package/dist/headers/RIPng.d.ts +26 -0
- package/dist/headers/RIPng.js +140 -0
- package/dist/headers/RMCP.d.ts +26 -0
- package/dist/headers/RMCP.js +155 -0
- package/dist/headers/RSVP.d.ts +31 -0
- package/dist/headers/RSVP.js +263 -0
- package/dist/headers/RTCP.d.ts +34 -0
- package/dist/headers/RTCP.js +217 -0
- package/dist/headers/RTP.d.ts +33 -0
- package/dist/headers/RTP.js +291 -0
- package/dist/headers/RTPS.d.ts +33 -0
- package/dist/headers/RTPS.js +182 -0
- package/dist/headers/RTSP.d.ts +36 -0
- package/dist/headers/RTSP.js +184 -0
- package/dist/headers/RawData.d.ts +17 -0
- package/dist/headers/RawData.js +43 -0
- package/dist/headers/Redis.d.ts +32 -0
- package/dist/headers/Redis.js +202 -0
- package/dist/headers/Rlogin.d.ts +42 -0
- package/dist/headers/Rlogin.js +139 -0
- package/dist/headers/Rsync.d.ts +28 -0
- package/dist/headers/Rsync.js +117 -0
- package/dist/headers/S7comm.d.ts +36 -0
- package/dist/headers/S7comm.js +244 -0
- package/dist/headers/SCTP.d.ts +35 -0
- package/dist/headers/SCTP.js +174 -0
- package/dist/headers/SFlow.d.ts +29 -0
- package/dist/headers/SFlow.js +242 -0
- package/dist/headers/SIP.d.ts +27 -0
- package/dist/headers/SIP.js +146 -0
- package/dist/headers/SLMP.d.ts +36 -0
- package/dist/headers/SLMP.js +154 -0
- package/dist/headers/SLP.d.ts +30 -0
- package/dist/headers/SLP.js +207 -0
- package/dist/headers/SLPv1.d.ts +32 -0
- package/dist/headers/SLPv1.js +138 -0
- package/dist/headers/SMB1.d.ts +37 -0
- package/dist/headers/SMB1.js +200 -0
- package/dist/headers/SMB2.d.ts +36 -0
- package/dist/headers/SMB2.js +203 -0
- package/dist/headers/SMPP.d.ts +33 -0
- package/dist/headers/SMPP.js +119 -0
- package/dist/headers/SMTP.d.ts +33 -0
- package/dist/headers/SMTP.js +157 -0
- package/dist/headers/SNAP.d.ts +22 -0
- package/dist/headers/SNAP.js +68 -0
- package/dist/headers/SNMP.d.ts +28 -0
- package/dist/headers/SNMP.js +302 -0
- package/dist/headers/SOCKS4.d.ts +42 -0
- package/dist/headers/SOCKS4.js +302 -0
- package/dist/headers/SOCKS5.d.ts +45 -0
- package/dist/headers/SOCKS5.js +223 -0
- package/dist/headers/SSDP.d.ts +27 -0
- package/dist/headers/SSDP.js +161 -0
- package/dist/headers/SSH.d.ts +44 -0
- package/dist/headers/SSH.js +274 -0
- package/dist/headers/STOMP.d.ts +48 -0
- package/dist/headers/STOMP.js +177 -0
- package/dist/headers/STP.d.ts +26 -0
- package/dist/headers/STP.js +150 -0
- package/dist/headers/STUN.d.ts +25 -0
- package/dist/headers/STUN.js +183 -0
- package/dist/headers/SercosIII.d.ts +43 -0
- package/dist/headers/SercosIII.js +199 -0
- package/dist/headers/Skinny.d.ts +32 -0
- package/dist/headers/Skinny.js +139 -0
- package/dist/headers/StatsD.d.ts +27 -0
- package/dist/headers/StatsD.js +134 -0
- package/dist/headers/SunRPC.d.ts +34 -0
- package/dist/headers/SunRPC.js +268 -0
- package/dist/headers/Syslog.d.ts +21 -0
- package/dist/headers/Syslog.js +91 -0
- package/dist/headers/TCP.d.ts +19 -0
- package/dist/headers/TCP.js +905 -0
- package/dist/headers/TFTP.d.ts +28 -0
- package/dist/headers/TFTP.js +224 -0
- package/dist/headers/TLS_Alert.d.ts +24 -0
- package/dist/headers/TLS_Alert.js +639 -0
- package/dist/headers/TLS_ApplicationData.d.ts +24 -0
- package/dist/headers/TLS_ApplicationData.js +170 -0
- package/dist/headers/TLS_ChangeCipherSpec.d.ts +23 -0
- package/dist/headers/TLS_ChangeCipherSpec.js +168 -0
- package/dist/headers/TLS_Handshake.d.ts +65 -0
- package/dist/headers/TLS_Handshake.js +860 -0
- package/dist/headers/TLS_Heartbeat.d.ts +27 -0
- package/dist/headers/TLS_Heartbeat.js +247 -0
- package/dist/headers/TPKT.d.ts +26 -0
- package/dist/headers/TPKT.js +99 -0
- package/dist/headers/TacacsPlus.d.ts +27 -0
- package/dist/headers/TacacsPlus.js +133 -0
- package/dist/headers/Telnet.d.ts +40 -0
- package/dist/headers/Telnet.js +193 -0
- package/dist/headers/Teredo.d.ts +40 -0
- package/dist/headers/Teredo.js +251 -0
- package/dist/headers/TimeProtocol.d.ts +25 -0
- package/dist/headers/TimeProtocol.js +53 -0
- package/dist/headers/UDP.d.ts +19 -0
- package/dist/headers/UDP.js +171 -0
- package/dist/headers/VLAN_802dot1Q.d.ts +24 -0
- package/dist/headers/VLAN_802dot1Q.js +96 -0
- package/dist/headers/VRRP.d.ts +26 -0
- package/dist/headers/VRRP.js +309 -0
- package/dist/headers/VXLAN.d.ts +24 -0
- package/dist/headers/VXLAN.js +75 -0
- package/dist/headers/WCCP.d.ts +29 -0
- package/dist/headers/WCCP.js +117 -0
- package/dist/headers/WHOIS.d.ts +37 -0
- package/dist/headers/WHOIS.js +126 -0
- package/dist/headers/WSDiscovery.d.ts +29 -0
- package/dist/headers/WSDiscovery.js +118 -0
- package/dist/headers/WakeOnLAN.d.ts +30 -0
- package/dist/headers/WakeOnLAN.js +126 -0
- package/dist/headers/WebSocket.d.ts +26 -0
- package/dist/headers/WebSocket.js +173 -0
- package/dist/headers/WireGuard.d.ts +38 -0
- package/dist/headers/WireGuard.js +216 -0
- package/dist/headers/XMPP.d.ts +37 -0
- package/dist/headers/XMPP.js +149 -0
- package/dist/headers/Zabbix.d.ts +35 -0
- package/dist/headers/Zabbix.js +153 -0
- package/dist/headers/cms/AcsiPdu.d.ts +45 -0
- package/dist/headers/cms/AcsiPdu.js +112 -0
- package/dist/headers/cms/PerDecoder.d.ts +68 -0
- package/dist/headers/cms/PerDecoder.js +211 -0
- package/dist/headers/cms/PerReader.d.ts +64 -0
- package/dist/headers/cms/PerReader.js +155 -0
- package/dist/helper/BufferToHex.d.ts +5 -0
- package/dist/helper/BufferToHex.js +10 -0
- package/dist/helper/BufferToIP.d.ts +12 -0
- package/dist/helper/BufferToIP.js +23 -0
- package/dist/helper/BufferToNumber.d.ts +18 -0
- package/dist/helper/BufferToNumber.js +47 -0
- package/dist/helper/HexToBuffer.d.ts +7 -0
- package/dist/helper/HexToBuffer.js +27 -0
- package/dist/helper/HexToNumber.d.ts +18 -0
- package/dist/helper/HexToNumber.js +48 -0
- package/dist/helper/IPToBuffer.d.ts +12 -0
- package/dist/helper/IPToBuffer.js +34 -0
- package/dist/helper/NumberToBERBuffer.d.ts +18 -0
- package/dist/helper/NumberToBERBuffer.js +31 -0
- package/dist/helper/NumberToBERHex.d.ts +18 -0
- package/dist/helper/NumberToBERHex.js +52 -0
- package/dist/helper/NumberToBuffer.d.ts +18 -0
- package/dist/helper/NumberToBuffer.js +38 -0
- package/dist/helper/NumberToHex.d.ts +18 -0
- package/dist/helper/NumberToHex.js +35 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.js +113 -0
- package/dist/lib/FlexibleObject.d.ts +27 -0
- package/dist/lib/FlexibleObject.js +113 -0
- package/dist/lib/GetBERIntegerLengthFromBuffer.d.ts +6 -0
- package/dist/lib/GetBERIntegerLengthFromBuffer.js +16 -0
- package/dist/lib/ProcessPacketPostHandlers.d.ts +13 -0
- package/dist/lib/ProcessPacketPostHandlers.js +53 -0
- package/dist/lib/SortPostHandlers.d.ts +7 -0
- package/dist/lib/SortPostHandlers.js +11 -0
- package/dist/lib/StringContentEncodingEnum.d.ts +10 -0
- package/dist/lib/StringContentEncodingEnum.js +14 -0
- package/dist/schema/ProtocolFieldJSONSchema.d.ts +35 -0
- package/dist/schema/ProtocolFieldJSONSchema.js +2 -0
- package/dist/schema/ProtocolFieldJSONSchemaDefinition.d.ts +2 -0
- package/dist/schema/ProtocolFieldJSONSchemaDefinition.js +2 -0
- package/dist/schema/ProtocolJSONSchema.d.ts +32 -0
- package/dist/schema/ProtocolJSONSchema.js +2 -0
- package/dist/types/CodecData.d.ts +7 -0
- package/dist/types/CodecData.js +2 -0
- package/dist/types/CodecDecodeResult.d.ts +10 -0
- package/dist/types/CodecDecodeResult.js +2 -0
- package/dist/types/CodecEncodeInput.d.ts +2 -0
- package/dist/types/CodecEncodeInput.js +2 -0
- package/dist/types/CodecEncodeResult.d.ts +5 -0
- package/dist/types/CodecEncodeResult.js +2 -0
- package/dist/types/CodecErrorInfo.d.ts +5 -0
- package/dist/types/CodecErrorInfo.js +2 -0
- package/dist/types/CodecModule.d.ts +2 -0
- package/dist/types/CodecModule.js +2 -0
- package/dist/types/CodecModuleConstructor.d.ts +2 -0
- package/dist/types/CodecModuleConstructor.js +2 -0
- package/dist/types/CodecSchema.d.ts +6 -0
- package/dist/types/CodecSchema.js +2 -0
- package/dist/types/DemuxProducer.d.ts +23 -0
- package/dist/types/DemuxProducer.js +2 -0
- package/dist/types/Dissection.d.ts +23 -0
- package/dist/types/Dissection.js +2 -0
- package/dist/types/HeaderTreeNode.d.ts +4 -0
- package/dist/types/HeaderTreeNode.js +2 -0
- package/dist/types/LayerGraph.d.ts +32 -0
- package/dist/types/LayerGraph.js +2 -0
- package/dist/types/PostHandlerItem.d.ts +4 -0
- package/dist/types/PostHandlerItem.js +2 -0
- 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
|
+
}
|