2026-05-25 15:45:57 +08:00

99 lines
3.6 KiB
Go

// Package mictime defines user-scoped microphone duration facts.
package mictime
const (
// RoomMicChangedEventType is the room-service outbox event consumed by this read model.
RoomMicChangedEventType = "RoomMicChanged"
// ActionUp opens a mic session and starts seat occupation time.
ActionUp = "up"
// ActionPublishConfirmed starts effective microphone online time for an open session.
ActionPublishConfirmed = "publish_confirmed"
// ActionChange moves the occupied seat without splitting duration.
ActionChange = "change"
// ActionDown closes a session and rolls duration into daily/lifetime aggregates.
ActionDown = "down"
// PublishStatePending means the user occupies a business mic seat but has not confirmed RTC audio.
PublishStatePending = "pending_publish"
// PublishStatePublishing means RTC audio has been confirmed for the session.
PublishStatePublishing = "publishing"
// PublishStateIdle means the seat has been released.
PublishStateIdle = "idle"
// SessionStatusPendingPublish is persisted before RTC audio confirmation.
SessionStatusPendingPublish = "pending_publish"
// SessionStatusPublishing is persisted after publish_confirmed.
SessionStatusPublishing = "publishing"
// SessionStatusEnded is terminal and must never be reopened by replayed events.
SessionStatusEnded = "ended"
// EventTypeUserMicSessionClosed is emitted after a session is closed and aggregates are durable.
EventTypeUserMicSessionClosed = "UserMicSessionClosed"
// EventTypeUserMicDailyStatsUpdated is emitted for each UTC day touched by a closed session.
EventTypeUserMicDailyStatsUpdated = "UserMicDailyStatsUpdated"
// EventTypeUserMicLifetimeStatsUpdated is emitted when lifetime totals receive one session delta.
EventTypeUserMicLifetimeStatsUpdated = "UserMicLifetimeStatsUpdated"
// CompensationReasonPendingPublishTimeout closes pending sessions whose expected room-service timeout event never arrived.
CompensationReasonPendingPublishTimeout = "compensated_publish_timeout"
// CompensationReasonPublishingMaxWindow closes publishing sessions at a configured safety ceiling.
CompensationReasonPublishingMaxWindow = "compensated_publishing_max_window"
)
// RoomMicEvent is the decoded RoomMicChanged fact used by user-service duration aggregation.
type RoomMicEvent struct {
AppCode string
EventID string
EventType string
RoomID string
RoomVersion int64
OutboxCreatedAtMs int64
OccurredAtMs int64
ActorUserID int64
TargetUserID int64
FromSeat int32
ToSeat int32
Action string
MicSessionID string
PublishState string
Reason string
PublishDeadlineMs int64
PublishEventTimeMs int64
}
// ApplyResult describes one idempotent event application.
type ApplyResult struct {
Consumed bool
Skipped bool
Closed bool
Reason string
}
// CompensationOptions bounds abnormal open sessions so missing down events cannot accumulate forever.
type CompensationOptions struct {
NowMs int64
BatchSize int
PendingPublishMaxAgeMs int64
PublishingSessionMaxAgeMs int64
}
// CompensationResult summarizes one compensation scan.
type CompensationResult struct {
ClosedCount int
PendingPublishClosed int
PublishingSessionClosed int
}
// LifetimeStats is the user-wide aggregate consumed by host tasks and profile views.
type LifetimeStats struct {
AppCode string
UserID int64
SeatOccupiedMs int64
MicOnlineMs int64
SessionCount int64
FirstMicAtMs int64
LastMicAtMs int64
UpdatedAtMs int64
}