http icon indicating copy to clipboard operation
http copied to clipboard

Can not listen pusher server

Open bensonarafat opened this issue 2 years ago • 2 comments

I could connect successfully with pusher at the backend but it wont receive anything.

bensonarafat avatar Dec 26 '23 08:12 bensonarafat

@bensonarafat Have you use channel.stream.listen() it?

In my project:

ChatGPT-Flutter-Web

import 'package:web_socket_channel/web_socket_channel.dart';


///
/// Connect Send Socket
///
@Riverpod(keepAlive: true)
WebSocketChannel send(SendRef ref) {
  const backendWebSocketUrl =
      String.fromEnvironment('BACKEND_WS_URL', defaultValue: ApiProvider.wsUrl);
  return WebSocketChannel.connect(
    Uri.parse(
        "${backendWebSocketUrl}chat/receive?token=${ref.watch(tokenProvider)}"),
  );
}

  ///
  /// Listen Stream 
  ///
_userMessageStreamListen() {
    ref.read(sendProvider).stream.listen(
      (jsonData) {
        var data = json.decode(jsonData);
        var result = BaseResult<List<ChatMessageInfo>>.fromJson(
            data,
            (jsonT) => (jsonT as List<dynamic>)
                .map((item) => ChatMessageInfo.fromJson(item))
                .toList());
        result.data != null && result.data!.length == 1
            ? ref.read(chatMessagesProvider.notifier).insertMessageList(result)
            : ref.read(chatMessagesProvider.notifier).selectMessageList(result);
      },
      onDone: () {
        retryUserSocket();
      },
      onError: (error) {
        Logger().d('WebSocket error: $error');
      },
    );
  }

/// send message
ref.read(sendProvider).sink.add(_chatMessageData(next.$1, next.$3));

Because channel.stream is asnyc stream, you should listen it to receive server message, do not use await for(xxxxxxx)

MannaYang avatar Jan 30 '24 09:01 MannaYang

Okay, great. I'll try it

bensonarafat avatar Jan 30 '24 17:01 bensonarafat