~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
46 lines · 1.3 KB Raw History
package guestcontrolplane

import (
	"context"
	"errors"
	"fmt"

	"github.com/johnandersen777/socialweb-computer-kcp/internal/bus"
	"github.com/johnandersen777/socialweb-computer-kcp/internal/contract/guestcp"
)

func (s *Service) openQueue(ctx context.Context, inputs guestcp.Source) error {
	if s.stateDir == "" {
		return errors.New("guestcontrolplane: the guest event queue needs a state dir")
	}
	self := s.self()
	ctx = bus.WithCallerLabels(ctx, self, s.deps.Labels)
	queue, err := bus.Resolve[guestcp.Queue](ctx, s.deps.Bus, self, self, bus.Capability{Name: guestcp.CapabilityQueue})
	if err != nil {
		return fmt.Errorf("guestcontrolplane: resolving the guest event queue: %w", err)
	}
	if err := queue.Open(s.stateDir); err != nil {
		return err
	}
	unwatch := inputs.Watch(func(in guestcp.Inputs) {
		names := make([]string, 0, len(in.ComputeVMs))
		for i := range in.ComputeVMs {
			names = append(names, in.ComputeVMs[i].Name)
		}
		queue.Retain(names)
	})
	s.mu.Lock()
	s.queue, s.unwatchQueue = queue, unwatch
	s.mu.Unlock()
	return nil
}

func (s *Service) publishGuestEvent(ctx context.Context, event guestcp.GuestEvent) error {
	s.mu.Lock()
	queue := s.queue
	s.mu.Unlock()
	if queue == nil {
		return guestcp.ErrQueueNotOpen
	}
	return queue.Publish(ctx, event)
}