feat: indie status page MVP -- FastAPI + SQLite
- 8 DB models (services, incidents, monitors, subscribers, etc.) - Full CRUD API for services, incidents, monitors - Public status page with live data - Incident detail page with timeline - API key authentication - Uptime monitoring scheduler - 13 tests passing - TECHNICAL_DESIGN.md with full spec
This commit is contained in:
commit
902133edd3
4655 changed files with 1342691 additions and 0 deletions
53
venv/lib/python3.11/site-packages/websockets/utils.py
Normal file
53
venv/lib/python3.11/site-packages/websockets/utils.py
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import base64
|
||||
import hashlib
|
||||
import secrets
|
||||
import sys
|
||||
|
||||
from .typing import BytesLike
|
||||
|
||||
|
||||
__all__ = ["accept_key", "apply_mask"]
|
||||
|
||||
|
||||
GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
|
||||
|
||||
|
||||
def generate_key() -> str:
|
||||
"""
|
||||
Generate a random key for the Sec-WebSocket-Key header.
|
||||
|
||||
"""
|
||||
key = secrets.token_bytes(16)
|
||||
return base64.b64encode(key).decode()
|
||||
|
||||
|
||||
def accept_key(key: str) -> str:
|
||||
"""
|
||||
Compute the value of the Sec-WebSocket-Accept header.
|
||||
|
||||
Args:
|
||||
key: Value of the Sec-WebSocket-Key header.
|
||||
|
||||
"""
|
||||
sha1 = hashlib.sha1((key + GUID).encode()).digest()
|
||||
return base64.b64encode(sha1).decode()
|
||||
|
||||
|
||||
def apply_mask(data: BytesLike, mask: bytes | bytearray) -> bytes:
|
||||
"""
|
||||
Apply masking to the data of a WebSocket message.
|
||||
|
||||
Args:
|
||||
data: Data to mask.
|
||||
mask: 4-bytes mask.
|
||||
|
||||
"""
|
||||
if len(mask) != 4:
|
||||
raise ValueError("mask must contain 4 bytes")
|
||||
|
||||
data_int = int.from_bytes(data, sys.byteorder)
|
||||
mask_repeated = mask * (len(data) // 4) + mask[: len(data) % 4]
|
||||
mask_int = int.from_bytes(mask_repeated, sys.byteorder)
|
||||
return (data_int ^ mask_int).to_bytes(len(data), sys.byteorder)
|
||||
Loading…
Add table
Add a link
Reference in a new issue