fix(protocol): fence gateway work recovery

This commit is contained in:
sechmachine
2026-08-13 07:43:42 +07:00
parent 8eacc4fda9
commit 6e18bc9ee6
21 changed files with 572 additions and 146 deletions
+37 -20
View File
@@ -269,6 +269,7 @@
},
"SessionQualityLimits": {
"type": "object",
"x-max-bytes": 16384,
"additionalProperties": false,
"required": ["policy_version_id", "policy_display_limit", "selectable_display_maximum", "display_limit_override", "bitrate_minimum_kbps", "bitrate_target_kbps", "bitrate_maximum_kbps"],
"properties": {
@@ -654,6 +655,7 @@
},
"DisplayLimitOverrideRequest": {
"type": "object",
"x-max-bytes": 16384,
"additionalProperties": false,
"required": ["allow_display_limit_override", "expected_version"],
"properties": {
@@ -663,6 +665,7 @@
},
"QualityChangeRequest": {
"type": "object",
"x-max-bytes": 16384,
"additionalProperties": false,
"required": ["bitrate_preference", "expected_session_version", "expected_policy_version"],
"properties": {
@@ -673,10 +676,11 @@
},
"QualityChangeOperation": {
"type": "object",
"x-max-bytes": 16384,
"additionalProperties": false,
"required": ["operation_id", "session_id", "revision", "state", "requested_bitrate_preference", "effective_bitrate_kbps", "governing_policy_version", "session_version", "created_at", "deadline_at", "updated_at"],
"properties": {
"operation_id": {"type": "string", "format": "uuid", "minLength": 36, "maxLength": 36},
"operation_id": {"type": "string", "format": "uuid", "pattern": "^(?!00000000-0000-0000-0000-000000000000$)[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", "minLength": 36, "maxLength": 36},
"session_id": {"type": "string", "minLength": 1, "maxLength": 128},
"revision": {"type": "integer", "minimum": 1},
"state": {"type": "string", "enum": ["pending", "applying", "applied", "failed", "timed_out"]},
@@ -684,84 +688,97 @@
"effective_bitrate_kbps": {"type": "integer", "minimum": 100, "maximum": 1000000},
"governing_policy_version": {"type": "string", "minLength": 1, "maxLength": 128},
"session_version": {"type": "integer", "minimum": 1},
"created_at": {"type": "string", "format": "date-time", "maxLength": 64},
"deadline_at": {"type": "string", "format": "date-time", "maxLength": 64},
"updated_at": {"type": "string", "format": "date-time", "maxLength": 64},
"created_at": {"type": "string", "format": "date-time", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]{0,8}[1-9])?Z$", "maxLength": 64},
"deadline_at": {"type": "string", "format": "date-time", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]{0,8}[1-9])?Z$", "maxLength": 64},
"updated_at": {"type": "string", "format": "date-time", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]{0,8}[1-9])?Z$", "maxLength": 64},
"failure_code": {"type": "string", "minLength": 1, "maxLength": 128}
}
},
"StopOperation": {
"type": "object",
"x-max-bytes": 16384,
"additionalProperties": false,
"required": ["operation_id", "session_id", "state", "session_version", "created_at", "deadline_at", "updated_at"],
"properties": {
"operation_id": {"type": "string", "format": "uuid", "minLength": 36, "maxLength": 36},
"operation_id": {"type": "string", "format": "uuid", "pattern": "^(?!00000000-0000-0000-0000-000000000000$)[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", "minLength": 36, "maxLength": 36},
"session_id": {"type": "string", "minLength": 1, "maxLength": 128},
"state": {"type": "string", "enum": ["pending", "attempting", "applied", "failed", "termination_unconfirmed"]},
"session_version": {"type": "integer", "minimum": 1},
"created_at": {"type": "string", "format": "date-time", "maxLength": 64},
"deadline_at": {"type": "string", "format": "date-time", "maxLength": 64},
"updated_at": {"type": "string", "format": "date-time", "maxLength": 64},
"created_at": {"type": "string", "format": "date-time", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]{0,8}[1-9])?Z$", "maxLength": 64},
"deadline_at": {"type": "string", "format": "date-time", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]{0,8}[1-9])?Z$", "maxLength": 64},
"updated_at": {"type": "string", "format": "date-time", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]{0,8}[1-9])?Z$", "maxLength": 64},
"failure_code": {"type": "string", "minLength": 1, "maxLength": 128}
}
},
"GatewayQualityWorkRequest": {
"type": "object", "additionalProperties": false,
"required": ["version", "session_id", "gateway_id", "reconnect_sequence", "operation_id", "revision"],
"x-max-bytes": 16384,
"required": ["version", "session_id", "gateway_id", "reconnect_sequence", "acquisition"],
"properties": {
"version": {"type": "string", "const": "1"}, "session_id": {"type": "string", "minLength": 1, "maxLength": 128},
"gateway_id": {"type": "string", "minLength": 1, "maxLength": 128}, "reconnect_sequence": {"type": "integer", "minimum": 0},
"operation_id": {"type": "string", "format": "uuid", "minLength": 36, "maxLength": 36}, "revision": {"type": "integer", "minimum": 1},
"acquisition": {"type": "string", "enum": ["poll", "prompt", "observation"]},
"operation_id": {"type": "string", "format": "uuid", "pattern": "^(?!00000000-0000-0000-0000-000000000000$)[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", "minLength": 36, "maxLength": 36},
"revision": {"type": "integer", "minimum": 1, "x-optional-pointer": true},
"lease_generation": {"type": "integer", "minimum": 1, "x-optional-pointer": true},
"current_applied_revision": {"type": "integer", "minimum": 0, "x-optional-pointer": true}
}
},
"GatewayQualityWork": {
"type": "object", "additionalProperties": false,
"required": ["version", "session_id", "gateway_id", "reconnect_sequence", "operation_id", "revision", "lease_expires_at", "selected_descriptor"],
"x-max-bytes": 16384,
"required": ["version", "session_id", "gateway_id", "reconnect_sequence", "operation_id", "revision", "lease_generation", "lease_expires_at", "selected_descriptor"],
"properties": {
"version": {"type": "string", "const": "1"}, "session_id": {"type": "string", "minLength": 1, "maxLength": 128},
"gateway_id": {"type": "string", "minLength": 1, "maxLength": 128}, "reconnect_sequence": {"type": "integer", "minimum": 0},
"operation_id": {"type": "string", "format": "uuid", "minLength": 36, "maxLength": 36}, "revision": {"type": "integer", "minimum": 1},
"lease_expires_at": {"type": "string", "format": "date-time", "maxLength": 64}, "selected_descriptor": {"$ref": "#/$defs/SelectedSessionDescriptor"},
"operation_id": {"type": "string", "format": "uuid", "pattern": "^(?!00000000-0000-0000-0000-000000000000$)[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", "minLength": 36, "maxLength": 36}, "revision": {"type": "integer", "minimum": 1},
"lease_generation": {"type": "integer", "minimum": 1},
"lease_expires_at": {"type": "string", "format": "date-time", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\\.[0-9]{0,8}[1-9])?Z$", "maxLength": 64}, "selected_descriptor": {"$ref": "#/$defs/SelectedSessionDescriptor"},
"current_applied_revision": {"type": "integer", "minimum": 0, "x-optional-pointer": true}
}
},
"GatewayQualityAck": {
"type": "object", "additionalProperties": false,
"required": ["version", "session_id", "gateway_id", "reconnect_sequence", "operation_id", "revision", "outcome", "current_applied_revision"],
"x-max-bytes": 16384,
"required": ["version", "session_id", "gateway_id", "reconnect_sequence", "operation_id", "revision", "lease_generation", "outcome"],
"properties": {
"version": {"type": "string", "const": "1"}, "session_id": {"type": "string", "minLength": 1, "maxLength": 128},
"gateway_id": {"type": "string", "minLength": 1, "maxLength": 128}, "reconnect_sequence": {"type": "integer", "minimum": 0},
"operation_id": {"type": "string", "format": "uuid", "minLength": 36, "maxLength": 36}, "revision": {"type": "integer", "minimum": 1},
"outcome": {"type": "string", "enum": ["applied", "not_applied", "uncertain"]}, "current_applied_revision": {"type": "integer", "minimum": 0},
"operation_id": {"type": "string", "format": "uuid", "pattern": "^(?!00000000-0000-0000-0000-000000000000$)[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", "minLength": 36, "maxLength": 36}, "revision": {"type": "integer", "minimum": 1},
"lease_generation": {"type": "integer", "minimum": 1},
"outcome": {"type": "string", "enum": ["applied", "proven_prior", "unknown"]}, "current_applied_revision": {"type": "integer", "minimum": 0, "x-optional-pointer": true},
"failure_code": {"type": "string", "minLength": 1, "maxLength": 128}
}
},
"GatewayStopWorkRequest": {
"type": "object", "additionalProperties": false,
"required": ["version", "session_id", "gateway_id", "reconnect_sequence", "operation_id"],
"x-max-bytes": 16384,
"required": ["version", "session_id", "gateway_id", "reconnect_sequence", "acquisition"],
"properties": {
"version": {"type": "string", "const": "1"}, "session_id": {"type": "string", "minLength": 1, "maxLength": 128},
"gateway_id": {"type": "string", "minLength": 1, "maxLength": 128}, "reconnect_sequence": {"type": "integer", "minimum": 0},
"operation_id": {"type": "string", "format": "uuid", "minLength": 36, "maxLength": 36}
"acquisition": {"type": "string", "enum": ["poll", "prompt"]},
"operation_id": {"type": "string", "format": "uuid", "pattern": "^(?!00000000-0000-0000-0000-000000000000$)[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", "minLength": 36, "maxLength": 36}
}
},
"GatewayStopWork": {
"type": "object", "additionalProperties": false,
"x-max-bytes": 16384,
"required": ["version", "session_id", "gateway_id", "reconnect_sequence", "operation_id", "attempt"],
"properties": {
"version": {"type": "string", "const": "1"}, "session_id": {"type": "string", "minLength": 1, "maxLength": 128},
"gateway_id": {"type": "string", "minLength": 1, "maxLength": 128}, "reconnect_sequence": {"type": "integer", "minimum": 0},
"operation_id": {"type": "string", "format": "uuid", "minLength": 36, "maxLength": 36}, "attempt": {"type": "integer", "minimum": 1, "maximum": 1}
"operation_id": {"type": "string", "format": "uuid", "pattern": "^(?!00000000-0000-0000-0000-000000000000$)[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", "minLength": 36, "maxLength": 36}, "attempt": {"type": "integer", "minimum": 1, "maximum": 1}
}
},
"GatewayStopAck": {
"type": "object", "additionalProperties": false,
"x-max-bytes": 16384,
"required": ["version", "session_id", "gateway_id", "reconnect_sequence", "operation_id", "outcome"],
"properties": {
"version": {"type": "string", "const": "1"}, "session_id": {"type": "string", "minLength": 1, "maxLength": 128},
"gateway_id": {"type": "string", "minLength": 1, "maxLength": 128}, "reconnect_sequence": {"type": "integer", "minimum": 0},
"operation_id": {"type": "string", "format": "uuid", "minLength": 36, "maxLength": 36}, "outcome": {"type": "string", "enum": ["applied", "failed", "termination_unconfirmed"]},
"operation_id": {"type": "string", "format": "uuid", "pattern": "^(?!00000000-0000-0000-0000-000000000000$)[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", "minLength": 36, "maxLength": 36}, "outcome": {"type": "string", "enum": ["applied", "failed", "termination_unconfirmed"]},
"failure_code": {"type": "string", "minLength": 1, "maxLength": 128}
}
},