package sessions import ( "context" "fmt" "time" "github.com/pomerium/pomerium/internal/sets" "github.com/pomerium/pomerium/pkg/grpc/databroker" "github.com/pomerium/pomerium/pkg/grpc/session" "github.com/pomerium/pomerium/pkg/protoutil" ) var sessionTypeURL = protoutil.GetTypeURL(new(session.Session)) // CurrentUsers returns a list of users active within the current UTC day func CurrentUsers( ctx context.Context, client databroker.DataBrokerServiceClient, ) ([]string, error) { records, _, _, err := databroker.InitialSync(ctx, client, &databroker.SyncLatestRequest{ Type: sessionTypeURL, }) if err != nil { return nil, fmt.Errorf("fetching sessions: %w", err) } users := sets.NewHash[string]() utcNow := time.Now().UTC() threshold := time.Date(utcNow.Year(), utcNow.Month(), utcNow.Day(), 0, 0, 0, 0, time.UTC) for _, record := range records { var s session.Session err := record.GetData().UnmarshalTo(&s) if err != nil { return nil, fmt.Errorf("unmarshaling session: %w", err) } if s.UserId == "" { // session creation is in progress continue } if s.AccessedAt == nil { continue } if s.AccessedAt.AsTime().Before(threshold) { continue } users.Add(s.UserId) } return users.Items(), nil }