| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- import 'dart:convert';
- import 'package:nanoid/nanoid.dart';
- import 'package:web_socket_channel/io.dart';
- import './config.dart';
- import './controller.dart';
- String getWebSocketUrl() {
- return "wss://${config['apiUrl']}/pubsub";
- }
- String getUniqueName(String name) {
- return "$name-${nanoid(5)}";
- }
- const socketKeepaliveTimeoutMs = 20000;
- Future keepalive(IOWebSocketChannel channel) {
- return new Future.delayed(const Duration(milliseconds: socketKeepaliveTimeoutMs), () {
- channel.sink.add(jsonEncode({'type': 'PING'}));
- keepalive(channel);
- });
- }
- void connect(Controller controller) async {
- if (controller.name.value.length == 0) {
- return;
- }
- final String uniqueName = getUniqueName(controller.name.value);
- controller.setUniqueName(uniqueName);
- final String webSocketUrl = getWebSocketUrl();
- final String pubsubUrl = "$webSocketUrl?client-name=$uniqueName";
- var channel = IOWebSocketChannel.connect(Uri.parse(pubsubUrl));
- controller.channel = channel;
- channel.stream.listen((message) {
- controller.onRemoteMessage(message);
- });
- keepalive(channel);
- }
|