How to Custom CastSession on type adapter on hive?
- Dominant language
- Dart
- Stars
- 4.4k
- Forks
- 449
- PR merge metrics
- No merged PRs in 30d
Description
import 'dart:async';
import 'device.dart';
import 'socket.dart';
enum CastSessionState {
connecting,
connected,
closed,
}
class CastSession {
static const kNamespaceConnection = 'urn:x-cast:com.google.cast.tp.connection';
static const kNamespaceHeartbeat = 'urn:x-cast:com.google.cast.tp.heartbeat';
static const kNamespaceReceiver = 'urn:x-cast:com.google.cast.receiver';
static const kNamespaceDeviceauth = 'urn:x-cast:com.google.cast.tp.deviceauth';
static const kNamespaceMedia = 'urn:x-cast:com.google.cast.media';
final String sessionId;
CastSocket get socket => _socket;
CastSessionState get state => _state;
Stream get stateStream => _stateController.stream;
Stream> get messageStream => _messageController.stream;
final CastSocket _socket;
CastSessionState _state = CastSessionState.connecting;
String? _transportId;
final _stateController = StreamController.broadcast();
final _messageController = StreamController>.broadcast();
CastSession._(this.sessionId, this._socket);
static Future connect(String sessionId, CastDevice device, [Duration? timeout]) async {
final _socket = await CastSocket.connect(
device.host,
device.port,
timeout,
);
final session = CastSession._(sessionId, _socket);
session._startListening();
session.sendMessage(kNamespaceConnection, {
'type': 'CONNECT',
});
return session;
}
Future close() async {
if (!_messageController.isClosed) {
sendMessage(kNamespaceConnection, {
'type': 'CLOSE',
});
try {
await _socket.flush();
} catch (_error) {}
}
return _socket.close();
}
void _startListening() {
_socket.stream.listen((message) {
// happen
if (_messageController.isClosed) {
return;
}
if (message.namespace == kNamespaceHeartbeat && message.payload['type'] == 'PING') {
sendMessage(kNamespaceHeartbeat, {
'type': 'PONG',
});
} else if (message.namespace == kNamespaceConnection && message.payload['type'] == 'CLOSE') {
close();
} else if (message.namespace == kNamespaceReceiver && message.payload['type'] == 'RECEIVER_STATUS') {
_handleReceiverStatus(message.payload);
_messageController.add(message.payload);
} else {
_messageController.add(message.payload);
}
}, onError: (error) {
_messageController.addError(error);
}, onDone: () {
_messageController.close();
_state = CastSessionState.closed;
_stateController.add(_state);
_stateController.close();
}, cancelOnError: false);
}
void _handleReceiverStatus(Map payload) {
if (_transportId != null) {
return;
}
if (payload['status']?.containsKey('applications') == true) {
_transportId = payload['status']['applications'][0]['transportId'];
// reconnect with new _transportId
sendMessage(kNamespaceConnection, {
'type': 'CONNECT',
});
_state = CastSessionState.connected;
_stateController.add(_state);
}
}
void sendMessage(String namespace, Map payload) {
_socket.sendMessage(
namespace,
sessionId,
_transportId ?? 'receiver-0',
payload,
);
}
Future flush() {
return _socket.flush();
}
}
Contributor guide
No contributing guide indexed for this repository
Research direction
The issue only shows a Dart CastSession class and asks how to use a custom type adapter with Hive; no repository file or test is identified. First clarify whether the expected outcome is documentation or an implementation, then identify the adapter entry point and define what successful CastSession serialization and restoration should demonstrate.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- dart
- Domain
- database
- Issue type
- Documentation
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 20/100