vercel-celery 0.7.0__py3-none-any.whl
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/integrations/celery/__init__.py +141 -0
- vercel/integrations/celery/_broker.py +1199 -0
- vercel/integrations/celery/_result_backend.py +198 -0
- vercel/integrations/celery/py.typed +0 -0
- vercel/integrations/celery/version.py +3 -0
- vercel_celery-0.7.0.dist-info/METADATA +90 -0
- vercel_celery-0.7.0.dist-info/RECORD +9 -0
- vercel_celery-0.7.0.dist-info/WHEEL +4 -0
- vercel_celery-0.7.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"""Celery integration for Vercel Queue Service."""
|
|
2
|
+
|
|
3
|
+
from kombu.transport import TRANSPORT_ALIASES, virtual
|
|
4
|
+
|
|
5
|
+
from celery.app import backends as celery_backends
|
|
6
|
+
from celery.app.defaults import DEFAULTS as CELERY_DEFAULTS
|
|
7
|
+
from vercel.queue import CommunicationError, TokenResolutionError, UnauthorizedError
|
|
8
|
+
|
|
9
|
+
from ._broker import (
|
|
10
|
+
AutoChannel,
|
|
11
|
+
PollChannel,
|
|
12
|
+
PushChannel,
|
|
13
|
+
_configure_existing_app_defaults,
|
|
14
|
+
_install_app_finalize_hook,
|
|
15
|
+
_install_connection_transport_options_hook,
|
|
16
|
+
_register_existing_app_queues,
|
|
17
|
+
_set_default_broker_set_by_installer,
|
|
18
|
+
register_celery_app_queues,
|
|
19
|
+
)
|
|
20
|
+
from ._result_backend import DEFAULT_RESULT_BACKEND_ALIAS, VercelRuntimeCacheBackend
|
|
21
|
+
from .version import __version__
|
|
22
|
+
|
|
23
|
+
_DEFAULT_CONNECTION_PARAMS = {"hostname": None, "port": None}
|
|
24
|
+
# Token resolution depends on request-scoped OIDC context that may be
|
|
25
|
+
# momentarily unavailable on Celery-owned threads (and refreshes with the next
|
|
26
|
+
# push delivery). A cached token can also expire between local resolution and the
|
|
27
|
+
# remote request, producing UnauthorizedError once before the next resolution
|
|
28
|
+
# evicts it. CommunicationError is ordinary network trouble. Treat all three as
|
|
29
|
+
# recoverable connection failures so the Celery consumer restarts instead of
|
|
30
|
+
# shutting the worker down permanently. Kombu's own connection_errors use
|
|
31
|
+
# amqp.exceptions.ConnectionError, not the builtin, so CommunicationError must be
|
|
32
|
+
# listed explicitly.
|
|
33
|
+
_CONNECTION_ERRORS = (
|
|
34
|
+
*virtual.Transport.connection_errors,
|
|
35
|
+
TokenResolutionError,
|
|
36
|
+
UnauthorizedError,
|
|
37
|
+
CommunicationError,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class VercelQueueTransport(virtual.Transport):
|
|
42
|
+
"""Kombu transport that auto-selects Vercel Queue Service delivery mode.
|
|
43
|
+
|
|
44
|
+
The transport uses push delivery when running on Vercel and polling otherwise. It is registered
|
|
45
|
+
as ``vercel://`` by ``install_vercel_celery_integration``.
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
Channel = AutoChannel
|
|
49
|
+
driver_type = "vercel"
|
|
50
|
+
driver_name = "Vercel Queue Service"
|
|
51
|
+
default_connection_params = _DEFAULT_CONNECTION_PARAMS
|
|
52
|
+
connection_errors = _CONNECTION_ERRORS
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class VercelQueuePollTransport(virtual.Transport):
|
|
56
|
+
"""Kombu transport that always polls Vercel Queue Service.
|
|
57
|
+
|
|
58
|
+
It is registered as ``vercel-poll://`` by ``install_vercel_celery_integration`` and is intended
|
|
59
|
+
for workers that cannot receive Vercel Queue push deliveries.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
Channel = PollChannel
|
|
63
|
+
driver_type = "vercel"
|
|
64
|
+
driver_name = "Vercel Queue Service (poll)"
|
|
65
|
+
default_connection_params = _DEFAULT_CONNECTION_PARAMS
|
|
66
|
+
connection_errors = _CONNECTION_ERRORS
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class VercelQueuePushTransport(virtual.Transport):
|
|
70
|
+
"""Kombu transport that receives Vercel Queue Service push deliveries.
|
|
71
|
+
|
|
72
|
+
It is registered as ``vercel-push://`` by ``install_vercel_celery_integration`` and requires the
|
|
73
|
+
app's queues to be registered as Vercel Queue topic subscribers.
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
Channel = PushChannel
|
|
77
|
+
driver_type = "vercel"
|
|
78
|
+
driver_name = "Vercel Queue Service (push)"
|
|
79
|
+
default_connection_params = _DEFAULT_CONNECTION_PARAMS
|
|
80
|
+
connection_errors = _CONNECTION_ERRORS
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def install_vercel_celery_integration(
|
|
84
|
+
*,
|
|
85
|
+
register_queues: bool = True,
|
|
86
|
+
set_default_broker: bool = True,
|
|
87
|
+
set_default_result_backend: bool = True,
|
|
88
|
+
) -> None:
|
|
89
|
+
"""Register Vercel Queue Service as a Celery broker integration.
|
|
90
|
+
|
|
91
|
+
Register ``vercel://``. ``vercel-poll://``, and ``vercel-push://`` as valid Kombu transport
|
|
92
|
+
aliases for automatic push/poll, always-poll, and always-push modes correspondingly. When
|
|
93
|
+
*set_default_broker* is ``True`` (default), also set Celery default broker URL to ``vercel://``
|
|
94
|
+
when no broker is configured already. When *set_default_result_backend* is ``True`` (default),
|
|
95
|
+
set Celery's default result backend to ``vercel-runtime-cache://`` when no result backend is
|
|
96
|
+
configured already. When *register_queues* is `True` (default), automatically register all
|
|
97
|
+
Celery queues as Vercel Queues topic subscribers.
|
|
98
|
+
|
|
99
|
+
This also registers ``vercel-runtime-cache://`` as the Vercel Runtime Cache result backend
|
|
100
|
+
alias.
|
|
101
|
+
"""
|
|
102
|
+
TRANSPORT_ALIASES["vercel"] = (
|
|
103
|
+
f"{VercelQueueTransport.__module__}:{VercelQueueTransport.__name__}"
|
|
104
|
+
)
|
|
105
|
+
TRANSPORT_ALIASES["vercel-poll"] = (
|
|
106
|
+
f"{VercelQueuePollTransport.__module__}:{VercelQueuePollTransport.__name__}"
|
|
107
|
+
)
|
|
108
|
+
TRANSPORT_ALIASES["vercel-push"] = (
|
|
109
|
+
f"{VercelQueuePushTransport.__module__}:{VercelQueuePushTransport.__name__}"
|
|
110
|
+
)
|
|
111
|
+
celery_backends.BACKEND_ALIASES[DEFAULT_RESULT_BACKEND_ALIAS] = (
|
|
112
|
+
f"{VercelRuntimeCacheBackend.__module__}:{VercelRuntimeCacheBackend.__name__}"
|
|
113
|
+
)
|
|
114
|
+
default_broker_url = "vercel://" if set_default_broker else None
|
|
115
|
+
default_result_backend = (
|
|
116
|
+
f"{DEFAULT_RESULT_BACKEND_ALIAS}://" if set_default_result_backend else None
|
|
117
|
+
)
|
|
118
|
+
if set_default_broker and CELERY_DEFAULTS.get("broker_url") is None:
|
|
119
|
+
CELERY_DEFAULTS["broker_url"] = default_broker_url
|
|
120
|
+
_set_default_broker_set_by_installer(value=True)
|
|
121
|
+
if set_default_result_backend and CELERY_DEFAULTS.get("result_backend") is None:
|
|
122
|
+
CELERY_DEFAULTS["result_backend"] = default_result_backend
|
|
123
|
+
_install_connection_transport_options_hook()
|
|
124
|
+
_install_app_finalize_hook(register_queues=register_queues)
|
|
125
|
+
_configure_existing_app_defaults(
|
|
126
|
+
broker_url=default_broker_url,
|
|
127
|
+
result_backend=default_result_backend,
|
|
128
|
+
)
|
|
129
|
+
if register_queues:
|
|
130
|
+
_register_existing_app_queues()
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
__all__ = [
|
|
134
|
+
"VercelQueuePollTransport",
|
|
135
|
+
"VercelQueuePushTransport",
|
|
136
|
+
"VercelQueueTransport",
|
|
137
|
+
"VercelRuntimeCacheBackend",
|
|
138
|
+
"__version__",
|
|
139
|
+
"install_vercel_celery_integration",
|
|
140
|
+
"register_celery_app_queues",
|
|
141
|
+
]
|