Skip to content

Commit e98c2a1

Browse files
committed
fix: make queueMessages client option True by default
- Add TO3g test verifying queueMessages defaults to true - Add RTL6c2 check to fail immediately when queueMessages is false and connection is CONNECTING/DISCONNECTED - Add test for publish failure on CONNECTING state with queueMessages=false
1 parent 78d8233 commit e98c2a1

File tree

5 files changed

+46
-4
lines changed

5 files changed

+46
-4
lines changed

ably/realtime/connectionmanager.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,19 @@ async def send_protocol_message(self, protocol_message: dict) -> None:
182182
Returns:
183183
None
184184
"""
185-
if self.state not in (ConnectionState.DISCONNECTED, ConnectionState.CONNECTING, ConnectionState.CONNECTED):
186-
raise AblyException(f"ConnectionManager.send_protocol_message(): called in {self.state}", 500, 50000)
185+
state_should_queue = (self.state in
186+
(ConnectionState.INITIALIZED, ConnectionState.DISCONNECTED, ConnectionState.CONNECTING))
187+
188+
if self.state != ConnectionState.CONNECTED and not state_should_queue:
189+
raise AblyException(f"Cannot send message while connection is {self.state}", 400, 90000)
190+
191+
# RTL6c2: If queueMessages is false, fail immediately when not CONNECTED
192+
if state_should_queue and not self.options.queue_messages:
193+
raise AblyException(
194+
f"Cannot send message while connection is {self.state}, and queue_messages is false",
195+
400,
196+
90000,
197+
)
187198

188199
pending_message = PendingMessage(protocol_message)
189200

@@ -194,7 +205,7 @@ async def send_protocol_message(self, protocol_message: dict) -> None:
194205
self.pending_message_queue.push(pending_message)
195206
self.msg_serial += 1
196207

197-
if self.state in (ConnectionState.DISCONNECTED, ConnectionState.CONNECTING):
208+
if state_should_queue:
198209
self.queued_messages.appendleft(pending_message)
199210
if pending_message.ack_required:
200211
await pending_message.future

ably/realtime/realtime_channel.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,7 @@ def _throw_if_unpublishable_state(self) -> None:
498498
# RTL6c4: Check connection state
499499
connection_state = self.__realtime.connection.state
500500
if connection_state not in [
501+
ConnectionState.INITIALIZED,
501502
ConnectionState.CONNECTED,
502503
ConnectionState.CONNECTING,
503504
ConnectionState.DISCONNECTED,

ably/types/options.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def decode(self, delta: bytes, base: bytes) -> bytes:
2626

2727
class Options(AuthOptions):
2828
def __init__(self, client_id=None, log_level=0, tls=True, rest_host=None, realtime_host=None, port=0,
29-
tls_port=0, use_binary_protocol=True, queue_messages=False, recover=False, environment=None,
29+
tls_port=0, use_binary_protocol=True, queue_messages=True, recover=False, environment=None,
3030
http_open_timeout=None, http_request_timeout=None, realtime_request_timeout=None,
3131
http_max_retry_count=None, http_max_retry_duration=None, fallback_hosts=None,
3232
fallback_retry_timeout=None, disconnected_retry_timeout=None, idempotent_rest_publishing=None,

test/ably/realtime/realtimechannel_publish_test.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,27 @@ async def check_disconnected():
285285

286286
await ably.close()
287287

288+
async def test_publish_fails_on_initialized_when_queue_messages_false(self):
289+
"""RTN7d: Verify publish fails immediately when connection is CONNECTING and queueMessages=false"""
290+
# Create client with queueMessages=False
291+
ably = await TestApp.get_ably_realtime(
292+
use_binary_protocol=self.use_binary_protocol,
293+
queue_messages=False,
294+
auto_connect=False
295+
)
296+
297+
channel = ably.channels.get('test_initialized_channel')
298+
299+
# Try to publish while in the INITIALIZED state with queueMessages=false
300+
with pytest.raises(AblyException) as exc_info:
301+
await channel.publish('test_event', 'test_data')
302+
303+
# Verify it failed with appropriate error
304+
assert exc_info.value.code == 90000
305+
assert exc_info.value.status_code == 400
306+
307+
await ably.close()
308+
288309
# RTN19a2 - Reset msgSerial on new connectionId
289310
async def test_msgserial_resets_on_new_connection_id(self):
290311
"""RTN19a2: Verify msgSerial resets to 0 when connectionId changes"""

test/ably/realtime/realtimeconnection_test.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,3 +460,12 @@ def intercepted_websocket_frame(data):
460460
assert all(isinstance(frame, str) for frame in received_raw_websocket_frames)
461461

462462
await ably.close()
463+
464+
# TO3g
465+
async def test_queue_messages_defaults_to_true(self):
466+
"""TO3g: Verify that queueMessages client option defaults to true"""
467+
ably = await TestApp.get_ably_realtime(auto_connect=False)
468+
469+
# TO3g: queueMessages defaults to true
470+
assert ably.options.queue_messages is True
471+
assert ably.connection.connection_manager.options.queue_messages is True

0 commit comments

Comments
 (0)