Files
jpmschweitzerandClaude Fable 5 051ceea3b2 route DaemonClient through a DaemonTransport seam (T-331)
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>
2026-06-12 03:04:58 +02:00

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;
}
}