feat(protocol): validate generated gateway contracts
Verify Protocol / verify (push) Canceled after 0s
Verify Protocol / module (push) Successful in 2m14s

This commit is contained in:
sechmachine
2026-07-29 10:03:37 +07:00
parent 7c145001c0
commit be709724ba
8 changed files with 2882 additions and 472 deletions
+30
View File
@@ -414,6 +414,9 @@ func (v AllocationPolicy) Validate() error {
if v.ReservationLeaseSeconds > 3600 {
violations = append(violations, FieldViolation{Field: "reservation_lease_seconds", Code: "maximum"})
}
if v.MinimumKbps > v.TargetKbps || v.TargetKbps > v.MaximumKbps {
violations = append(violations, FieldViolation{Field: "bounds", Code: "invalid_order"})
}
if len(violations) > 0 {
return ValidationError{Violations: violations}
}
@@ -918,6 +921,9 @@ func (v ChannelFrame) Validate() error {
if len(v.Payload) > 87384 {
violations = append(violations, FieldViolation{Field: "payload", Code: "max_length"})
}
if v.FragmentIndex >= v.FragmentCount {
violations = append(violations, FieldViolation{Field: "fragment_index", Code: "invalid_order"})
}
if len(violations) > 0 {
return ValidationError{Violations: violations}
}
@@ -2227,6 +2233,9 @@ func (v GatewayRegistration) Validate() error {
if err := v.Capabilities.Validate(); err != nil {
violations = append(violations, FieldViolation{Field: "capabilities", Code: "invalid_object"})
}
if v.ProtocolMinVersion > v.ProtocolMaxVersion {
violations = append(violations, FieldViolation{Field: "protocol_version", Code: "invalid_order"})
}
if len(violations) > 0 {
return ValidationError{Violations: violations}
}
@@ -2484,6 +2493,9 @@ func (v ManifestBounds) Validate() error {
if v.MaximumKbps > 100000000 {
violations = append(violations, FieldViolation{Field: "maximum_kbps", Code: "maximum"})
}
if v.MinimumKbps > v.TargetKbps || v.TargetKbps > v.MaximumKbps {
violations = append(violations, FieldViolation{Field: "bounds", Code: "invalid_order"})
}
if len(violations) > 0 {
return ValidationError{Violations: violations}
}
@@ -4043,3 +4055,21 @@ func EncodeVersionNegotiation(value VersionNegotiation) ([]byte, error) {
}
return json.Marshal(value)
}
var ErrNoCapabilityOverlap = errors.New("no capability overlap")
func IntersectCapabilityProfiles(profiles ...CapabilityProfile) (CapabilityProfile, error) {
if len(profiles) == 0 {
return CapabilityProfile{}, ErrNoCapabilityOverlap
}
selected := profiles[0]
if err := selected.Validate(); err != nil {
return CapabilityProfile{}, ErrNoCapabilityOverlap
}
for _, profile := range profiles[1:] {
if err := profile.Validate(); err != nil || profile != selected {
return CapabilityProfile{}, ErrNoCapabilityOverlap
}
}
return selected, nil
}
+1 -1
View File
@@ -12,7 +12,7 @@
"2"
]
},
"generator_sha256": "cb975bcd42bf77641b6a0f44d5ec7a6fdba1858d6b8a865e0f04e53bad82648c",
"generator_sha256": "88535ecf2b1c926104b10b4ab56f1bc6298e1c3e75490e36ee8581a135bcded7",
"protocol_version": "1.0.0",
"schema_sha256": "b8a69785112bb94d45f47c2250ca59d0bde47e3667b8ad89c9b0e2c4cfb25aec"
}
+1255 -194
View File
File diff suppressed because it is too large Load Diff
+1227 -270
View File
File diff suppressed because it is too large Load Diff