@@ -34,24 +34,25 @@ const (
3434var supportedRemoteProtocolVersions = []string {RemoteProtocolVersionV1 , RemoteProtocolVersionV2 }
3535
3636type RegistrationState struct {
37- SessionID contracts.ID `json:"session_id,omitempty"`
38- EnvironmentID string `json:"environment_id,omitempty"`
39- RuntimeState string `json:"runtime_state"`
40- RegistrationURL string `json:"registration_url,omitempty"`
41- ManifestPath string `json:"manifest_path,omitempty"`
42- LastAttemptAt string `json:"last_attempt_at,omitempty"`
43- RegisteredAt string `json:"registered_at,omitempty"`
44- StatusCode int `json:"status_code,omitempty"`
45- RemoteSessionID string `json:"remote_session_id,omitempty"`
46- RegistrationID string `json:"registration_id,omitempty"`
47- ProtocolVersion string `json:"protocol_version,omitempty"`
48- Capabilities []string `json:"capabilities,omitempty"`
49- WebSocketURL string `json:"websocket_url,omitempty"`
50- PollURL string `json:"poll_url,omitempty"`
51- LeaseRenewURL string `json:"lease_renew_url,omitempty"`
52- Message string `json:"message,omitempty"`
53- Error string `json:"error,omitempty"`
54- ManifestServices int `json:"manifest_services,omitempty"`
37+ SessionID contracts.ID `json:"session_id,omitempty"`
38+ EnvironmentID string `json:"environment_id,omitempty"`
39+ RuntimeState string `json:"runtime_state"`
40+ RegistrationURL string `json:"registration_url,omitempty"`
41+ ManifestPath string `json:"manifest_path,omitempty"`
42+ LastAttemptAt string `json:"last_attempt_at,omitempty"`
43+ RegisteredAt string `json:"registered_at,omitempty"`
44+ StatusCode int `json:"status_code,omitempty"`
45+ RemoteSessionID string `json:"remote_session_id,omitempty"`
46+ RegistrationID string `json:"registration_id,omitempty"`
47+ ProtocolVersion string `json:"protocol_version,omitempty"`
48+ Capabilities []string `json:"capabilities,omitempty"`
49+ CapabilityWarnings []string `json:"capability_warnings,omitempty"`
50+ WebSocketURL string `json:"websocket_url,omitempty"`
51+ PollURL string `json:"poll_url,omitempty"`
52+ LeaseRenewURL string `json:"lease_renew_url,omitempty"`
53+ Message string `json:"message,omitempty"`
54+ Error string `json:"error,omitempty"`
55+ ManifestServices int `json:"manifest_services,omitempty"`
5556}
5657
5758type RegistrationOptions struct {
@@ -157,6 +158,7 @@ func RegisterManifest(ctx context.Context, options RegistrationOptions) Registra
157158 state .PollURL = ""
158159 state .LeaseRenewURL = ""
159160 }
161+ applyRemoteCapabilityGates (& state )
160162 return state
161163}
162164
@@ -327,6 +329,40 @@ func validateRemoteProtocolVersion(version string) error {
327329 return fmt .Errorf ("unsupported remote protocol version %q; supported: %s" , text , strings .Join (supportedRemoteProtocolVersions , ", " ))
328330}
329331
332+ func applyRemoteCapabilityGates (state * RegistrationState ) {
333+ if state == nil || len (state .Capabilities ) == 0 {
334+ return
335+ }
336+ if strings .TrimSpace (state .WebSocketURL ) != "" && ! hasRemoteCapability (state .Capabilities , "websocket_protocol" , "websocket" , "websocket_stream" ) {
337+ state .WebSocketURL = ""
338+ state .CapabilityWarnings = append (state .CapabilityWarnings , "websocket url ignored: missing websocket_protocol capability" )
339+ }
340+ if strings .TrimSpace (state .LeaseRenewURL ) != "" && ! hasRemoteCapability (state .Capabilities , "lease_renew" , "lease_refresh" ) {
341+ state .LeaseRenewURL = ""
342+ state .CapabilityWarnings = append (state .CapabilityWarnings , "lease renew url ignored: missing lease_renew capability" )
343+ }
344+ }
345+
346+ func hasRemoteCapability (capabilities []string , names ... string ) bool {
347+ if len (capabilities ) == 0 {
348+ return false
349+ }
350+ wanted := make (map [string ]bool , len (names ))
351+ for _ , name := range names {
352+ text := strings .TrimSpace (strings .ToLower (name ))
353+ if text != "" {
354+ wanted [text ] = true
355+ }
356+ }
357+ for _ , capability := range capabilities {
358+ text := strings .TrimSpace (strings .ToLower (capability ))
359+ if wanted [text ] {
360+ return true
361+ }
362+ }
363+ return false
364+ }
365+
330366func remoteRegistrationError (status string , body []byte ) string {
331367 bodyText := strings .TrimSpace (string (body ))
332368 if bodyText == "" {
0 commit comments