String clean_chat_field(String raw, u32 max_length)
{
String value = trim(raw);
value = replace(value, "\r", " ");
value = replace(value, "\n", " ");
if(value.length() > max_length)
value.resize(max_length);
return(value);
}
DValue chat_event(Request& context, String type, String body)
{
DValue event;
event["type"] = type;
event["body"] = body;
event["connection_id"] = context.params["WS_CONNECTION_ID"];
event["scope"] = first(context.params["WS_DOCUMENT_URI"], context.params["DOCUMENT_URI"]);
event["online"] = float_val(first(context.params["WS_CONNECTION_COUNT"], "0"));
event["at"] = time_format_utc("%H:%M:%S");
event["name"] = context.connection["name"].to_string();
event["message_count"] = context.connection["message_count"];
return(event);
}
RENDER(Request& context)
{
String ws_url = context.params["DOCUMENT_URI"];
u64 online = ws_connection_count();
<>
Page scope: = ws_url ?>
Connected right now: = online ?>
Status: Connecting...
This demo uses context.in for the current payload, context.params["WS_..."] for message metadata, and context.connection for per-client state.
>
}
WS(Request& context)
{
if(ws_is_binary())
{
ws_send_to(
context.params["WS_CONNECTION_ID"],
json_encode(chat_event(context, "notice", "Binary messages are not handled by this demo"))
);
return;
}
DValue payload = json_decode(context.in);
String type = clean_chat_field(payload["type"].to_string(), 24);
String name = clean_chat_field(payload["name"].to_string(), 32);
String body = clean_chat_field(payload["body"].to_string(), 500);
u64 message_count = int_val(context.connection["message_count"].to_string());
if(name == "")
name = first(context.connection["name"].to_string(), "guest");
context.connection["name"] = name;
if(type == "join")
{
context.connection["joined_at"] = time_format_utc("%Y-%m-%d %H:%M:%S");
context.connection["last_type"] = type;
ws_send(json_encode(chat_event(context, "join", name + " joined the room")));
return;
}
if(type == "message" && body != "")
{
context.connection["last_type"] = type;
context.connection["last_body"] = body;
context.connection["message_count"] = (f64)(message_count + 1);
DValue event = chat_event(context, "message", body);
ws_send(json_encode(event));
return;
}
if(type != "")
{
context.connection["last_type"] = type;
ws_send_to(context.params["WS_CONNECTION_ID"], json_encode(chat_event(context, "notice", "Unknown message type: " + type)));
}
}