WebSocket guarantees in-order delivery
Within a single connection, WebSocket frames arrive in send order — that is a TCP guarantee that flows up. There is no reordering and no protocol-level deduplication. If you reconnect, that guarantee resets: the new connection is independent.
Frame size limits
The protocol allows enormous frames in theory (2^63 bytes), but every implementation caps them. Default limits in production are usually 64KB-1MB. For larger payloads, chunk explicitly: send file.start with metadata, then a stream of binary chunks, then file.end. Never assume one logical message = one frame.
Application-level ACKs
If a message must be delivered (a chat message, a payment confirmation), build acknowledgement at the application layer: client sends with a sequence number, server echoes back ack with that number, client retransmits if no ack arrives in time. This is independent of the underlying WebSocket — it survives reconnects.
AsyncAPI for documentation
AsyncAPI is OpenAPI for event-driven and message-based APIs. Define your channels, operations, and message schemas in YAML; generate docs, mocks, even client code. Worth it once your protocol has more than a handful of types.