···
···
/// can help prevent that if your consumer sometimes pauses, at a cost of higher memory
/// usage while events are buffered.
204
+
/// How long since the last jetstream message before we consider the connection dead
207
+
pub liveliness_ttl: Duration,
impl Default for JetstreamConfig {
···
omit_user_agent_jetstream_info: false,
replay_on_reconnect: false,
channel_size: 4096, // a few seconds of firehose buffer
221
+
liveliness_ttl: Duration::from_secs(15),
···
let (send_channel, receive_channel) = channel(self.config.channel_size);
let replay_on_reconnect = self.config.replay_on_reconnect;
389
+
let liveliness_ttl = self.config.liveliness_ttl;
let build_request = self.config.get_request_builder();
tokio::task::spawn(async move {
···
if let Ok((ws_stream, _)) = connect_async(req).await {
let t_connected = Instant::now();
log::info!("jetstream connected. starting websocket task...");
418
-
websocket_task(dict, ws_stream, send_channel.clone(), &mut last_cursor)
424
+
if let Err(e) = websocket_task(
427
+
send_channel.clone(),
JetstreamEventError::ReceiverClosedError => {
···
JetstreamEventError::CompressionDictionaryError(_) => {
#[cfg(feature="metrics")]
counter!("jetstream_disconnects", "reason" => "zstd", "fatal" => "no").increment(1);
444
+
JetstreamEventError::NoMessagesReceived => {
445
+
#[cfg(feature="metrics")]
446
+
counter!("jetstream_disconnects", "reason" => "ttl", "fatal" => "no").increment(1);
JetstreamEventError::PingPongError(_) => {
#[cfg(feature="metrics")]
···
ws: WebSocketStream<MaybeTlsStream<TcpStream>>,
send_channel: JetstreamSender,
last_cursor: &mut Option<Cursor>,
500
+
liveliness_ttl: Duration,
) -> Result<(), JetstreamEventError> {
// TODO: Use the write half to allow the user to change configuration settings on the fly.
let (mut socket_write, mut socket_read) = ws.split();
let mut closing_connection = false;
490
-
match socket_read.next().await {
507
+
let next = match timeout(liveliness_ttl, socket_read.next()).await {
510
+
log::warn!("jetstream no events for {liveliness_ttl:?}, closing");
511
+
_ = socket_write.close().await;
512
+
return Err(JetstreamEventError::NoMessagesReceived);
Some(Ok(message)) => match message {
#[cfg(feature = "metrics")]