{
  "$id": "websocket-frame.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "WebSocket Frame",
  "description": "Schema describing the structure of a WebSocket data frame as defined in RFC 6455 Section 5.2. Each frame consists of header fields and a payload.",
  "type": "object",
  "required": [
    "fin",
    "opcode",
    "masked",
    "payloadLength"
  ],
  "properties": {
    "fin": {
      "type": "boolean",
      "description": "Indicates whether this is the final fragment in a message. The first fragment may also be the final fragment."
    },
    "rsv1": {
      "type": "boolean",
      "default": false,
      "description": "Reserved bit 1. Must be 0 unless an extension defines a meaning for non-zero values (e.g., permessage-deflate uses RSV1)."
    },
    "rsv2": {
      "type": "boolean",
      "default": false,
      "description": "Reserved bit 2. Must be 0 unless an extension defines a meaning for non-zero values."
    },
    "rsv3": {
      "type": "boolean",
      "default": false,
      "description": "Reserved bit 3. Must be 0 unless an extension defines a meaning for non-zero values."
    },
    "opcode": {
      "type": "integer",
      "description": "Defines the interpretation of the payload data. Opcodes 0x0-0x2 are for data frames, 0x8-0xA are for control frames.",
      "enum": [0, 1, 2, 8, 9, 10],
      "examples": [1]
    },
    "opcodeDescription": {
      "type": "string",
      "description": "Human-readable description of the opcode value.",
      "enum": [
        "continuation",
        "text",
        "binary",
        "connection close",
        "ping",
        "pong"
      ]
    },
    "masked": {
      "type": "boolean",
      "description": "Indicates whether the payload data is masked. All frames sent from client to server must be masked. Frames from server to client must not be masked."
    },
    "maskingKey": {
      "type": "string",
      "description": "A 32-bit value used to mask the payload data. Present only when masked is true. Represented as 4 bytes.",
      "pattern": "^[0-9a-fA-F]{8}$"
    },
    "payloadLength": {
      "type": "integer",
      "minimum": 0,
      "description": "The length of the payload data in bytes. For control frames, this must not exceed 125."
    },
    "payloadData": {
      "type": "string",
      "description": "The application data carried by the frame. For text frames, this is UTF-8 encoded text. For binary frames, this is raw binary data."
    }
  },
  "additionalProperties": false
}
