diff --git a/README.md b/README.md index eb21d1cf..646d0d69 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # angel_websocket -[![1.0.7](https://img.shields.io/badge/pub-1.0.7-brightgreen.svg)](https://pub.dartlang.org/packages/angel_websocket) +[![Pub](https://img.shields.io/pub/v/angel_websocket.svg)](https://pub.dartlang.org/packages/angel_websocket) [![build status](https://travis-ci.org/angel-dart/websocket.svg)](https://travis-ci.org/angel-dart/websocket) WebSocket plugin for Angel. @@ -36,6 +36,10 @@ synchronously or asynchronously. myService.properties['ws:filter'] = (HookedServiceEvent e, WebSocketContext socket) async { return true; } + +myService.index({ + 'ws:filter': (e, socket) => ...; +}); ``` **Adding Handlers within a Controller** diff --git a/lib/base_websocket_client.dart b/lib/base_websocket_client.dart index f1d46e0f..8711a33a 100644 --- a/lib/base_websocket_client.dart +++ b/lib/base_websocket_client.dart @@ -133,10 +133,10 @@ abstract class BaseWebSocketClient extends BaseAngelClient { Future getConnectedWebSocket(); @override - BaseWebSocketService service(String path, + WebSocketsService service(String path, {Type type, AngelDeserializer deserializer}) { String uri = path.toString().replaceAll(_straySlashes, ''); - return new BaseWebSocketService(socket, this, uri, + return new WebSocketsService(socket, this, uri, deserializer: deserializer); } @@ -225,7 +225,7 @@ abstract class BaseWebSocketClient extends BaseAngelClient { } /// A [Service] that asynchronously interacts with the server. -class BaseWebSocketService extends Service { +class WebSocketsService extends Service { /// The [BaseWebSocketClient] that spawned this service. @override final BaseWebSocketClient app; @@ -275,7 +275,7 @@ class BaseWebSocketService extends Service { /// Fired on `removed` events. Stream get onRemoved => _onRemoved.stream; - BaseWebSocketService(this.socket, this.app, this.path, {this.deserializer}) { + WebSocketsService(this.socket, this.app, this.path, {this.deserializer}) { listen(); } diff --git a/lib/browser.dart b/lib/browser.dart index 7f3afa6d..c0598cbd 100644 --- a/lib/browser.dart +++ b/lib/browser.dart @@ -15,7 +15,7 @@ final RegExp _straySlashes = new RegExp(r"(^/)|(/+$)"); /// Queries an Angel server via WebSockets. class WebSockets extends BaseWebSocketClient { - final List _services = []; + final List _services = []; WebSockets(String path) : super(new http.BrowserClient(), path); @@ -80,17 +80,17 @@ class WebSockets extends BaseWebSocketClient { } @override - WebSocketsService service(String path, + BrowserWebSocketsService service(String path, {Type type, AngelDeserializer deserializer}) { String uri = path.replaceAll(_straySlashes, ''); - return new WebSocketsService(socket, this, uri, deserializer: deserializer); + return new BrowserWebSocketsService(socket, this, uri, deserializer: deserializer); } } -class WebSocketsService extends BaseWebSocketService { +class BrowserWebSocketsService extends WebSocketsService { final Type type; - WebSocketsService(WebSocketChannel socket, Angel app, String uri, + BrowserWebSocketsService(WebSocketChannel socket, Angel app, String uri, {this.type, AngelDeserializer deserializer}) : super(socket, app, uri, deserializer: deserializer); } diff --git a/lib/flutter.dart b/lib/flutter.dart new file mode 100644 index 00000000..1186dbe8 --- /dev/null +++ b/lib/flutter.dart @@ -0,0 +1,46 @@ +/// Flutter-compatible WebSocket client library for the Angel framework. +library angel_websocket.flutter; + +import 'dart:async'; +import 'dart:io'; +import 'package:angel_client/angel_client.dart'; +import 'package:http/http.dart' as http; +import 'package:web_socket_channel/web_socket_channel.dart'; +import 'package:web_socket_channel/io.dart'; +import 'angel_websocket.dart'; +import 'base_websocket_client.dart'; +export 'package:angel_client/angel_client.dart'; +export 'angel_websocket.dart'; + +final RegExp _straySlashes = new RegExp(r"(^/)|(/+$)"); + +/// Queries an Angel server via WebSockets. +class WebSockets extends BaseWebSocketClient { + final List _services = []; + + WebSockets(String path) : super(new http.Client(), path); + + @override + Stream authenticateViaPopup(String url, {String eventName: 'token'}) { + throw new UnimplementedError( + 'Opening popup windows is not supported in the `dart:io` client.'); + } + + @override + Future close() { + for (var service in _services) { + service.close(); + } + + return super.close(); + } + + @override + Future getConnectedWebSocket() async { + var socket = await WebSocket.connect(basePath, + headers: authToken?.isNotEmpty == true + ? {'Authorization': 'Bearer $authToken'} + : {}); + return new IOWebSocketChannel(socket); + } +} \ No newline at end of file diff --git a/lib/io.dart b/lib/io.dart index 254e76fd..19f9e648 100644 --- a/lib/io.dart +++ b/lib/io.dart @@ -17,7 +17,7 @@ final RegExp _straySlashes = new RegExp(r"(^/)|(/+$)"); /// Queries an Angel server via WebSockets. class WebSockets extends BaseWebSocketClient { - final List _services = []; + final List _services = []; WebSockets(String path) : super(new http.Client(), path); @@ -46,20 +46,20 @@ class WebSockets extends BaseWebSocketClient { } @override - WebSocketsService service(String path, + IoWebSocketsService service(String path, {Type type, AngelDeserializer deserializer}) { String uri = path.replaceAll(_straySlashes, ''); - return new WebSocketsService(socket, this, uri, T != dynamic ? T : type); + return new IoWebSocketsService(socket, this, uri, T != dynamic ? T : type); } @override serialize(x) => god.serialize(x); } -class WebSocketsService extends BaseWebSocketService { +class IoWebSocketsService extends WebSocketsService { final Type type; - WebSocketsService(WebSocketChannel socket, Angel app, String uri, this.type) + IoWebSocketsService(WebSocketChannel socket, Angel app, String uri, this.type) : super(socket, app, uri); @override diff --git a/lib/server.dart b/lib/server.dart index 51670e04..d48f87c1 100644 --- a/lib/server.dart +++ b/lib/server.dart @@ -107,6 +107,8 @@ class AngelWebSocket extends AngelPlugin { _filter(WebSocketContext socket) { if (e.service.properties.containsKey('ws:filter')) return e.service.properties['ws:filter'](e, socket); + else if (e.params != null && e.params.containsKey('ws:filter')) + return e.params['ws:filter'](e, socket); else return true; } diff --git a/lib/websocket_controller.dart b/lib/websocket_controller.dart index c1da2ec9..f692df71 100644 --- a/lib/websocket_controller.dart +++ b/lib/websocket_controller.dart @@ -37,7 +37,7 @@ class WebSocketController extends Controller { @override Future call(Angel app) async { - await super.call(app); + if (findExpose() != null) await super.call(app); InstanceMirror instanceMirror = reflect(this); ClassMirror classMirror = reflectClass(this.runtimeType); diff --git a/pubspec.yaml b/pubspec.yaml index d7b1ae4e..fe514dbe 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.0.7 +version: 1.0.8 author: Tobe O homepage: https://github.com/angel-dart/angel_websocket dependencies: