| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- import 'dart:convert';
- import 'package:nanoid/nanoid.dart';
- import 'package:web_socket_channel/io.dart';
- import './config.dart';
- import './controller.dart';
- String getApiUrlWithProtocol() {
- final String baseUrl = config['apiUrl'];
- if (baseUrl.startsWith('//')) {
- return "https://$baseUrl";
- }
- return baseUrl;
- }
- String getWebSocketUrl() {
- String apiUrlWithProtocol = getApiUrlWithProtocol();
- String protocol = apiUrlWithProtocol.substring(0, apiUrlWithProtocol.indexOf('//'));
- String apiUrlWithoutProtocol = apiUrlWithProtocol.substring(apiUrlWithProtocol.indexOf('//') + 2);
- return "${(protocol == 'https:') ? 'wss' : 'ws'}://$apiUrlWithoutProtocol/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";
- print("Connecting to socket: $pubsubUrl");
- var channel = IOWebSocketChannel.connect(Uri.parse(pubsubUrl));
- channel.stream.listen((message) {
- controller.onRemoteMessage(message);
- });
- keepalive(channel);
- }
|