diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..3daafa79 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,2 @@ +# 1.1.0+1 +* Added `unwrap`. \ No newline at end of file diff --git a/README.md b/README.md index 19ffa147..b97af397 100644 --- a/README.md +++ b/README.md @@ -163,3 +163,13 @@ main() async { app.authenticateViaJwt(''); } ``` +**Unwrapping Events** +In several cases, it may be cumbersome or inconsistent to handle events +as `WebSocketEvent`s. Call `unwrap` to receive a `Service` that returns the underlying `data` +objects. + +```dart +foo() async { + var unwrapped = app.service('api/todos').unwrap(); +} +``` \ No newline at end of file diff --git a/lib/base_websocket_client.dart b/lib/base_websocket_client.dart index a44780b1..5ff956d6 100644 --- a/lib/base_websocket_client.dart +++ b/lib/base_websocket_client.dart @@ -136,8 +136,7 @@ abstract class BaseWebSocketClient extends BaseAngelClient { WebSocketsService service(String path, {Type type, AngelDeserializer deserializer}) { String uri = path.toString().replaceAll(_straySlashes, ''); - return new WebSocketsService(socket, this, uri, - deserializer: deserializer); + return new WebSocketsService(socket, this, uri, deserializer: deserializer); } /// Starts listening for data. @@ -389,6 +388,9 @@ class WebSocketsService extends Service { eventName: '$path::${ACTION_REMOVE}', id: id, params: params ?? {})); return null; } + + /// Returns a wrapper that queries this service, but fires the `data` of `WebSocketEvent`s, rather than the events themselves. + Service unwrap() => new _WebSocketsDataService(this); } /// Contains a dynamic Map of [WebSocketEvent] streams. @@ -409,3 +411,81 @@ class WebSocketExtraneousEventHandler { return _events[index].stream; } } + +class _WebSocketsDataService extends Service { + final WebSocketsService service; + + Stream _onIndexed, _onRead, _onCreated, _onModified, _onUpdated, _onRemoved; + + _WebSocketsDataService(this.service); + + getData(WebSocketEvent e) => e.data; + + @override + Future remove(id, [Map params]) { + return service.remove(id, params); + } + + @override + Future update(id, data, [Map params]) { + return service.update(id, data, params); + } + + @override + Future modify(id, data, [Map params]) { + return service.modify(id, data, params); + } + + @override + Future create(data, [Map params]) { + return service.create(data, params); + } + + @override + Future read(id, [Map params]) { + return service.read(id, params); + } + + @override + Future index([Map params]) { + return service.index(params); + } + + @override + Future close() async {} + + @override + Angel get app { + return service.app; + } + + @override + Stream get onRemoved { + return _onRemoved ??= service.onRemoved.map(getData); + } + + @override + Stream get onUpdated { + return _onUpdated ??= service.onUpdated.map(getData); + } + + @override + Stream get onModified { + return _onModified ??= service.onModified.map(getData); + } + + @override + Stream get onCreated { + return _onCreated ??= service.onCreated.map(getData); + } + + @override + Stream get onRead { + return _onRead ??= service.onRead.map(getData); + } + + @override + Stream get onIndexed { + return _onIndexed ??= service.onIndexed.map(getData); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index ba7e2917..fd545daf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: angel_websocket description: WebSocket plugin for Angel. environment: sdk: ">=1.19.0" -version: 1.1.0-alpha+4 +version: 1.1.0+1 author: Tobe O homepage: https://github.com/angel-dart/angel_websocket dependencies: diff --git a/test/service/common.dart b/test/service/common.dart index 11d265f1..9e30ab79 100644 --- a/test/service/common.dart +++ b/test/service/common.dart @@ -21,12 +21,12 @@ class TodoService extends TypedService { } testIndex(BaseWebSocketClient client) async { - var Todos = client.service('api/todos'); + var Todos = client.service('api/todos').unwrap(); Todos.index(); var indexed = await Todos.onIndexed.first; - print('indexed: ${indexed.toJson()}'); + print('indexed: $indexed'); - expect(indexed.data, isList); - expect(indexed.data, isEmpty); + expect(indexed, isList); + expect(indexed, isEmpty); }