The UI's backend client connected straight to the workspace unix socket, hard-coding the local shape. It now talks JSON-lines through a DaemonTransport (new lib/src/ipc/transport.dart, Flutter-free), with LocalSocketTransport reproducing today's connect byte-for-byte — zero behavior change, proven by the untouched client test suite plus new seam tests driving the client over an in-memory transport. This is the slot the SSH-remote backend (T-329/Q-23) plugs into: request correlation, reconnect/backoff, and event forwarding live above the seam and won't change when the endpoint is remote. main.dart's swapIpcServer becomes swapBackend per the same plan. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
46 lines
1.3 KiB
Dart
46 lines
1.3 KiB
Dart
import 'package:clide/clide.dart';
|
|
import 'package:clide/kernel/kernel.dart';
|
|
|
|
/// A DaemonClient that doesn't actually open a socket. Use in tests
|
|
/// that need a connected-state observable but not a real daemon.
|
|
class FakeDaemonClient extends DaemonClient {
|
|
FakeDaemonClient({required super.log, required super.events}) : super.unixSocket(socketPath: '/dev/null/fake-clide.sock');
|
|
|
|
bool _fakeConnected = false;
|
|
final Map<String, Future<IpcResponse> Function(Map<String, Object?>)> _stubs = {};
|
|
|
|
@override
|
|
bool get isConnected => _fakeConnected;
|
|
|
|
@override
|
|
Future<void> start() async {
|
|
// No real socket; tests drive connection-state via [setConnected].
|
|
}
|
|
|
|
@override
|
|
Future<void> stop() async {
|
|
_fakeConnected = false;
|
|
notifyListeners();
|
|
}
|
|
|
|
@override
|
|
Future<IpcResponse> request(String cmd, {Map<String, Object?> args = const {}}) async {
|
|
final stub = _stubs[cmd];
|
|
if (stub != null) return stub(args);
|
|
return IpcResponse.err(
|
|
id: '',
|
|
error: IpcError(code: IpcExitCode.notFound, kind: IpcErrorKind.notFound, message: 'no stub for $cmd'),
|
|
);
|
|
}
|
|
|
|
void setConnected(bool v) {
|
|
if (_fakeConnected == v) return;
|
|
_fakeConnected = v;
|
|
notifyListeners();
|
|
}
|
|
|
|
void stub(String cmd, Future<IpcResponse> Function(Map<String, Object?>) handler) {
|
|
_stubs[cmd] = handler;
|
|
}
|
|
}
|