File size: 2,175 Bytes
3dfb537
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from helpers import runtime
from helpers.extension import Extension
from helpers.print_style import PrintStyle
from helpers.state_monitor import get_state_monitor, _ws_debug_enabled
from helpers.state_snapshot import (
    StateRequestValidationError,
    parse_state_request_payload,
)


class StateSync(Extension):
    async def execute(
        self,
        instance=None,
        sid: str = "",
        event_type: str = "",
        data: dict | None = None,
        response_data: dict | None = None,
        **kwargs,
    ):
        if instance is None or data is None:
            return

        if event_type != "state_request":
            return

        correlation_id = data.get("correlationId")
        try:
            request = parse_state_request_payload(data)
        except StateRequestValidationError as exc:
            PrintStyle.warning(
                f"[WebuiHandler] INVALID_REQUEST sid={sid} reason={exc.reason} details={exc.details!r}"
            )
            if response_data is not None:
                response_data["code"] = "INVALID_REQUEST"
                response_data["message"] = str(exc)
            return

        if _ws_debug_enabled():
            PrintStyle.debug(
                f"[WebuiHandler] state_request sid={sid} context={request.context!r} "
                f"log_from={request.log_from} notifications_from={request.notifications_from} timezone={request.timezone!r} "
                f"correlation_id={correlation_id}"
            )

        seq_base = 1
        monitor = get_state_monitor()
        monitor.update_projection(
            instance.namespace,
            sid,
            request=request,
            seq_base=seq_base,
        )
        monitor.mark_dirty(
            instance.namespace,
            sid,
            reason="webui_ws_event.StateSync.state_request",
        )
        if _ws_debug_enabled():
            PrintStyle.debug(
                f"[WebuiHandler] state_request accepted sid={sid} seq_base={seq_base}"
            )

        if response_data is not None:
            response_data["runtime_epoch"] = runtime.get_runtime_id()
            response_data["seq_base"] = seq_base