pages235/src/react/packetsFilter.ts
Vitaly 1387cb036b
feat: Replay packets server functionality! (#287)
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-02-23 03:48:15 +03:00

55 lines
1.6 KiB
TypeScript

import { PacketData } from './ReplayPanel'
function wildcardToRegExp (pattern: string): RegExp {
const escaped = pattern.replaceAll(/[.*+?^${}()|[\]\\]/g, '\\$&')
return new RegExp(`^${escaped.replaceAll('\\*', '.*')}$`)
}
function patternToRegExp (pattern: string): RegExp {
if (pattern.startsWith('$')) {
return new RegExp(`^${pattern.slice(1)}$`)
}
return wildcardToRegExp(`*${pattern}*`)
}
export function parseFilterString (filter: string): { include: RegExp[]; exclude: RegExp[] } {
const parts = filter.split(/,\s*/)
const include: RegExp[] = []
const exclude: RegExp[] = []
for (const part of parts) {
if (!part) continue
if (part.startsWith('!')) {
exclude.push(patternToRegExp(part.slice(1)))
} else {
include.push(patternToRegExp(part))
}
}
return { include, exclude }
}
export function filterPackets (packets: PacketData[], filter: string): { filtered: PacketData[]; hiddenCount: number } {
if (!filter.trim()) {
return { filtered: packets, hiddenCount: 0 }
}
const { include, exclude } = parseFilterString(filter)
const filtered = packets.filter(packet => {
// If packet matches any exclude pattern, filter it out
if (exclude.some(pattern => pattern.test(packet.name))) {
return false
}
// If there are include patterns, packet must match at least one
if (include.length > 0) {
return include.some(pattern => pattern.test(packet.name))
}
// If no include patterns, keep the packet (unless it was excluded)
return true
})
return {
filtered,
hiddenCount: packets.length - filtered.length
}
}