platform/lib/websocket_context.dart

66 lines
1.9 KiB
Dart
Raw Normal View History

part of angel_websocket.server;
2016-12-23 20:57:46 +00:00
/// Represents a WebSocket session, with the original
/// [RequestContext] and [ResponseContext] attached.
class WebSocketContext {
2016-12-23 20:57:46 +00:00
/// Use this to listen for events.
2016-09-18 01:35:16 +00:00
_WebSocketEventTable on = new _WebSocketEventTable();
2016-12-23 20:57:46 +00:00
2018-11-04 02:11:52 +00:00
/// The underlying [StreamChannel].
final StreamChannel channel;
2016-12-23 20:57:46 +00:00
/// The original [RequestContext].
final RequestContext request;
/// The original [ResponseContext].
final ResponseContext response;
StreamController<WebSocketAction> _onAction =
new StreamController<WebSocketAction>();
2017-02-28 14:15:34 +00:00
StreamController<Null> _onClose = new StreamController<Null>();
2016-12-23 20:57:46 +00:00
StreamController _onData = new StreamController();
/// Fired on any [WebSocketAction];
Stream<WebSocketAction> get onAction => _onAction.stream;
2017-02-28 14:15:34 +00:00
/// Fired once the underlying [WebSocket] closes.
Stream<Null> get onClose => _onClose.stream;
2017-09-24 16:19:16 +00:00
/// Fired when any data is sent through [channel].
2016-09-18 01:35:16 +00:00
Stream get onData => _onData.stream;
2017-09-24 16:19:16 +00:00
WebSocketContext(this.channel, this.request, this.response);
2018-11-04 02:11:52 +00:00
/// Closes the underlying [StreamChannel].
Future close() async {
await channel.sink.close();
2017-02-28 14:15:34 +00:00
_onAction.close();
_onData.close();
_onClose.add(null);
_onClose.close();
}
2016-12-23 20:57:46 +00:00
/// Sends an arbitrary [WebSocketEvent];
void send(String eventName, data) {
2018-11-04 02:11:52 +00:00
channel.sink
.add(json.encode(new WebSocketEvent(eventName: eventName, data: data)));
}
2016-12-23 20:57:46 +00:00
/// Sends an error event.
void sendError(AngelHttpException error) => send(EVENT_ERROR, error.toJson());
2016-09-03 12:34:01 +00:00
}
2016-09-18 01:35:16 +00:00
class _WebSocketEventTable {
Map<String, StreamController<Map>> _handlers = {};
2018-07-10 16:54:55 +00:00
StreamController<Map> _getStreamForEvent(String eventName) {
2016-09-18 01:35:16 +00:00
if (!_handlers.containsKey(eventName))
2017-02-28 14:15:34 +00:00
_handlers[eventName] = new StreamController<Map>();
2016-09-18 01:35:16 +00:00
return _handlers[eventName];
}
Stream<Map> operator [](String key) => _getStreamForEvent(key).stream;
}