websocket_message.dart 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. final class FinalizeMessage extends WebSocketMessage {
  24. const FinalizeMessage();
  25. @override
  26. Map<String, dynamic> toJson() => {'type': 'finalize'};
  27. }
  28. sealed class ServerMessage {
  29. const ServerMessage();
  30. static ServerMessage fromJson(Map<String, dynamic> json) {
  31. final type = json['type'] as String?;
  32. switch (type) {
  33. case 'connected':
  34. return ConnectedMessage(
  35. model: json['model'] as Map<String, dynamic>? ?? const {},
  36. );
  37. case 'partial':
  38. return PartialMessage(
  39. text: json['text'] as String? ?? '',
  40. seq: json['seq'] as int? ?? 0,
  41. );
  42. case 'utterance':
  43. return UtteranceMessage(
  44. text: json['text'] as String? ?? '',
  45. seq: json['seq'] as int? ?? 0,
  46. );
  47. case 'cleared':
  48. return const ClearedMessage();
  49. case 'error':
  50. return ErrorMessage(
  51. message: json['message'] as String? ?? 'Unknown error',
  52. );
  53. default:
  54. return ErrorMessage(message: 'Unknown message type: $type');
  55. }
  56. }
  57. static ServerMessage fromJsonString(String source) {
  58. try {
  59. final json = jsonDecode(source) as Map<String, dynamic>;
  60. return fromJson(json);
  61. } on FormatException catch (e) {
  62. return ErrorMessage(message: 'Invalid JSON: $e');
  63. }
  64. }
  65. }
  66. final class ConnectedMessage extends ServerMessage {
  67. const ConnectedMessage({required this.model});
  68. final Map<String, dynamic> model;
  69. }
  70. final class PartialMessage extends ServerMessage {
  71. const PartialMessage({required this.text, this.seq = 0});
  72. final String text;
  73. final int seq;
  74. }
  75. final class UtteranceMessage extends ServerMessage {
  76. const UtteranceMessage({required this.text, this.seq = 0});
  77. final String text;
  78. final int seq;
  79. }
  80. final class ClearedMessage extends ServerMessage {
  81. const ClearedMessage();
  82. }
  83. final class ErrorMessage extends ServerMessage {
  84. const ErrorMessage({required this.message});
  85. final String message;
  86. }