unrealon 1.0.9__py3-none-any.whl → 1.1.1__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.
- unrealon/__init__.py +23 -21
- unrealon-1.1.1.dist-info/METADATA +722 -0
- unrealon-1.1.1.dist-info/RECORD +82 -0
- {unrealon-1.0.9.dist-info → unrealon-1.1.1.dist-info}/WHEEL +1 -1
- unrealon-1.1.1.dist-info/entry_points.txt +9 -0
- {unrealon-1.0.9.dist-info → unrealon-1.1.1.dist-info/licenses}/LICENSE +1 -1
- unrealon_bridge/__init__.py +114 -0
- unrealon_bridge/cli.py +316 -0
- unrealon_bridge/client/__init__.py +93 -0
- unrealon_bridge/client/base.py +78 -0
- unrealon_bridge/client/commands.py +89 -0
- unrealon_bridge/client/connection.py +90 -0
- unrealon_bridge/client/events.py +65 -0
- unrealon_bridge/client/health.py +38 -0
- unrealon_bridge/client/html_parser.py +146 -0
- unrealon_bridge/client/logging.py +139 -0
- unrealon_bridge/client/proxy.py +70 -0
- unrealon_bridge/client/scheduler.py +450 -0
- unrealon_bridge/client/session.py +70 -0
- unrealon_bridge/configs/__init__.py +14 -0
- unrealon_bridge/configs/bridge_config.py +212 -0
- unrealon_bridge/configs/bridge_config.yaml +39 -0
- unrealon_bridge/models/__init__.py +138 -0
- unrealon_bridge/models/base.py +28 -0
- unrealon_bridge/models/command.py +41 -0
- unrealon_bridge/models/events.py +40 -0
- unrealon_bridge/models/html_parser.py +79 -0
- unrealon_bridge/models/logging.py +55 -0
- unrealon_bridge/models/parser.py +63 -0
- unrealon_bridge/models/proxy.py +41 -0
- unrealon_bridge/models/requests.py +95 -0
- unrealon_bridge/models/responses.py +88 -0
- unrealon_bridge/models/scheduler.py +592 -0
- unrealon_bridge/models/session.py +28 -0
- unrealon_bridge/server/__init__.py +91 -0
- unrealon_bridge/server/base.py +171 -0
- unrealon_bridge/server/handlers/__init__.py +23 -0
- unrealon_bridge/server/handlers/command.py +110 -0
- unrealon_bridge/server/handlers/html_parser.py +139 -0
- unrealon_bridge/server/handlers/logging.py +95 -0
- unrealon_bridge/server/handlers/parser.py +95 -0
- unrealon_bridge/server/handlers/proxy.py +75 -0
- unrealon_bridge/server/handlers/scheduler.py +545 -0
- unrealon_bridge/server/handlers/session.py +66 -0
- unrealon_browser/__init__.py +61 -18
- unrealon_browser/{src/cli → cli}/browser_cli.py +6 -13
- unrealon_browser/{src/cli → cli}/cookies_cli.py +5 -1
- unrealon_browser/{src/core → core}/browser_manager.py +2 -2
- unrealon_browser/{src/managers → managers}/captcha.py +1 -1
- unrealon_browser/{src/managers → managers}/cookies.py +1 -1
- unrealon_browser/managers/logger_bridge.py +231 -0
- unrealon_browser/{src/managers → managers}/profile.py +1 -1
- unrealon_driver/__init__.py +73 -19
- unrealon_driver/browser/__init__.py +8 -0
- unrealon_driver/browser/config.py +74 -0
- unrealon_driver/browser/manager.py +416 -0
- unrealon_driver/exceptions.py +28 -0
- unrealon_driver/parser/__init__.py +55 -0
- unrealon_driver/parser/cli_manager.py +141 -0
- unrealon_driver/parser/daemon_manager.py +227 -0
- unrealon_driver/parser/managers/__init__.py +46 -0
- unrealon_driver/parser/managers/browser.py +51 -0
- unrealon_driver/parser/managers/config.py +281 -0
- unrealon_driver/parser/managers/error.py +412 -0
- unrealon_driver/parser/managers/html.py +732 -0
- unrealon_driver/parser/managers/logging.py +609 -0
- unrealon_driver/parser/managers/result.py +321 -0
- unrealon_driver/parser/parser_manager.py +628 -0
- unrealon/sdk_config.py +0 -88
- unrealon-1.0.9.dist-info/METADATA +0 -810
- unrealon-1.0.9.dist-info/RECORD +0 -246
- unrealon_browser/pyproject.toml +0 -182
- unrealon_browser/src/__init__.py +0 -62
- unrealon_browser/src/managers/logger_bridge.py +0 -395
- unrealon_driver/README.md +0 -204
- unrealon_driver/pyproject.toml +0 -187
- unrealon_driver/src/__init__.py +0 -90
- unrealon_driver/src/cli/__init__.py +0 -10
- unrealon_driver/src/cli/main.py +0 -66
- unrealon_driver/src/cli/simple.py +0 -510
- unrealon_driver/src/config/__init__.py +0 -11
- unrealon_driver/src/config/auto_config.py +0 -478
- unrealon_driver/src/core/__init__.py +0 -18
- unrealon_driver/src/core/exceptions.py +0 -289
- unrealon_driver/src/core/parser.py +0 -638
- unrealon_driver/src/dto/__init__.py +0 -66
- unrealon_driver/src/dto/cli.py +0 -119
- unrealon_driver/src/dto/config.py +0 -18
- unrealon_driver/src/dto/events.py +0 -237
- unrealon_driver/src/dto/execution.py +0 -313
- unrealon_driver/src/dto/services.py +0 -311
- unrealon_driver/src/execution/__init__.py +0 -23
- unrealon_driver/src/execution/daemon_mode.py +0 -317
- unrealon_driver/src/execution/interactive_mode.py +0 -88
- unrealon_driver/src/execution/modes.py +0 -45
- unrealon_driver/src/execution/scheduled_mode.py +0 -209
- unrealon_driver/src/execution/test_mode.py +0 -250
- unrealon_driver/src/logging/__init__.py +0 -24
- unrealon_driver/src/logging/driver_logger.py +0 -512
- unrealon_driver/src/services/__init__.py +0 -24
- unrealon_driver/src/services/browser_service.py +0 -726
- unrealon_driver/src/services/llm/__init__.py +0 -15
- unrealon_driver/src/services/llm/browser_llm_service.py +0 -363
- unrealon_driver/src/services/llm/llm.py +0 -195
- unrealon_driver/src/services/logger_service.py +0 -232
- unrealon_driver/src/services/metrics_service.py +0 -185
- unrealon_driver/src/services/scheduler_service.py +0 -489
- unrealon_driver/src/services/websocket_service.py +0 -362
- unrealon_driver/src/utils/__init__.py +0 -16
- unrealon_driver/src/utils/service_factory.py +0 -317
- unrealon_driver/src/utils/time_formatter.py +0 -338
- unrealon_llm/README.md +0 -44
- unrealon_llm/__init__.py +0 -26
- unrealon_llm/pyproject.toml +0 -154
- unrealon_llm/src/__init__.py +0 -228
- unrealon_llm/src/cli/__init__.py +0 -0
- unrealon_llm/src/core/__init__.py +0 -11
- unrealon_llm/src/core/smart_client.py +0 -438
- unrealon_llm/src/dto/__init__.py +0 -155
- unrealon_llm/src/dto/models/__init__.py +0 -0
- unrealon_llm/src/dto/models/config.py +0 -343
- unrealon_llm/src/dto/models/core.py +0 -328
- unrealon_llm/src/dto/models/enums.py +0 -123
- unrealon_llm/src/dto/models/html_analysis.py +0 -345
- unrealon_llm/src/dto/models/statistics.py +0 -473
- unrealon_llm/src/dto/models/translation.py +0 -383
- unrealon_llm/src/dto/models/type_conversion.py +0 -462
- unrealon_llm/src/dto/schemas/__init__.py +0 -0
- unrealon_llm/src/exceptions.py +0 -392
- unrealon_llm/src/llm_config/__init__.py +0 -20
- unrealon_llm/src/llm_config/logging_config.py +0 -178
- unrealon_llm/src/llm_logging/__init__.py +0 -42
- unrealon_llm/src/llm_logging/llm_events.py +0 -107
- unrealon_llm/src/llm_logging/llm_logger.py +0 -466
- unrealon_llm/src/managers/__init__.py +0 -15
- unrealon_llm/src/managers/cache_manager.py +0 -67
- unrealon_llm/src/managers/cost_manager.py +0 -107
- unrealon_llm/src/managers/request_manager.py +0 -298
- unrealon_llm/src/modules/__init__.py +0 -0
- unrealon_llm/src/modules/html_processor/__init__.py +0 -25
- unrealon_llm/src/modules/html_processor/base_processor.py +0 -415
- unrealon_llm/src/modules/html_processor/details_processor.py +0 -85
- unrealon_llm/src/modules/html_processor/listing_processor.py +0 -91
- unrealon_llm/src/modules/html_processor/models/__init__.py +0 -20
- unrealon_llm/src/modules/html_processor/models/processing_models.py +0 -40
- unrealon_llm/src/modules/html_processor/models/universal_model.py +0 -56
- unrealon_llm/src/modules/html_processor/processor.py +0 -102
- unrealon_llm/src/modules/llm/__init__.py +0 -0
- unrealon_llm/src/modules/translator/__init__.py +0 -0
- unrealon_llm/src/provider.py +0 -116
- unrealon_llm/src/utils/__init__.py +0 -95
- unrealon_llm/src/utils/common.py +0 -64
- unrealon_llm/src/utils/data_extractor.py +0 -188
- unrealon_llm/src/utils/html_cleaner.py +0 -767
- unrealon_llm/src/utils/language_detector.py +0 -308
- unrealon_llm/src/utils/models_cache.py +0 -592
- unrealon_llm/src/utils/smart_counter.py +0 -229
- unrealon_llm/src/utils/token_counter.py +0 -189
- unrealon_sdk/README.md +0 -25
- unrealon_sdk/__init__.py +0 -30
- unrealon_sdk/pyproject.toml +0 -231
- unrealon_sdk/src/__init__.py +0 -150
- unrealon_sdk/src/cli/__init__.py +0 -12
- unrealon_sdk/src/cli/commands/__init__.py +0 -22
- unrealon_sdk/src/cli/commands/benchmark.py +0 -42
- unrealon_sdk/src/cli/commands/diagnostics.py +0 -573
- unrealon_sdk/src/cli/commands/health.py +0 -46
- unrealon_sdk/src/cli/commands/integration.py +0 -498
- unrealon_sdk/src/cli/commands/reports.py +0 -43
- unrealon_sdk/src/cli/commands/security.py +0 -36
- unrealon_sdk/src/cli/commands/server.py +0 -483
- unrealon_sdk/src/cli/commands/servers.py +0 -56
- unrealon_sdk/src/cli/commands/tests.py +0 -55
- unrealon_sdk/src/cli/main.py +0 -126
- unrealon_sdk/src/cli/utils/reporter.py +0 -519
- unrealon_sdk/src/clients/openapi.yaml +0 -3347
- unrealon_sdk/src/clients/python_http/__init__.py +0 -3
- unrealon_sdk/src/clients/python_http/api_config.py +0 -228
- unrealon_sdk/src/clients/python_http/models/BaseModel.py +0 -12
- unrealon_sdk/src/clients/python_http/models/BroadcastDeliveryStats.py +0 -33
- unrealon_sdk/src/clients/python_http/models/BroadcastMessage.py +0 -17
- unrealon_sdk/src/clients/python_http/models/BroadcastMessageRequest.py +0 -35
- unrealon_sdk/src/clients/python_http/models/BroadcastPriority.py +0 -10
- unrealon_sdk/src/clients/python_http/models/BroadcastResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/BroadcastResultResponse.py +0 -33
- unrealon_sdk/src/clients/python_http/models/BroadcastTarget.py +0 -11
- unrealon_sdk/src/clients/python_http/models/ConnectionStats.py +0 -27
- unrealon_sdk/src/clients/python_http/models/ConnectionsResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/DeveloperMessageResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ErrorResponse.py +0 -25
- unrealon_sdk/src/clients/python_http/models/HTTPValidationError.py +0 -16
- unrealon_sdk/src/clients/python_http/models/HealthResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/HealthStatus.py +0 -33
- unrealon_sdk/src/clients/python_http/models/LogLevel.py +0 -10
- unrealon_sdk/src/clients/python_http/models/LoggingRequest.py +0 -27
- unrealon_sdk/src/clients/python_http/models/LoggingResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/MaintenanceMode.py +0 -9
- unrealon_sdk/src/clients/python_http/models/MaintenanceModeRequest.py +0 -33
- unrealon_sdk/src/clients/python_http/models/MaintenanceStatusResponse.py +0 -39
- unrealon_sdk/src/clients/python_http/models/ParserCommandRequest.py +0 -25
- unrealon_sdk/src/clients/python_http/models/ParserMessageResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/ParserRegistrationRequest.py +0 -28
- unrealon_sdk/src/clients/python_http/models/ParserRegistrationResponse.py +0 -25
- unrealon_sdk/src/clients/python_http/models/ParserType.py +0 -10
- unrealon_sdk/src/clients/python_http/models/ProxyBlockRequest.py +0 -19
- unrealon_sdk/src/clients/python_http/models/ProxyEndpointResponse.py +0 -20
- unrealon_sdk/src/clients/python_http/models/ProxyListResponse.py +0 -19
- unrealon_sdk/src/clients/python_http/models/ProxyProvider.py +0 -10
- unrealon_sdk/src/clients/python_http/models/ProxyPurchaseRequest.py +0 -25
- unrealon_sdk/src/clients/python_http/models/ProxyResponse.py +0 -47
- unrealon_sdk/src/clients/python_http/models/ProxyRotationRequest.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ProxyStatus.py +0 -10
- unrealon_sdk/src/clients/python_http/models/ProxyUsageRequest.py +0 -19
- unrealon_sdk/src/clients/python_http/models/ProxyUsageStatsResponse.py +0 -26
- unrealon_sdk/src/clients/python_http/models/ServiceRegistrationDto.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ServiceStatsResponse.py +0 -31
- unrealon_sdk/src/clients/python_http/models/SessionStartRequest.py +0 -23
- unrealon_sdk/src/clients/python_http/models/SuccessResponse.py +0 -25
- unrealon_sdk/src/clients/python_http/models/SystemNotificationResponse.py +0 -23
- unrealon_sdk/src/clients/python_http/models/ValidationError.py +0 -18
- unrealon_sdk/src/clients/python_http/models/ValidationErrorResponse.py +0 -21
- unrealon_sdk/src/clients/python_http/models/WebSocketMetrics.py +0 -21
- unrealon_sdk/src/clients/python_http/models/__init__.py +0 -44
- unrealon_sdk/src/clients/python_http/services/None_service.py +0 -35
- unrealon_sdk/src/clients/python_http/services/ParserManagement_service.py +0 -190
- unrealon_sdk/src/clients/python_http/services/ProxyManagement_service.py +0 -289
- unrealon_sdk/src/clients/python_http/services/SocketLogging_service.py +0 -187
- unrealon_sdk/src/clients/python_http/services/SystemHealth_service.py +0 -119
- unrealon_sdk/src/clients/python_http/services/WebSocketAPI_service.py +0 -198
- unrealon_sdk/src/clients/python_http/services/__init__.py +0 -0
- unrealon_sdk/src/clients/python_http/services/admin_service.py +0 -125
- unrealon_sdk/src/clients/python_http/services/async_None_service.py +0 -35
- unrealon_sdk/src/clients/python_http/services/async_ParserManagement_service.py +0 -190
- unrealon_sdk/src/clients/python_http/services/async_ProxyManagement_service.py +0 -289
- unrealon_sdk/src/clients/python_http/services/async_SocketLogging_service.py +0 -189
- unrealon_sdk/src/clients/python_http/services/async_SystemHealth_service.py +0 -123
- unrealon_sdk/src/clients/python_http/services/async_WebSocketAPI_service.py +0 -200
- unrealon_sdk/src/clients/python_http/services/async_admin_service.py +0 -125
- unrealon_sdk/src/clients/python_websocket/__init__.py +0 -28
- unrealon_sdk/src/clients/python_websocket/client.py +0 -490
- unrealon_sdk/src/clients/python_websocket/events.py +0 -732
- unrealon_sdk/src/clients/python_websocket/example.py +0 -136
- unrealon_sdk/src/clients/python_websocket/types.py +0 -871
- unrealon_sdk/src/core/__init__.py +0 -64
- unrealon_sdk/src/core/client.py +0 -556
- unrealon_sdk/src/core/config.py +0 -465
- unrealon_sdk/src/core/exceptions.py +0 -239
- unrealon_sdk/src/core/metadata.py +0 -191
- unrealon_sdk/src/core/models.py +0 -142
- unrealon_sdk/src/core/types.py +0 -68
- unrealon_sdk/src/dto/__init__.py +0 -268
- unrealon_sdk/src/dto/authentication.py +0 -108
- unrealon_sdk/src/dto/cache.py +0 -208
- unrealon_sdk/src/dto/common.py +0 -19
- unrealon_sdk/src/dto/concurrency.py +0 -393
- unrealon_sdk/src/dto/events.py +0 -108
- unrealon_sdk/src/dto/health.py +0 -339
- unrealon_sdk/src/dto/load_balancing.py +0 -336
- unrealon_sdk/src/dto/logging.py +0 -230
- unrealon_sdk/src/dto/performance.py +0 -165
- unrealon_sdk/src/dto/rate_limiting.py +0 -295
- unrealon_sdk/src/dto/resource_pooling.py +0 -128
- unrealon_sdk/src/dto/structured_logging.py +0 -112
- unrealon_sdk/src/dto/task_scheduling.py +0 -121
- unrealon_sdk/src/dto/websocket.py +0 -55
- unrealon_sdk/src/enterprise/__init__.py +0 -59
- unrealon_sdk/src/enterprise/authentication.py +0 -401
- unrealon_sdk/src/enterprise/cache_manager.py +0 -578
- unrealon_sdk/src/enterprise/error_recovery.py +0 -494
- unrealon_sdk/src/enterprise/event_system.py +0 -549
- unrealon_sdk/src/enterprise/health_monitor.py +0 -747
- unrealon_sdk/src/enterprise/load_balancer.py +0 -964
- unrealon_sdk/src/enterprise/logging/__init__.py +0 -68
- unrealon_sdk/src/enterprise/logging/cleanup.py +0 -156
- unrealon_sdk/src/enterprise/logging/development.py +0 -744
- unrealon_sdk/src/enterprise/logging/service.py +0 -410
- unrealon_sdk/src/enterprise/multithreading_manager.py +0 -853
- unrealon_sdk/src/enterprise/performance_monitor.py +0 -539
- unrealon_sdk/src/enterprise/proxy_manager.py +0 -696
- unrealon_sdk/src/enterprise/rate_limiter.py +0 -652
- unrealon_sdk/src/enterprise/resource_pool.py +0 -763
- unrealon_sdk/src/enterprise/task_scheduler.py +0 -709
- unrealon_sdk/src/internal/__init__.py +0 -10
- unrealon_sdk/src/internal/command_router.py +0 -497
- unrealon_sdk/src/internal/connection_manager.py +0 -397
- unrealon_sdk/src/internal/http_client.py +0 -446
- unrealon_sdk/src/internal/websocket_client.py +0 -420
- unrealon_sdk/src/provider.py +0 -471
- unrealon_sdk/src/utils.py +0 -234
- /unrealon_browser/{src/cli → cli}/__init__.py +0 -0
- /unrealon_browser/{src/cli → cli}/interactive_mode.py +0 -0
- /unrealon_browser/{src/cli → cli}/main.py +0 -0
- /unrealon_browser/{src/core → core}/__init__.py +0 -0
- /unrealon_browser/{src/dto → dto}/__init__.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/config.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/core.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/dataclasses.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/detection.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/enums.py +0 -0
- /unrealon_browser/{src/dto → dto}/models/statistics.py +0 -0
- /unrealon_browser/{src/managers → managers}/__init__.py +0 -0
- /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})>"
|