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.
Files changed (158) hide show
  1. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/CHANGELOG.md +18 -0
  2. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/PKG-INFO +1 -1
  3. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/pyproject.toml +1 -1
  4. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/asgi.py +30 -1
  5. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/pyproject.toml +3 -1
  6. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/tests/test_asgi.py +13 -0
  7. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/worker.py +28 -0
  8. {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
  9. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi-ws-disconnect/worker.py +35 -1
  10. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/uv.lock +1 -1
  11. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/.gitignore +0 -0
  12. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/AGENTS.md +0 -0
  13. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/README.md +0 -0
  14. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/_cloudflare_compat_flags.pyi +0 -0
  15. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/_pyodide_entrypoint_helper.pyi +0 -0
  16. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/_workers_sdk_entropy_import_context.pth +0 -0
  17. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/_workers_sdk_entropy_import_context.py +0 -0
  18. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/_workers_sdk_entropy_import_context_loader.py +0 -0
  19. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/__init__.py +0 -0
  20. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/blob.py +0 -0
  21. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/entrypoints.py +0 -0
  22. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/fetch.py +0 -0
  23. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/formdata.py +0 -0
  24. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/py.typed +0 -0
  25. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/request.py +0 -0
  26. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/response.py +0 -0
  27. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/rpc.py +0 -0
  28. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/types.py +0 -0
  29. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/utils.py +0 -0
  30. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/workflows.py +0 -0
  31. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/src/workers/wsgi.py +0 -0
  32. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/public/data.json +0 -0
  33. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/public/hello.txt +0 -0
  34. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/pyproject.toml +0 -0
  35. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/conftest.py +0 -0
  36. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_analytics_engine.py +0 -0
  37. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_assets.py +0 -0
  38. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_d1.py +0 -0
  39. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_do.py +0 -0
  40. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_images.py +0 -0
  41. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_kv.py +0 -0
  42. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_mtls.py +0 -0
  43. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_queue.py +0 -0
  44. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_r2.py +0 -0
  45. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_ratelimit.py +0 -0
  46. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_vectorize.py +0 -0
  47. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_version_metadata.py +0 -0
  48. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/test_workflow.py +0 -0
  49. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/worker.py +0 -0
  50. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/worker_durable_object.py +0 -0
  51. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/src/worker_workflow.py +0 -0
  52. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/bindings-test/wrangler.jsonc +0 -0
  53. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/conftest.py +0 -0
  54. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/test_bindings.py +0 -0
  55. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/test_fastapi.py +0 -0
  56. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/test_in_workerd.py +0 -0
  57. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/test_web_frameworks.py +0 -0
  58. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/_client.py +0 -0
  59. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/conftest.py +0 -0
  60. {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
  61. {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
  62. {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
  63. {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
  64. {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
  65. {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
  66. {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
  67. {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
  68. {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
  69. {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
  70. {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
  71. {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
  72. {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
  73. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/templates/base.html +0 -0
  74. {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
  75. {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
  76. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/templates/hello.html +0 -0
  77. {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
  78. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_auth.py +0 -0
  79. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_caching.py +0 -0
  80. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_cors.py +0 -0
  81. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_csrf.py +0 -0
  82. {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
  83. {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
  84. {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
  85. {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
  86. {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
  87. {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
  88. {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
  89. {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
  90. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_forms.py +0 -0
  91. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_middleware.py +0 -0
  92. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_pagination.py +0 -0
  93. {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
  94. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_sessions.py +0 -0
  95. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_signals.py +0 -0
  96. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_streaming.py +0 -0
  97. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/test_templates.py +0 -0
  98. {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
  99. {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
  100. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/src/worker.py +0 -0
  101. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/django-async/wrangler.jsonc +0 -0
  102. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/public/data.json +0 -0
  103. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/public/index.html +0 -0
  104. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/public/style.css +0 -0
  105. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/pyproject.toml +0 -0
  106. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/src/_client.py +0 -0
  107. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/src/conftest.py +0 -0
  108. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/src/test_assets.py +0 -0
  109. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/src/worker.py +0 -0
  110. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/web-frameworks-test/fastapi-tests/wrangler.jsonc +0 -0
  111. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/asgi.wd-test +0 -0
  112. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/pyproject.toml +0 -0
  113. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi/wrangler.jsonc +0 -0
  114. {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
  115. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi-ws-disconnect/pyproject.toml +0 -0
  116. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/asgi-ws-disconnect/wrangler.jsonc +0 -0
  117. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object/durable-object.wd-test +0 -0
  118. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object/pyproject.toml +0 -0
  119. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object/worker.py +0 -0
  120. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object/wrangler.jsonc +0 -0
  121. {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
  122. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-abort/pyproject.toml +0 -0
  123. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-abort/worker.py +0 -0
  124. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-abort/wrangler.jsonc +0 -0
  125. {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
  126. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-inheritance/pyproject.toml +0 -0
  127. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-inheritance/worker.py +0 -0
  128. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-inheritance/wrangler.jsonc +0 -0
  129. {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
  130. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-websocket/pyproject.toml +0 -0
  131. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-websocket/tester.js +0 -0
  132. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-websocket/worker.py +0 -0
  133. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/durable-object-websocket/wrangler.jsonc +0 -0
  134. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/entropy-patches.wd-test +0 -0
  135. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/pyproject.toml +0 -0
  136. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/tests/test_aiohttp_websocket.py +0 -0
  137. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/tests/test_langsmith.py +0 -0
  138. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/tests/test_numpy.py +0 -0
  139. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/tests/test_pydantic.py +0 -0
  140. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/tests/test_rust_packages.py +0 -0
  141. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/tests/test_ssl_avoidance.py +0 -0
  142. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/worker.py +0 -0
  143. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/entropy-patches/wrangler.jsonc +0 -0
  144. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/python-rpc/pyproject.toml +0 -0
  145. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/python-rpc/python-rpc.wd-test +0 -0
  146. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/python-rpc/worker.js +0 -0
  147. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/python-rpc/worker.py +0 -0
  148. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/python-rpc/wrangler.jsonc +0 -0
  149. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/pyproject.toml +0 -0
  150. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/sdk.wd-test +0 -0
  151. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/server.py +0 -0
  152. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/tests/test_sdk.py +0 -0
  153. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/worker.py +0 -0
  154. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/sdk/wrangler.jsonc +0 -0
  155. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/wsgi/pyproject.toml +0 -0
  156. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/wsgi/worker.py +0 -0
  157. {workers_runtime_sdk-1.6.8 → workers_runtime_sdk-1.6.10}/tests/workerd-test/wsgi/wrangler.jsonc +0 -0
  158. {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.8
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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "workers-runtime-sdk"
7
- version = "1.6.8"
7
+ version = "1.6.10"
8
8
  description = "Python SDK for Cloudflare Workers"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -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
- msg = {"type": "websocket.receive", "text": evt.data}
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
- "django",
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",
@@ -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
- return await asgi.websocket(ws_app, request)
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
@@ -345,7 +345,7 @@ wheels = [
345
345
 
346
346
  [[package]]
347
347
  name = "workers-runtime-sdk"
348
- version = "1.6.8"
348
+ version = "1.6.10"
349
349
  source = { editable = "." }
350
350
 
351
351
  [package.dev-dependencies]