package mock import ( "context" "tera-clone/services/tera-api/internal/directstream" "tera-clone/services/tera-api/internal/domain" ) // DirectTicketAuthority keeps ticket issuance, consumption, lifecycle, and // audit ownership in tera-api while tera-sessiond handles only streaming. type DirectTicketAuthority struct { store *Store } func NewDirectTicketAuthority(store *Store) *DirectTicketAuthority { return &DirectTicketAuthority{store: store} } func (a *DirectTicketAuthority) ConsumeTicket(_ context.Context, value string, binding directstream.TicketBinding) (directstream.TicketClaims, error) { claims, err := a.store.directTickets.Consume(value, binding) a.store.mu.Lock() defer a.store.mu.Unlock() ctx := context.Background() result := "rejected" message := "Direct Mode stream ticket rejected" if err == nil { claims.MaxAttachments = a.store.running[claims.Channel].Operation1.MaxClients ctx = domain.WithActor(ctx, domain.Actor{Name: claims.Actor}) result = "succeeded" message = "Direct Mode stream ticket consumed by tera-sessiond for session " + claims.SessionID } a.store.recordAuditLocked(ctx, "direct.stream.ticket.consume", binding.Channel, result, message) return claims, err } func (a *DirectTicketAuthority) CloseConsumedStream(ctx context.Context, claims directstream.TicketClaims) error { ctx = domain.WithActor(ctx, domain.Actor{Name: claims.Actor}) _, err := a.store.CloseDirectSession(ctx, claims.Channel, claims.SessionID) return err } func (a *DirectTicketAuthority) ReleaseConsumedWriter(ctx context.Context, claims directstream.TicketClaims) error { ctx = domain.WithActor(ctx, domain.Actor{Name: claims.Actor}) _, err := a.store.releaseDirectSessionWriter(ctx, claims.Channel, claims.SessionID) return err } func (a *DirectTicketAuthority) RecordConsumedStreamEvent(ctx context.Context, claims directstream.TicketClaims, event directstream.SessionEvent) error { ctx = domain.WithActor(ctx, domain.Actor{Name: claims.Actor}) _, err := a.store.RecordPortLog(ctx, domain.PortLogEvent{ Timestamp: event.Timestamp, Channel: claims.Channel, EventType: "session", Actor: claims.Actor + "/" + claims.SessionID, Message: directstream.SessionEventMessage(claims, event), }) return err }