wavespeed 1.0.7__tar.gz → 1.0.8__tar.gz
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.
- {wavespeed-1.0.7 → wavespeed-1.0.8}/PKG-INFO +1 -1
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/_version.py +1 -1
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/__init__.py +15 -4
- wavespeed-1.0.8/src/wavespeed/serverless/modules/health.py +59 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed.egg-info/PKG-INFO +1 -1
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed.egg-info/SOURCES.txt +1 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/.github/workflows/claude-code-review.yml +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/.github/workflows/claude.yml +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/.github/workflows/pre-commit.yml +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/.github/workflows/python-packages.yml +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/.github/workflows/python-publish.yml +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/.gitignore +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/.pre-commit-config.yaml +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/CLAUDE.md +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/LICENSE +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/MANIFEST.in +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/README.md +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/VERSIONING.md +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/images/build_and_push.sh +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/images/test_worker/Dockerfile +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/images/test_worker/build_and_test.sh +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/images/test_worker/handler.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/images/test_worker/requirements.txt +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/images/test_worker/test_input.json +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/pyproject.toml +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/pytest.ini +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/setup.cfg +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/__init__.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/_config_module.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/api/__init__.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/api/client.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/config.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/modules/__init__.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/modules/fastapi.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/modules/handler.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/modules/heartbeat.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/modules/http.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/modules/job.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/modules/local.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/modules/logger.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/modules/progress.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/modules/scaler.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/modules/state.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/utils/__init__.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/utils/boto3_utils.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/utils/validator.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed/serverless/worker.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed.egg-info/dependency_links.txt +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed.egg-info/not-zip-safe +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed.egg-info/requires.txt +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/src/wavespeed.egg-info/top_level.txt +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/__init__.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/conftest.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_api.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_config.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/__init__.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_modules/__init__.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_modules/test_fastapi.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_modules/test_handler.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_modules/test_http.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_modules/test_job.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_modules/test_local.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_modules/test_logger.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_modules/test_progress.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_modules/test_scaler.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_modules/test_state.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_utils/__init__.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_utils/test_validator.py +0 -0
- {wavespeed-1.0.7 → wavespeed-1.0.8}/tests/test_serverless/test_worker.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# This file is automatically generated by setuptools_scm
|
|
2
|
-
__version__ = "1.0.
|
|
2
|
+
__version__ = "1.0.8"
|
|
@@ -56,8 +56,8 @@ def _parse_args() -> argparse.Namespace:
|
|
|
56
56
|
"--waverless_api_host",
|
|
57
57
|
"--rp_api_host",
|
|
58
58
|
type=str,
|
|
59
|
-
default="
|
|
60
|
-
help="API server host (default:
|
|
59
|
+
default="0.0.0.0",
|
|
60
|
+
help="API server host (default: 0.0.0.0)",
|
|
61
61
|
)
|
|
62
62
|
parser.add_argument(
|
|
63
63
|
"--waverless_api_port",
|
|
@@ -160,6 +160,17 @@ def start(config: Dict[str, Any]) -> None:
|
|
|
160
160
|
port=args.waverless_api_port,
|
|
161
161
|
)
|
|
162
162
|
else:
|
|
163
|
-
# Standard worker mode
|
|
163
|
+
# Standard worker mode with health check server
|
|
164
164
|
log.info("Starting serverless worker...")
|
|
165
|
-
|
|
165
|
+
from .modules.health import HealthServer
|
|
166
|
+
|
|
167
|
+
health_server = HealthServer(
|
|
168
|
+
host=args.waverless_api_host,
|
|
169
|
+
port=args.waverless_api_port,
|
|
170
|
+
)
|
|
171
|
+
health_server.start()
|
|
172
|
+
|
|
173
|
+
try:
|
|
174
|
+
run_worker(config)
|
|
175
|
+
finally:
|
|
176
|
+
health_server.stop()
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"""Lightweight health check HTTP server for worker mode."""
|
|
2
|
+
|
|
3
|
+
import threading
|
|
4
|
+
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
from .logger import log
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class HealthHandler(BaseHTTPRequestHandler):
|
|
11
|
+
"""Simple HTTP handler for health checks."""
|
|
12
|
+
|
|
13
|
+
def do_GET(self) -> None:
|
|
14
|
+
"""Handle GET requests."""
|
|
15
|
+
if self.path == "/health":
|
|
16
|
+
self.send_response(200)
|
|
17
|
+
self.send_header("Content-Type", "application/json")
|
|
18
|
+
self.end_headers()
|
|
19
|
+
self.wfile.write(b'{"status": "ok"}')
|
|
20
|
+
else:
|
|
21
|
+
self.send_response(404)
|
|
22
|
+
self.end_headers()
|
|
23
|
+
|
|
24
|
+
def log_message(self, format: str, *args) -> None:
|
|
25
|
+
"""Suppress default logging."""
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class HealthServer:
|
|
30
|
+
"""Background health check server."""
|
|
31
|
+
|
|
32
|
+
def __init__(self, host: str = "0.0.0.0", port: int = 8000):
|
|
33
|
+
"""Initialize the health server.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
host: Host to bind to.
|
|
37
|
+
port: Port to bind to.
|
|
38
|
+
"""
|
|
39
|
+
self.host = host
|
|
40
|
+
self.port = port
|
|
41
|
+
self._server: Optional[HTTPServer] = None
|
|
42
|
+
self._thread: Optional[threading.Thread] = None
|
|
43
|
+
|
|
44
|
+
def start(self) -> None:
|
|
45
|
+
"""Start the health server in a background thread."""
|
|
46
|
+
try:
|
|
47
|
+
self._server = HTTPServer((self.host, self.port), HealthHandler)
|
|
48
|
+
self._thread = threading.Thread(target=self._server.serve_forever, daemon=True)
|
|
49
|
+
self._thread.start()
|
|
50
|
+
log.info(f"Health server started at http://{self.host}:{self.port}/health")
|
|
51
|
+
except Exception as e:
|
|
52
|
+
log.error(f"Failed to start health server: {e}")
|
|
53
|
+
|
|
54
|
+
def stop(self) -> None:
|
|
55
|
+
"""Stop the health server."""
|
|
56
|
+
if self._server:
|
|
57
|
+
self._server.shutdown()
|
|
58
|
+
self._server = None
|
|
59
|
+
log.debug("Health server stopped")
|
|
@@ -36,6 +36,7 @@ src/wavespeed/serverless/worker.py
|
|
|
36
36
|
src/wavespeed/serverless/modules/__init__.py
|
|
37
37
|
src/wavespeed/serverless/modules/fastapi.py
|
|
38
38
|
src/wavespeed/serverless/modules/handler.py
|
|
39
|
+
src/wavespeed/serverless/modules/health.py
|
|
39
40
|
src/wavespeed/serverless/modules/heartbeat.py
|
|
40
41
|
src/wavespeed/serverless/modules/http.py
|
|
41
42
|
src/wavespeed/serverless/modules/job.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|