Skip to content

🐛 Bug Report: Realtime does not reconnect when connection is lost #107

@merabtenei

Description

@merabtenei

👟 Reproduction steps

  • On android, create a subscription, check that it receives events correctly.
  • Now turn off wifi (and any other connectivity) for a few seconds.
  • Turn on wifi (or other connectivity) again.
  • Trigger some events
  • Now the subscription doesn't receive those event and the worst is there's no exception or anything triggered when the connection was lost

I'm using Flutter and below is a very simple app that will reproduce this behavior.

import 'package:appwrite/appwrite.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Appwrite Realtime Test',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Appwrite Realtime Test'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Client client = Client();

  late RealtimeSubscription subscription;

  @override
  void initState() {
    client
            .setEndpoint(
                'https://xxxxxxxx.xxx/v1') // Your Appwrite Endpoint
            .setProject('xxxxx') // Your project ID
            .setSelfSigned() // Use only on dev mode with a self-signed SSL cert
        ;
    Realtime realtime = Realtime(client);
    subscription =
        realtime.subscribe(['databases.xxxxx.collections.xxxxx.documents']);
    subscription.stream.listen((event) => print('Received event'),
        onDone: () => print('DONE'), onError: (error, st) => print('ERROR'));

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: StreamBuilder(
          stream: subscription.stream,
          builder: (context, snapshot) {
            if (snapshot.hasData && snapshot.data != null) {
              return Text(snapshot.data!.payload.toString());
            } else if (snapshot.hasError) {
              return Tooltip(
                message: snapshot.error.toString(),
                child: const Icon(Icons.error),
              );
            } else {
              return const CircularProgressIndicator();
            }
          },
        ),
      ),
    );
  }
}

👍 Expected behavior

One of two scenarios :

  • Websocket should reconnect automatically.
  • Or raise an exception or anything we can catch when the connection is lost so we can try to recreate the subscription manually

👎 Actual Behavior

  • No automatic reconnecting
  • No exception or error raised when deconnecting

🎲 Appwrite version

Version 2.0.x

💻 Operating system

Linux

🧱 Your Environment

No response

👀 Have you spent some time to check if this issue has been raised before?

  • I checked and didn't find similar issue

🏢 Have you read the Code of Conduct?

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions