import 'package:actors/actors.dart'; import 'package:bip340/bip340.dart' as bip340; import 'nostr_event.dart'; sealed class SignerMessage { const SignerMessage(); } final class SignEvent extends SignerMessage { final int kind; final List> tags; final String content; final int? createdAt; const SignEvent({ required this.kind, this.tags = const [], required this.content, this.createdAt, }); } final class GetPublicKey extends SignerMessage { const GetPublicKey(); } sealed class SignerResult { const SignerResult(); } final class EventSigned extends SignerResult { final String event; const EventSigned(this.event); } final class PublicKeyResult extends SignerResult { final String publicKey; const PublicKeyResult(this.publicKey); } class NostrSignerActor with Handler { final String _privateKey; final String _publicKey; NostrSignerActor(String privateKey) : _privateKey = privateKey, _publicKey = bip340.getPublicKey(privateKey); @override Future handle(SignerMessage message) => switch (message) { SignEvent(:final kind, :final tags, :final content, :final createdAt) => Future.value(_signEvent(kind, tags, content, createdAt)), GetPublicKey() => Future.value(PublicKeyResult(_publicKey)), }; EventSigned _signEvent( int kind, List> tags, String content, int? createdAt, ) => EventSigned(signNostrEvent( privateKey: _privateKey, publicKey: _publicKey, kind: kind, tags: tags, content: content, createdAt: createdAt, )); }