Define API and live update contract
This commit is contained in:
parent
0b2b026283
commit
8c0ec9627e
1 changed files with 954 additions and 0 deletions
149
docs/spec/api/events.schema.json
Normal file
149
docs/spec/api/events.schema.json
Normal file
|
|
@ -0,0 +1,149 @@
|
|||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://remora.invalid/spec/api/events.schema.json",
|
||||
"title": "Remora WebSocket frame",
|
||||
"oneOf": [
|
||||
{"$ref": "#/$defs/Subscribe"},
|
||||
{"$ref": "#/$defs/JobChanged"},
|
||||
{"$ref": "#/$defs/DeletionChanged"},
|
||||
{"$ref": "#/$defs/ResyncRequired"},
|
||||
{"$ref": "#/$defs/Heartbeat"}
|
||||
],
|
||||
"$defs": {
|
||||
"OpaqueId": {
|
||||
"type": "string",
|
||||
"pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{7,127}$"
|
||||
},
|
||||
"Cursor": {
|
||||
"type": "string",
|
||||
"minLength": 16,
|
||||
"maxLength": 2048
|
||||
},
|
||||
"Subscribe": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["schema_version", "kind"],
|
||||
"properties": {
|
||||
"schema_version": {"const": 1},
|
||||
"kind": {"const": "subscribe"},
|
||||
"cursor": {"oneOf": [{"$ref": "#/$defs/Cursor"}, {"type": "null"}]}
|
||||
}
|
||||
},
|
||||
"Attempt": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["attempt_id", "fence"],
|
||||
"properties": {
|
||||
"attempt_id": {"$ref": "#/$defs/OpaqueId"},
|
||||
"fence": {"type": "integer", "minimum": 1}
|
||||
}
|
||||
},
|
||||
"Progress": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["attempt_id", "fence", "completed_bytes", "completed_members"],
|
||||
"properties": {
|
||||
"attempt_id": {"$ref": "#/$defs/OpaqueId"},
|
||||
"fence": {"type": "integer", "minimum": 1},
|
||||
"completed_bytes": {"type": "integer", "minimum": 0},
|
||||
"total_bytes": {"type": ["integer", "null"], "minimum": 0},
|
||||
"completed_members": {"type": "integer", "minimum": 0},
|
||||
"total_members": {"type": ["integer", "null"], "minimum": 0}
|
||||
}
|
||||
},
|
||||
"ServerBase": {
|
||||
"type": "object",
|
||||
"required": ["schema_version", "kind", "event_id", "sequence", "cursor", "occurred_at"],
|
||||
"properties": {
|
||||
"schema_version": {"const": 1},
|
||||
"kind": {"type": "string"},
|
||||
"event_id": {"$ref": "#/$defs/OpaqueId"},
|
||||
"sequence": {"type": "integer", "minimum": 1},
|
||||
"cursor": {"$ref": "#/$defs/Cursor"},
|
||||
"occurred_at": {"type": "string", "format": "date-time"}
|
||||
}
|
||||
},
|
||||
"JobChanged": {
|
||||
"allOf": [
|
||||
{"$ref": "#/$defs/ServerBase"},
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["schema_version", "kind", "event_id", "sequence", "cursor", "occurred_at", "job_id", "job_revision", "phase", "lifecycle", "authoritative_attempt", "progress"],
|
||||
"properties": {
|
||||
"schema_version": {"const": 1},
|
||||
"kind": {"const": "job_changed"},
|
||||
"event_id": {"$ref": "#/$defs/OpaqueId"},
|
||||
"sequence": {"type": "integer", "minimum": 1},
|
||||
"cursor": {"$ref": "#/$defs/Cursor"},
|
||||
"occurred_at": {"type": "string", "format": "date-time"},
|
||||
"job_id": {"$ref": "#/$defs/OpaqueId"},
|
||||
"job_revision": {"type": "integer", "minimum": 1},
|
||||
"phase": {"enum": ["Queued", "Running", "RetryWait", "Cancelling", "Succeeded", "Failed", "Cancelled"]},
|
||||
"lifecycle": {"enum": ["visible", "soft_deleted", "hard_deleting", "hard_deleted"]},
|
||||
"authoritative_attempt": {"oneOf": [{"$ref": "#/$defs/Attempt"}, {"type": "null"}]},
|
||||
"progress": {"oneOf": [{"$ref": "#/$defs/Progress"}, {"type": "null"}]}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"DeletionChanged": {
|
||||
"allOf": [
|
||||
{"$ref": "#/$defs/ServerBase"},
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["schema_version", "kind", "event_id", "sequence", "cursor", "occurred_at", "job_id", "operation_id", "state"],
|
||||
"properties": {
|
||||
"schema_version": {"const": 1},
|
||||
"kind": {"const": "deletion_changed"},
|
||||
"event_id": {"$ref": "#/$defs/OpaqueId"},
|
||||
"sequence": {"type": "integer", "minimum": 1},
|
||||
"cursor": {"$ref": "#/$defs/Cursor"},
|
||||
"occurred_at": {"type": "string", "format": "date-time"},
|
||||
"job_id": {"$ref": "#/$defs/OpaqueId"},
|
||||
"operation_id": {"$ref": "#/$defs/OpaqueId"},
|
||||
"state": {"enum": ["queued", "running", "retry_wait", "completed"]}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"ResyncRequired": {
|
||||
"allOf": [
|
||||
{"$ref": "#/$defs/ServerBase"},
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["schema_version", "kind", "event_id", "sequence", "cursor", "occurred_at", "reason"],
|
||||
"properties": {
|
||||
"schema_version": {"const": 1},
|
||||
"kind": {"const": "resync_required"},
|
||||
"event_id": {"$ref": "#/$defs/OpaqueId"},
|
||||
"sequence": {"type": "integer", "minimum": 1},
|
||||
"cursor": {"$ref": "#/$defs/Cursor"},
|
||||
"occurred_at": {"type": "string", "format": "date-time"},
|
||||
"reason": {"enum": ["cursor_absent", "cursor_invalid", "cursor_expired", "authorization_changed", "history_unavailable"]}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"Heartbeat": {
|
||||
"allOf": [
|
||||
{"$ref": "#/$defs/ServerBase"},
|
||||
{
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["schema_version", "kind", "event_id", "sequence", "cursor", "occurred_at"],
|
||||
"properties": {
|
||||
"schema_version": {"const": 1},
|
||||
"kind": {"const": "heartbeat"},
|
||||
"event_id": {"$ref": "#/$defs/OpaqueId"},
|
||||
"sequence": {"type": "integer", "minimum": 1},
|
||||
"cursor": {"$ref": "#/$defs/Cursor"},
|
||||
"occurred_at": {"type": "string", "format": "date-time"}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue