The extension (producer) must stream a high rate of packet metadata to the app (consumer) for the live UI, across a process boundary, without saturating the system and without adding latency or memory pressure to the packet loop. Durable history already goes to SQLite, but that is not the right channel for a real-time, per-packet feed.
Use a fixed-size memory-mapped ring buffer in the App Group container as a lock-free
single-producer/single-consumer queue, plus a Darwin notification posted (coalesced) as a
wakeup only. The notification carries no data; the mmap carries the bytes. See
../spec/ipc.md.
push is a bounded write to shared memory with atomic head/tail; no
syscall per packet, no allocation, no blocking. Back-pressure = drop + increment a counter.handleAppMessage / provider messaging for the live feed: fine for occasional control
commands, but request/response and not built for a per-packet firehose. We use it only for
control (start/stop inspection, rotate pcap, stats).