socket.dart 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import 'dart:convert';
  2. import 'package:nanoid/nanoid.dart';
  3. import 'package:web_socket_channel/io.dart';
  4. import 'package:web_socket_channel/web_socket_channel.dart';
  5. import 'package:web_socket_channel/status.dart' as status;
  6. import 'config.dart';
  7. String getApiUrlWithProtocol() {
  8. final String baseUrl = config['apiUrl'];
  9. if (baseUrl.startsWith('//')) {
  10. return "https://$baseUrl";
  11. }
  12. return baseUrl;
  13. }
  14. String getWebSocketUrl() {
  15. String apiUrlWithProtocol = getApiUrlWithProtocol();
  16. String protocol = apiUrlWithProtocol.substring(0, apiUrlWithProtocol.indexOf('//'));
  17. String apiUrlWithoutProtocol = apiUrlWithProtocol.substring(apiUrlWithProtocol.indexOf('//') + 2);
  18. return "${(protocol == 'https:') ? 'wss' : 'ws'}://$apiUrlWithoutProtocol/pubsub";
  19. }
  20. String getUniqueName(String name) {
  21. return "$name-${nanoid(5)}";
  22. }
  23. const socketKeepaliveTimeoutMs = 20000;
  24. Future keepalive(IOWebSocketChannel channel) {
  25. return new Future.delayed(const Duration(milliseconds: socketKeepaliveTimeoutMs), () {
  26. channel.sink.add(jsonEncode({'type': 'PING'}));
  27. keepalive(channel);
  28. });
  29. }
  30. void connect(String name) async {
  31. final String uniqueName = getUniqueName(name);
  32. final String webSocketUrl = getWebSocketUrl();
  33. final String pubsubUrl = "$webSocketUrl?client-name=$uniqueName";
  34. print("Connecting to socket: $pubsubUrl");
  35. var channel = IOWebSocketChannel.connect(Uri.parse(pubsubUrl));
  36. channel.stream.listen((message) {
  37. print("Received message: $message");
  38. });
  39. keepalive(channel);
  40. }