replit-river 0.17.10__py3-none-any.whl → 0.17.12__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.
@@ -99,6 +99,8 @@ class ClientSession(Session):
99
99
  try:
100
100
  await self._handle_messages_from_ws()
101
101
  except ConnectionClosed:
102
+ if self._should_abort_streams_after_transport_failure():
103
+ await self.close()
102
104
  if self._retry_connection_callback:
103
105
  self._task_manager.create_task(self._retry_connection_callback())
104
106
 
@@ -106,10 +108,13 @@ class ClientSession(Session):
106
108
  logger.debug("ConnectionClosed while serving", exc_info=True)
107
109
  except FailedSendingMessageException:
108
110
  # Expected error if the connection is closed.
111
+ if self._should_abort_streams_after_transport_failure():
112
+ await self.close()
109
113
  logger.debug(
110
114
  "FailedSendingMessageException while serving", exc_info=True
111
115
  )
112
116
  except Exception:
117
+ await self.close()
113
118
  logger.exception("caught exception at message iterator")
114
119
  except ExceptionGroup as eg:
115
120
  _, unhandled = eg.split(lambda e: isinstance(e, ConnectionClosed))
@@ -405,7 +405,11 @@ def encode_type(
405
405
  | UnionTypeExpr
406
406
  | LiteralType
407
407
  ) = other
408
- raise ValueError(f"What does it mean to have {_o2} here?")
408
+ raise ValueError(
409
+ f"What does it mean to have {
410
+ render_type_expr(_o2)
411
+ } here?"
412
+ )
409
413
  if permit_unknown_members:
410
414
  union = _make_open_union_type_expr(any_of)
411
415
  else:
