2.6 KiB
Design
Context
- The codec encodes a protocol message through the allow-list: protocol field names, enum values as names, the set
member of a oneof as a document named after the oneof, URLs redacted by rule. Raw events store
EgressInfothis way, sopayload.egress.requestholds the full request without secrets. - The egress projection writes
requestfromegressRequest(), a summary built field by field. - Validators are applied at every start with
validationLevel: strictand the configured action (warnby default).
Goals / Non-Goals
Goals:
- The egress document keeps the full request, without secrets, for the entities retention.
Non-Goals:
- Replacing the summary, which the list and the detail facts read.
- Backfilling stored documents.
Decisions
Same encoding as the raw payloads
rawRequest is the request member of EgressInfo as the codec encodes it: one key, the oneof member that is set
(room_composite, web, participant, track_composite, track, egress or replay), holding the request. It is
the value payload.egress.request of the raw events of the same egress. The allow-list stays the only place that
decides what is stored.
Alternative rejected: unwrapping the oneof member. The member tells the legacy room composite API apart from the
unified StartEgress and ExportReplay APIs, which type does not.
Alternative rejected: protojson with camelCase names. Raw payloads and this field would show the same request in two namings.
Written on every event
Every EGRESS_* event carries the request, so the field is set on each upsert, like request. It is absent when the
event has no request.
Data model
- Collection
egresses: new optional fieldrawRequest(object). No index; the field is never queried. - Retention: the entities retention of the document.
- Schema version: unchanged (1). The field is optional, and the contract has not shipped in a release. A dashboard that does not know the field ignores it.
- Migration from legacy events: the legacy migration decodes the legacy
EgressInfoand projects it like a live event, so a migrated egress getsrawRequestwhen its legacy events carry a request. - Performance: one encode of a message the codec already encodes for the raw event. The document grows by the size of the request, usually under 1 KB.
Risks / Trade-offs
- [A future allow-list entry stores a secret in the document too] → The codec tests keep checking every allow-listed field against the secret patterns, and an edition that shows the field can filter it again on read.