unrealon 1.0.9__py3-none-any.whl → 1.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. unrealon/__init__.py +23 -21
  2. unrealon-1.1.0.dist-info/METADATA +164 -0
  3. unrealon-1.1.0.dist-info/RECORD +82 -0
  4. {unrealon-1.0.9.dist-info → unrealon-1.1.0.dist-info}/WHEEL +1 -1
  5. unrealon-1.1.0.dist-info/entry_points.txt +9 -0
  6. {unrealon-1.0.9.dist-info → unrealon-1.1.0.dist-info/licenses}/LICENSE +1 -1
  7. unrealon_bridge/__init__.py +114 -0
  8. unrealon_bridge/cli.py +316 -0
  9. unrealon_bridge/client/__init__.py +93 -0
  10. unrealon_bridge/client/base.py +78 -0
  11. unrealon_bridge/client/commands.py +89 -0
  12. unrealon_bridge/client/connection.py +90 -0
  13. unrealon_bridge/client/events.py +65 -0
  14. unrealon_bridge/client/health.py +38 -0
  15. unrealon_bridge/client/html_parser.py +146 -0
  16. unrealon_bridge/client/logging.py +139 -0
  17. unrealon_bridge/client/proxy.py +70 -0
  18. unrealon_bridge/client/scheduler.py +450 -0
  19. unrealon_bridge/client/session.py +70 -0
  20. unrealon_bridge/configs/__init__.py +14 -0
  21. unrealon_bridge/configs/bridge_config.py +212 -0
  22. unrealon_bridge/configs/bridge_config.yaml +39 -0
  23. unrealon_bridge/models/__init__.py +138 -0
  24. unrealon_bridge/models/base.py +28 -0
  25. unrealon_bridge/models/command.py +41 -0
  26. unrealon_bridge/models/events.py +40 -0
  27. unrealon_bridge/models/html_parser.py +79 -0
  28. unrealon_bridge/models/logging.py +55 -0
  29. unrealon_bridge/models/parser.py +63 -0
  30. unrealon_bridge/models/proxy.py +41 -0
  31. unrealon_bridge/models/requests.py +95 -0
  32. unrealon_bridge/models/responses.py +88 -0
  33. unrealon_bridge/models/scheduler.py +592 -0
  34. unrealon_bridge/models/session.py +28 -0
  35. unrealon_bridge/server/__init__.py +91 -0
  36. unrealon_bridge/server/base.py +171 -0
  37. unrealon_bridge/server/handlers/__init__.py +23 -0
  38. unrealon_bridge/server/handlers/command.py +110 -0
  39. unrealon_bridge/server/handlers/html_parser.py +139 -0
  40. unrealon_bridge/server/handlers/logging.py +95 -0
  41. unrealon_bridge/server/handlers/parser.py +95 -0
  42. unrealon_bridge/server/handlers/proxy.py +75 -0
  43. unrealon_bridge/server/handlers/scheduler.py +545 -0
  44. unrealon_bridge/server/handlers/session.py +66 -0
  45. unrealon_browser/__init__.py +61 -18
  46. unrealon_browser/{src/cli → cli}/browser_cli.py +6 -13
  47. unrealon_browser/{src/cli → cli}/cookies_cli.py +5 -1
  48. unrealon_browser/{src/core → core}/browser_manager.py +2 -2
  49. unrealon_browser/{src/managers → managers}/captcha.py +1 -1
  50. unrealon_browser/{src/managers → managers}/cookies.py +1 -1
  51. unrealon_browser/managers/logger_bridge.py +231 -0
  52. unrealon_browser/{src/managers → managers}/profile.py +1 -1
  53. unrealon_driver/__init__.py +73 -19
  54. unrealon_driver/browser/__init__.py +8 -0
  55. unrealon_driver/browser/config.py +74 -0
  56. unrealon_driver/browser/manager.py +416 -0
  57. unrealon_driver/exceptions.py +28 -0
  58. unrealon_driver/parser/__init__.py +55 -0
  59. unrealon_driver/parser/cli_manager.py +141 -0
  60. unrealon_driver/parser/daemon_manager.py +227 -0
  61. unrealon_driver/parser/managers/__init__.py +46 -0
  62. unrealon_driver/parser/managers/browser.py +51 -0
  63. unrealon_driver/parser/managers/config.py +281 -0
  64. unrealon_driver/parser/managers/error.py +412 -0
  65. unrealon_driver/parser/managers/html.py +732 -0
  66. unrealon_driver/parser/managers/logging.py +609 -0
  67. unrealon_driver/parser/managers/result.py +321 -0
  68. unrealon_driver/parser/parser_manager.py +628 -0
  69. unrealon/sdk_config.py +0 -88
  70. unrealon-1.0.9.dist-info/METADATA +0 -810
  71. unrealon-1.0.9.dist-info/RECORD +0 -246
  72. unrealon_browser/pyproject.toml +0 -182
  73. unrealon_browser/src/__init__.py +0 -62
  74. unrealon_browser/src/managers/logger_bridge.py +0 -395
  75. unrealon_driver/README.md +0 -204
  76. unrealon_driver/pyproject.toml +0 -187
  77. unrealon_driver/src/__init__.py +0 -90
  78. unrealon_driver/src/cli/__init__.py +0 -10
  79. unrealon_driver/src/cli/main.py +0 -66
  80. unrealon_driver/src/cli/simple.py +0 -510
  81. unrealon_driver/src/config/__init__.py +0 -11
  82. unrealon_driver/src/config/auto_config.py +0 -478
  83. unrealon_driver/src/core/__init__.py +0 -18
  84. unrealon_driver/src/core/exceptions.py +0 -289
  85. unrealon_driver/src/core/parser.py +0 -638
  86. unrealon_driver/src/dto/__init__.py +0 -66
  87. unrealon_driver/src/dto/cli.py +0 -119
  88. unrealon_driver/src/dto/config.py +0 -18
  89. unrealon_driver/src/dto/events.py +0 -237
  90. unrealon_driver/src/dto/execution.py +0 -313
  91. unrealon_driver/src/dto/services.py +0 -311
  92. unrealon_driver/src/execution/__init__.py +0 -23
  93. unrealon_driver/src/execution/daemon_mode.py +0 -317
  94. unrealon_driver/src/execution/interactive_mode.py +0 -88
  95. unrealon_driver/src/execution/modes.py +0 -45
  96. unrealon_driver/src/execution/scheduled_mode.py +0 -209
  97. unrealon_driver/src/execution/test_mode.py +0 -250
  98. unrealon_driver/src/logging/__init__.py +0 -24
  99. unrealon_driver/src/logging/driver_logger.py +0 -512
  100. unrealon_driver/src/services/__init__.py +0 -24
  101. unrealon_driver/src/services/browser_service.py +0 -726
  102. unrealon_driver/src/services/llm/__init__.py +0 -15
  103. unrealon_driver/src/services/llm/browser_llm_service.py +0 -363
  104. unrealon_driver/src/services/llm/llm.py +0 -195
  105. unrealon_driver/src/services/logger_service.py +0 -232
  106. unrealon_driver/src/services/metrics_service.py +0 -185
  107. unrealon_driver/src/services/scheduler_service.py +0 -489
  108. unrealon_driver/src/services/websocket_service.py +0 -362
  109. unrealon_driver/src/utils/__init__.py +0 -16
  110. unrealon_driver/src/utils/service_factory.py +0 -317
  111. unrealon_driver/src/utils/time_formatter.py +0 -338
  112. unrealon_llm/README.md +0 -44
  113. unrealon_llm/__init__.py +0 -26
  114. unrealon_llm/pyproject.toml +0 -154
  115. unrealon_llm/src/__init__.py +0 -228
  116. unrealon_llm/src/cli/__init__.py +0 -0
  117. unrealon_llm/src/core/__init__.py +0 -11
  118. unrealon_llm/src/core/smart_client.py +0 -438
  119. unrealon_llm/src/dto/__init__.py +0 -155
  120. unrealon_llm/src/dto/models/__init__.py +0 -0
  121. unrealon_llm/src/dto/models/config.py +0 -343
  122. unrealon_llm/src/dto/models/core.py +0 -328
  123. unrealon_llm/src/dto/models/enums.py +0 -123
  124. unrealon_llm/src/dto/models/html_analysis.py +0 -345
  125. unrealon_llm/src/dto/models/statistics.py +0 -473
  126. unrealon_llm/src/dto/models/translation.py +0 -383
  127. unrealon_llm/src/dto/models/type_conversion.py +0 -462
  128. unrealon_llm/src/dto/schemas/__init__.py +0 -0
  129. unrealon_llm/src/exceptions.py +0 -392
  130. unrealon_llm/src/llm_config/__init__.py +0 -20
  131. unrealon_llm/src/llm_config/logging_config.py +0 -178
  132. unrealon_llm/src/llm_logging/__init__.py +0 -42
  133. unrealon_llm/src/llm_logging/llm_events.py +0 -107
  134. unrealon_llm/src/llm_logging/llm_logger.py +0 -466
  135. unrealon_llm/src/managers/__init__.py +0 -15
  136. unrealon_llm/src/managers/cache_manager.py +0 -67
  137. unrealon_llm/src/managers/cost_manager.py +0 -107
  138. unrealon_llm/src/managers/request_manager.py +0 -298
  139. unrealon_llm/src/modules/__init__.py +0 -0
  140. unrealon_llm/src/modules/html_processor/__init__.py +0 -25
  141. unrealon_llm/src/modules/html_processor/base_processor.py +0 -415
  142. unrealon_llm/src/modules/html_processor/details_processor.py +0 -85
  143. unrealon_llm/src/modules/html_processor/listing_processor.py +0 -91
  144. unrealon_llm/src/modules/html_processor/models/__init__.py +0 -20
  145. unrealon_llm/src/modules/html_processor/models/processing_models.py +0 -40
  146. unrealon_llm/src/modules/html_processor/models/universal_model.py +0 -56
  147. unrealon_llm/src/modules/html_processor/processor.py +0 -102
  148. unrealon_llm/src/modules/llm/__init__.py +0 -0
  149. unrealon_llm/src/modules/translator/__init__.py +0 -0
  150. unrealon_llm/src/provider.py +0 -116
  151. unrealon_llm/src/utils/__init__.py +0 -95
  152. unrealon_llm/src/utils/common.py +0 -64
  153. unrealon_llm/src/utils/data_extractor.py +0 -188
  154. unrealon_llm/src/utils/html_cleaner.py +0 -767
  155. unrealon_llm/src/utils/language_detector.py +0 -308
  156. unrealon_llm/src/utils/models_cache.py +0 -592
  157. unrealon_llm/src/utils/smart_counter.py +0 -229
  158. unrealon_llm/src/utils/token_counter.py +0 -189
  159. unrealon_sdk/README.md +0 -25
  160. unrealon_sdk/__init__.py +0 -30
  161. unrealon_sdk/pyproject.toml +0 -231
  162. unrealon_sdk/src/__init__.py +0 -150
  163. unrealon_sdk/src/cli/__init__.py +0 -12
  164. unrealon_sdk/src/cli/commands/__init__.py +0 -22
  165. unrealon_sdk/src/cli/commands/benchmark.py +0 -42
  166. unrealon_sdk/src/cli/commands/diagnostics.py +0 -573
  167. unrealon_sdk/src/cli/commands/health.py +0 -46
  168. unrealon_sdk/src/cli/commands/integration.py +0 -498
  169. unrealon_sdk/src/cli/commands/reports.py +0 -43
  170. unrealon_sdk/src/cli/commands/security.py +0 -36
  171. unrealon_sdk/src/cli/commands/server.py +0 -483
  172. unrealon_sdk/src/cli/commands/servers.py +0 -56
  173. unrealon_sdk/src/cli/commands/tests.py +0 -55
  174. unrealon_sdk/src/cli/main.py +0 -126
  175. unrealon_sdk/src/cli/utils/reporter.py +0 -519
  176. unrealon_sdk/src/clients/openapi.yaml +0 -3347
  177. unrealon_sdk/src/clients/python_http/__init__.py +0 -3
  178. unrealon_sdk/src/clients/python_http/api_config.py +0 -228
  179. unrealon_sdk/src/clients/python_http/models/BaseModel.py +0 -12
  180. unrealon_sdk/src/clients/python_http/models/BroadcastDeliveryStats.py +0 -33
  181. unrealon_sdk/src/clients/python_http/models/BroadcastMessage.py +0 -17
  182. unrealon_sdk/src/clients/python_http/models/BroadcastMessageRequest.py +0 -35
  183. unrealon_sdk/src/clients/python_http/models/BroadcastPriority.py +0 -10
  184. unrealon_sdk/src/clients/python_http/models/BroadcastResponse.py +0 -21
  185. unrealon_sdk/src/clients/python_http/models/BroadcastResultResponse.py +0 -33
  186. unrealon_sdk/src/clients/python_http/models/BroadcastTarget.py +0 -11
  187. unrealon_sdk/src/clients/python_http/models/ConnectionStats.py +0 -27
  188. unrealon_sdk/src/clients/python_http/models/ConnectionsResponse.py +0 -21
  189. unrealon_sdk/src/clients/python_http/models/DeveloperMessageResponse.py +0 -23
  190. unrealon_sdk/src/clients/python_http/models/ErrorResponse.py +0 -25
  191. unrealon_sdk/src/clients/python_http/models/HTTPValidationError.py +0 -16
  192. unrealon_sdk/src/clients/python_http/models/HealthResponse.py +0 -23
  193. unrealon_sdk/src/clients/python_http/models/HealthStatus.py +0 -33
  194. unrealon_sdk/src/clients/python_http/models/LogLevel.py +0 -10
  195. unrealon_sdk/src/clients/python_http/models/LoggingRequest.py +0 -27
  196. unrealon_sdk/src/clients/python_http/models/LoggingResponse.py +0 -23
  197. unrealon_sdk/src/clients/python_http/models/MaintenanceMode.py +0 -9
  198. unrealon_sdk/src/clients/python_http/models/MaintenanceModeRequest.py +0 -33
  199. unrealon_sdk/src/clients/python_http/models/MaintenanceStatusResponse.py +0 -39
  200. unrealon_sdk/src/clients/python_http/models/ParserCommandRequest.py +0 -25
  201. unrealon_sdk/src/clients/python_http/models/ParserMessageResponse.py +0 -21
  202. unrealon_sdk/src/clients/python_http/models/ParserRegistrationRequest.py +0 -28
  203. unrealon_sdk/src/clients/python_http/models/ParserRegistrationResponse.py +0 -25
  204. unrealon_sdk/src/clients/python_http/models/ParserType.py +0 -10
  205. unrealon_sdk/src/clients/python_http/models/ProxyBlockRequest.py +0 -19
  206. unrealon_sdk/src/clients/python_http/models/ProxyEndpointResponse.py +0 -20
  207. unrealon_sdk/src/clients/python_http/models/ProxyListResponse.py +0 -19
  208. unrealon_sdk/src/clients/python_http/models/ProxyProvider.py +0 -10
  209. unrealon_sdk/src/clients/python_http/models/ProxyPurchaseRequest.py +0 -25
  210. unrealon_sdk/src/clients/python_http/models/ProxyResponse.py +0 -47
  211. unrealon_sdk/src/clients/python_http/models/ProxyRotationRequest.py +0 -23
  212. unrealon_sdk/src/clients/python_http/models/ProxyStatus.py +0 -10
  213. unrealon_sdk/src/clients/python_http/models/ProxyUsageRequest.py +0 -19
  214. unrealon_sdk/src/clients/python_http/models/ProxyUsageStatsResponse.py +0 -26
  215. unrealon_sdk/src/clients/python_http/models/ServiceRegistrationDto.py +0 -23
  216. unrealon_sdk/src/clients/python_http/models/ServiceStatsResponse.py +0 -31
  217. unrealon_sdk/src/clients/python_http/models/SessionStartRequest.py +0 -23
  218. unrealon_sdk/src/clients/python_http/models/SuccessResponse.py +0 -25
  219. unrealon_sdk/src/clients/python_http/models/SystemNotificationResponse.py +0 -23
  220. unrealon_sdk/src/clients/python_http/models/ValidationError.py +0 -18
  221. unrealon_sdk/src/clients/python_http/models/ValidationErrorResponse.py +0 -21
  222. unrealon_sdk/src/clients/python_http/models/WebSocketMetrics.py +0 -21
  223. unrealon_sdk/src/clients/python_http/models/__init__.py +0 -44
  224. unrealon_sdk/src/clients/python_http/services/None_service.py +0 -35
  225. unrealon_sdk/src/clients/python_http/services/ParserManagement_service.py +0 -190
  226. unrealon_sdk/src/clients/python_http/services/ProxyManagement_service.py +0 -289
  227. unrealon_sdk/src/clients/python_http/services/SocketLogging_service.py +0 -187
  228. unrealon_sdk/src/clients/python_http/services/SystemHealth_service.py +0 -119
  229. unrealon_sdk/src/clients/python_http/services/WebSocketAPI_service.py +0 -198
  230. unrealon_sdk/src/clients/python_http/services/__init__.py +0 -0
  231. unrealon_sdk/src/clients/python_http/services/admin_service.py +0 -125
  232. unrealon_sdk/src/clients/python_http/services/async_None_service.py +0 -35
  233. unrealon_sdk/src/clients/python_http/services/async_ParserManagement_service.py +0 -190
  234. unrealon_sdk/src/clients/python_http/services/async_ProxyManagement_service.py +0 -289
  235. unrealon_sdk/src/clients/python_http/services/async_SocketLogging_service.py +0 -189
  236. unrealon_sdk/src/clients/python_http/services/async_SystemHealth_service.py +0 -123
  237. unrealon_sdk/src/clients/python_http/services/async_WebSocketAPI_service.py +0 -200
  238. unrealon_sdk/src/clients/python_http/services/async_admin_service.py +0 -125
  239. unrealon_sdk/src/clients/python_websocket/__init__.py +0 -28
  240. unrealon_sdk/src/clients/python_websocket/client.py +0 -490
  241. unrealon_sdk/src/clients/python_websocket/events.py +0 -732
  242. unrealon_sdk/src/clients/python_websocket/example.py +0 -136
  243. unrealon_sdk/src/clients/python_websocket/types.py +0 -871
  244. unrealon_sdk/src/core/__init__.py +0 -64
  245. unrealon_sdk/src/core/client.py +0 -556
  246. unrealon_sdk/src/core/config.py +0 -465
  247. unrealon_sdk/src/core/exceptions.py +0 -239
  248. unrealon_sdk/src/core/metadata.py +0 -191
  249. unrealon_sdk/src/core/models.py +0 -142
  250. unrealon_sdk/src/core/types.py +0 -68
  251. unrealon_sdk/src/dto/__init__.py +0 -268
  252. unrealon_sdk/src/dto/authentication.py +0 -108
  253. unrealon_sdk/src/dto/cache.py +0 -208
  254. unrealon_sdk/src/dto/common.py +0 -19
  255. unrealon_sdk/src/dto/concurrency.py +0 -393
  256. unrealon_sdk/src/dto/events.py +0 -108
  257. unrealon_sdk/src/dto/health.py +0 -339
  258. unrealon_sdk/src/dto/load_balancing.py +0 -336
  259. unrealon_sdk/src/dto/logging.py +0 -230
  260. unrealon_sdk/src/dto/performance.py +0 -165
  261. unrealon_sdk/src/dto/rate_limiting.py +0 -295
  262. unrealon_sdk/src/dto/resource_pooling.py +0 -128
  263. unrealon_sdk/src/dto/structured_logging.py +0 -112
  264. unrealon_sdk/src/dto/task_scheduling.py +0 -121
  265. unrealon_sdk/src/dto/websocket.py +0 -55
  266. unrealon_sdk/src/enterprise/__init__.py +0 -59
  267. unrealon_sdk/src/enterprise/authentication.py +0 -401
  268. unrealon_sdk/src/enterprise/cache_manager.py +0 -578
  269. unrealon_sdk/src/enterprise/error_recovery.py +0 -494
  270. unrealon_sdk/src/enterprise/event_system.py +0 -549
  271. unrealon_sdk/src/enterprise/health_monitor.py +0 -747
  272. unrealon_sdk/src/enterprise/load_balancer.py +0 -964
  273. unrealon_sdk/src/enterprise/logging/__init__.py +0 -68
  274. unrealon_sdk/src/enterprise/logging/cleanup.py +0 -156
  275. unrealon_sdk/src/enterprise/logging/development.py +0 -744
  276. unrealon_sdk/src/enterprise/logging/service.py +0 -410
  277. unrealon_sdk/src/enterprise/multithreading_manager.py +0 -853
  278. unrealon_sdk/src/enterprise/performance_monitor.py +0 -539
  279. unrealon_sdk/src/enterprise/proxy_manager.py +0 -696
  280. unrealon_sdk/src/enterprise/rate_limiter.py +0 -652
  281. unrealon_sdk/src/enterprise/resource_pool.py +0 -763
  282. unrealon_sdk/src/enterprise/task_scheduler.py +0 -709
  283. unrealon_sdk/src/internal/__init__.py +0 -10
  284. unrealon_sdk/src/internal/command_router.py +0 -497
  285. unrealon_sdk/src/internal/connection_manager.py +0 -397
  286. unrealon_sdk/src/internal/http_client.py +0 -446
  287. unrealon_sdk/src/internal/websocket_client.py +0 -420
  288. unrealon_sdk/src/provider.py +0 -471
  289. unrealon_sdk/src/utils.py +0 -234
  290. /unrealon_browser/{src/cli → cli}/__init__.py +0 -0
  291. /unrealon_browser/{src/cli → cli}/interactive_mode.py +0 -0
  292. /unrealon_browser/{src/cli → cli}/main.py +0 -0
  293. /unrealon_browser/{src/core → core}/__init__.py +0 -0
  294. /unrealon_browser/{src/dto → dto}/__init__.py +0 -0
  295. /unrealon_browser/{src/dto → dto}/models/config.py +0 -0
  296. /unrealon_browser/{src/dto → dto}/models/core.py +0 -0
  297. /unrealon_browser/{src/dto → dto}/models/dataclasses.py +0 -0
  298. /unrealon_browser/{src/dto → dto}/models/detection.py +0 -0
  299. /unrealon_browser/{src/dto → dto}/models/enums.py +0 -0
  300. /unrealon_browser/{src/dto → dto}/models/statistics.py +0 -0
  301. /unrealon_browser/{src/managers → managers}/__init__.py +0 -0
  302. /unrealon_browser/{src/managers → managers}/stealth.py +0 -0
