Coverage for src/lektor_ng/admin/modules/livereload.py: 61%
23 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-09 00:28 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-09 00:28 +0000
1from __future__ import annotations
3import queue
4import secrets
5from collections.abc import Generator
6from typing import TYPE_CHECKING
8from flask import Blueprint
10from lektor_ng.admin.utils import eventstream
11from lektor_ng.reporter import reporter
13if TYPE_CHECKING:
14 from lektor.builder import Artifact
16PING_DELAY = 1.0
18bp = Blueprint("livereload", __name__)
19# Use a random ID to detect reloading, which will be changed after reloaded
20version_id = secrets.token_urlsafe(16)
23@bp.route("/events")
24@eventstream
25def events() -> Generator[dict[str, str]]:
26 updated_artifacts: queue.Queue[Artifact] = queue.Queue()
27 with reporter.on_build_change(updated_artifacts.put):
28 while True:
29 yield {"type": "ping", "versionId": version_id}
31 try:
32 artifact = updated_artifacts.get(timeout=PING_DELAY)
33 except queue.Empty:
34 continue
35 yield {"type": "reload", "path": artifact.artifact_name}