2.0.0-alpha.2
This commit is contained in:
parent
11b7b6159e
commit
6674353a53
7 changed files with 49 additions and 36 deletions
|
@ -1,3 +1,6 @@
|
||||||
|
# 2.0.0-alpha.2
|
||||||
|
* Updated for the next version of `angel_client`.
|
||||||
|
|
||||||
# 2.0.0-alpha.1
|
# 2.0.0-alpha.1
|
||||||
* Refactorings for updated Angel 2 versions.
|
* Refactorings for updated Angel 2 versions.
|
||||||
* Remove `package:dart2_constant`.
|
* Remove `package:dart2_constant`.
|
||||||
|
|
|
@ -39,16 +39,24 @@ const List<String> EVENTS = const [
|
||||||
];
|
];
|
||||||
|
|
||||||
/// A notification from the server that something has occurred.
|
/// A notification from the server that something has occurred.
|
||||||
class WebSocketEvent {
|
class WebSocketEvent<Data> {
|
||||||
String eventName;
|
String eventName;
|
||||||
var data;
|
Data data;
|
||||||
|
|
||||||
WebSocketEvent({String this.eventName, this.data});
|
WebSocketEvent({String this.eventName, this.data});
|
||||||
|
|
||||||
factory WebSocketEvent.fromJson(Map data) => new WebSocketEvent(
|
factory WebSocketEvent.fromJson(Map data) => new WebSocketEvent(
|
||||||
eventName: data['eventName'].toString(), data: data['data']);
|
eventName: data['eventName'].toString(), data: data['data'] as Data);
|
||||||
|
|
||||||
Map toJson() {
|
WebSocketEvent<T> cast<T>() {
|
||||||
|
if (T == Data) {
|
||||||
|
return this as WebSocketEvent<T>;
|
||||||
|
} else {
|
||||||
|
return new WebSocketEvent<T>(eventName: eventName, data: data as T);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
return {'eventName': eventName, 'data': data};
|
return {'eventName': eventName, 'data': data};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,10 +133,11 @@ abstract class BaseWebSocketClient extends BaseAngelClient {
|
||||||
Future<WebSocketChannel> getConnectedWebSocket();
|
Future<WebSocketChannel> getConnectedWebSocket();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
WebSocketsService service(String path,
|
WebSocketsService<Id, Data> service<Id, Data>(String path,
|
||||||
{Type type, AngelDeserializer deserializer}) {
|
{Type type, AngelDeserializer<Data> deserializer}) {
|
||||||
String uri = path.toString().replaceAll(_straySlashes, '');
|
String uri = path.toString().replaceAll(_straySlashes, '');
|
||||||
return new WebSocketsService(socket, this, uri, deserializer: deserializer);
|
return new WebSocketsService<Id, Data>(socket, this, uri,
|
||||||
|
deserializer: deserializer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Starts listening for data.
|
/// Starts listening for data.
|
||||||
|
@ -225,13 +226,13 @@ abstract class BaseWebSocketClient extends BaseAngelClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A [Service] that asynchronously interacts with the server.
|
/// A [Service] that asynchronously interacts with the server.
|
||||||
class WebSocketsService extends Service {
|
class WebSocketsService<Id, Data> extends Service<Id, Data> {
|
||||||
/// The [BaseWebSocketClient] that spawned this service.
|
/// The [BaseWebSocketClient] that spawned this service.
|
||||||
@override
|
@override
|
||||||
final BaseWebSocketClient app;
|
final BaseWebSocketClient app;
|
||||||
|
|
||||||
/// Used to deserialize JSON into typed data.
|
/// Used to deserialize JSON into typed data.
|
||||||
final AngelDeserializer deserializer;
|
final AngelDeserializer<Data> deserializer;
|
||||||
|
|
||||||
/// The [WebSocketChannel] to listen to, and send data across.
|
/// The [WebSocketChannel] to listen to, and send data across.
|
||||||
final WebSocketChannel socket;
|
final WebSocketChannel socket;
|
||||||
|
@ -242,11 +243,11 @@ class WebSocketsService extends Service {
|
||||||
final StreamController<WebSocketEvent> _onAllEvents =
|
final StreamController<WebSocketEvent> _onAllEvents =
|
||||||
new StreamController<WebSocketEvent>();
|
new StreamController<WebSocketEvent>();
|
||||||
final StreamController _onIndexed = new StreamController();
|
final StreamController _onIndexed = new StreamController();
|
||||||
final StreamController _onRead = new StreamController();
|
final StreamController<Data> _onRead = new StreamController<Data>();
|
||||||
final StreamController _onCreated = new StreamController();
|
final StreamController<Data> _onCreated = new StreamController<Data>();
|
||||||
final StreamController _onModified = new StreamController();
|
final StreamController<Data> _onModified = new StreamController<Data>();
|
||||||
final StreamController _onUpdated = new StreamController();
|
final StreamController<Data> _onUpdated = new StreamController<Data>();
|
||||||
final StreamController _onRemoved = new StreamController();
|
final StreamController<Data> _onRemoved = new StreamController<Data>();
|
||||||
|
|
||||||
/// Fired on all events.
|
/// Fired on all events.
|
||||||
Stream<WebSocketEvent> get onAllEvents => _onAllEvents.stream;
|
Stream<WebSocketEvent> get onAllEvents => _onAllEvents.stream;
|
||||||
|
@ -255,19 +256,19 @@ class WebSocketsService extends Service {
|
||||||
Stream get onIndexed => _onIndexed.stream;
|
Stream get onIndexed => _onIndexed.stream;
|
||||||
|
|
||||||
/// Fired on `read` events.
|
/// Fired on `read` events.
|
||||||
Stream get onRead => _onRead.stream;
|
Stream<Data> get onRead => _onRead.stream;
|
||||||
|
|
||||||
/// Fired on `created` events.
|
/// Fired on `created` events.
|
||||||
Stream get onCreated => _onCreated.stream;
|
Stream<Data> get onCreated => _onCreated.stream;
|
||||||
|
|
||||||
/// Fired on `modified` events.
|
/// Fired on `modified` events.
|
||||||
Stream get onModified => _onModified.stream;
|
Stream<Data> get onModified => _onModified.stream;
|
||||||
|
|
||||||
/// Fired on `updated` events.
|
/// Fired on `updated` events.
|
||||||
Stream get onUpdated => _onUpdated.stream;
|
Stream<Data> get onUpdated => _onUpdated.stream;
|
||||||
|
|
||||||
/// Fired on `removed` events.
|
/// Fired on `removed` events.
|
||||||
Stream get onRemoved => _onRemoved.stream;
|
Stream<Data> get onRemoved => _onRemoved.stream;
|
||||||
|
|
||||||
WebSocketsService(this.socket, this.app, this.path, {this.deserializer}) {
|
WebSocketsService(this.socket, this.app, this.path, {this.deserializer}) {
|
||||||
listen();
|
listen();
|
||||||
|
@ -287,12 +288,12 @@ class WebSocketsService extends Service {
|
||||||
serialize(WebSocketAction action) => json.encode(action);
|
serialize(WebSocketAction action) => json.encode(action);
|
||||||
|
|
||||||
/// Deserializes data from a [WebSocketEvent].
|
/// Deserializes data from a [WebSocketEvent].
|
||||||
deserialize(x) {
|
Data deserialize(x) {
|
||||||
return deserializer != null ? deserializer(x) : x;
|
return deserializer != null ? deserializer(x) : x as Data;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Deserializes the contents of an [event].
|
/// Deserializes the contents of an [event].
|
||||||
WebSocketEvent transformEvent(WebSocketEvent event) {
|
WebSocketEvent<Data> transformEvent(WebSocketEvent<Data> event) {
|
||||||
return event..data = deserialize(event.data);
|
return event..data = deserialize(event.data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -300,7 +301,7 @@ class WebSocketsService extends Service {
|
||||||
void listen() {
|
void listen() {
|
||||||
app.onServiceEvent.listen((map) {
|
app.onServiceEvent.listen((map) {
|
||||||
if (map.containsKey(path)) {
|
if (map.containsKey(path)) {
|
||||||
var event = map[path];
|
var event = map[path].cast<Data>();
|
||||||
var transformed = transformEvent(event).data;
|
var transformed = transformEvent(event).data;
|
||||||
|
|
||||||
_onAllEvents.add(event);
|
_onAllEvents.add(event);
|
||||||
|
|
|
@ -83,18 +83,18 @@ class WebSockets extends BaseWebSocketClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
BrowserWebSocketsService service(String path,
|
BrowserWebSocketsService<Id, Data> service<Id, Data>(String path,
|
||||||
{Type type, AngelDeserializer deserializer}) {
|
{Type type, AngelDeserializer<Data> deserializer}) {
|
||||||
String uri = path.replaceAll(_straySlashes, '');
|
String uri = path.replaceAll(_straySlashes, '');
|
||||||
return new BrowserWebSocketsService(socket, this, uri,
|
return new BrowserWebSocketsService<Id, Data>(socket, this, uri,
|
||||||
deserializer: deserializer);
|
deserializer: deserializer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BrowserWebSocketsService extends WebSocketsService {
|
class BrowserWebSocketsService<Id, Data> extends WebSocketsService<Id, Data> {
|
||||||
final Type type;
|
final Type type;
|
||||||
|
|
||||||
BrowserWebSocketsService(WebSocketChannel socket, WebSockets app, String uri,
|
BrowserWebSocketsService(WebSocketChannel socket, WebSockets app, String uri,
|
||||||
{this.type, AngelDeserializer deserializer})
|
{this.type, AngelDeserializer<Data> deserializer})
|
||||||
: super(socket, app, uri, deserializer: deserializer);
|
: super(socket, app, uri, deserializer: deserializer);
|
||||||
}
|
}
|
||||||
|
|
10
lib/io.dart
10
lib/io.dart
|
@ -46,17 +46,17 @@ class WebSockets extends BaseWebSocketClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
IoWebSocketsService service(String path,
|
IoWebSocketsService<Id, Data> service<Id, Data>(String path,
|
||||||
{Type type, AngelDeserializer deserializer}) {
|
{Type type, AngelDeserializer<Data> deserializer}) {
|
||||||
String uri = path.replaceAll(_straySlashes, '');
|
String uri = path.replaceAll(_straySlashes, '');
|
||||||
return new IoWebSocketsService(socket, this, uri, type);
|
return new IoWebSocketsService<Id, Data>(socket, this, uri, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
serialize(x) => god.serialize(x);
|
serialize(x) => god.serialize(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
class IoWebSocketsService extends WebSocketsService {
|
class IoWebSocketsService<Id, Data> extends WebSocketsService<Id, Data> {
|
||||||
final Type type;
|
final Type type;
|
||||||
|
|
||||||
IoWebSocketsService(
|
IoWebSocketsService(
|
||||||
|
@ -69,7 +69,7 @@ class IoWebSocketsService extends WebSocketsService {
|
||||||
@override
|
@override
|
||||||
deserialize(x) {
|
deserialize(x) {
|
||||||
if (type != null && type != dynamic) {
|
if (type != null && type != dynamic) {
|
||||||
return god.deserializeDatum(x, outputType: type);
|
return god.deserializeDatum(x, outputType: type) as Data;
|
||||||
} else
|
} else
|
||||||
return super.deserialize(x);
|
return super.deserialize(x);
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,7 +68,8 @@ class WebSocketController extends Controller {
|
||||||
socket.onData.listen((data) => onData(data, socket));
|
socket.onData.listen((data) => onData(data, socket));
|
||||||
|
|
||||||
socket.onAction.listen((WebSocketAction action) async {
|
socket.onAction.listen((WebSocketAction action) async {
|
||||||
socket.request.container.registerSingleton<WebSocketAction>(action);
|
var container = socket.request.container.createChild();
|
||||||
|
container.registerSingleton<WebSocketAction>(action);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await onAction(action, socket);
|
await onAction(action, socket);
|
||||||
|
@ -77,7 +78,7 @@ class WebSocketController extends Controller {
|
||||||
var methodMirror = _handlers[action.eventName];
|
var methodMirror = _handlers[action.eventName];
|
||||||
var fn = instanceMirror.getField(methodMirror.simpleName).reflectee;
|
var fn = instanceMirror.getField(methodMirror.simpleName).reflectee;
|
||||||
return app.runContained(
|
return app.runContained(
|
||||||
fn as Function, socket.request, socket.response);
|
fn as Function, socket.request, socket.response, container);
|
||||||
}
|
}
|
||||||
} catch (e, st) {
|
} catch (e, st) {
|
||||||
ws.catchError(e, st, socket);
|
ws.catchError(e, st, socket);
|
||||||
|
|
|
@ -2,7 +2,7 @@ name: angel_websocket
|
||||||
description: WebSocket plugin for Angel.
|
description: WebSocket plugin for Angel.
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.0.0-dev <3.0.0"
|
sdk: ">=2.0.0-dev <3.0.0"
|
||||||
version: 2.0.0-alpha.1
|
version: 2.0.0-alpha.2
|
||||||
author: Tobe O <thosakwe@gmail.com>
|
author: Tobe O <thosakwe@gmail.com>
|
||||||
homepage: https://github.com/angel-dart/angel_websocket
|
homepage: https://github.com/angel-dart/angel_websocket
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
Loading…
Reference in a new issue