यहाँ कैसे API docs एक WebSocket हैंडलर रजिस्टर करने के लिए सलाह देते हैं है:
server
.where((request) => request.uri.path == "/ws")
.transform(new WebSocketTransformer()).listen((webSocket) => ...);
हालांकि, सर्वर एक एकल सदस्यता धारा है। एक बार listen
संलग्न हो जाने पर, आप अन्य श्रोताओं को संलग्न नहीं कर सकते हैं।
जो कुछ मैं वास्तव में चाहता हूं वह किसी ईवेंट को देखने के लिए है, यह तय करें कि यह इसे संभाल सकता है, और यदि ऐसा है तो इसे किसी अन्य स्ट्रीम पर रूट करें। अन्यथा, इसे साथ पास करें। इस तरह, घटना (इस मामले में एक HttpRequest ऑब्जेक्ट) एक श्रृंखला के साथ पारित होने तक पारित किया जाता है।
मैंने TakeAndRoute
कक्षा बनाई जो StreamEventTransformer
फैली हुई है। TakeAndRoute
यह निर्धारित करने के लिए एक फ़ंक्शन का उपयोग करता है कि क्या इसे ईवेंट को पकड़ना चाहिए और उसे किसी अन्य स्ट्रीम पर रूट करना चाहिए, या बस इसे आगे बढ़ाएं।
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();
});
});
}
वैसे, यह overkill हो सकता है:
यहाँ मैं के साथ आया है। मार्ग पैकेज का उपयोग करें: कैसे मैं एक StreamController बनाने के लिए तो मैं WebSocketTransformer
करने के लिए घटनाओं पंप सकता
स्रोत
2013-02-27 07:18:08
है कि मैं के लिए, धन्यवाद क्या देख रहा था! –