WebSocket plugin for Angel.
This plugin broadcasts events from hooked services via WebSockets.
In addition, it adds itself to the app's IoC container as AngelWebSocket
, so that it can be used
in controllers as well.
WebSocket contexts are add to req.properties
as 'socket'
.
Server-side
import "package:angel_framework/angel_framework.dart";
import "package:angel_websocket/server.dart";
main() async {
var app = new Angel();
var ws = new AngelWebSocket();
// This is a plug-in. It hooks all your services,
// to automatically broadcast events.
await app.configure(ws.configureServer);
// Listen for requests at `/ws`.
app.all('/ws', ws.handleRequest);
}
Filtering events is easy with hooked services. Just return a bool
, whether
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
WebSocketController
extends a normal Controller
, but also listens to WebSockets.
import 'dart:async';
import "package:angel_framework/angel_framework.dart";
import "package:angel_websocket/server.dart";
@Expose("/")
class MyController extends WebSocketController {
// A reference to the WebSocket plug-in is required.
MyController(AngelWebSocket ws):super(ws);
@override
void onConnect(WebSocketContext socket) {
// On connect...
}
// Dependency injection works, too..
@ExposeWs("read_message")
void sendMessage(WebSocketContext socket, WebSocketAction action, Db db) async {
socket.send(
"found_message",
db.collection("messages").findOne(where.id(action.data['message_id'])));
}
// Event filtering
@ExposeWs("foo")
void foo() {
broadcast(new WebSocketEvent(...), filter: (socket) async => ...);
}
}
Client Use
This repo also provides two client libraries browser
and io
that extend the base
angel_client
interface, and allow you to use a very similar API on the client to that of
the server.
The provided clients also automatically try to reconnect their WebSockets when disconnected, which means you can restart your development server without having to reload browser windows.
They also provide streams of data that pump out filtered data as it comes in from the server.
Clients can even perform authentication over WebSockets.
In the Browser
import "package:angel_websocket/browser.dart";
main() async {
Angel app = new WebSockets("/ws");
await app.connect();
var Cars = app.service("api/cars");
Cars.onCreated.listen((car) => print("New car: $car"));
// Happens asynchronously
Cars.create({"brand": "Toyota"});
// Authenticate a WebSocket, if you were not already authenticated...
app.authenticateViaJwt('<some-jwt>');
// Listen for arbitrary events
app.on['custom_event'].listen((event) {
// For example, this might be sent by a
// WebSocketController.
print('Hi!');
});
}
CLI Client
import "package:angel_framework/common.dart";
import "package:angel_websocket/io.dart";
// You can include these in a shared file and access on both client and server
class Car extends Model {
int year;
String brand, make;
Car({this.year, this.brand, this.make});
@override String toString() => "$year $brand $make";
}
main() async {
Angel app = new WebSockets("/ws");
// Wait for WebSocket connection...
await app.connect();
var Cars = app.service("api/cars", type: Car);
Cars.onCreated.listen((Car car) {
// Automatically deserialized into a car :)
//
// I just bought a new 2016 Toyota Camry!
print("I just bought a new $car!");
});
// Happens asynchronously
Cars.create({"year": 2016, "brand": "Toyota", "make": "Camry"});
// Authenticate a WebSocket, if you were not already authenticated...
app.authenticateViaJwt('<some-jwt>');
}
unwrap
.e.data
, rather than the actual event.unwrap
.Add this to your package's pubspec.yaml file:
dependencies:
angel_websocket: "^1.1.1"
You can install packages from the command line:
with pub:
$ pub get
Alternatively, your editor might support pub get
.
Check the docs for your editor to learn more.
Now in your Dart code, you can use:
import 'package:angel_websocket/angel_websocket.dart';
Version | Uploaded | Documentation | Archive |
---|---|---|---|
1.1.1 | Dec 21, 2017 |
|
|
1.1.0+1 | Dec 10, 2017 |
|
|
1.1.0 | Dec 7, 2017 |
|
|
1.0.8 | Jun 30, 2017 | failed |
|
1.0.7 | Jun 3, 2017 | failed |
|
1.0.6+1 | Apr 23, 2017 | failed |
|
1.0.6 | Apr 23, 2017 | failed |
|
1.0.5 | Apr 17, 2017 | failed |
|
1.0.4+3 | Apr 17, 2017 | failed |
|
1.0.4+2 | Apr 15, 2017 | failed |
|
We analyzed this package on Apr 23, 2018, and provided a score, details, and suggestions below. Analysis was completed with status completed using:
Popularity:
Describes how popular the package is relative to other packages.
[more]
|
81 | / 100 |
Health:
Code health derived from static analysis.
[more]
|
97 | / 100 |
Maintenance:
Reflects how tidy and up-to-date the package is.
[more]
|
79 | / 100 |
Overall score:
Weighted score of the above.
[more]
|
85 |
Detected platforms: unsure
Fix platform conflicts.
Fix analysis and formatting issues.
Analysis or formatting checks reported 1 error 13 hints.
Make sure that the imported libraries are not in conflict. Detected components:
html
,io
,isolate
. nullRun
dartfmt
to formatlib/base_websocket_client.dart
.Similar analysis of the following files failed:
lib/flutter.dart
(hint)lib/server.dart
(hint)
The description is too short.
Add more detail about the package, what it does and what is its target use case. Try to write at least 60 characters.
Maintain an example.
Create a short demo in the
example/
directory to show how to use this package. Common file name patterns include:main.dart
,example.dart
or you could also useangel_websocket.dart
.
Package | Constraint | Resolved | Available |
---|---|---|---|
Direct dependencies | |||
Dart SDK | >=1.19.0 | ||
angel_auth | ^1.1.0-alpha | 1.1.0+2 | |
angel_client | ^1.1.0-alpha | 1.2.0+1 | |
angel_framework | ^1.1.0-alpha | 1.1.2 | |
http | >=0.11.0 <0.12.0 | 0.11.3+16 | |
json_god | ^2.0.0-beta | 2.0.0-beta+1 | |
merge_map | ^1.0.0 | 1.0.0 | |
meta | ^1.0.0 | 1.1.2 | |
uuid | ^0.5.3 | 0.5.3 | 1.0.0 |
web_socket_channel | ^1.0.0 | 1.0.7 | |
Transitive dependencies | |||
angel_http_exception | 1.0.0 | ||
angel_model | 1.0.0 | ||
angel_route | 2.0.5 | ||
async | 2.0.6 | ||
body_parser | 1.1.0 | ||
charcode | 1.1.1 | ||
collection | 1.14.9 | ||
combinator | 1.0.0-beta+7 | ||
container | 0.1.2 | ||
convert | 2.0.1 | ||
crypto | 2.0.2+1 | ||
http_parser | 3.1.1 | ||
http_server | 0.9.7 | ||
logging | 0.11.3+1 | ||
matcher | 0.12.2 | ||
mime | 0.9.6 | ||
path | 1.5.1 | ||
pool | 1.3.4 | ||
quiver_hashcode | 1.0.0 | ||
random_string | 0.0.1 | ||
source_span | 1.4.0 | ||
stack_trace | 1.9.2 | ||
stream_channel | 1.6.5 | ||
string_scanner | 1.0.2 | ||
tuple | 1.0.1 | ||
typed_data | 1.1.5 | ||
Dev dependencies | |||
test | ^0.12.15 |