-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnode_protocol.py
More file actions
71 lines (55 loc) · 2.15 KB
/
node_protocol.py
File metadata and controls
71 lines (55 loc) · 2.15 KB
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
68
69
70
71
"""Shared protocol definitions for Main <-> Node communication.
Port of server/node-protocol.js.
"""
import json
import time
# Message types
MESSAGE_TYPES = {
"REGISTER": "register",
"REGISTER_ACK": "register_ack",
"HELLO": "hello",
"REGISTER_INFO": "register_info",
"HEARTBEAT": "heartbeat",
"REQUEST": "request",
"RESPONSE": "response",
"EVENT": "event",
"ERROR": "error",
}
NODE_ACTIONS = {
"PROJECT_LIST": "project.list",
"PROJECT_SESSIONS": "project.sessions",
"PROJECT_SESSION_MESSAGES": "project.sessionMessages",
"CHAT_SEND": "chat.send",
"CHAT_ABORT": "chat.abort",
"NODE_PING": "node.ping",
"NODE_GET_CAPABILITIES": "node.getCapabilities",
}
_request_counter = 0
def generate_request_id() -> str:
global _request_counter
_request_counter += 1
return f"req_{int(time.time() * 1000)}_{_request_counter}"
def create_message(msg_type: str, node_id: str | None, payload: dict | None = None, request_id: str | None = None) -> dict:
return {
"type": msg_type,
"nodeId": node_id,
"timestamp": int(time.time() * 1000),
"requestId": request_id,
"payload": payload or {},
}
def parse_message(raw) -> dict:
if isinstance(raw, bytes):
raw = raw.decode("utf-8")
msg = json.loads(raw)
if not msg.get("type"):
raise ValueError("Missing message type")
return msg
def create_request(node_id: str, action: str, params: dict) -> tuple[dict, str]:
"""Returns (message, request_id)."""
request_id = generate_request_id()
message = create_message(MESSAGE_TYPES["REQUEST"], node_id, {"action": action, "params": params}, request_id)
return message, request_id
def create_response(node_id: str, request_id: str, data=None, error: str | None = None) -> dict:
return create_message(MESSAGE_TYPES["RESPONSE"], node_id, {"data": data, "error": error}, request_id)
def create_event(node_id: str, request_id: str, event_type: str, data=None) -> dict:
return create_message(MESSAGE_TYPES["EVENT"], node_id, {"eventType": event_type, "data": data}, request_id)