Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
UserContext,
)

from .json_sanitize import install_json_sanitize
from .folder_paths_patch import install_folder_paths_patch
from .execution_patch import install_execution_patch
from .cache_signature_patch import install_cache_signature_patch
Expand All @@ -59,6 +60,8 @@

if ENABLE_PLUGIN:
try:
# JSON 补丁必须最早安装(在 server 处理 /object_info 之前生效)
install_json_sanitize()
# Install all patches
install_folder_paths_patch()
install_execution_patch()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
"""
JSON 序列化辅助 - 将 DynamicPathProxy 转为字符串

ComfyUI /object_info 经 aiohttp.web.json_response → json.dumps;
仅 patch web.json_response 不够(server 模块可能已绑定旧引用)。
同时 patch json.JSONEncoder.default,确保所有标准 json.dumps 都能序列化 Proxy。
"""

import json

from aiohttp import web

from .path_proxy import DynamicPathProxy

_installed = False
_original_encoder_default = None
_original_json_response = None


def sanitize_for_json(obj):
"""递归将 DynamicPathProxy 转为 str(按当前 user 上下文解析路径)。"""
if isinstance(obj, DynamicPathProxy):
return str(obj)
if isinstance(obj, dict):
return {sanitize_for_json(k): sanitize_for_json(v) for k, v in obj.items()}
if isinstance(obj, (list, tuple)):
return [sanitize_for_json(x) for x in obj]
return obj


def install_json_sanitize():
"""
安装 JSON 序列化补丁(幂等)。

1. json.JSONEncoder.default — 覆盖 aiohttp 内部的 json.dumps(data)
2. aiohttp.web.json_response — 双保险,先 sanitize 再 dumps
3. server.web.json_response — 若 server 已 import,同步替换
"""
global _installed, _original_encoder_default, _original_json_response

if _installed:
return

_original_encoder_default = json.JSONEncoder.default

def patched_encoder_default(self, o):
if isinstance(o, DynamicPathProxy):
return str(o)
return _original_encoder_default(self, o)

json.JSONEncoder.default = patched_encoder_default

_original_json_response = web.json_response

def json_response_safe(data, **kwargs):
return _original_json_response(sanitize_for_json(data), **kwargs)

json_response_safe._comfyui_user_json_patched = True
web.json_response = json_response_safe

try:
import server # type: ignore

server.web.json_response = json_response_safe
except ImportError:
pass

_installed = True
print("[ComfyUI-Multi-User] JSON sanitize 已安装 (JSONEncoder.default + json_response)")


__all__ = ['sanitize_for_json', 'install_json_sanitize']
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
"""

from .context import set_current_user, clear_current_user
from .json_sanitize import install_json_sanitize

_hook_installed = False
_original_add_routes = None
Expand All @@ -26,6 +27,8 @@ def install_server_middleware():
try:
import server # type: ignore

install_json_sanitize()

# Save original add_routes method
_original_add_routes = server.PromptServer.add_routes

Expand Down