This commit is contained in:
Daniel Ponte 2024-08-15 10:12:26 -04:00
parent b45899558c
commit 596c9863ef
7 changed files with 125 additions and 52 deletions

View file

@ -1,24 +1,22 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:web_socket_channel/io.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import '../pb/stillbox.pb.dart'; import '../pb/stillbox.pb.dart';
import 'play.dart'; import 'play.dart';
import 'storage_none.dart' import 'stillbox_none.dart'
if (dart.library.io) 'storage_secure.dart' if (dart.library.io) 'stillbox_io.dart'
if (dart.library.html) 'storage_web.dart'; if (dart.library.html) 'stillbox_web.dart';
class BadAuthException implements Exception {} class BadAuthException implements Exception {}
class Stillbox extends ChangeNotifier { class Stillbox extends ChangeNotifier {
final storage = Storer(); final storage = Storer();
Player player = Player(); Player player = Player();
late IOWebSocketChannel channel; final channel = Socketer();
bool connected = false; bool connected = false;
late Uri _wsUri; late Uri _wsUri;
LiveState _state = LiveState.LS_LIVE; LiveState _state = LiveState.LS_LIVE;
Filter? currentFilter; Filter? currentFilter;
Call? _currentCall; Call? _currentCall;
Map<String, String> headers = {};
Uri? baseUri = Uri.base; Uri? baseUri = Uri.base;
set state(LiveState newState) { set state(LiveState newState) {
@ -54,15 +52,6 @@ class Stillbox extends ChangeNotifier {
} }
} }
void updateCookie(http.Response response) {
String? rawCookie = response.headers['set-cookie'];
if (rawCookie != null) {
int index = rawCookie.indexOf(';');
headers['cookie'] =
(index == -1) ? rawCookie : rawCookie.substring(0, index);
}
}
Future<bool> doLogin(String uri, String username, String password) async { Future<bool> doLogin(String uri, String username, String password) async {
baseUri = Uri.parse(uri); baseUri = Uri.parse(uri);
setUris(); setUris();
@ -80,10 +69,10 @@ class Stillbox extends ChangeNotifier {
body: form, body: form,
); );
if (response.statusCode == 200) { if (response.statusCode == 200) {
updateCookie(response); String? token = channel.updateCookie(response);
storage.setKey('baseURL', uri); storage.setKey('baseURL', uri);
if (!kIsWeb) { if (!kIsWeb && token != null) {
storage.setKey('token', headers['cookie']!); storage.setKey('token', token);
} }
await connect(); await connect();
return true; return true;
@ -95,7 +84,7 @@ class Stillbox extends ChangeNotifier {
if (connected == true) { if (connected == true) {
return; return;
} }
channel = IOWebSocketChannel.connect(_wsUri, headers: headers); channel.connect(_wsUri);
channel.stream.listen((event) => _handleData(event), onDone: () { channel.stream.listen((event) => _handleData(event), onDone: () {
connected = false; connected = false;
}, onError: (error) { }, onError: (error) {
@ -112,7 +101,7 @@ class Stillbox extends ChangeNotifier {
if (storedToken == null || storedUri == null) { if (storedToken == null || storedUri == null) {
throw (BadAuthException); throw (BadAuthException);
} }
headers['cookie'] = storedToken; channel.setCookie(storedToken);
baseUri = Uri.parse(storedUri); baseUri = Uri.parse(storedUri);
setUris(); setUris();
} }

View file

@ -0,0 +1,47 @@
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:web_socket_channel/io.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:http/http.dart' as http;
class Storer {
final storage = const FlutterSecureStorage();
Future<String?> getKey(String key) async {
return await storage.read(key: key);
}
void setKey(String key, String value) async {
await storage.write(key: key, value: value);
}
}
class Socketer {
late IOWebSocketChannel channel;
Map<String, String> headers = {};
WebSocketSink get sink {
return channel.sink;
}
Stream<dynamic> get stream {
return channel.stream;
}
String? updateCookie(http.Response response) {
String? rawCookie = response.headers['set-cookie'];
if (rawCookie != null) {
int index = rawCookie.indexOf(';');
headers['cookie'] =
(index == -1) ? rawCookie : rawCookie.substring(0, index);
}
return headers['cookie'];
}
void setCookie(String token) {
headers['cookie'] = token;
}
void connect(Uri uri) {
channel = IOWebSocketChannel.connect(uri, headers: headers);
}
}

View file

@ -0,0 +1,34 @@
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:http/http.dart' as http;
class Storer {
Future<String?> getKey(String key) async {
return null;
}
void setKey(String key, String value) {
return;
}
}
class Socketer {
late WebSocketChannel channel;
WebSocketSink get sink {
return channel.sink;
}
Stream<dynamic> get stream {
return channel.stream;
}
String? updateCookie(http.Response response) {
return null;
}
void setCookie(String token) {}
void connect(Uri uri) {
channel = WebSocketChannel.connect(uri);
}
}

View file

@ -0,0 +1,35 @@
import 'dart:html';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:http/http.dart' as http;
class Storer {
Future<String?> getKey(String key) async {
return window.localStorage[key];
}
void setKey(String key, String value) {
window.localStorage[key] = value;
}
}
class Socketer {
late WebSocketChannel channel;
WebSocketSink get sink {
return channel.sink;
}
Stream<dynamic> get stream {
return channel.stream;
}
String? updateCookie(http.Response response) {
return response.headers['set-cookie'];
}
void setCookie(String token) {}
void connect(Uri uri) {
channel = WebSocketChannel.connect(uri);
}
}

View file

@ -1,9 +0,0 @@
class Storer {
Future<String?> getKey(String key) async {
return null;
}
void setKey(String key, String value) {
return;
}
}

View file

@ -1,12 +0,0 @@
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
class Storer {
final storage = const FlutterSecureStorage();
Future<String?> getKey(String key) async {
return await storage.read(key: 'token');
}
void setKey(String key, String value) async {
await storage.write(key: 'token', value: value);
}
}

View file

@ -1,11 +0,0 @@
import 'dart:html';
class Storer {
Future<String?> getKey(String key) async {
return window.localStorage[key];
}
void setKey(String key, String value) {
window.localStorage[key] = value;
}
}