@@ -1,362 +0,0 @@
1
- """
2
- WebSocket Service for UnrealOn Driver v3.0
3
-
4
- Full WebSocket service using unrealon_sdk AdapterClient.
5
- Provides Socket.IO WebSocket connectivity for daemon mode.
6
-
7
- CRITICAL REQUIREMENTS COMPLIANCE:
8
- - ✅ Absolute imports only
9
- - ✅ Pydantic v2 models everywhere
10
- - ✅ Complete type annotations
11
- - ✅ Full unrealon_sdk integration
12
- """
13
-
14
- import asyncio
15
- from typing import Any, Dict, Optional, Callable
16
- from datetime import datetime
17
-
18
- from pydantic import BaseModel, Field, ConfigDict
19
-
20
- from unrealon_sdk.src.provider import Core, Utils, Models
21
- from unrealon_sdk.src.enterprise.logging.development import get_development_logger
22
- from unrealon_sdk.src.dto.logging import SDKContext, SDKEventType
23
-
24
- from unrealon_driver.src.core.exceptions import WebSocketError, create_websocket_error
25
- from unrealon_driver.src.dto.services import (
26
- WebSocketConfig,
27
- ServiceHealthStatus,
28
- ServiceOperationResult,
29
- )
30
- from unrealon_driver.src.dto.events import DriverEventType
31
-
32
-
33
- class SDKAdapterConfig(BaseModel):
34
- """Configuration for SDK Adapter service."""
35
-
36
- model_config = ConfigDict(validate_assignment=True, extra="forbid")
37
-
38
- parser_id: str = Field(..., description="Parser identifier")
39
- parser_name: str = Field(..., description="Human-readable parser name")
40
- api_key: str = Field(..., description="UnrealOn API key")
41
- server_url: str = Field(default="ws://localhost:8000", description="WebSocket server URL")
42
- auto_reconnect: bool = Field(default=True, description="Auto-reconnect on connection loss")
43
- heartbeat_interval: int = Field(default=30, ge=5, le=300, description="Heartbeat interval")
44
- connection_timeout: int = Field(default=10, ge=1, le=60, description="Connection timeout")
45
-
46
-
47
- class WebSocketService:
48
- """
49
- 🔌 WebSocket Service - Production Daemon Communication
50
-
51
- Full implementation using unrealon_sdk AdapterClient:
52
- - Socket.IO WebSocket communication (not raw websockets)
53
- - Command handler registration
54
- - Automatic reconnection
55
- - Parser registration with server
56
- - Type-safe message handling
57
- """
58
-
59
- def __init__(
60
- self,
61
- config: WebSocketConfig,
62
- logger: Optional[Any] = None,
63
- metrics: Optional[Any] = None,
64
- parser_id: str = "unknown",
65
- ):
66
- """Initialize WebSocket service with full SDK integration."""
67
- self.config = config
68
- self.logger = logger
69
- self.metrics = metrics
70
- self.parser_id = parser_id
71
-
72
- # ✅ DEVELOPMENT LOGGER INTEGRATION (CRITICAL REQUIREMENT)
73
- self.dev_logger = get_development_logger()
74
-
75
- # SDK components
76
- self._adapter_client: Optional[Core.AdapterClient] = None
77
- self._command_handlers: Dict[str, Callable] = {}
78
- self._is_connected = False
79
- self._shutdown_event = asyncio.Event()
80
-
81
- # WebSocket connection events are automatically logged by unrealon_sdk AdapterClient
82
- # Driver logs only its specific initialization
83
- if self.dev_logger:
84
- self.dev_logger.log_info(
85
- SDKEventType.COMPONENT_CREATED,
86
- "WebSocket service initialized (connection events handled by SDK)",
87
- context=SDKContext(
88
- parser_id=self.parser_id,
89
- component_name="WebSocket",
90
- layer_name="UnrealOn_Driver",
91
- metadata={
92
- "server_url": self.config.server_url or "auto-detect",
93
- "auto_reconnect": self.config.auto_reconnect,
94
- },
95
- ),
96
- )
97
-
98
- @property
99
- def is_connected(self) -> bool:
100
- """Check if WebSocket is connected."""
101
- return self._is_connected and self._adapter_client is not None
102
-
103
- def register_handler(self, command_type: str, handler: Callable) -> None:
104
- """
105
- Register a command handler.
106
-
107
- Args:
108
- command_type: Command type to handle
109
- handler: Async function to handle the command
110
- """
111
- self._command_handlers[command_type] = handler
112
-
113
- # Log driver-specific handler registration
114
- if self.dev_logger:
115
- self.dev_logger.log_info(
116
- DriverEventType.WEBSOCKET_COMMAND_HANDLER_REGISTERED.value,
117
- f"Command handler registered: {command_type}",
118
- context=SDKContext(
119
- parser_id=self.parser_id,
120
- component_name="WebSocket",
121
- layer_name="UnrealOn_Driver",
122
- metadata={
123
- "command_type": command_type,
124
- "handler_name": handler.__name__ if hasattr(handler, '__name__') else str(handler),
125
- "total_handlers": len(self._command_handlers),
126
- },
127
- ),
128
- )
129
-
130
- if self.logger:
131
- self.logger.info(f"Registered handler for command type: {command_type}")
132
-
133
- async def connect(
134
- self, server_url: Optional[str] = None, api_key: Optional[str] = None, **kwargs
135
- ) -> bool:
136
- """Connect to UnrealOn Server via SDK AdapterClient."""
137
- if self._is_connected:
138
- if self.logger:
139
- self.logger.warning("Already connected to server")
140
- return True
141
-
142
- try:
143
- # Get connection parameters
144
- actual_server_url = server_url or self.config.server_url or "ws://localhost:8000"
145
- actual_api_key = api_key or self.config.api_key or ""
146
-
147
- if not actual_api_key:
148
- raise create_websocket_error(
149
- "API key is required for WebSocket connection", server_url=actual_server_url
150
- )
151
-
152
- if self.logger:
153
- self.logger.info(f"Connecting to UnrealOn Server: {actual_server_url}")
154
-
155
- # Create SDK configuration
156
- sdk_config = Utils.create_parser_config(
157
- parser_id=self.parser_id,
158
- parser_name=self.config.parser_name or self.parser_id,
159
- api_key=actual_api_key,
160
- server_url=actual_server_url,
161
- )
162
-
163
- # Create AdapterClient
164
- self._adapter_client = Core.AdapterClient(sdk_config)
165
-
166
- # Register command handlers with the adapter
167
- for command_type, handler in self._command_handlers.items():
168
- self._register_sdk_handler(command_type, handler)
169
-
170
- # Connect to server
171
- await self._adapter_client.connect()
172
-
173
- self._is_connected = True
174
-
175
- if self.logger:
176
- self.logger.info("WebSocket service connected successfully")
177
-
178
- return True
179
-
180
- except Exception as e:
181
- self._is_connected = False
182
- if self.logger:
183
- self.logger.error(f"WebSocket connection failed: {e}")
184
-
185
- raise create_websocket_error(
186
- f"Failed to connect to WebSocket server: {e}",
187
- server_url=actual_server_url,
188
- connection_status="failed",
189
- )
190
-
191
- def _register_sdk_handler(self, command_type: str, handler: Callable) -> None:
192
- """Register handler with SDK AdapterClient."""
193
- if not self._adapter_client:
194
- return
195
-
196
- @self._adapter_client.on_command(command_type)
197
- async def sdk_handler(command: Models.ParserCommandEvent) -> Models.SuccessResponse:
198
- try:
199
- # Call the user's handler
200
- result = await handler(command)
201
-
202
- # Convert result to proper SDK response
203
- if isinstance(result, (Models.SuccessResponse, Models.ErrorResponse)):
204
- return result
205
- elif isinstance(result, dict):
206
- return Utils.create_success_response(
207
- command_id=command.command_id,
208
- message=f"Command {command_type} handled successfully",
209
- data=result,
210
- )
211
- else:
212
- return Utils.create_success_response(
213
- command_id=command.command_id,
214
- message=f"Command {command_type} handled successfully",
215
- data={"result": str(result)},
216
- )
217
-
218
- except Exception as e:
219
- if self.logger:
220
- self.logger.error(f"Handler for {command_type} failed: {e}")
221
- return Utils.create_error_response(
222
- message=f"Command {command_type} failed: {str(e)}", error_code="HANDLER_ERROR"
223
- )
224
-
225
- async def listen(self, shutdown_event: Optional[asyncio.Event] = None) -> None:
226
- """Start listening for commands (blocks until stopped or shutdown_event is set)."""
227
- if not self._is_connected or not self._adapter_client:
228
- raise WebSocketError("WebSocket not connected. Call connect() first.")
229
-
230
- try:
231
- if self.logger:
232
- self.logger.info("WebSocket service listening for commands...")
233
- self.logger.info(f" Registered handlers: {list(self._command_handlers.keys())}")
234
-
235
- # Start the adapter
236
- await self._adapter_client.start()
237
-
238
- # Use provided shutdown event or our internal one
239
- event_to_wait = shutdown_event or self._shutdown_event
240
-
241
- # Wait for shutdown signal
242
- await event_to_wait.wait()
243
-
244
- if self.logger:
245
- self.logger.info("WebSocket service received shutdown signal")
246
-
247
- except asyncio.CancelledError:
248
- if self.logger:
249
- self.logger.info("WebSocket service stopped (cancelled)")
250
- raise
251
- except Exception as e:
252
- if self.logger:
253
- self.logger.error(f"WebSocket listening error: {e}")
254
- raise
255
-
256
- async def send(self, data: dict):
257
- """Send data through WebSocket."""
258
- if not self._is_connected or not self._adapter_client:
259
- if self.logger:
260
- self.logger.warning("Cannot send data - not connected")
261
- return
262
-
263
- try:
264
- # Send status update or other data
265
- if self.logger:
266
- self.logger.debug(f"Sending data: {data}")
267
- # Note: Specific send methods depend on SDK implementation
268
-
269
- except Exception as e:
270
- if self.logger:
271
- self.logger.error(f"Failed to send data: {e}")
272
-
273
- async def send_status_update(self, status: str, metadata: Optional[dict] = None) -> None:
274
- """Send status update to server."""
275
- if not self._is_connected:
276
- if self.logger:
277
- self.logger.warning("Cannot send status - not connected")
278
- return
279
-
280
- try:
281
- status_data = {
282
- "status": status,
283
- "parser_id": self.parser_id,
284
- "timestamp": datetime.utcnow().isoformat(),
285
- }
286
- if metadata:
287
- status_data["metadata"] = metadata
288
-
289
- await self.send(status_data)
290
-
291
- except Exception as e:
292
- if self.logger:
293
- self.logger.error(f"Failed to send status update: {e}")
294
-
295
- async def disconnect(self):
296
- """Disconnect from WebSocket server."""
297
- if not self._is_connected:
298
- return
299
-
300
- try:
301
- if self._adapter_client:
302
- await self._adapter_client.stop()
303
-
304
- self._is_connected = False
305
-
306
- if self.logger:
307
- self.logger.info("WebSocket service disconnected")
308
-
309
- except Exception as e:
310
- if self.logger:
311
- self.logger.error(f"Error during WebSocket disconnect: {e}")
312
-
313
- def stop(self):
314
- """Signal shutdown for graceful stop."""
315
- self._shutdown_event.set()
316
-
317
- async def health_check(self) -> dict:
318
- """Check WebSocket service health."""
319
- try:
320
- health_status = {
321
- "status": "healthy" if self._is_connected else "disconnected",
322
- "connected": self._is_connected,
323
- "server_url": self.config.server_url or "unknown",
324
- "handlers_count": len(self._command_handlers),
325
- "parser_id": self.parser_id,
326
- }
327
-
328
- if self._adapter_client:
329
- # Add adapter-specific health info if available
330
- health_status["adapter_status"] = "active"
331
-
332
- return health_status
333
-
334
- except Exception as e:
335
- return {"status": "unhealthy", "error": str(e), "connected": False}
336
-
337
- async def cleanup(self):
338
- """Clean up WebSocket resources."""
339
- try:
340
- await self.disconnect()
341
- self._command_handlers.clear()
342
-
343
- if self.logger:
344
- self.logger.info("WebSocket service cleanup completed")
345
-
346
- except Exception as e:
347
- if self.logger:
348
- self.logger.error(f"Error during WebSocket cleanup: {e}")
349
-
350
- @property
351
- def connection_info(self) -> dict:
352
- """Get connection information."""
353
- return {
354
- "connected": self._is_connected,
355
- "parser_id": self.parser_id,
356
- "server_url": self.config.server_url or "unknown",
357
- "handlers": list(self._command_handlers.keys()),
358
- "timestamp": datetime.utcnow().isoformat(),
359
- }
360
-
361
- def __repr__(self) -> str:
362
- return f"<WebSocketService(connected={self._is_connected}, handlers={len(self._command_handlers)})>"
@@ -1,16 +0,0 @@
1
- """
2
- UnrealOn Driver v3.0 - Utilities
3
-
4
- Modern utilities and helper classes for driver operations.
5
- COMPLIANCE: 100% Pydantic v2 compliant, no Dict[str, Any] usage.
6
- """
7
-
8
- from .service_factory import ServiceFactory
9
- from .time_formatter import TimeFormatter, ScheduleTimer, DaemonTimer
10
-
11
- __all__ = [
12
- "ServiceFactory",
13
- "TimeFormatter",
14
- "ScheduleTimer",
15
- "DaemonTimer",
16
- ]
@@ -1,317 +0,0 @@
1
- """
2
- Modern Service Factory - UnrealOn Driver v3.0
3
-
4
- Revolutionary service factory with Pydantic v2 integration and AutoConfig support.
5
- Provides type-safe, zero-configuration service creation with enterprise defaults.
6
-
7
- COMPLIANCE: 100% Pydantic v2 compliant, no Dict[str, Any] usage.
8
- """
9
-
10
- from typing import Optional, TypeVar, Type
11
- from pathlib import Path
12
-
13
- from unrealon_driver.src.config.auto_config import AutoConfig
14
- from unrealon_driver.src.core.parser import Parser
15
- from unrealon_driver.src.services.browser_service import BrowserService
16
- from unrealon_driver.src.services.llm import LLMService
17
- from unrealon_driver.src.services.websocket_service import WebSocketService
18
- from unrealon_driver.src.logging import DriverLogger, ensure_driver_logger
19
- from unrealon_driver.src.services.metrics_service import MetricsService
20
- from unrealon_driver.src.services.scheduler_service import SchedulerService
21
- from unrealon_driver.src.dto.services import (
22
- DriverBrowserConfig,
23
- LLMConfig,
24
- WebSocketConfig,
25
- LoggerConfig,
26
- MetricsConfig,
27
- SchedulerConfig,
28
- )
29
-
30
- # Type variable for generic service creation
31
- ServiceType = TypeVar("ServiceType")
32
-
33
-
34
- class ServiceFactory:
35
- """
36
- 🎯 Modern Service Factory - UnrealOn Driver v3.0
37
-
38
- Revolutionary Simplicity meets Enterprise Power:
39
- - 🔧 Zero-configuration defaults via AutoConfig
40
- - 🎯 100% Pydantic v2 type safety
41
- - ⚡ Fluent API for service creation
42
- - 🚀 Enterprise-grade configurations
43
- - 🔄 Environment-aware settings
44
-
45
- Examples:
46
- # Quick development setup
47
- factory = ServiceFactory.for_development("my_parser")
48
- parser = factory.create_parser()
49
- browser = factory.create_browser_service()
50
-
51
- # Production setup with custom config
52
- factory = ServiceFactory.for_production("prod_parser")
53
- parser = factory.create_parser()
54
- llm = factory.create_llm_service()
55
-
56
- # Custom configuration
57
- factory = ServiceFactory(config=my_config)
58
- all_services = factory.create_all_services()
59
- """
60
-
61
- def __init__(self, config: Optional[AutoConfig] = None):
62
- """
63
- Initialize service factory with optional configuration.
64
-
65
- Args:
66
- config: AutoConfig instance. If None, creates default development config.
67
- """
68
- self.config = config or AutoConfig.create_development("factory_default")
69
-
70
- # ===========================================
71
- # FLUENT FACTORY CREATION METHODS
72
- # ===========================================
73
-
74
- @classmethod
75
- def for_development(cls, parser_id: str) -> "ServiceFactory":
76
- """Create factory for development environment with debug features."""
77
- config = AutoConfig.create_development(parser_id)
78
- return cls(config)
79
-
80
- @classmethod
81
- def for_production(cls, parser_id: str) -> "ServiceFactory":
82
- """Create factory for production environment with optimal settings."""
83
- config = AutoConfig.create_production(parser_id)
84
- return cls(config)
85
-
86
- @classmethod
87
- def for_testing(cls, parser_id: str) -> "ServiceFactory":
88
- """Create factory for testing environment with minimal settings."""
89
- config = AutoConfig.create_minimal(parser_id)
90
- return cls(config)
91
-
92
- @classmethod
93
- def with_custom_config(cls, config: AutoConfig) -> "ServiceFactory":
94
- """Create factory with custom AutoConfig."""
95
- return cls(config)
96
-
97
- @classmethod
98
- def from_config(cls, config: AutoConfig) -> "ServiceFactory":
99
- """Create factory from AutoConfig (alias for with_custom_config)."""
100
- return cls(config)
101
-
102
- # ===========================================
103
- # CORE SERVICE CREATION METHODS
104
- # ===========================================
105
-
106
- def create_parser(self, **overrides) -> Parser:
107
- """
108
- Create fully configured Parser instance.
109
-
110
- Args:
111
- **overrides: Override specific parser configuration options.
112
-
113
- Returns:
114
- Parser with all services auto-configured based on environment.
115
- """
116
- parser_id = overrides.get("parser_id", self.config.parser_id)
117
- parser_name = overrides.get("parser_name", self.config.parser_id.replace("_", " ").title())
118
-
119
- config = self.config.model_dump()
120
- if overrides:
121
- config.update(overrides)
122
-
123
- return Parser(
124
- parser_id=parser_id,
125
- parser_name=parser_name,
126
- config=config,
127
- )
128
-
129
- def create_browser_service(self, **overrides) -> BrowserService:
130
- """
131
- Create BrowserService with intelligent defaults.
132
-
133
- Args:
134
- **overrides: Override specific browser configuration options.
135
-
136
- Returns:
137
- Configured BrowserService instance.
138
- """
139
- browser_config = self.config.browser_config
140
- if overrides:
141
- browser_config = browser_config.model_copy(update=overrides)
142
-
143
- return BrowserService(
144
- config=browser_config,
145
- logger=self._create_service_logger("browser"),
146
- metrics=self._create_service_metrics("browser"),
147
- )
148
-
149
- def create_llm_service(self, **overrides) -> LLMService:
150
- """
151
- Create LLMService with AI-optimized defaults.
152
-
153
- Args:
154
- **overrides: Override specific LLM configuration options.
155
-
156
- Returns:
157
- Configured LLMService instance.
158
- """
159
- llm_config = self.config.llm_config
160
- if overrides:
161
- llm_config = llm_config.model_copy(update=overrides)
162
-
163
- return LLMService(
164
- config=llm_config,
165
- logger=self._create_service_logger("llm"),
166
- )
167
-
168
- def create_websocket_service(self, **overrides) -> WebSocketService:
169
- """
170
- Create WebSocketService for real-time communication.
171
-
172
- Args:
173
- **overrides: Override specific WebSocket configuration options.
174
-
175
- Returns:
176
- Configured WebSocketService instance.
177
- """
178
- websocket_config = self.config.websocket_config
179
- if overrides:
180
- websocket_config = websocket_config.model_copy(update=overrides)
181
-
182
- return WebSocketService(
183
- parser_id=self.config.parser_id,
184
- config=websocket_config,
185
- logger=self._create_service_logger("websocket"),
186
- )
187
-
188
- def create_driver_logger(self, **overrides) -> DriverLogger:
189
- """
190
- Create DriverLogger with enterprise SDK integration.
191
-
192
- Args:
193
- **overrides: Override specific logger configuration options.
194
-
195
- Returns:
196
- Configured DriverLogger instance with SDK integration.
197
- """
198
- # Extract relevant config from overrides
199
- log_level = overrides.get("log_level", self.config.logger_config.log_level.value)
200
- enable_console = overrides.get("enable_console", self.config.logger_config.console_output)
201
- enable_websocket = overrides.get("enable_websocket", False) # Default off for performance
202
-
203
- return ensure_driver_logger(
204
- parser_id=self.config.parser_id,
205
- parser_name=self.config.parser_id.replace("_", " ").title(),
206
- )
207
-
208
- def create_metrics_service(self, **overrides) -> MetricsService:
209
- """
210
- Create MetricsService for performance monitoring.
211
-
212
- Args:
213
- **overrides: Override specific metrics configuration options.
214
-
215
- Returns:
216
- Configured MetricsService instance.
217
- """
218
- metrics_config = self.config.metrics_config
219
- if overrides:
220
- metrics_config = metrics_config.model_copy(update=overrides)
221
-
222
- return MetricsService(
223
- parser_id=self.config.parser_id,
224
- config=metrics_config,
225
- )
226
-
227
- def create_scheduler_service(self, **overrides) -> SchedulerService:
228
- """
229
- Create SchedulerService for task automation.
230
-
231
- Args:
232
- **overrides: Override specific scheduler configuration options.
233
-
234
- Returns:
235
- Configured SchedulerService instance.
236
- """
237
- scheduler_config = self.config.scheduler_config
238
- if overrides:
239
- scheduler_config = scheduler_config.model_copy(update=overrides)
240
-
241
- return SchedulerService(
242
- config=scheduler_config,
243
- logger=self._create_service_logger("scheduler"),
244
- )
245
-
246
- # ===========================================
247
- # CONVENIENCE METHODS
248
- # ===========================================
249
-
250
- def create_all_services(self) -> dict:
251
- """
252
- Create all services with consistent configuration.
253
-
254
- Returns:
255
- Dictionary with all configured services.
256
- """
257
- return {
258
- "parser": self.create_parser(),
259
- "browser": self.create_browser_service(),
260
- "llm": self.create_llm_service(),
261
- "websocket": self.create_websocket_service(),
262
- "logger": self.create_driver_logger(),
263
- "metrics": self.create_metrics_service(),
264
- "scheduler": self.create_scheduler_service(),
265
- }
266
-
267
- def create_core_services(self) -> dict:
268
- """
269
- Create essential services for basic parsing operations.
270
-
271
- Returns:
272
- Dictionary with core services (browser, llm, logger).
273
- """
274
- return {
275
- "parser": self.create_parser(),
276
- "browser": self.create_browser_service(),
277
- "llm": self.create_llm_service(),
278
- "logger": self.create_driver_logger(),
279
- }
280
-
281
- # ===========================================
282
- # INTERNAL HELPER METHODS
283
- # ===========================================
284
-
285
- def _create_service_logger(self, service_name: str) -> Optional[DriverLogger]:
286
- """Create a DriverLogger for a specific service (shared global instance)."""
287
- # Services now share the global DriverLogger instance for consistency
288
- return ensure_driver_logger(
289
- parser_id=self.config.parser_id,
290
- parser_name=self.config.parser_id.replace("_", " ").title(),
291
- )
292
-
293
- def _create_service_metrics(self, service_name: str) -> Optional[MetricsService]:
294
- """Create metrics collector for a specific service."""
295
- if not self.config.metrics_config:
296
- return None
297
-
298
- return MetricsService(
299
- config=self.config.metrics_config,
300
- parser_id=f"{self.config.parser_id}_{service_name}",
301
- )
302
-
303
- def update_config(self, **updates) -> "ServiceFactory":
304
- """
305
- Create new factory with updated configuration.
306
-
307
- Args:
308
- **updates: Configuration updates to apply.
309
-
310
- Returns:
311
- New ServiceFactory instance with updated config.
312
- """
313
- new_config = self.config.model_copy(update=updates)
314
- return ServiceFactory(new_config)
315
-
316
- def __repr__(self) -> str:
317
- return f"<ServiceFactory(parser_id={self.config.parser_id}, env={self.config.environment})>"