mirror of
https://git.selfprivacy.org/kherel/selfprivacy.org.app.git
synced 2024-11-09 10:23:11 +00:00
feat: Use Websockets to update server jobs status
This commit is contained in:
parent
135ed30ee3
commit
e0232bfa44
|
@ -101,7 +101,13 @@ abstract class GraphQLApiMap {
|
||||||
final WebSocketLink webSocketLink = WebSocketLink(
|
final WebSocketLink webSocketLink = WebSocketLink(
|
||||||
'ws://api.$rootAddress/graphql',
|
'ws://api.$rootAddress/graphql',
|
||||||
config: SocketClientConfig(
|
config: SocketClientConfig(
|
||||||
|
// TODO: Figure out the keep alive pings, as the app disconnects after 30s of inactivity.
|
||||||
autoReconnect: true,
|
autoReconnect: true,
|
||||||
|
initialPayload: _token.isEmpty
|
||||||
|
? null
|
||||||
|
: {
|
||||||
|
'Authorization': 'Bearer $_token',
|
||||||
|
},
|
||||||
headers: _token.isEmpty
|
headers: _token.isEmpty
|
||||||
? null
|
? null
|
||||||
: {
|
: {
|
||||||
|
|
|
@ -22,6 +22,18 @@ mixin JobsApi on GraphQLApiMap {
|
||||||
return jobsList;
|
return jobsList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Stream<List<ServerJob>> getServerJobsStream() async* {
|
||||||
|
final GraphQLClient client = await getSubscriptionClient();
|
||||||
|
final subscription = client.subscribe$JobUpdates();
|
||||||
|
await for (final response in subscription) {
|
||||||
|
final jobsList = response.parsedData?.jobUpdates
|
||||||
|
.map<ServerJob>((final job) => ServerJob.fromGraphQL(job))
|
||||||
|
.toList() ??
|
||||||
|
[];
|
||||||
|
yield jobsList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Future<GenericResult<bool>> removeApiJob(final String uid) async {
|
Future<GenericResult<bool>> removeApiJob(final String uid) async {
|
||||||
try {
|
try {
|
||||||
final GraphQLClient client = await getClient();
|
final GraphQLClient client = await getClient();
|
||||||
|
|
|
@ -44,6 +44,8 @@ class ApiConnectionRepository {
|
||||||
|
|
||||||
Timer? _timer;
|
Timer? _timer;
|
||||||
|
|
||||||
|
StreamSubscription<List<ServerJob>>? _serverJobsStreamSubscription;
|
||||||
|
|
||||||
Future<void> removeServerJob(final String uid) async {
|
Future<void> removeServerJob(final String uid) async {
|
||||||
await api.removeApiJob(uid);
|
await api.removeApiJob(uid);
|
||||||
_apiData.serverJobs.data
|
_apiData.serverJobs.data
|
||||||
|
@ -273,6 +275,12 @@ class ApiConnectionRepository {
|
||||||
connectionStatus = ConnectionStatus.connected;
|
connectionStatus = ConnectionStatus.connected;
|
||||||
_connectionStatusStream.add(connectionStatus);
|
_connectionStatusStream.add(connectionStatus);
|
||||||
|
|
||||||
|
_serverJobsStreamSubscription =
|
||||||
|
api.getServerJobsStream().listen((final List<ServerJob> jobs) {
|
||||||
|
_apiData.serverJobs.data = jobs;
|
||||||
|
_dataStream.add(_apiData);
|
||||||
|
});
|
||||||
|
|
||||||
// Use timer to periodically check for new jobs
|
// Use timer to periodically check for new jobs
|
||||||
_timer = Timer.periodic(
|
_timer = Timer.periodic(
|
||||||
const Duration(seconds: 10),
|
const Duration(seconds: 10),
|
||||||
|
@ -284,6 +292,7 @@ class ApiConnectionRepository {
|
||||||
connectionStatus = ConnectionStatus.nonexistent;
|
connectionStatus = ConnectionStatus.nonexistent;
|
||||||
_connectionStatusStream.add(connectionStatus);
|
_connectionStatusStream.add(connectionStatus);
|
||||||
_timer?.cancel();
|
_timer?.cancel();
|
||||||
|
await _serverJobsStreamSubscription?.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _refetchEverything(final Version version) async {
|
Future<void> _refetchEverything(final Version version) async {
|
||||||
|
@ -338,7 +347,8 @@ class ApiData {
|
||||||
),
|
),
|
||||||
serverJobs = ApiDataElement<List<ServerJob>>(
|
serverJobs = ApiDataElement<List<ServerJob>>(
|
||||||
fetchData: () async => api.getServerJobs(),
|
fetchData: () async => api.getServerJobs(),
|
||||||
ttl: 10,
|
// TODO: Figure this out later, as ws keeps this updated
|
||||||
|
ttl: 10000,
|
||||||
),
|
),
|
||||||
backupConfig = ApiDataElement<BackupConfiguration>(
|
backupConfig = ApiDataElement<BackupConfiguration>(
|
||||||
fetchData: () async => api.getBackupsConfiguration(),
|
fetchData: () async => api.getBackupsConfiguration(),
|
||||||
|
|
Loading…
Reference in a new issue