DaemonBus (was EventBus): typed events for system/IPC layer. MessageBus: channel-based pub/sub for UI/extension coordination. Messages carry publisher (auto-stamped from extension ID), channel (required), timestamp, and payload. Subscribe by publisher, channel, or both — zero collision across extensions. Extension context gains publish() and subscribe() convenience methods that auto-stamp the extension's ID as publisher. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
23 lines
609 B
Dart
23 lines
609 B
Dart
import 'dart:async';
|
|
|
|
import 'package:clide/kernel/src/events/types.dart';
|
|
|
|
class DaemonBus {
|
|
DaemonBus();
|
|
|
|
final StreamController<ClideEventEnvelope> _controller =
|
|
StreamController<ClideEventEnvelope>.broadcast();
|
|
|
|
Stream<ClideEventEnvelope> get stream => _controller.stream;
|
|
|
|
Stream<T> on<T extends ClideEvent>() =>
|
|
_controller.stream.where((e) => e.event is T).map((e) => e.event as T);
|
|
|
|
void emit(ClideEvent event) {
|
|
if (_controller.isClosed) return;
|
|
_controller.add(ClideEventEnvelope(event, DateTime.now().toUtc()));
|
|
}
|
|
|
|
Future<void> dispose() => _controller.close();
|
|
}
|