vercel-runtime 0.13.0__tar.gz → 0.13.2__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.
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/PKG-INFO +1 -1
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/pyproject.toml +1 -1
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/crons.py +7 -1
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/dev.py +12 -9
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/headers.py +41 -7
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/vc_init.py +35 -41
- vercel_runtime-0.13.2/src/vercel_runtime/workers.py +50 -0
- vercel_runtime-0.13.0/src/vercel_runtime/workers.py +0 -311
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/LICENSE.txt +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/_compat.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/_termui_impl.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/_textwrap.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/_winconsole.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/core.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/decorators.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/exceptions.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/formatting.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/globals.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/parser.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/py.typed +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/shell_completion.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/termui.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/testing.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/types.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/utils.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/LICENSE.txt +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/ansi.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/ansitowin32.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/initialise.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/win32.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/winterm.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama.pyi +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/LICENSE.txt +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_abnf.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_connection.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_events.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_headers.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_readers.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_receivebuffer.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_state.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_util.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_version.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_writers.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/py.typed +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/markupsafe/LICENSE.txt +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/markupsafe/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/markupsafe/_native.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/markupsafe/_speedups.c +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/markupsafe/_speedups.pyi +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/markupsafe/py.typed +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/LICENSE.md +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/__main__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/_compat.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/_subprocess.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/_types.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/config.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/importer.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/lifespan/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/lifespan/off.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/lifespan/on.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/logging.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/loops/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/loops/asyncio.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/loops/auto.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/loops/uvloop.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/main.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/middleware/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/middleware/asgi2.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/middleware/message_logger.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/middleware/proxy_headers.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/middleware/wsgi.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/http/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/http/auto.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/http/flow_control.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/http/h11_impl.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/http/httptools_impl.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/utils.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/websockets/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/websockets/auto.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/websockets/websockets_impl.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/websockets/websockets_sansio_impl.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/websockets/wsproto_impl.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/py.typed +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/server.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/supervisors/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/supervisors/basereload.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/supervisors/multiprocess.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/supervisors/statreload.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/supervisors/watchfilesreload.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/workers.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/vendor.txt +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/ICON_LICENSE.md +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/LICENSE.txt +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/_internal.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/_reloader.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/accept.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/auth.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/cache_control.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/csp.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/etag.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/file_storage.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/headers.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/mixins.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/range.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/structures.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/console.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/repr.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/shared/ICON_LICENSE.md +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/shared/console.png +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/shared/debugger.js +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/shared/less.png +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/shared/more.png +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/shared/style.css +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/tbtools.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/exceptions.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/formparser.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/http.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/local.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/dispatcher.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/http_proxy.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/lint.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/profiler.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/proxy_fix.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/shared_data.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/py.typed +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/routing/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/routing/converters.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/routing/exceptions.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/routing/map.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/routing/matcher.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/routing/rules.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/sansio/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/sansio/http.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/sansio/multipart.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/sansio/request.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/sansio/response.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/sansio/utils.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/security.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/serving.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/test.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/testapp.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/urls.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/user_agent.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/utils.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/wrappers/__init__.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/wrappers/request.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/wrappers/response.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/wsgi.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/asgi.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/resolver.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/routing.py +0 -0
- {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/utils.py +0 -0
|
@@ -23,7 +23,13 @@ type CronHandler = SyncCronHandler | AsyncCronHandler
|
|
|
23
23
|
|
|
24
24
|
def is_cron_service() -> bool:
|
|
25
25
|
svc_type = os.environ.get("VERCEL_SERVICE_TYPE") or ""
|
|
26
|
-
|
|
26
|
+
normalized_type = svc_type.strip().lower()
|
|
27
|
+
if normalized_type == "cron":
|
|
28
|
+
return True
|
|
29
|
+
|
|
30
|
+
svc_trigger = os.environ.get("VERCEL_SERVICE_TRIGGER") or ""
|
|
31
|
+
normalized_trigger = svc_trigger.strip().lower()
|
|
32
|
+
return normalized_type == "job" and normalized_trigger == "schedule"
|
|
27
33
|
|
|
28
34
|
|
|
29
35
|
def bootstrap_cron_service_app(module: ModuleType) -> ASGI:
|
|
@@ -19,9 +19,9 @@ from vercel_runtime.routing import (
|
|
|
19
19
|
strip_service_route_prefix,
|
|
20
20
|
)
|
|
21
21
|
from vercel_runtime.workers import (
|
|
22
|
-
bootstrap_worker_service_app,
|
|
23
22
|
is_worker_service,
|
|
24
|
-
|
|
23
|
+
maybe_bootstrap_worker_service_app,
|
|
24
|
+
prepare_worker_environment,
|
|
25
25
|
)
|
|
26
26
|
|
|
27
27
|
if TYPE_CHECKING:
|
|
@@ -397,7 +397,7 @@ def _setup_apps() -> None:
|
|
|
397
397
|
variable_name = os.environ["VERCEL_DEV_VARIABLE_NAME"]
|
|
398
398
|
|
|
399
399
|
_setup_server_log_routing()
|
|
400
|
-
|
|
400
|
+
prepare_worker_environment()
|
|
401
401
|
|
|
402
402
|
mod = import_module(module_name, entry_abs)
|
|
403
403
|
|
|
@@ -406,8 +406,10 @@ def _setup_apps() -> None:
|
|
|
406
406
|
return
|
|
407
407
|
|
|
408
408
|
if is_worker_service():
|
|
409
|
-
|
|
410
|
-
|
|
409
|
+
worker_app = maybe_bootstrap_worker_service_app(mod)
|
|
410
|
+
if worker_app is not None:
|
|
411
|
+
_asgi_user_app = cast("ASGI", worker_app)
|
|
412
|
+
return
|
|
411
413
|
|
|
412
414
|
app_name, user_app = resolve_app(mod, module_name, variable_name)
|
|
413
415
|
try:
|
|
@@ -432,7 +434,7 @@ def _wrap_django_static(app: WSGIApplication) -> WSGIApplication:
|
|
|
432
434
|
# STATIC_URL are served from source directories via Django's staticfiles
|
|
433
435
|
# finders, without needing collectstatic to have been run.
|
|
434
436
|
try:
|
|
435
|
-
from django.conf import ( # noqa: PLC0415 # pyright: ignore[reportMissingImports]
|
|
437
|
+
from django.conf import ( # noqa: PLC0415 # pyright: ignore[reportMissingImports, reportMissingTypeStubs]
|
|
436
438
|
settings as django_settings, # pyright: ignore[reportUnknownVariableType, reportMissingTypeStubs]
|
|
437
439
|
)
|
|
438
440
|
|
|
@@ -464,10 +466,10 @@ def _handle_manifest(app: WSGIApplication) -> WSGIApplication | None:
|
|
|
464
466
|
"""
|
|
465
467
|
import os # noqa: PLC0415
|
|
466
468
|
|
|
467
|
-
from django import ( # noqa: PLC0415 # pyright: ignore[reportMissingImports]
|
|
469
|
+
from django import ( # noqa: PLC0415 # pyright: ignore[reportMissingImports, reportMissingTypeStubs]
|
|
468
470
|
VERSION as DJANGO_VERSION, # pyright: ignore[reportUnknownVariableType]
|
|
469
471
|
)
|
|
470
|
-
from django.conf import ( # noqa: PLC0415 # pyright: ignore[reportMissingImports]
|
|
472
|
+
from django.conf import ( # noqa: PLC0415 # pyright: ignore[reportMissingImports, reportMissingTypeStubs]
|
|
471
473
|
settings as django_settings, # pyright: ignore[reportUnknownVariableType, reportMissingTypeStubs]
|
|
472
474
|
)
|
|
473
475
|
from django.utils.module_loading import ( # noqa: PLC0415 # pyright: ignore[reportMissingImports, reportMissingTypeStubs]
|
|
@@ -520,7 +522,8 @@ def _handle_manifest(app: WSGIApplication) -> WSGIApplication | None:
|
|
|
520
522
|
|
|
521
523
|
# Override the storage backend so {% static %} produces unhashed URLs
|
|
522
524
|
plain = "django.contrib.staticfiles.storage.StaticFilesStorage"
|
|
523
|
-
|
|
525
|
+
django_major_version = cast("int", DJANGO_VERSION[0])
|
|
526
|
+
if django_major_version >= 5:
|
|
524
527
|
storages = {**storages, "staticfiles": {"BACKEND": plain}}
|
|
525
528
|
django_settings.STORAGES = storages # pyright: ignore[reportAttributeAccessIssue]
|
|
526
529
|
else:
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import contextlib
|
|
4
|
+
import os
|
|
4
5
|
from collections.abc import Iterable, Mapping
|
|
5
6
|
from importlib import import_module
|
|
6
7
|
from typing import cast
|
|
7
8
|
|
|
9
|
+
OIDC_HEADER_NAME = "x-vercel-oidc-token"
|
|
10
|
+
INTERNAL_OIDC_HEADER_NAME = "x-vercel-internal-oidc-token"
|
|
11
|
+
|
|
8
12
|
|
|
9
13
|
def _iter_header_items(headers: object) -> list[tuple[object, object]]:
|
|
10
14
|
if isinstance(headers, Mapping):
|
|
@@ -47,14 +51,12 @@ def _iter_event_header_pairs(
|
|
|
47
51
|
def _normalize_internal_oidc_header(
|
|
48
52
|
headers: list[tuple[str, str]],
|
|
49
53
|
) -> list[tuple[str, str]]:
|
|
50
|
-
has_public_oidc = any(
|
|
51
|
-
key.lower() == "x-vercel-oidc-token" for key, _ in headers
|
|
52
|
-
)
|
|
54
|
+
has_public_oidc = any(key.lower() == OIDC_HEADER_NAME for key, _ in headers)
|
|
53
55
|
internal_oidc_token = next(
|
|
54
56
|
(
|
|
55
57
|
value
|
|
56
58
|
for key, value in headers
|
|
57
|
-
if key.lower() ==
|
|
59
|
+
if key.lower() == INTERNAL_OIDC_HEADER_NAME
|
|
58
60
|
),
|
|
59
61
|
None,
|
|
60
62
|
)
|
|
@@ -62,15 +64,47 @@ def _normalize_internal_oidc_header(
|
|
|
62
64
|
without_internal = [
|
|
63
65
|
(key, value)
|
|
64
66
|
for key, value in headers
|
|
65
|
-
if key.lower() !=
|
|
67
|
+
if key.lower() != INTERNAL_OIDC_HEADER_NAME
|
|
66
68
|
]
|
|
67
69
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
+
oidc_token = get_oidc_token_for_request(
|
|
71
|
+
has_public_oidc=has_public_oidc,
|
|
72
|
+
internal_oidc_token=internal_oidc_token,
|
|
73
|
+
)
|
|
74
|
+
if oidc_token:
|
|
75
|
+
without_internal.append((OIDC_HEADER_NAME, oidc_token))
|
|
70
76
|
|
|
71
77
|
return without_internal
|
|
72
78
|
|
|
73
79
|
|
|
80
|
+
def get_oidc_token_for_request(
|
|
81
|
+
*,
|
|
82
|
+
has_public_oidc: bool,
|
|
83
|
+
internal_oidc_token: str | None,
|
|
84
|
+
) -> str | None:
|
|
85
|
+
if has_public_oidc:
|
|
86
|
+
return None
|
|
87
|
+
if internal_oidc_token:
|
|
88
|
+
return internal_oidc_token
|
|
89
|
+
return os.environ.get("VERCEL_OIDC_TOKEN") or None
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def append_oidc_header_if_missing(
|
|
93
|
+
headers_list: list[tuple[bytes, bytes]],
|
|
94
|
+
*,
|
|
95
|
+
internal_oidc_token: str | None,
|
|
96
|
+
) -> None:
|
|
97
|
+
oidc_token = get_oidc_token_for_request(
|
|
98
|
+
has_public_oidc=any(
|
|
99
|
+
decode_header_bytes(k).lower() == OIDC_HEADER_NAME
|
|
100
|
+
for k, _ in headers_list
|
|
101
|
+
),
|
|
102
|
+
internal_oidc_token=internal_oidc_token,
|
|
103
|
+
)
|
|
104
|
+
if oidc_token:
|
|
105
|
+
headers_list.append((OIDC_HEADER_NAME.encode(), oidc_token.encode()))
|
|
106
|
+
|
|
107
|
+
|
|
74
108
|
def set_headers(headers: Mapping[str, str] | None) -> None:
|
|
75
109
|
with contextlib.suppress(Exception):
|
|
76
110
|
try:
|
|
@@ -23,8 +23,12 @@ from vercel_runtime.crons import (
|
|
|
23
23
|
is_cron_service,
|
|
24
24
|
)
|
|
25
25
|
from vercel_runtime.headers import (
|
|
26
|
+
INTERNAL_OIDC_HEADER_NAME,
|
|
27
|
+
OIDC_HEADER_NAME,
|
|
28
|
+
append_oidc_header_if_missing,
|
|
26
29
|
clear_vercel_headers_context,
|
|
27
30
|
decode_header_bytes,
|
|
31
|
+
get_oidc_token_for_request,
|
|
28
32
|
normalize_event_header_pairs,
|
|
29
33
|
normalize_event_headers,
|
|
30
34
|
set_vercel_headers_from_asgi_pairs,
|
|
@@ -41,10 +45,9 @@ from vercel_runtime.routing import (
|
|
|
41
45
|
split_request_target,
|
|
42
46
|
)
|
|
43
47
|
from vercel_runtime.workers import (
|
|
44
|
-
bootstrap_worker_service_app,
|
|
45
|
-
is_celery_app,
|
|
46
48
|
is_worker_service,
|
|
47
|
-
|
|
49
|
+
maybe_bootstrap_worker_service_app,
|
|
50
|
+
prepare_worker_environment,
|
|
48
51
|
)
|
|
49
52
|
|
|
50
53
|
if TYPE_CHECKING:
|
|
@@ -467,31 +470,22 @@ if _extra_path:
|
|
|
467
470
|
os.environ["PATH"] = _extra_path + ":" + os.environ.get("PATH", "")
|
|
468
471
|
|
|
469
472
|
try:
|
|
470
|
-
|
|
473
|
+
prepare_worker_environment()
|
|
471
474
|
__vc_module = import_module(_entrypoint_modname, _entrypoint_abs)
|
|
472
475
|
__vc_variables = dir(__vc_module)
|
|
473
476
|
except Exception:
|
|
474
477
|
_fatal_exc(f'could not import "{_entrypoint_rel}"')
|
|
475
478
|
|
|
476
479
|
if is_worker_service():
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
)
|
|
482
|
-
else:
|
|
483
|
-
should_bootstrap_worker_app = False
|
|
484
|
-
|
|
485
|
-
if should_bootstrap_worker_app:
|
|
486
|
-
try:
|
|
487
|
-
__vc_module.__dict__["app"] = bootstrap_worker_service_app(
|
|
488
|
-
__vc_module
|
|
489
|
-
)
|
|
480
|
+
try:
|
|
481
|
+
worker_app = maybe_bootstrap_worker_service_app(__vc_module)
|
|
482
|
+
if worker_app is not None:
|
|
483
|
+
__vc_module.__dict__["app"] = worker_app
|
|
490
484
|
__vc_variables = dir(__vc_module)
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
485
|
+
except Exception:
|
|
486
|
+
_stderr("Error bootstrapping worker service app:")
|
|
487
|
+
_stderr(traceback.format_exc())
|
|
488
|
+
exit(1)
|
|
495
489
|
|
|
496
490
|
if is_cron_service():
|
|
497
491
|
try:
|
|
@@ -568,7 +562,7 @@ class ASGIMiddleware:
|
|
|
568
562
|
new_headers: list[tuple[bytes, bytes]] = []
|
|
569
563
|
invocation_id = "0"
|
|
570
564
|
request_id = 0
|
|
571
|
-
internal_oidc_token =
|
|
565
|
+
internal_oidc_token: str | None = None
|
|
572
566
|
|
|
573
567
|
for raw_k, raw_v in headers_list:
|
|
574
568
|
key_bytes = raw_k if isinstance(raw_k, bytes) else raw_k.encode()
|
|
@@ -586,20 +580,15 @@ class ASGIMiddleware:
|
|
|
586
580
|
"x-vercel-internal-trace-id",
|
|
587
581
|
):
|
|
588
582
|
continue
|
|
589
|
-
if key ==
|
|
583
|
+
if key == INTERNAL_OIDC_HEADER_NAME:
|
|
590
584
|
internal_oidc_token = val
|
|
591
585
|
continue
|
|
592
586
|
new_headers.append((key_bytes, val_bytes))
|
|
593
587
|
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
)
|
|
599
|
-
if not has_oidc_header:
|
|
600
|
-
new_headers.append(
|
|
601
|
-
(b"x-vercel-oidc-token", internal_oidc_token.encode())
|
|
602
|
-
)
|
|
588
|
+
append_oidc_header_if_missing(
|
|
589
|
+
new_headers,
|
|
590
|
+
internal_oidc_token=internal_oidc_token,
|
|
591
|
+
)
|
|
603
592
|
|
|
604
593
|
new_scope = dict(scope)
|
|
605
594
|
new_scope["headers"] = new_headers
|
|
@@ -748,17 +737,22 @@ if "VERCEL_IPC_PATH" in os.environ:
|
|
|
748
737
|
del self.headers["x-vercel-internal-request-id"]
|
|
749
738
|
del self.headers["x-vercel-internal-span-id"]
|
|
750
739
|
del self.headers["x-vercel-internal-trace-id"]
|
|
751
|
-
|
|
752
|
-
|
|
740
|
+
raw_internal_oidc_token = self.headers.get(
|
|
741
|
+
INTERNAL_OIDC_HEADER_NAME
|
|
753
742
|
)
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
)
|
|
759
|
-
|
|
743
|
+
internal_oidc_token = (
|
|
744
|
+
raw_internal_oidc_token
|
|
745
|
+
if isinstance(raw_internal_oidc_token, str)
|
|
746
|
+
else None
|
|
747
|
+
)
|
|
748
|
+
oidc_token = get_oidc_token_for_request(
|
|
749
|
+
has_public_oidc=bool(self.headers.get(OIDC_HEADER_NAME)),
|
|
750
|
+
internal_oidc_token=internal_oidc_token,
|
|
751
|
+
)
|
|
752
|
+
if oidc_token:
|
|
753
|
+
self.headers[OIDC_HEADER_NAME] = oidc_token
|
|
760
754
|
with contextlib.suppress(Exception):
|
|
761
|
-
del self.headers[
|
|
755
|
+
del self.headers[INTERNAL_OIDC_HEADER_NAME]
|
|
762
756
|
|
|
763
757
|
send_message(
|
|
764
758
|
{
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import contextlib
|
|
4
|
+
import os
|
|
5
|
+
from typing import Any, cast
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def is_worker_service() -> bool:
|
|
9
|
+
svc_type = os.environ.get("VERCEL_SERVICE_TYPE") or ""
|
|
10
|
+
normalized_type = svc_type.strip().lower()
|
|
11
|
+
if normalized_type == "worker":
|
|
12
|
+
return True
|
|
13
|
+
|
|
14
|
+
svc_trigger = os.environ.get("VERCEL_SERVICE_TRIGGER") or ""
|
|
15
|
+
normalized_trigger = svc_trigger.strip().lower()
|
|
16
|
+
return normalized_type == "job" and normalized_trigger == "queue"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def has_worker_services() -> bool:
|
|
20
|
+
value = os.environ.get("VERCEL_HAS_WORKER_SERVICES") or ""
|
|
21
|
+
return value.strip().lower() in {"1", "true"}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _load_workers_runtime() -> Any | None:
|
|
25
|
+
with contextlib.suppress(ImportError):
|
|
26
|
+
import vercel.workers._runtime as workers_runtime # type: ignore[import-not-found] # noqa: PLC0415, PLC2701 # pyright: ignore[reportMissingImports]
|
|
27
|
+
|
|
28
|
+
return workers_runtime
|
|
29
|
+
return None
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def prepare_worker_environment() -> None:
|
|
33
|
+
workers_runtime = _load_workers_runtime()
|
|
34
|
+
if workers_runtime is None:
|
|
35
|
+
return
|
|
36
|
+
workers_runtime.prepare_environment(os.environ)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def maybe_bootstrap_worker_service_app(module: object) -> object | None:
|
|
40
|
+
workers_runtime = _load_workers_runtime()
|
|
41
|
+
if workers_runtime is None:
|
|
42
|
+
raise RuntimeError(
|
|
43
|
+
"Unable to bootstrap worker service because "
|
|
44
|
+
'"vercel-workers" is missing. Install '
|
|
45
|
+
'"vercel-workers" and configure an explicit worker integration.'
|
|
46
|
+
)
|
|
47
|
+
return cast(
|
|
48
|
+
"object | None",
|
|
49
|
+
workers_runtime.maybe_bootstrap_worker_service_app(module),
|
|
50
|
+
)
|
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import contextlib
|
|
4
|
-
import os
|
|
5
|
-
from importlib import import_module
|
|
6
|
-
from importlib.util import find_spec
|
|
7
|
-
from typing import TYPE_CHECKING, cast
|
|
8
|
-
|
|
9
|
-
if TYPE_CHECKING:
|
|
10
|
-
from collections.abc import Callable, Mapping
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def _has_module(module_name: str) -> bool:
|
|
14
|
-
try:
|
|
15
|
-
return find_spec(module_name) is not None
|
|
16
|
-
except ModuleNotFoundError:
|
|
17
|
-
return False
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def _import_optional_module(module_name: str) -> object | None:
|
|
21
|
-
with contextlib.suppress(Exception):
|
|
22
|
-
return import_module(module_name)
|
|
23
|
-
return None
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
CELERY_AVAILABLE = _has_module("celery")
|
|
27
|
-
DRAMATIQ_AVAILABLE = _has_module("dramatiq")
|
|
28
|
-
DJANGO_TASKS_AVAILABLE = _has_module("django.tasks")
|
|
29
|
-
VERCEL_WORKERS_AVAILABLE = _has_module("vercel.workers")
|
|
30
|
-
|
|
31
|
-
VERCEL_CELERY_BROKER_URL = "vercel://"
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def is_worker_service() -> bool:
|
|
35
|
-
svc_type = os.environ.get("VERCEL_SERVICE_TYPE") or ""
|
|
36
|
-
return svc_type.strip().lower() == "worker"
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def has_worker_services() -> bool:
|
|
40
|
-
value = os.environ.get("VERCEL_HAS_WORKER_SERVICES") or ""
|
|
41
|
-
return value.strip().lower() in {"1", "true"}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def _uses_vercel_celery_broker(broker_url: str | None) -> bool:
|
|
45
|
-
if broker_url is None:
|
|
46
|
-
return False
|
|
47
|
-
normalized = broker_url.strip().lower()
|
|
48
|
-
return normalized.startswith(VERCEL_CELERY_BROKER_URL)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def _install_vercel_celery_transport_alias() -> None:
|
|
52
|
-
with contextlib.suppress(Exception):
|
|
53
|
-
transport_module = _import_optional_module(
|
|
54
|
-
"vercel.workers.celery.transport"
|
|
55
|
-
)
|
|
56
|
-
if transport_module is None:
|
|
57
|
-
return
|
|
58
|
-
|
|
59
|
-
install_transport_alias = getattr(
|
|
60
|
-
transport_module,
|
|
61
|
-
"install_kombu_transport_alias",
|
|
62
|
-
None,
|
|
63
|
-
)
|
|
64
|
-
if not callable(install_transport_alias):
|
|
65
|
-
return
|
|
66
|
-
|
|
67
|
-
install_transport_alias_fn = cast(
|
|
68
|
-
"Callable[[str], None]",
|
|
69
|
-
install_transport_alias,
|
|
70
|
-
)
|
|
71
|
-
install_transport_alias_fn("vercel")
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
def prepare_celery_environment() -> None:
|
|
75
|
-
has_worker_svcs = has_worker_services()
|
|
76
|
-
if has_worker_svcs and "CELERY_BROKER_URL" not in os.environ:
|
|
77
|
-
os.environ["CELERY_BROKER_URL"] = VERCEL_CELERY_BROKER_URL
|
|
78
|
-
|
|
79
|
-
broker_url = os.environ.get("CELERY_BROKER_URL")
|
|
80
|
-
if not has_worker_svcs and not _uses_vercel_celery_broker(broker_url):
|
|
81
|
-
return
|
|
82
|
-
|
|
83
|
-
_install_vercel_celery_transport_alias()
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def is_celery_app(candidate: object) -> bool:
|
|
87
|
-
if candidate is None:
|
|
88
|
-
return False
|
|
89
|
-
module_name = getattr(candidate.__class__, "__module__", "")
|
|
90
|
-
if isinstance(module_name, str) and module_name.startswith("celery"):
|
|
91
|
-
return True
|
|
92
|
-
return (
|
|
93
|
-
hasattr(candidate, "conf")
|
|
94
|
-
and callable(getattr(candidate, "send_task", None))
|
|
95
|
-
and callable(getattr(candidate, "task", None))
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def _find_celery_app(module: object) -> object | None:
|
|
100
|
-
candidates = [
|
|
101
|
-
getattr(module, "app", None),
|
|
102
|
-
getattr(module, "celery_app", None),
|
|
103
|
-
getattr(module, "worker_app", None),
|
|
104
|
-
getattr(module, "worker", None),
|
|
105
|
-
getattr(module, "celery", None),
|
|
106
|
-
]
|
|
107
|
-
for candidate in candidates:
|
|
108
|
-
if is_celery_app(candidate):
|
|
109
|
-
return candidate
|
|
110
|
-
return None
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
def _bootstrap_dramatiq_worker_app(module: object) -> object | None:
|
|
114
|
-
if not DRAMATIQ_AVAILABLE:
|
|
115
|
-
return None
|
|
116
|
-
|
|
117
|
-
dramatiq_mod = _import_optional_module("dramatiq")
|
|
118
|
-
vercel_dramatiq = _import_optional_module("vercel.workers.dramatiq")
|
|
119
|
-
if dramatiq_mod is None or vercel_dramatiq is None:
|
|
120
|
-
if not VERCEL_WORKERS_AVAILABLE:
|
|
121
|
-
raise RuntimeError(
|
|
122
|
-
"Dramatiq worker service detected, but "
|
|
123
|
-
'"vercel-workers" is not installed. '
|
|
124
|
-
'Install "vercel-workers" and '
|
|
125
|
-
"configure "
|
|
126
|
-
'"from vercel.workers.dramatiq import '
|
|
127
|
-
'VercelQueuesBroker".'
|
|
128
|
-
)
|
|
129
|
-
raise RuntimeError(
|
|
130
|
-
"Failed to import Dramatiq worker adapter from vercel-workers."
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
broker_candidates: list[object] = []
|
|
134
|
-
module_broker = getattr(module, "broker", None)
|
|
135
|
-
if module_broker is not None:
|
|
136
|
-
broker_candidates.append(module_broker)
|
|
137
|
-
get_broker = getattr(dramatiq_mod, "get_broker", None)
|
|
138
|
-
if callable(get_broker):
|
|
139
|
-
with contextlib.suppress(Exception):
|
|
140
|
-
get_broker_fn = cast("Callable[[], object]", get_broker)
|
|
141
|
-
broker_candidates.append(get_broker_fn())
|
|
142
|
-
|
|
143
|
-
resolved_broker: object | None = None
|
|
144
|
-
broker_type = getattr(vercel_dramatiq, "VercelQueuesBroker", None)
|
|
145
|
-
if isinstance(broker_type, type):
|
|
146
|
-
for broker in broker_candidates:
|
|
147
|
-
if isinstance(broker, broker_type):
|
|
148
|
-
resolved_broker = broker
|
|
149
|
-
break
|
|
150
|
-
|
|
151
|
-
if resolved_broker is None:
|
|
152
|
-
return None
|
|
153
|
-
|
|
154
|
-
# Users must import task modules from the entrypoint.
|
|
155
|
-
actors = getattr(resolved_broker, "actors", None)
|
|
156
|
-
actors_mapping: Mapping[object, object] | None = None
|
|
157
|
-
if isinstance(actors, dict):
|
|
158
|
-
actors_mapping = cast("Mapping[object, object]", actors)
|
|
159
|
-
if actors_mapping is None or len(actors_mapping) == 0:
|
|
160
|
-
raise RuntimeError(
|
|
161
|
-
"Worker service did not register any Dramatiq "
|
|
162
|
-
"actors. Ensure your worker entrypoint imports "
|
|
163
|
-
"task modules before startup."
|
|
164
|
-
)
|
|
165
|
-
|
|
166
|
-
get_asgi_app = getattr(vercel_dramatiq, "get_asgi_app", None)
|
|
167
|
-
if not callable(get_asgi_app):
|
|
168
|
-
raise RuntimeError(
|
|
169
|
-
"Failed to resolve Dramatiq ASGI adapter from vercel-workers."
|
|
170
|
-
)
|
|
171
|
-
get_asgi_app_fn = cast(
|
|
172
|
-
"Callable[[object], object]",
|
|
173
|
-
get_asgi_app,
|
|
174
|
-
)
|
|
175
|
-
return get_asgi_app_fn(resolved_broker)
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
def _bootstrap_celery_worker_app(module: object) -> object | None:
|
|
179
|
-
if not CELERY_AVAILABLE:
|
|
180
|
-
return None
|
|
181
|
-
|
|
182
|
-
celery_app = _find_celery_app(module)
|
|
183
|
-
if celery_app is None:
|
|
184
|
-
return None
|
|
185
|
-
|
|
186
|
-
vercel_celery = _import_optional_module("vercel.workers.celery")
|
|
187
|
-
if vercel_celery is None:
|
|
188
|
-
if not VERCEL_WORKERS_AVAILABLE:
|
|
189
|
-
raise RuntimeError(
|
|
190
|
-
'Celery worker service requires "vercel-workers". '
|
|
191
|
-
'Install "vercel-workers" and export a Celery app.'
|
|
192
|
-
)
|
|
193
|
-
raise RuntimeError(
|
|
194
|
-
"Failed to import Celery worker adapter from vercel-workers."
|
|
195
|
-
)
|
|
196
|
-
|
|
197
|
-
get_adapter_app = getattr(vercel_celery, "get_asgi_app", None)
|
|
198
|
-
if not callable(get_adapter_app):
|
|
199
|
-
raise RuntimeError(
|
|
200
|
-
"Failed to resolve Celery ASGI adapter from vercel-workers."
|
|
201
|
-
)
|
|
202
|
-
get_adapter_app_fn = cast(
|
|
203
|
-
"Callable[[object], object]",
|
|
204
|
-
get_adapter_app,
|
|
205
|
-
)
|
|
206
|
-
return get_adapter_app_fn(celery_app)
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
def _bootstrap_django_worker_app(module: object) -> object | None:
|
|
210
|
-
if not DJANGO_TASKS_AVAILABLE:
|
|
211
|
-
return None
|
|
212
|
-
|
|
213
|
-
vercel_django = _import_optional_module("vercel.workers.django")
|
|
214
|
-
if vercel_django is None:
|
|
215
|
-
if not VERCEL_WORKERS_AVAILABLE:
|
|
216
|
-
raise RuntimeError(
|
|
217
|
-
"Django tasks worker service detected, but "
|
|
218
|
-
'"vercel-workers" is not installed. '
|
|
219
|
-
'Install "vercel-workers" and '
|
|
220
|
-
"configure "
|
|
221
|
-
'"vercel.workers.django.VercelQueuesBackend" '
|
|
222
|
-
"as your Django tasks backend."
|
|
223
|
-
)
|
|
224
|
-
raise RuntimeError(
|
|
225
|
-
"could not import Django tasks adapter from vercel-workers"
|
|
226
|
-
)
|
|
227
|
-
|
|
228
|
-
get_asgi_app = getattr(vercel_django, "get_asgi_app", None)
|
|
229
|
-
if not callable(get_asgi_app):
|
|
230
|
-
raise RuntimeError(
|
|
231
|
-
"could not resolve Django tasks ASGI adapter from vercel-workers"
|
|
232
|
-
)
|
|
233
|
-
get_asgi_app_fn = cast(
|
|
234
|
-
"Callable[[], object]",
|
|
235
|
-
get_asgi_app,
|
|
236
|
-
)
|
|
237
|
-
return get_asgi_app_fn()
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
def _bootstrap_generic_worker_app() -> object | None:
|
|
241
|
-
if not VERCEL_WORKERS_AVAILABLE:
|
|
242
|
-
return None
|
|
243
|
-
|
|
244
|
-
vercel_workers = _import_optional_module("vercel.workers")
|
|
245
|
-
if vercel_workers is None:
|
|
246
|
-
return None
|
|
247
|
-
|
|
248
|
-
has_subscriptions = getattr(vercel_workers, "has_subscriptions", None)
|
|
249
|
-
get_asgi_app = getattr(vercel_workers, "get_asgi_app", None)
|
|
250
|
-
if not callable(has_subscriptions) or not callable(get_asgi_app):
|
|
251
|
-
return None
|
|
252
|
-
|
|
253
|
-
with contextlib.suppress(Exception):
|
|
254
|
-
has_subscriptions_fn = cast(
|
|
255
|
-
"Callable[[], bool]",
|
|
256
|
-
has_subscriptions,
|
|
257
|
-
)
|
|
258
|
-
if not has_subscriptions_fn():
|
|
259
|
-
return None
|
|
260
|
-
|
|
261
|
-
get_asgi_app_fn = cast(
|
|
262
|
-
"Callable[[], object]",
|
|
263
|
-
get_asgi_app,
|
|
264
|
-
)
|
|
265
|
-
return get_asgi_app_fn()
|
|
266
|
-
|
|
267
|
-
return None
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
def bootstrap_worker_service_app(module: object) -> object:
|
|
271
|
-
if _find_celery_app(module) is not None:
|
|
272
|
-
try:
|
|
273
|
-
app = _bootstrap_celery_worker_app(module)
|
|
274
|
-
if app is not None:
|
|
275
|
-
return app
|
|
276
|
-
except Exception as exc:
|
|
277
|
-
raise RuntimeError("Celery worker bootstrap failed.") from exc
|
|
278
|
-
|
|
279
|
-
if DRAMATIQ_AVAILABLE:
|
|
280
|
-
try:
|
|
281
|
-
app = _bootstrap_dramatiq_worker_app(module)
|
|
282
|
-
if app is not None:
|
|
283
|
-
return app
|
|
284
|
-
except Exception as exc:
|
|
285
|
-
raise RuntimeError("Dramatiq worker bootstrap failed.") from exc
|
|
286
|
-
|
|
287
|
-
if DJANGO_TASKS_AVAILABLE:
|
|
288
|
-
try:
|
|
289
|
-
app = _bootstrap_django_worker_app(module)
|
|
290
|
-
if app is not None:
|
|
291
|
-
return app
|
|
292
|
-
except Exception as exc:
|
|
293
|
-
raise RuntimeError("Django tasks worker bootstrap failed.") from exc
|
|
294
|
-
|
|
295
|
-
app = _bootstrap_generic_worker_app()
|
|
296
|
-
if app is not None:
|
|
297
|
-
return app
|
|
298
|
-
|
|
299
|
-
if not VERCEL_WORKERS_AVAILABLE:
|
|
300
|
-
raise RuntimeError(
|
|
301
|
-
"Unable to bootstrap worker service because "
|
|
302
|
-
'"vercel-workers" is missing. Install '
|
|
303
|
-
'"vercel-workers" and configure an '
|
|
304
|
-
"explicit worker integration."
|
|
305
|
-
)
|
|
306
|
-
|
|
307
|
-
raise RuntimeError(
|
|
308
|
-
"Unable to bootstrap worker service. "
|
|
309
|
-
"Export an ASGI/WSGI app, or configure "
|
|
310
|
-
"Celery/Dramatiq/Django via vercel-workers."
|
|
311
|
-
)
|
|
File without changes
|
|
File without changes
|
{vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/LICENSE.txt
RENAMED
|
File without changes
|
{vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/_termui_impl.py
RENAMED
|
File without changes
|