websocket_message.dart 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import 'dart:convert';
  2. sealed class WebSocketMessage {
  3. const WebSocketMessage();
  4. Map<String, dynamic> toJson();
  5. String toJsonString() => jsonEncode(toJson());
  6. }
  7. final class AudioMessage extends WebSocketMessage {
  8. const AudioMessage({required this.data});
  9. final String data;
  10. @override
  11. Map<String, dynamic> toJson() => {'type': 'audio', 'data': data};
  12. }
  13. final class TranscribeMessage extends WebSocketMessage {
  14. const TranscribeMessage();
  15. @override
  16. Map<String, dynamic> toJson() => {'type': 'transcribe'};
  17. }
  18. final class ClearMessage extends WebSocketMessage {
  19. const ClearMessage();
  20. @override
  21. Map<String, dynamic> toJson() => {'type': 'clear'};
  22. }
  23. sealed class ServerMessage {
  24. const ServerMessage();
  25. static ServerMessage fromJson(Map<String, dynamic> json) {
  26. final type = json['type'] as String?;
  27. switch (type) {
  28. case 'connected':
  29. return ConnectedMessage(
  30. model: json['model'] as Map<String, dynamic>? ?? const {},
  31. );
  32. case 'transcript':
  33. return TranscriptMessage(
  34. text: json['text'] as String? ?? '',
  35. language: json['language'] as String?,
  36. );
  37. case 'cleared':
  38. return const ClearedMessage();
  39. case 'error':
  40. return ErrorMessage(
  41. message: json['message'] as String? ?? 'Unknown error',
  42. );
  43. default:
  44. return ErrorMessage(message: 'Unknown message type: $type');
  45. }
  46. }
  47. static ServerMessage fromJsonString(String source) {
  48. try {
  49. final json = jsonDecode(source) as Map<String, dynamic>;
  50. return fromJson(json);
  51. } on FormatException catch (e) {
  52. return ErrorMessage(message: 'Invalid JSON: $e');
  53. }
  54. }
  55. }
  56. final class ConnectedMessage extends ServerMessage {
  57. const ConnectedMessage({required this.model});
  58. final Map<String, dynamic> model;
  59. }
  60. final class TranscriptMessage extends ServerMessage {
  61. const TranscriptMessage({required this.text, this.language});
  62. final String text;
  63. final String? language;
  64. }
  65. final class ClearedMessage extends ServerMessage {
  66. const ClearedMessage();
  67. }
  68. final class ErrorMessage extends ServerMessage {
  69. const ErrorMessage({required this.message});
  70. final String message;
  71. }