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