35 lines
1.3 KiB
Go
35 lines
1.3 KiB
Go
package agent
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
rvboxv1 "github.com/rvbox/rvbox/gen/go/rvbox/v1"
|
|
"github.com/rvbox/rvbox/internal/agentproto"
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
// SendCommandEvent writes a previously durable, sequence-assigned event. It
|
|
// derives the immutable digest at the final wire boundary so retrying the same
|
|
// event produces byte-equivalent protocol evidence.
|
|
func SendCommandEvent(ctx context.Context, transport Transport, session Session, event *rvboxv1.CommandEvent, limits agentproto.Limits) error {
|
|
if transport == nil || event == nil || session.ID == "" || session.Generation == 0 {
|
|
return ErrProtocolHandshake
|
|
}
|
|
copyEvent := proto.Clone(event).(*rvboxv1.CommandEvent)
|
|
digest, err := agentproto.CommandEventDigest(copyEvent)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
copyEvent.ImmutableEventSha256 = digest[:]
|
|
envelope := &rvboxv1.AgentEnvelope{SessionId: session.ID, SessionGeneration: session.Generation, Payload: &rvboxv1.AgentEnvelope_CommandEvent{CommandEvent: copyEvent}}
|
|
if err := agentproto.ValidateEnvelope(envelope, limits, rvboxv1.Platform_PLATFORM_WINDOWS); err != nil {
|
|
return fmt.Errorf("validate command event: %w", err)
|
|
}
|
|
encoded, err := proto.Marshal(envelope)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return transport.Write(ctx, encoded)
|
|
}
|