From 59c770ba3e99c3294603cbbe9fe035f272eac5f4 Mon Sep 17 00:00:00 2001 From: break27 Date: Fri, 10 Jul 2026 17:22:36 +0800 Subject: [PATCH] fix: added 'add' function in jsonrpc2 service provider --- src/common/actionflow.py | 14 ++++++++++---- src/common/jsonrpc2/server.py | 7 ++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/common/actionflow.py b/src/common/actionflow.py index bb91d74..cb233a0 100644 --- a/src/common/actionflow.py +++ b/src/common/actionflow.py @@ -21,18 +21,24 @@ class ActionFlow: self.actions: list[type[Action]] = [] self.on: list[bool] = [] + def __iter__(self): + for key in self.indices.keys(): + yield (key, self[key]) + def __getitem__(self, key): index = self.indices[key] - state = self.on[index] - def inner(*args, **kwargs): + if self.on[index]: raise Unavailable(key) + if self.on[index] is None: raise NotAllowed(key) self.on[index] = self.actions[index].prepare(*args, **kwargs) return self.on[index] - if state: raise Unavailable(key) - if state is None: raise NotAllowed(key) return inner + def queue(self, action: type[Action]) -> bool: + try: return self[action.__name__]() + except: return False + def react(self, *stage: type[Action]): for Props in stage: self.allow(Props) diff --git a/src/common/jsonrpc2/server.py b/src/common/jsonrpc2/server.py index ce2a845..259c061 100644 --- a/src/common/jsonrpc2/server.py +++ b/src/common/jsonrpc2/server.py @@ -3,6 +3,7 @@ import logging import dataclasses from enum import Enum from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler +from collections.abc import Iterable from typing import Self, Callable, Any from threading import Thread @@ -169,7 +170,7 @@ class ServiceProvider: logger.addHandler(history) opts = cls.Options() self = cls(opts) - self.set('history', lambda: history.truncate()) + self.set('logs', lambda: history.truncate()) self.set('exit', lambda: (t.interrupt_main(), sys.exit(0))) return self @@ -181,6 +182,10 @@ class ServiceProvider: encoding : str = 'UTF-8' interval : float = 0.2 + def add(self, *handlers: Callable[..., Any], pairs: Iterable[tuple[str, Callable[..., Any]]] = None): + for handler in handlers: self.set(handler.__name__, handler) + for k, v in pairs or tuple(): self.set(k, v) + def set(self, method: str, handler: Callable[..., Any]): if method in self.server.handlers: raise KeyError(method) self.server.handlers[method] = handler