@@ -496,7 +500,7 @@ def encode_type(
496
500
  typeddict_encoder.append("None")
497
501
  return (NoneTypeExpr(), [], [], set())
498
502
  elif type.type == "Date":
499
- typeddict_encoder.append("TODO: dstewart")
503
+ typeddict_encoder.append("datetime.datetime")
500
504
  return (LiteralType("datetime.datetime"), [], [], set())
501
505
  elif type.type == "array" and type.items:
502
506
  type_name, module_info, type_chunks, encoder_names = encode_type(
replit_river/session.py CHANGED
@@ -286,6 +286,17 @@ class Session:
286
286
  if should_retry and self._retry_connection_callback:
287
287
  self._task_manager.create_task(self._retry_connection_callback())
288
288
 
289
+ def _should_abort_streams_after_transport_failure(self) -> bool:
290
+ return not self._transport_options.transparent_reconnect
291
+
292
+ def _abort_all_streams(self) -> None:
293
+ """Close all active stream channels, notifying any waiting consumers."""
294
+ if not self._streams:
295
+ return
296
+ for stream in self._streams.values():
297
+ stream.close()
298
+ self._streams.clear()
299
+
289
300
  async def close(self) -> None:
290
301
  """Close the session and all associated streams."""
291
302
  logger.info(
@@ -310,9 +321,7 @@ class Session:
310
321
 
311
322
  # TODO: unexpected_close should close stream differently here to
312
323
  # throw exception correctly.
313
- for stream in self._streams.values():
314
- stream.close()
315
- self._streams.clear()
324
+ self._abort_all_streams()
316
325
 
317
326
  self._state = SessionState.CLOSED
318
327
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: replit-river
3
- Version: 0.17.10
3
+ Version: 0.17.12
4
4
  Summary: Replit river toolkit for Python
5
5
  Author-email: Replit <eng@replit.com>
6
6
  License: MIT License
@@ -33,7 +33,7 @@ Classifier: Programming Language :: Python :: 3
33
33
  Classifier: Programming Language :: Python :: 3.11
34
34
  Classifier: Programming Language :: Python :: 3.12
35
35
  Classifier: Topic :: Internet
36
- Requires-Python: <4,>=3.11
36
+ Requires-Python: <4,>=3.12
37
37
  Requires-Dist: aiochannel>=1.2.1
38
38
  Requires-Dist: grpcio-tools>=1.59.3
39
39
  Requires-Dist: grpcio>=1.59.3
@@ -43,7 +43,7 @@ Requires-Dist: opentelemetry-api>=1.28.2
43
43
  Requires-Dist: opentelemetry-sdk>=1.28.2
44
44
  Requires-Dist: protobuf>=5.28.3
45
45
  Requires-Dist: pydantic-core>=2.20.1
46
- Requires-Dist: pydantic==2.9.2
46
+ Requires-Dist: pydantic<3,>=2.9.0
47
47
  Requires-Dist: websockets<14,>=13.0
48
48
  Description-Content-Type: text/markdown
49
49
 
@@ -1,6 +1,6 @@
1
1
  replit_river/__init__.py,sha256=9NWf8QCC7U34WoV3KAvyM7PPrjVMJ7SUuG77cYHx8l0,528
2
2
  replit_river/client.py,sha256=tZKU7XRz2OgQctrSAafrthhC6Iy-d1cuf6FcAIe1etE,8534
3
- replit_river/client_session.py,sha256=-5zLTwlJCsPj6oL5psSuooQgbbheK3Ibi04GxkyYORE,19428
3
+ replit_river/client_session.py,sha256=d0aDuZ5Ke4u5uN2_lcU6Q_bbVuDrwlN4LPDKNnHb3Qc,19687
4
4
  replit_river/client_transport.py,sha256=7ATTR6tnaT0H-NfWo5j6PvGXbSB9zCs5UsEuvcOdNiU,14588
5
5
  replit_river/common_session.py,sha256=iOV9gnhg2kcCHW0cR1thqtT6hWApP_83ErjMliMuDnM,3960
6
6
  replit_river/error_schema.py,sha256=dts5f3iEsKhCF56-N6yNsZSf45sV8ILcjix0BddJgD8,3985
@@ -13,13 +13,13 @@ replit_river/seq_manager.py,sha256=AUUdNIFARH0wmEsnl7wOylfSRG92iZUAR-8mTQzP9DY,2
13
13
  replit_river/server.py,sha256=XBmmmqlk96MAWmglzb8-a_z7Ju_tVm8ug9oOzVEckcA,3995
14
14
  replit_river/server_session.py,sha256=CZnEO0Q5dNIIVZfSkFAsU5ajPwDwg9cmPSfg_uV25GY,10143
15
15
  replit_river/server_transport.py,sha256=Xd3F98lFm2HRhmw9zgE_hmULY-75IlK8QRQe5ThThWM,12023
16
- replit_river/session.py,sha256=s-3zu8gXuBLHfYkLX89BLSvnlpOmnhfQhgYyEDKoPgE,14337
16
+ replit_river/session.py,sha256=ig06WE8MTxUy8yQjgbgaz8kw6BNVLDrD_5J96Rxcf58,14671
17
17
  replit_river/task_manager.py,sha256=i-nHRG1qlvVFOqUn-UyrlROOIIMfXJtox7XZv5eduK8,4477
18
18
  replit_river/transport_options.py,sha256=Kx3n6_x6sA69WV52EUvm-GzJhDaaewUQzbtcdPlZntA,2155
19
19
  replit_river/websocket_wrapper.py,sha256=xrk421A5eXTH2bjAcNeBZN96zTO6xQsl0VS9qcwus6M,814
20
20
  replit_river/codegen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  replit_river/codegen/__main__.py,sha256=LyKe1OXIyev0BuUcu43iu6zBLJzeogQ8DocxDkALD-Q,153
22
- replit_river/codegen/client.py,sha256=ebcR9aQ_VZ00UP1h_a3Y_PwTQAMKXaPbDnZ9MAgLSjE,59810
22
+ replit_river/codegen/client.py,sha256=EU3cuwDegkLI9V6SG0IWPPdLQvBl6dUyrSuu0JDYGpQ,59963
23
23
  replit_river/codegen/format.py,sha256=pLa9nWlw8hTOnjzZjMsMpgcmNYiLaF5VAHNQTwwJ7Zw,285
24
24
  replit_river/codegen/run.py,sha256=InJaUDJft80pY7v2l-LoXHr8HYg3Bmb_6XQvlqgvxv4,3170
25
25
  replit_river/codegen/schema.py,sha256=y3kzrEPgzW9gKMjqiF2souZk47mE_kuFkHlsxRdD560,5344
@@ -29,7 +29,7 @@ replit_river/v2/__init__.py,sha256=Fi4wP87qHOQwaWQmVbPJOOiGfkiZ6gTWg5bF5J8je5s,1
29
29
  replit_river/v2/client.py,sha256=PQ1qz15lFTdMOs0kktBdzMUEYD66OnJJN0loYFVjdn4,7241
30
30
  replit_river/v2/client_transport.py,sha256=swtsFoWIX8nnG5cBeHMkZSZsJ5SW-VbdNHBdLtldMgU,3445
31
31
  replit_river/v2/session.py,sha256=8EMKw8bevoIrMfQBKMl3oXFlOJ91lzjmuqsm3qZN8Ts,54147
32
- replit_river-0.17.10.dist-info/METADATA,sha256=LrMPCnZCsCa8ZQfuPQNkPcvhVnp7IcZCI7zwuk34OEk,4791
33
- replit_river-0.17.10.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
34
- replit_river-0.17.10.dist-info/licenses/LICENSE,sha256=kyZ5E3kOH4dzPet_xD0w6xi04e-0fGT0HRMhKyLyLC0,1063
35
- replit_river-0.17.10.dist-info/RECORD,,
32
+ replit_river-0.17.12.dist-info/METADATA,sha256=K3yvG8yAj4od7kQL3DxmFP3cOUoUWnx7kKHXB2XuZsM,4794
33
+ replit_river-0.17.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
34
+ replit_river-0.17.12.dist-info/licenses/LICENSE,sha256=kyZ5E3kOH4dzPet_xD0w6xi04e-0fGT0HRMhKyLyLC0,1063
35
+ replit_river-0.17.12.dist-info/RECORD,,