You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix(asyncio): fix error propagation in async request path
Ensure `PubNubAsyncioException` always carries a valid `PNStatus` with error data instead of `None`.
fix(asyncio): fix `PubNubAsyncioException.__str__` crash
Handle cases where status or `error_data` is `None` instead of raising `AttributeError`.
fix(event-engine): fix error type checks in effects
Match `PubNubAsyncioException` which is what `request_future` actually returns on failure.
fix(event-engine): fix give-up logic for unlimited retries
Handle `-1 (unlimited)` correctly since `attempts > -1` was always `true`, causing immediate give-up.
fix(event-engine): initialize heartbeat max retry attempts
Use delay class defaults instead of config value which could be `None` causing `TypeError` on comparison.
fix(event-engine): add missing return after `heartbeat` give-up
Prevent falling through to start a heartbeat after deciding to give up.
fix(request-handlers): use explicit `httpx.Timeout` object
Set all four timeout fields explicitly instead of a 2-tuple that left write and pool unset.
fix(request-handlers): enforce wall-clock deadline to survive system sleep
On macOS and Linux, `time.monotonic()` does not advance during system sleep, causing socket and
`asyncio` timeouts (310s subscribe) to stall for hours of wall-clock time. Add `time.time()`-based
deadline checks that detect sleep and cancel stale requests within ~5s of wake.
fix(asyncio): replace `asyncio.wait_for` with wall-clock-aware loop
Use `asyncio.wait()` with periodic `time.time()` checks instead of a single monotonic-based
`wait_for()`, yielding to the event loop between checks.
fix(native-threads): add `WallClockDeadlineWatchdog`
Persistent single daemon thread monitors `time.time()` every 5s and closes the `httpx` session
when the wall-clock deadline passes, interrupting the blocking socket read. Tracks deadlines
per calling thread so concurrent requests (e.g., subscribe + publish) don't interfere. Only armed
for long-timeout requests (>30s). Session is recreated for subsequent requests
test(wall-clock-deadline): add unit tests for sleep detection
Cover both `asyncio` and threads paths: simulated clock jumps, normal passthrough, clean watchdog
shutdown, per-thread deadline isolation, concurrent request independence, cleanup, and exception
propagation.
test(native-threads): add try/finally cleanup to subscribe tests
Ensure `pubnub.stop()` always runs to prevent non-daemon threads from blocking process exit.
test(native-threads): fix flaky where_now and here_now tests
Enable presence heartbeat and use unique channel names so presence registers on the server.
test(file-upload): fix shared state leak in file upload tests
Restore `cipher_key` after use in `send_file` and pass it explicitly to `download_file`.
test(message-actions): use unique channel names
Avoid collisions with stale data from prior test runs.
0 commit comments