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.
@@ -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
+ ]