workers-runtime-sdk 1.6.8__tar.gz → 1.6.10__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.
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/CHANGELOG.md +18 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/PKG-INFO +1 -1
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/pyproject.toml +1 -1
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/asgi.py +30 -1
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/pyproject.toml +3 -1
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/tests/test_asgi.py +13 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/worker.py +28 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi-ws-disconnect/tests/test_ws_disconnect.py +43 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi-ws-disconnect/worker.py +35 -1
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/uv.lock +1 -1
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/.gitignore +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/AGENTS.md +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/README.md +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/_cloudflare_compat_flags.pyi +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/_pyodide_entrypoint_helper.pyi +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/_workers_sdk_entropy_import_context.pth +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/_workers_sdk_entropy_import_context.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/_workers_sdk_entropy_import_context_loader.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/__init__.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/blob.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/entrypoints.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/fetch.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/formdata.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/py.typed +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/request.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/response.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/rpc.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/types.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/utils.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/workflows.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/wsgi.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/public/data.json +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/public/hello.txt +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/pyproject.toml +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/conftest.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_analytics_engine.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_assets.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_d1.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_do.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_images.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_kv.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_mtls.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_queue.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_r2.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_ratelimit.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_vectorize.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_version_metadata.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_workflow.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/worker.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/worker_durable_object.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/worker_workflow.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/conftest.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/test_bindings.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/test_fastapi.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/test_in_workerd.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/test_web_frameworks.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/_client.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/conftest.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/__init__.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/api_urls.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/auth_backend.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/drf_auth.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/drf_serializers.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/drf_throttling.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/drf_views.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/forms.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/middleware.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/templatetags/__init__.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/templatetags/custom_tags.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/urls.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/django_app/views.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/templates/base.html +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/templates/context_test.html +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/templates/csrf_form.html +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/templates/hello.html +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_async_utilities.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_auth.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_caching.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_cors.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_csrf.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_drf_auth_permissions.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_drf_content_negotiation.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_drf_serializers.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_drf_throttling.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_drf_versioning.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_drf_views.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_error_handling.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_file_uploads.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_forms.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_middleware.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_pagination.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_request_response.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_sessions.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_signals.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_streaming.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_templates.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_url_routing.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_views_basic.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/worker.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/public/data.json +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/public/index.html +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/public/style.css +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/pyproject.toml +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/src/_client.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/src/conftest.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/src/test_assets.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/src/worker.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/asgi.wd-test +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/pyproject.toml +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi-ws-disconnect/asgi-ws-disconnect.wd-test +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi-ws-disconnect/pyproject.toml +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi-ws-disconnect/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object/durable-object.wd-test +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object/pyproject.toml +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object/worker.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-abort/durable-object-abort.wd-test +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-abort/pyproject.toml +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-abort/worker.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-abort/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-inheritance/durable-object-inheritance.wd-test +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-inheritance/pyproject.toml +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-inheritance/worker.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-inheritance/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-websocket/durable-object-websocket.wd-test +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-websocket/pyproject.toml +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-websocket/tester.js +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-websocket/worker.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-websocket/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/entropy-patches.wd-test +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/pyproject.toml +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/tests/test_aiohttp_websocket.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/tests/test_langsmith.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/tests/test_numpy.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/tests/test_pydantic.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/tests/test_rust_packages.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/tests/test_ssl_avoidance.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/worker.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/python-rpc/pyproject.toml +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/python-rpc/python-rpc.wd-test +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/python-rpc/worker.js +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/python-rpc/worker.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/python-rpc/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/pyproject.toml +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/sdk.wd-test +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/server.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/tests/test_sdk.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/worker.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/wsgi/pyproject.toml +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/wsgi/worker.py +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/wsgi/wrangler.jsonc +0 -0
- {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/wsgi/wsgi.wd-test +0 -0
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- version list -->
|
|
4
4
|
|
|
5
|
+
## v1.6.10 (2026-08-10)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- **runtime-sdk**: Terminate the response stream when the app fails mid-stream
|
|
10
|
+
([#168](https://github.com/cloudflare/workers-py/pull/168),
|
|
11
|
+
[`fd4dde9`](https://github.com/cloudflare/workers-py/commit/fd4dde98fcc39f405a7cf320a6db49a83426f46b))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## v1.6.9 (2026-08-10)
|
|
15
|
+
|
|
16
|
+
### Bug Fixes
|
|
17
|
+
|
|
18
|
+
- **runtime-sdk**: Deliver binary WebSocket frames as ASGI `bytes`
|
|
19
|
+
([#164](https://github.com/cloudflare/workers-py/pull/164),
|
|
20
|
+
[`44ca368`](https://github.com/cloudflare/workers-py/commit/44ca36818367af23ffd0c76f5d2dc7588219b340))
|
|
21
|
+
|
|
22
|
+
|
|
5
23
|
## v1.6.8 (2026-08-05)
|
|
6
24
|
|
|
7
25
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: workers-runtime-sdk
|
|
3
|
-
Version: 1.6.
|
|
3
|
+
Version: 1.6.10
|
|
4
4
|
Summary: Python SDK for Cloudflare Workers
|
|
5
5
|
Project-URL: Homepage, https://github.com/cloudflare/workers-py
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/cloudflare/workers-py/issues
|
|
@@ -28,6 +28,13 @@ def run_in_background(coro: Awaitable[Any]) -> None:
|
|
|
28
28
|
fut.add_done_callback(_on_done)
|
|
29
29
|
|
|
30
30
|
|
|
31
|
+
async def close_stream_quietly(writer):
|
|
32
|
+
try:
|
|
33
|
+
await writer.close()
|
|
34
|
+
except Exception:
|
|
35
|
+
logger.debug("Closing the response stream failed", exc_info=True)
|
|
36
|
+
|
|
37
|
+
|
|
31
38
|
@contextmanager
|
|
32
39
|
def acquire_js_buffer(pybuffer):
|
|
33
40
|
from pyodide.ffi import create_proxy
|
|
@@ -182,6 +189,7 @@ async def process_request(
|
|
|
182
189
|
|
|
183
190
|
# Streaming state — initialized lazily on first body chunk with more_body=True.
|
|
184
191
|
writer = None
|
|
192
|
+
writer_closed = False
|
|
185
193
|
|
|
186
194
|
receive_queue = Queue()
|
|
187
195
|
if req.body:
|
|
@@ -208,6 +216,7 @@ async def process_request(
|
|
|
208
216
|
nonlocal status
|
|
209
217
|
nonlocal headers
|
|
210
218
|
nonlocal writer
|
|
219
|
+
nonlocal writer_closed
|
|
211
220
|
|
|
212
221
|
if got["type"] == "http.response.start":
|
|
213
222
|
status = got["status"]
|
|
@@ -224,6 +233,7 @@ async def process_request(
|
|
|
224
233
|
await writer.write(jsbytes.slice())
|
|
225
234
|
if not more_body:
|
|
226
235
|
await writer.close()
|
|
236
|
+
writer_closed = True
|
|
227
237
|
finished_response.set()
|
|
228
238
|
elif more_body:
|
|
229
239
|
# First body chunk with more data coming — switch to streaming.
|
|
@@ -275,6 +285,15 @@ async def process_request(
|
|
|
275
285
|
# Response already sent — exception can't be propagated to the
|
|
276
286
|
# client, so log it to avoid silently swallowing errors.
|
|
277
287
|
logger.exception("Exception in ASGI application after response started")
|
|
288
|
+
finished_response.set()
|
|
289
|
+
if writer is not None and not writer_closed:
|
|
290
|
+
# End the body so a client reading it sees the stream stop
|
|
291
|
+
# instead of waiting forever for chunks that will never
|
|
292
|
+
# come. Deliberately not awaited: close() settles only once
|
|
293
|
+
# the queued chunks reach a consumer, so a response body
|
|
294
|
+
# that nobody reads would block this task, which the
|
|
295
|
+
# runtime is waiting on through wait_until.
|
|
296
|
+
run_in_background(close_stream_quietly(writer))
|
|
278
297
|
|
|
279
298
|
# Create task to run the application in the background
|
|
280
299
|
app_task = create_proxy(create_task(run_app()))
|
|
@@ -294,6 +313,9 @@ async def process_websocket(app: Any, req: "Request | js.Request") -> js.Respons
|
|
|
294
313
|
|
|
295
314
|
client, server = WebSocketPair.new().object_values()
|
|
296
315
|
server.accept()
|
|
316
|
+
# Binary frames otherwise arrive as Blob (observed under wrangler dev),
|
|
317
|
+
# which cannot be read synchronously in the message callback.
|
|
318
|
+
server.binaryType = "arraybuffer"
|
|
297
319
|
queue = Queue()
|
|
298
320
|
|
|
299
321
|
def onopen(evt):
|
|
@@ -312,7 +334,14 @@ async def process_websocket(app: Any, req: "Request | js.Request") -> js.Respons
|
|
|
312
334
|
queue.put_nowait(msg)
|
|
313
335
|
|
|
314
336
|
def onmessage(evt):
|
|
315
|
-
|
|
337
|
+
data = evt.data
|
|
338
|
+
if isinstance(data, str):
|
|
339
|
+
msg = {"type": "websocket.receive", "text": data}
|
|
340
|
+
else:
|
|
341
|
+
# Binary frames arrive as an ArrayBuffer; the ASGI spec requires
|
|
342
|
+
# them under "bytes" (frameworks like Starlette dispatch on which
|
|
343
|
+
# key is present, so labeling them "text" breaks receive_bytes()).
|
|
344
|
+
msg = {"type": "websocket.receive", "bytes": data.to_bytes()}
|
|
316
345
|
queue.put_nowait(msg)
|
|
317
346
|
|
|
318
347
|
server.onopen = onopen
|
|
@@ -3,7 +3,9 @@ name = "django-async-test"
|
|
|
3
3
|
version = "0.1.0"
|
|
4
4
|
requires-python = ">=3.12"
|
|
5
5
|
dependencies = [
|
|
6
|
-
|
|
6
|
+
# https://github.com/django/django/pull/21438/changes#r3399119797
|
|
7
|
+
# Remove this constraint when drf releases a version that supports Django 6.1
|
|
8
|
+
"django<6.1",
|
|
7
9
|
"djangorestframework",
|
|
8
10
|
"django-cors-headers",
|
|
9
11
|
"pytest",
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/tests/test_asgi.py
RENAMED
|
@@ -399,3 +399,16 @@ async def test_scope_path_is_percent_decoded():
|
|
|
399
399
|
async def test_scope_exposes_raw_path():
|
|
400
400
|
scope = await _scope("/scope/hello%20world")
|
|
401
401
|
assert scope["raw_path"] == "/scope/hello%20world"
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
@pytest.mark.asyncio
|
|
405
|
+
async def test_late_stream_failure_terminates_response():
|
|
406
|
+
# An app that raises after the streaming response started must terminate
|
|
407
|
+
# the stream (truncated EOF) instead of leaving the client hanging; a
|
|
408
|
+
# regression here surfaces as a timeout or workerd's hung-request
|
|
409
|
+
# cancellation instead of a clean read.
|
|
410
|
+
response = await asyncio.wait_for(
|
|
411
|
+
env.SELF.fetch("http://example.com/stream-late-failure"), timeout=5
|
|
412
|
+
)
|
|
413
|
+
body = await asyncio.wait_for(response.text(), timeout=5)
|
|
414
|
+
assert body == "chunk-1"
|
|
@@ -182,6 +182,29 @@ class StreamingApp:
|
|
|
182
182
|
# ---------------------------------------------------------------------------
|
|
183
183
|
|
|
184
184
|
|
|
185
|
+
class LateFailureStreamApp:
|
|
186
|
+
"""Starts a streaming response, then raises: the stream must terminate."""
|
|
187
|
+
|
|
188
|
+
async def __call__(self, scope, receive, send):
|
|
189
|
+
if scope["type"] == "lifespan":
|
|
190
|
+
message = await receive()
|
|
191
|
+
if message["type"] == "lifespan.startup":
|
|
192
|
+
await send({"type": "lifespan.startup.complete"})
|
|
193
|
+
return
|
|
194
|
+
await receive()
|
|
195
|
+
await send(
|
|
196
|
+
{
|
|
197
|
+
"type": "http.response.start",
|
|
198
|
+
"status": 200,
|
|
199
|
+
"headers": [(b"content-type", b"application/octet-stream")],
|
|
200
|
+
}
|
|
201
|
+
)
|
|
202
|
+
await send(
|
|
203
|
+
{"type": "http.response.body", "body": b"chunk-1", "more_body": True}
|
|
204
|
+
)
|
|
205
|
+
raise RuntimeError("app failed mid-stream")
|
|
206
|
+
|
|
207
|
+
|
|
185
208
|
class ScopeEchoApp:
|
|
186
209
|
"""Echoes selected scope fields as JSON so tests can inspect them."""
|
|
187
210
|
|
|
@@ -214,6 +237,7 @@ app = HeaderEchoApp()
|
|
|
214
237
|
sse_app = SSEApp()
|
|
215
238
|
streaming_app = StreamingApp()
|
|
216
239
|
scope_echo_app = ScopeEchoApp()
|
|
240
|
+
late_failure_stream_app = LateFailureStreamApp()
|
|
217
241
|
|
|
218
242
|
example_hdr = {"Header1": "Value1", "Header2": "Value2"}
|
|
219
243
|
|
|
@@ -231,6 +255,10 @@ class Default(WorkerEntrypoint):
|
|
|
231
255
|
return await asgi.fetch(streaming_app, request, self.env, self.ctx)
|
|
232
256
|
elif path.startswith("/scope"):
|
|
233
257
|
return await asgi.fetch(scope_echo_app, request, self.env, self.ctx)
|
|
258
|
+
elif path == "/stream-late-failure":
|
|
259
|
+
return await asgi.fetch(
|
|
260
|
+
late_failure_stream_app, request, self.env, self.ctx
|
|
261
|
+
)
|
|
234
262
|
|
|
235
263
|
return await asgi.fetch(app, request, self.env, self.ctx)
|
|
236
264
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
import contextlib
|
|
2
3
|
|
|
3
4
|
import pytest
|
|
4
5
|
from pyodide.ffi import create_proxy, to_js
|
|
@@ -70,3 +71,45 @@ async def test_client_close_reaches_app_as_disconnect():
|
|
|
70
71
|
return
|
|
71
72
|
await asyncio.sleep(0.2)
|
|
72
73
|
pytest.fail("the app never observed the client's disconnect")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@contextlib.asynccontextmanager
|
|
77
|
+
async def _ws_session(path):
|
|
78
|
+
"""Accepted client socket, always closed again.
|
|
79
|
+
|
|
80
|
+
A test that raises before closing leaves the app awaiting receive(), and
|
|
81
|
+
the runtime keeps the request alive for that task, so the whole worker
|
|
82
|
+
invocation hangs instead of reporting the failure.
|
|
83
|
+
"""
|
|
84
|
+
response = await _ws_connect(path)
|
|
85
|
+
ws = response.webSocket
|
|
86
|
+
assert ws is not None
|
|
87
|
+
ws.accept()
|
|
88
|
+
# Without this the payload arrives as a Blob, which cannot be read
|
|
89
|
+
# synchronously in the message callback.
|
|
90
|
+
ws.binaryType = "arraybuffer"
|
|
91
|
+
try:
|
|
92
|
+
yield ws
|
|
93
|
+
finally:
|
|
94
|
+
ws.close()
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@pytest.mark.asyncio
|
|
98
|
+
async def test_text_frame_arrives_as_asgi_text():
|
|
99
|
+
async with _ws_session("/ws-echo") as ws:
|
|
100
|
+
message = _listen(ws, "message")
|
|
101
|
+
ws.send("hello")
|
|
102
|
+
evt = await asyncio.wait_for(message, TIMEOUT_S)
|
|
103
|
+
assert evt.data == "text=hello"
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@pytest.mark.asyncio
|
|
107
|
+
async def test_binary_frame_arrives_as_asgi_bytes():
|
|
108
|
+
async with _ws_session("/ws-echo") as ws:
|
|
109
|
+
message = _listen(ws, "message")
|
|
110
|
+
payload = b"\x00\x01binary"
|
|
111
|
+
ws.send(to_js(payload))
|
|
112
|
+
evt = await asyncio.wait_for(message, TIMEOUT_S)
|
|
113
|
+
data = evt.data
|
|
114
|
+
assert not isinstance(data, str), f"delivered to the app as text: {data!r}"
|
|
115
|
+
assert data.to_bytes() == b"bytes=" + payload
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import os
|
|
3
3
|
import sys
|
|
4
|
+
from urllib.parse import urlsplit
|
|
4
5
|
|
|
5
6
|
import pytest
|
|
6
7
|
from pyodide.webloop import WebLoop
|
|
@@ -49,13 +50,46 @@ class WSWatchApp:
|
|
|
49
50
|
return
|
|
50
51
|
|
|
51
52
|
|
|
53
|
+
class WSEchoApp:
|
|
54
|
+
"""Accepts and echoes each frame back tagged with the ASGI key it arrived
|
|
55
|
+
under ("bytes=" / "text=" prefix), so tests can detect frames delivered
|
|
56
|
+
under the wrong key (an untagged echo would bounce a mislabeled frame
|
|
57
|
+
opaquely and pass anyway)."""
|
|
58
|
+
|
|
59
|
+
async def __call__(self, scope, receive, send):
|
|
60
|
+
if scope["type"] == "lifespan":
|
|
61
|
+
await _drain_lifespan(receive, send)
|
|
62
|
+
return
|
|
63
|
+
message = await receive()
|
|
64
|
+
assert message["type"] == "websocket.connect"
|
|
65
|
+
await send({"type": "websocket.accept"})
|
|
66
|
+
while True:
|
|
67
|
+
message = await receive()
|
|
68
|
+
if message["type"] == "websocket.disconnect":
|
|
69
|
+
return
|
|
70
|
+
if message.get("bytes") is not None:
|
|
71
|
+
await send(
|
|
72
|
+
{"type": "websocket.send", "bytes": b"bytes=" + message["bytes"]}
|
|
73
|
+
)
|
|
74
|
+
else:
|
|
75
|
+
text = message.get("text")
|
|
76
|
+
# text is always str once frames are labeled correctly; repr()
|
|
77
|
+
# keeps a regression readable instead of timing out on a
|
|
78
|
+
# TypeError inside the app.
|
|
79
|
+
reply = "text=" + (text if isinstance(text, str) else repr(text))
|
|
80
|
+
await send({"type": "websocket.send", "text": reply})
|
|
81
|
+
|
|
82
|
+
|
|
52
83
|
ws_app = WSWatchApp()
|
|
84
|
+
echo_app = WSEchoApp()
|
|
53
85
|
|
|
54
86
|
|
|
55
87
|
class Default(WorkerEntrypoint):
|
|
56
88
|
async def fetch(self, request):
|
|
57
89
|
if (request.headers.get("upgrade") or "").lower() == "websocket":
|
|
58
|
-
|
|
90
|
+
path = urlsplit(request.url).path
|
|
91
|
+
app = echo_app if path == "/ws-echo" else ws_app
|
|
92
|
+
return await asgi.websocket(app, request)
|
|
59
93
|
import json
|
|
60
94
|
|
|
61
95
|
from workers import Response
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/_workers_sdk_entropy_import_context.pth
RENAMED
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/_workers_sdk_entropy_import_context.py
RENAMED
|
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
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/public/data.json
RENAMED
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/public/hello.txt
RENAMED
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/conftest.py
RENAMED
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_assets.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_images.py
RENAMED
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_mtls.py
RENAMED
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_queue.py
RENAMED
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_ratelimit.py
RENAMED
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_vectorize.py
RENAMED
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_workflow.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/worker_workflow.py
RENAMED
|
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
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/asgi.wd-test
RENAMED
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/pyproject.toml
RENAMED
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/wrangler.jsonc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object/worker.py
RENAMED
|
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
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/python-rpc/worker.js
RENAMED
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/python-rpc/worker.py
RENAMED
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/pyproject.toml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/tests/test_sdk.py
RENAMED
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/wrangler.jsonc
RENAMED
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/wsgi/pyproject.toml
RENAMED
|
File without changes
|
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/wsgi/wrangler.jsonc
RENAMED
|
File without changes
|
{workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/wsgi/wsgi.wd-test
RENAMED
|
File without changes
|