{
  "product": "Specification (reference)",
  "title": "WebSocket",
  "summary": "A persistent bidirectional connection, from handshake to graceful close.",
  "category": "protocols",
  "entries": [
    {
      "path": [
        "Handshake",
        "HTTP Upgrade with Sec-WebSocket-Key"
      ],
      "value": "",
      "status": "yes",
      "note": "server returns the derived Accept"
    },
    {
      "path": [
        "Handshake",
        "Subprotocol negotiation"
      ],
      "value": "Sec-WebSocket-Protocol",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Handshake",
        "Extension negotiation"
      ],
      "value": "permessage-deflate",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Handshake",
        "Origin checked by the server"
      ],
      "value": "",
      "status": "yes",
      "note": "browsers do not enforce same-origin here"
    },
    {
      "path": [
        "Framing",
        "Text and binary frames"
      ],
      "value": "",
      "status": "yes",
      "note": "text is valid UTF-8"
    },
    {
      "path": [
        "Framing",
        "Fragmentation and continuation frames"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Framing",
        "Client-to-server frames are masked"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Framing",
        "Maximum message size enforced"
      ],
      "value": "",
      "status": "yes",
      "note": "oversized messages close the connection"
    },
    {
      "path": [
        "Liveness",
        "Ping and pong frames"
      ],
      "value": "",
      "status": "yes",
      "note": "unsolicited pong allowed"
    },
    {
      "path": [
        "Liveness",
        "Idle timeout with heartbeat"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Close",
        "Close frame with a status code and reason"
      ],
      "value": "1000, 1001, 1006…",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Close",
        "Both sides complete the closing handshake"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Reconnection",
        "Client backs off exponentially with jitter"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    },
    {
      "path": [
        "Reconnection",
        "Session resume or replay after reconnect"
      ],
      "value": "",
      "status": "yes",
      "note": "stated guarantee"
    },
    {
      "path": [
        "Backpressure",
        "Send buffer bounded; slow consumers handled"
      ],
      "value": "",
      "status": "yes",
      "note": "drop, queue or disconnect — stated"
    },
    {
      "path": [
        "Security",
        "wss in production; auth at or before the handshake"
      ],
      "value": "",
      "status": "yes",
      "note": ""
    }
  ]
}
