spooled 1.2.1__tar.gz → 1.2.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.
- {spooled-1.2.1 → spooled-1.2.2}/PKG-INFO +1 -1
- {spooled-1.2.1 → spooled-1.2.2}/pyproject.toml +1 -1
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/_version.py +1 -1
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/realtime/sse.py +33 -18
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/realtime/unified.py +16 -9
- {spooled-1.2.1 → spooled-1.2.2}/.gitignore +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/LICENSE +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/README.md +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/proto/spooled.proto +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/__init__.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/async_client.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/client.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/config.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/errors.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/grpc/__init__.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/grpc/client.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/grpc/stubs/__init__.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/grpc/stubs/spooled_pb2.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/grpc/stubs/spooled_pb2.pyi +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/grpc/stubs/spooled_pb2_grpc.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/py.typed +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/realtime/__init__.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/realtime/events.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/realtime/websocket.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/__init__.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/admin.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/api_keys.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/auth.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/base.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/billing.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/dashboard.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/health.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/ingest.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/jobs.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/metrics.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/organizations.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/queues.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/schedules.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/webhooks.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/workers.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/resources/workflows.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/__init__.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/admin.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/api_keys.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/auth.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/billing.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/common.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/dashboard.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/health.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/jobs.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/organizations.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/queues.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/schedules.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/webhooks.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/workers.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/types/workflows.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/utils/__init__.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/utils/async_http.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/utils/casing.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/utils/circuit_breaker.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/utils/http.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/utils/jwt.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/utils/retry.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/worker/__init__.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/worker/async_worker.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/worker/types.py +0 -0
- {spooled-1.2.1 → spooled-1.2.2}/src/spooled/worker/worker.py +0 -0
|
@@ -304,16 +304,27 @@ class SSEClient:
|
|
|
304
304
|
|
|
305
305
|
try:
|
|
306
306
|
self._client = httpx.Client()
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
307
|
+
# send(stream=True) keeps the response open until close(). Entering
|
|
308
|
+
# client.stream(...) by hand dropped its context manager, which the
|
|
309
|
+
# garbage collector then exited — closing the stream before any
|
|
310
|
+
# event was read ("the stream has been closed").
|
|
311
|
+
self._response = self._client.send(
|
|
312
|
+
self._client.build_request(
|
|
313
|
+
"GET",
|
|
314
|
+
url,
|
|
315
|
+
headers={
|
|
316
|
+
"Authorization": f"Bearer {self._token}",
|
|
317
|
+
"Accept": "text/event-stream",
|
|
318
|
+
},
|
|
319
|
+
),
|
|
320
|
+
stream=True,
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
# sseclient needs raw byte chunks: it finds event boundaries by the
|
|
324
|
+
# blank line between events. iter_lines() yields str lines with the
|
|
325
|
+
# newlines stripped, so the first line raised TypeError and the
|
|
326
|
+
# stream never produced an event.
|
|
327
|
+
self._sse_client = sseclient.SSEClient(self._response.iter_bytes()) # type: ignore[arg-type]
|
|
317
328
|
self._set_state(SSEConnectionState.CONNECTED)
|
|
318
329
|
self._reconnect_attempts = 0
|
|
319
330
|
self._closed = False
|
|
@@ -650,14 +661,18 @@ class AsyncSSEClient:
|
|
|
650
661
|
|
|
651
662
|
try:
|
|
652
663
|
self._client = httpx.AsyncClient()
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
664
|
+
# See SSEClient.connect: keep the response open until close().
|
|
665
|
+
self._response = await self._client.send(
|
|
666
|
+
self._client.build_request(
|
|
667
|
+
"GET",
|
|
668
|
+
url,
|
|
669
|
+
headers={
|
|
670
|
+
"Authorization": f"Bearer {self._token}",
|
|
671
|
+
"Accept": "text/event-stream",
|
|
672
|
+
},
|
|
673
|
+
),
|
|
674
|
+
stream=True,
|
|
675
|
+
)
|
|
661
676
|
self._set_state(SSEConnectionState.CONNECTED)
|
|
662
677
|
self._reconnect_attempts = 0
|
|
663
678
|
self._closed = False
|
|
@@ -510,17 +510,24 @@ class SpooledRealtime:
|
|
|
510
510
|
|
|
511
511
|
try:
|
|
512
512
|
self._http_client = httpx.Client()
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
"
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
513
|
+
# send(stream=True) keeps the response open until disconnect(); a
|
|
514
|
+
# hand-entered client.stream(...) was closed by the GC (see sse.py).
|
|
515
|
+
self._sse_response = self._http_client.send(
|
|
516
|
+
self._http_client.build_request(
|
|
517
|
+
"GET",
|
|
518
|
+
url,
|
|
519
|
+
headers={
|
|
520
|
+
"Authorization": f"Bearer {self._options.token}",
|
|
521
|
+
"Accept": "text/event-stream",
|
|
522
|
+
},
|
|
523
|
+
),
|
|
524
|
+
stream=True,
|
|
525
|
+
)
|
|
521
526
|
|
|
522
527
|
if HAS_SSE:
|
|
523
|
-
|
|
528
|
+
# Raw byte chunks: sseclient splits events on the blank line,
|
|
529
|
+
# which iter_lines() strips (see realtime/sse.py).
|
|
530
|
+
self._sse_client = sseclient.SSEClient(self._sse_response.iter_bytes())
|
|
524
531
|
|
|
525
532
|
self._set_state(ConnectionState.CONNECTED)
|
|
526
533
|
self._reconnect_attempts = 0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|