Add some web socket goodness.
This commit is contained in:
parent
04d90b7c7a
commit
74b370f19b
4 changed files with 73 additions and 5 deletions
36
source/app.d
36
source/app.d
|
|
@ -19,10 +19,21 @@ import vibe.d;
|
|||
|
||||
final class Room {
|
||||
string[] messages;
|
||||
ManualEvent messageEvent;
|
||||
|
||||
this() {
|
||||
messageEvent = createManualEvent();
|
||||
}
|
||||
|
||||
void addMessage(string nick, string message) {
|
||||
messages ~= nick ~ ": " ~ message;
|
||||
}
|
||||
|
||||
void waitForMessage(size_t next_message) {
|
||||
while (messages.length <= next_message) {
|
||||
messageEvent.wait();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final class WebChat {
|
||||
|
|
@ -51,6 +62,29 @@ final class WebChat {
|
|||
redirect("room?room=" ~ room.urlEncode ~ "&nick=" ~ nick.urlEncode);
|
||||
}
|
||||
|
||||
// /ws?room=...&nick=...
|
||||
void getWS(string room, string nick, scope WebSocket socket) {
|
||||
auto r = getOrCreateRoom(room);
|
||||
auto writer = runTask({
|
||||
auto next_message = r.messages.length;
|
||||
while (socket.connected) {
|
||||
while (next_message < r.messages.length) {
|
||||
socket.send(r.messages[next_message++]);
|
||||
}
|
||||
r.waitForMessage(next_message);
|
||||
}
|
||||
});
|
||||
|
||||
while (socket.waitForData) {
|
||||
auto message = socket.receiveText();
|
||||
if (message.length) {
|
||||
r.addMessage(nick, message);
|
||||
}
|
||||
}
|
||||
|
||||
writer.join();
|
||||
}
|
||||
|
||||
private Room getOrCreateRoom(string room) {
|
||||
if (auto pr = room in rooms) return *pr;
|
||||
return rooms[room] = new Room;
|
||||
|
|
@ -67,7 +101,7 @@ shared static this()
|
|||
|
||||
auto settings = new HTTPServerSettings;
|
||||
settings.port = 8083;
|
||||
settings.bindAddresses = ["::1", "127.0.0.1"];
|
||||
// settings.bindAddresses = ["::", "0.0.0.0"];
|
||||
listenHTTP(settings, router);
|
||||
|
||||
logInfo("Please open http://127.0.0.1:%d/ in your browser.".format(settings.port));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue