Joining another server no longer opens an empty player
connect() kept the last server's state while dialling the next; the shell saw its media on arrival and opened the player (full, on a friend's server) over the new, empty one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d9d7881747
commit
51af830160
3 files changed
+39
-2
No files matched your search
@@ -517,6 +517,9 @@ class SessionCoordinator {
|
|||||||
final epoch = connection.invalidate();
|
final epoch = connection.invalidate();
|
||||||
await _teardown(silent: true);
|
await _teardown(silent: true);
|
||||||
if (!connection.isCurrent(epoch)) throw const ConnectCancelled();
|
if (!connection.isCurrent(epoch)) throw const ConnectCancelled();
|
||||||
|
// The last server's state is not this one's: kept, its media opened the
|
||||||
|
// player (full, on a friend's server) over an empty new server.
|
||||||
|
serverState.value = null;
|
||||||
connection.begin(params);
|
connection.begin(params);
|
||||||
_wsHost = params.host;
|
_wsHost = params.host;
|
||||||
_wsPort = params.port;
|
_wsPort = params.port;
|
||||||
|
|||||||
@@ -865,14 +865,14 @@ packages:
|
|||||||
path: "../../packages/core"
|
path: "../../packages/core"
|
||||||
relative: true
|
relative: true
|
||||||
source: path
|
source: path
|
||||||
version: "1.2.0"
|
version: "1.3.0"
|
||||||
sync_relay_server:
|
sync_relay_server:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "../../packages/server"
|
path: "../../packages/server"
|
||||||
relative: true
|
relative: true
|
||||||
source: path
|
source: path
|
||||||
version: "1.2.0"
|
version: "1.3.0"
|
||||||
synchronized:
|
synchronized:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import 'dart:io';
|
|||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:hive_ce/hive.dart';
|
import 'package:hive_ce/hive.dart';
|
||||||
import 'package:media_kit/media_kit.dart';
|
import 'package:media_kit/media_kit.dart';
|
||||||
|
import 'package:signals/signals.dart' show effect;
|
||||||
import 'package:sync_relay_core/core.dart';
|
import 'package:sync_relay_core/core.dart';
|
||||||
import 'package:sync_relay_core/testing.dart';
|
import 'package:sync_relay_core/testing.dart';
|
||||||
import 'package:sync_relay_server/server.dart';
|
import 'package:sync_relay_server/server.dart';
|
||||||
@@ -443,6 +444,39 @@ void main() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('moving to another server never shows the last one\'s media', timeout: const Timeout(Duration(minutes: 1)),
|
||||||
|
() async {
|
||||||
|
final home = SyncServer(const AppConfig(port: 0, secret: 'pw', name: 'home'));
|
||||||
|
final empty = SyncServer(const AppConfig(port: 0, secret: 'pw', name: 'empty'));
|
||||||
|
await home.start();
|
||||||
|
await empty.start();
|
||||||
|
final origin = await _origin(await _media());
|
||||||
|
try {
|
||||||
|
final alice = await member(home.boundPort, 'alice');
|
||||||
|
expect(await alice.swapPicked(LinkMedia('http://127.0.0.1:${origin.port}/ep.mkv', anyway: true)), isNull);
|
||||||
|
await _poll(() => alice.serverState.peek()?.media != null, 'media up at home');
|
||||||
|
// The shell opens the player on any state with media as soon as the
|
||||||
|
// app is in a server again: nothing from the last one may be left
|
||||||
|
// while the new one is dialled.
|
||||||
|
final seen = <String>[];
|
||||||
|
final stop = effect(() {
|
||||||
|
if (alice.connection.state.value is ConnConnecting) {
|
||||||
|
seen.add(alice.serverState.peek()?.media?['name'] as String? ?? '');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
await alice.connect(ConnectParams(host: '127.0.0.1', port: empty.boundPort, secret: 'pw', name: 'alice'));
|
||||||
|
await _poll(() => alice.serverState.peek() != null, 'the new server\'s state');
|
||||||
|
stop();
|
||||||
|
expect(seen, isNotEmpty);
|
||||||
|
expect(seen.where((n) => n.isNotEmpty), isEmpty, reason: 'no media from the last server');
|
||||||
|
expect(alice.serverState.peek()?.media, isNull);
|
||||||
|
} finally {
|
||||||
|
await home.stop();
|
||||||
|
await empty.stop();
|
||||||
|
await origin.close(force: true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
test('cancel during connect setup aborts without joining', timeout: const Timeout(Duration(minutes: 1)), () async {
|
test('cancel during connect setup aborts without joining', timeout: const Timeout(Duration(minutes: 1)), () async {
|
||||||
final server = SyncServer(const AppConfig(port: 0, secret: '', name: 'cancel'));
|
final server = SyncServer(const AppConfig(port: 0, secret: '', name: 'cancel'));
|
||||||
await server.start();
|
await server.start();
|
||||||
|
|||||||
Reference in new issue
Block a user