~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
75 lines · 2.3 KB Raw History
package bidder

import (
	"context"
	"fmt"
	"slices"

	"github.com/johnandersen777/socialweb-computer-kcp/api/v1alpha1"
	"github.com/johnandersen777/socialweb-computer-kcp/internal/atproto/market"
	"github.com/johnandersen777/socialweb-computer-kcp/internal/guestseed"
)

var ErrKindUnsupported = fmt.Errorf("bidder: the RFP asks for a compute kind this bidder does not serve")

func (b *Bidder) servesKind(kind string) bool {
	served := b.cfg.ComputeKinds
	if len(served) == 0 {
		served = []string{string(v1alpha1.ComputeKindVM)}
	}
	if kind == "" {
		kind = string(v1alpha1.ComputeKindVM)
	}
	if !slices.Contains(served, kind) {
		return false
	}
	if kind == string(v1alpha1.ComputeKindDeno) && (b.cfg.Sandbox == nil || !b.cfg.Sandbox.Available()) {
		return false
	}
	return true
}

func (b *Bidder) rfpKind(ctx context.Context, rfpURI, rfpCID string) (string, error) {
	resolved, err := b.records.Resolve(ctx, market.RecordRef{URI: rfpURI, CID: rfpCID})
	if err != nil {
		return "", fmt.Errorf("bidder: resolving the RFP payload kind: %w", err)
	}
	rfp, err := market.ParseRFP(resolved.Value)
	if err != nil {
		return "", nil
	}
	payload, err := b.records.Resolve(ctx, market.RecordRef{URI: rfp.Payload.URI, CID: rfp.Payload.CID})
	if err != nil {
		return "", fmt.Errorf("bidder: resolving the RFP payload: %w", err)
	}
	kind, _ := payload.Value["kind"].(string)
	return kind, nil
}

func (b *Bidder) inboxServesKind(ctx context.Context, rfpURI, rfpCID string) (string, bool) {
	kind, err := b.rfpKind(ctx, rfpURI, rfpCID)
	if err != nil {
		b.log.Warn("reading the compute kind of an inbox RFP failed; it is dropped", "rfp", rfpURI, "err", err.Error())
		return kind, false
	}
	return kind, b.servesKind(kind)
}

func (b *Bidder) guestToolsRefused(ctx context.Context, rfp *market.RFP) (string, error) {
	payload, err := b.records.Resolve(ctx, market.RecordRef{URI: rfp.Payload.URI, CID: rfp.Payload.CID})
	if err != nil {
		return "", fmt.Errorf("bidder: resolving the RFP payload for its guest tools: %w", err)
	}
	userData, _ := payload.Value["user_data"].(string)
	needs := guestseed.GuestBinariesNeeded(userData)
	if len(needs.Tools) == 0 {
		return "", nil
	}
	if err := needs.ToolsErr(); err != nil {
		return err.Error(), nil
	}
	if _, err := guestseed.GuestBinaryPins(b.cfg.GuestDownloads, needs.Tools); err != nil {
		return err.Error(), nil
	}
	return "", nil
}