Đây là cách API docs khuyên bạn nên đăng ký một handler WebSocket:
server
.where((request) => request.uri.path == "/ws")
.transform(new WebSocketTransformer()).listen((webSocket) => ...);
Tuy nhiên, máy chủ là một dòng đơn thuê bao. Sau khi đính kèm listen
, bạn không thể đính kèm các trình nghe khác.
Điều tôi thực sự muốn dành cho một cái gì đó để xem một sự kiện, quyết định xem nó có thể xử lý sự kiện hay không và sau đó định tuyến cho luồng khác. Nếu không, hãy vượt qua nó. Bằng cách này, sự kiện (trong trường hợp này là một đối tượng HttpRequest) được truyền theo một chuỗi cho đến khi nó được xử lý.
Tôi đã tạo một lớp học TakeAndRoute
kéo dài StreamEventTransformer
. TakeAndRoute
sử dụng một chức năng để xác định xem nó có nên lấy sự kiện và định tuyến đến một luồng khác hay đơn giản là chuyển tiếp nó.
Đây là những gì tôi đã đưa ra:
import 'dart:io';
import 'dart:async';
handleWebSocket(WebSocket webSocket) {
webSocket.listen((event) {
if (event is MessageEvent) {
/* Handle message. */
} else if (event is CloseEvent) {
/* Handle closed. */
}
});
}
typedef bool ShouldTake(e);
typedef void RouteTo(Stream stream);
typedef void HandleEvent(e);
class TakeAndRoute<S, T> extends StreamEventTransformer<S, T> {
ShouldTake shouldTake;
RouteTo routeTo;
StreamController controller = new StreamController();
HandleEvent handler;
TakeAndRoute(this.shouldTake, {this.routeTo, this.handler}) {
if (routeTo != null) routeTo(controller.stream);
}
handleData(event, StreamSink sink) {
print("handling");
if (shouldTake(event)) {
if (routeTo != null) {
controller.add(event);
}
if (handler != null) {
handler(event);
}
} else {
sink.add(event);
}
}
}
main() {
HttpServer.bind('127.0.0.1', 8888)
.then((HttpServer server) {
server
.transform(new TakeAndRoute<HttpRequest, HttpRequest>(
(req) => req.uri.path == '/ws',
routeTo: (stream) => stream.transform(new WebSocketTransformer()).listen(handleWebSocket)))
.transform(new TakeAndRoute<HttpRequest, HttpRequest>(
(req) => req.uri.path == '/foo',
handler: (req) {
print('got foo');
req.response.addString("foo");
req.response.close();
}))
.listen((req) {
print("got 404 for ${req.uri}");
req.response.statusCode = 404;
req.response.close();
});
});
}
Phải thừa nhận rằng, đây có thể là quá mức cần thiết.
Nguồn
2013-02-27 07:18:08
Đó là những gì tôi đang tìm kiếm, cảm ơn! –