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.
Files changed (163) hide show
  1. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/PKG-INFO +1 -1
  2. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/pyproject.toml +1 -1
  3. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/crons.py +7 -1
  4. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/dev.py +12 -9
  5. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/headers.py +41 -7
  6. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/vc_init.py +35 -41
  7. vercel_runtime-0.13.2/src/vercel_runtime/workers.py +50 -0
  8. vercel_runtime-0.13.0/src/vercel_runtime/workers.py +0 -311
  9. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/__init__.py +0 -0
  10. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/__init__.py +0 -0
  11. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/LICENSE.txt +0 -0
  12. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/__init__.py +0 -0
  13. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/_compat.py +0 -0
  14. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/_termui_impl.py +0 -0
  15. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/_textwrap.py +0 -0
  16. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/_winconsole.py +0 -0
  17. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/core.py +0 -0
  18. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/decorators.py +0 -0
  19. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/exceptions.py +0 -0
  20. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/formatting.py +0 -0
  21. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/globals.py +0 -0
  22. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/parser.py +0 -0
  23. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/py.typed +0 -0
  24. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/shell_completion.py +0 -0
  25. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/termui.py +0 -0
  26. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/testing.py +0 -0
  27. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/types.py +0 -0
  28. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/click/utils.py +0 -0
  29. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/LICENSE.txt +0 -0
  30. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/__init__.py +0 -0
  31. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/ansi.py +0 -0
  32. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/ansitowin32.py +0 -0
  33. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/initialise.py +0 -0
  34. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/win32.py +0 -0
  35. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama/winterm.py +0 -0
  36. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/colorama.pyi +0 -0
  37. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/LICENSE.txt +0 -0
  38. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/__init__.py +0 -0
  39. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_abnf.py +0 -0
  40. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_connection.py +0 -0
  41. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_events.py +0 -0
  42. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_headers.py +0 -0
  43. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_readers.py +0 -0
  44. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_receivebuffer.py +0 -0
  45. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_state.py +0 -0
  46. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_util.py +0 -0
  47. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_version.py +0 -0
  48. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/_writers.py +0 -0
  49. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/h11/py.typed +0 -0
  50. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/markupsafe/LICENSE.txt +0 -0
  51. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/markupsafe/__init__.py +0 -0
  52. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/markupsafe/_native.py +0 -0
  53. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/markupsafe/_speedups.c +0 -0
  54. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/markupsafe/_speedups.pyi +0 -0
  55. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/markupsafe/py.typed +0 -0
  56. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/LICENSE.md +0 -0
  57. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/__init__.py +0 -0
  58. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/__main__.py +0 -0
  59. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/_compat.py +0 -0
  60. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/_subprocess.py +0 -0
  61. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/_types.py +0 -0
  62. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/config.py +0 -0
  63. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/importer.py +0 -0
  64. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/lifespan/__init__.py +0 -0
  65. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/lifespan/off.py +0 -0
  66. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/lifespan/on.py +0 -0
  67. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/logging.py +0 -0
  68. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/loops/__init__.py +0 -0
  69. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/loops/asyncio.py +0 -0
  70. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/loops/auto.py +0 -0
  71. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/loops/uvloop.py +0 -0
  72. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/main.py +0 -0
  73. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/middleware/__init__.py +0 -0
  74. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/middleware/asgi2.py +0 -0
  75. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/middleware/message_logger.py +0 -0
  76. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/middleware/proxy_headers.py +0 -0
  77. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/middleware/wsgi.py +0 -0
  78. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/__init__.py +0 -0
  79. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/http/__init__.py +0 -0
  80. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/http/auto.py +0 -0
  81. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/http/flow_control.py +0 -0
  82. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/http/h11_impl.py +0 -0
  83. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/http/httptools_impl.py +0 -0
  84. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/utils.py +0 -0
  85. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/websockets/__init__.py +0 -0
  86. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/websockets/auto.py +0 -0
  87. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/websockets/websockets_impl.py +0 -0
  88. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/websockets/websockets_sansio_impl.py +0 -0
  89. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/protocols/websockets/wsproto_impl.py +0 -0
  90. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/py.typed +0 -0
  91. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/server.py +0 -0
  92. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/supervisors/__init__.py +0 -0
  93. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/supervisors/basereload.py +0 -0
  94. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/supervisors/multiprocess.py +0 -0
  95. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/supervisors/statreload.py +0 -0
  96. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/supervisors/watchfilesreload.py +0 -0
  97. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/uvicorn/workers.py +0 -0
  98. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/vendor.txt +0 -0
  99. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/ICON_LICENSE.md +0 -0
  100. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/LICENSE.txt +0 -0
  101. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/__init__.py +0 -0
  102. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/_internal.py +0 -0
  103. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/_reloader.py +0 -0
  104. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/__init__.py +0 -0
  105. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/accept.py +0 -0
  106. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/auth.py +0 -0
  107. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/cache_control.py +0 -0
  108. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/csp.py +0 -0
  109. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/etag.py +0 -0
  110. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/file_storage.py +0 -0
  111. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/headers.py +0 -0
  112. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/mixins.py +0 -0
  113. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/range.py +0 -0
  114. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/datastructures/structures.py +0 -0
  115. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/__init__.py +0 -0
  116. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/console.py +0 -0
  117. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/repr.py +0 -0
  118. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/shared/ICON_LICENSE.md +0 -0
  119. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/shared/console.png +0 -0
  120. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/shared/debugger.js +0 -0
  121. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/shared/less.png +0 -0
  122. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/shared/more.png +0 -0
  123. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/shared/style.css +0 -0
  124. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/debug/tbtools.py +0 -0
  125. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/exceptions.py +0 -0
  126. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/formparser.py +0 -0
  127. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/http.py +0 -0
  128. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/local.py +0 -0
  129. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/__init__.py +0 -0
  130. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/dispatcher.py +0 -0
  131. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/http_proxy.py +0 -0
  132. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/lint.py +0 -0
  133. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/profiler.py +0 -0
  134. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/proxy_fix.py +0 -0
  135. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/middleware/shared_data.py +0 -0
  136. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/py.typed +0 -0
  137. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/routing/__init__.py +0 -0
  138. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/routing/converters.py +0 -0
  139. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/routing/exceptions.py +0 -0
  140. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/routing/map.py +0 -0
  141. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/routing/matcher.py +0 -0
  142. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/routing/rules.py +0 -0
  143. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/sansio/__init__.py +0 -0
  144. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/sansio/http.py +0 -0
  145. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/sansio/multipart.py +0 -0
  146. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/sansio/request.py +0 -0
  147. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/sansio/response.py +0 -0
  148. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/sansio/utils.py +0 -0
  149. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/security.py +0 -0
  150. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/serving.py +0 -0
  151. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/test.py +0 -0
  152. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/testapp.py +0 -0
  153. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/urls.py +0 -0
  154. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/user_agent.py +0 -0
  155. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/utils.py +0 -0
  156. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/wrappers/__init__.py +0 -0
  157. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/wrappers/request.py +0 -0
  158. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/wrappers/response.py +0 -0
  159. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/_vendor/werkzeug/wsgi.py +0 -0
  160. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/asgi.py +0 -0
  161. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/resolver.py +0 -0
  162. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/routing.py +0 -0
  163. {vercel_runtime-0.13.0 → vercel_runtime-0.13.2}/src/vercel_runtime/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: vercel-runtime
