socket.dart 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import 'dart:convert';
  2. import 'package:nanoid/nanoid.dart';
  3. import 'package:web_socket_channel/io.dart';
  4. import './config.dart';
  5. import './controller.dart';
  6. String getWebSocketUrl() {
  7. return "wss://${config['apiUrl']}/pubsub";
  8. }
  9. String getUniqueName(String name) {
  10. return "$name-${nanoid(5)}";
  11. }
  12. const socketKeepaliveTimeoutMs = 20000;
  13. Future keepalive(IOWebSocketChannel channel) {
  14. return new Future.delayed(const Duration(milliseconds: socketKeepaliveTimeoutMs), () {
  15. channel.sink.add(jsonEncode({'type': 'PING'}));
  16. keepalive(channel);
  17. });
  18. }
  19. void connect(Controller controller) async {
  20. if (controller.name.value.length == 0) {
  21. return;
  22. }
  23. final String uniqueName = getUniqueName(controller.name.value);
  24. controller.setUniqueName(uniqueName);
  25. final String webSocketUrl = getWebSocketUrl();
  26. final String pubsubUrl = "$webSocketUrl?client-name=$uniqueName";
  27. var channel = IOWebSocketChannel.connect(Uri.parse(pubsubUrl));
  28. controller.channel = channel;
  29. channel.stream.listen((message) {
  30. controller.onRemoteMessage(message);
  31. });
  32. keepalive(channel);
  33. }