3
- Version: 0.13.0
3
+ Version: 0.13.2
4
4
  License-Expression: Apache-2.0
5
5
  License-File: src/vercel_runtime/_vendor/__init__.py
6
6
  License-File: src/vercel_runtime/_vendor/click/LICENSE.txt
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "vercel-runtime"
3
- version = "0.13.0"
3
+ version = "0.13.2"
4
4
  license = "Apache-2.0"
5
5
  license-files = [
6
6
  "src/vercel_runtime/_vendor/*/LICEN[CS]E*",
@@ -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
- return svc_type.strip().lower() == "cron"
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
- prepare_celery_environment,
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
- prepare_celery_environment()
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
- _asgi_user_app = cast("ASGI", bootstrap_worker_service_app(mod))
410
- return
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
- if DJANGO_VERSION >= (5, 0):
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() == "x-vercel-internal-oidc-token"
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() != "x-vercel-internal-oidc-token"
67
+ if key.lower() != INTERNAL_OIDC_HEADER_NAME
66
68
  ]
67
69
 
68
- if not has_public_oidc and internal_oidc_token is not None:
69
- without_internal.append(("x-vercel-oidc-token", internal_oidc_token))
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
- prepare_celery_environment,
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
- prepare_celery_environment()
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
- if "handler" not in __vc_variables and "Handler" not in __vc_variables:
478
- should_bootstrap_worker_app = (
479
- "app" not in __vc_variables
480
- or is_celery_app(getattr(__vc_module, "app", None))
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
- except Exception:
492
- _stderr("Error bootstrapping worker service app:")
493
- _stderr(traceback.format_exc())
494
- exit(1)
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 == "x-vercel-internal-oidc-token":
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
- if internal_oidc_token:
595
- has_oidc_header = any(
596
- decode_header_bytes(k).lower() == "x-vercel-oidc-token"
597
- for k, _ in new_headers
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
- internal_oidc_token = self.headers.get(
752
- "x-vercel-internal-oidc-token"
740
+ raw_internal_oidc_token = self.headers.get(
741
+ INTERNAL_OIDC_HEADER_NAME
753
742
  )
754
- if (
755
- isinstance(internal_oidc_token, str)
756
- and internal_oidc_token
757
- and not self.headers.get("x-vercel-oidc-token")
758
- ):
759
- self.headers["x-vercel-oidc-token"] = internal_oidc_token
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["x-vercel-internal-oidc-token"]
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
- )