Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 57e7254f8d | |||
| e379a86020 |
+7
-3
@@ -3,7 +3,11 @@
|
||||
{registered,[]},
|
||||
{included_applications,[]},
|
||||
{applications,[stdlib,kernel]},
|
||||
{vsn,"0.1.0"},
|
||||
{modules,[fd_client,fd_client_man,fd_client_sup,fd_clients,
|
||||
fd_sup,fewd]},
|
||||
{vsn,"0.2.0"},
|
||||
{modules,[fd_cache,fd_httpd,fd_httpd_client,fd_httpd_client_man,
|
||||
fd_httpd_client_sup,fd_httpd_clients,fd_httpd_sfc,
|
||||
fd_httpd_sfc_cache,fd_httpd_sfc_entry,fd_httpd_utils,
|
||||
fd_sup,fd_wsp,fewd,qhl,qhl_ws,wfc,wfc_bm,wfc_eval,
|
||||
wfc_eval_context,wfc_ltr,wfc_pp,wfc_read,wfc_sentence,
|
||||
wfc_sftt,wfc_ttfuns,wfc_utils,wfc_word,zj]},
|
||||
{mod,{fewd,[]}}]}.
|
||||
|
||||
@@ -1,106 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Chat with Websockets</title>
|
||||
<link rel="stylesheet" href="/css/default.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="titlebar">
|
||||
<div class="content">
|
||||
<a href="/" class="tb-home">Home</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content">
|
||||
<h1 class="content-title">Chat with websockets</h1>
|
||||
|
||||
<div class="content-body">
|
||||
<input autofocus label="Nick" id="nick"></input>
|
||||
<textarea hidden disabled id="wfc-output"></textarea>
|
||||
<input hidden id="wfc-input"></input>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let nelt = document.getElementById('nick');
|
||||
let ielt = document.getElementById('wfc-input');
|
||||
let oelt = document.getElementById('wfc-output');
|
||||
let ws = new WebSocket("/ws/chat");
|
||||
let nick = '';
|
||||
|
||||
// when user hits any key while typing in nick
|
||||
function on_nick(evt) {
|
||||
if (evt.key === 'Enter') {
|
||||
// don't do default thing
|
||||
evt.preventDefault();
|
||||
// grab contents
|
||||
let contents = nelt.value;
|
||||
let trimmed = contents.trim();
|
||||
// if contents are nonempty
|
||||
let nonempty_contents = trimmed.length > 0;
|
||||
if (nonempty_contents) {
|
||||
nick = trimmed;
|
||||
let msg_obj = ['nick', nick];
|
||||
let msg_str = JSON.stringify(msg_obj);
|
||||
console.log('message to server:', contents.trim());
|
||||
// query backend for result
|
||||
ws.send(msg_str);
|
||||
|
||||
// delete element from dom
|
||||
nelt.remove();
|
||||
oelt.hidden = false;
|
||||
ielt.hidden = false;
|
||||
ielt.autofocus = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// when user hits any key while typing in ielt
|
||||
function on_input_key(evt) {
|
||||
if (evt.key === 'Enter') {
|
||||
// don't do default thing
|
||||
evt.preventDefault();
|
||||
// grab contents
|
||||
let contents = ielt.value;
|
||||
let trimmed = contents.trim();
|
||||
// if contents are nonempty
|
||||
let nonempty_contents = trimmed.length > 0;
|
||||
if (nonempty_contents) {
|
||||
let msg_obj = ['chat', trimmed];
|
||||
let msg_str = JSON.stringify(msg_obj);
|
||||
console.log('message to server:', contents.trim());
|
||||
// query backend for result
|
||||
ws.send(msg_str);
|
||||
|
||||
// clear input
|
||||
ielt.value = '';
|
||||
|
||||
// add to output
|
||||
oelt.value += '> ';
|
||||
oelt.value += trimmed;
|
||||
oelt.value += '\n';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function main() {
|
||||
nelt.addEventListener('keydown', on_nick);
|
||||
ielt.addEventListener('keydown', on_input_key);
|
||||
ws.onmessage =
|
||||
function (msg_evt) {
|
||||
console.log('message from server:', msg_evt);
|
||||
let msg_str = msg_evt.data;
|
||||
let msg_obj = JSON.parse(msg_str);
|
||||
|
||||
oelt.value += msg_obj.nick;
|
||||
oelt.value += '> ';
|
||||
oelt.value += msg_obj.msg;
|
||||
oelt.value += '\n';
|
||||
};
|
||||
}
|
||||
|
||||
main();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -16,9 +16,7 @@
|
||||
<h1 class="content-title">FEWD: index</h1>
|
||||
|
||||
<ul>
|
||||
<li><a href="/chat.html">Chatroom</a></li>
|
||||
<li><a href="/echo.html">Echo</a></li>
|
||||
<li><a href="/tetris.html">Tetris</a></li>
|
||||
<li><a href="/wfc.html">WFC</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Tetris with Websockets</title>
|
||||
<link rel="stylesheet" href="/css/default.css">
|
||||
<link rel="stylesheet" href="/css/tetris.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="titlebar">
|
||||
<div class="content">
|
||||
<a href="/" class="tb-home">Home</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content">
|
||||
<h1 class="content-title">Tetris</h1>
|
||||
|
||||
<textarea id="tetris-state"></textarea>
|
||||
</div>
|
||||
|
||||
<script type="module" src="./js/dist/tetris.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,5 +1,6 @@
|
||||
% @doc storing map #{cookie := Context}
|
||||
-module(fd_cache).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-behavior(gen_server).
|
||||
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
-module(fd_httpd).
|
||||
-vsn("0.1.0").
|
||||
-vsn("0.2.0").
|
||||
-behaviour(supervisor).
|
||||
-author("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
-copyright("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(fd_httpd_client).
|
||||
-vsn("0.1.0").
|
||||
-vsn("0.2.0").
|
||||
-author("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
-copyright("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
-license("BSD-2-Clause-FreeBSD").
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(fd_httpd_client_man).
|
||||
-vsn("0.1.0").
|
||||
-vsn("0.2.0").
|
||||
-behavior(gen_server).
|
||||
-author("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
-copyright("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(fd_httpd_client_sup).
|
||||
-vsn("0.1.0").
|
||||
-vsn("0.2.0").
|
||||
-behaviour(supervisor).
|
||||
-author("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
-copyright("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(fd_httpd_clients).
|
||||
-vsn("0.1.0").
|
||||
-vsn("0.2.0").
|
||||
-behavior(supervisor).
|
||||
-author("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
-copyright("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
% @doc static file cache
|
||||
-module(fd_httpd_sfc).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-behavior(gen_server).
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
% @doc
|
||||
% cache data management
|
||||
-module(fd_httpd_sfc_cache).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
cache/0
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
%
|
||||
% this spams the filesystem, so it's not "pure" code
|
||||
-module(fd_httpd_sfc_entry).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
encoding/0,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
% @doc http utility functions
|
||||
-module(fd_httpd_utils).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export([
|
||||
new_cookie/0,
|
||||
@@ -113,6 +114,6 @@ add_headers(Hs, Body) ->
|
||||
|
||||
default_headers(Body) ->
|
||||
BodySize = byte_size(iolist_to_binary(Body)),
|
||||
#{"Server" => "fewd 0.1.0",
|
||||
#{"Server" => "fewd 0.2.0",
|
||||
"Date" => qhl:ridiculous_web_date(),
|
||||
"Content-Length" => io_lib:format("~p", [BodySize])}.
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(fd_sup).
|
||||
-vsn("0.1.0").
|
||||
-vsn("0.2.0").
|
||||
-behaviour(supervisor).
|
||||
-author("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
-copyright("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
%
|
||||
% for each websocket message it gets
|
||||
-module(fd_wsp).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-behavior(gen_server).
|
||||
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(fewd).
|
||||
-vsn("0.1.0").
|
||||
-vsn("0.2.0").
|
||||
-behavior(application).
|
||||
-author("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
-copyright("Peter Harpending <peterharpending@qpq.swiss>").
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
%
|
||||
% ref: https://datatracker.ietf.org/doc/html/rfc6455
|
||||
-module(qhl_ws).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
opcode/0,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
% @doc
|
||||
% porcelain wfc ops
|
||||
-module(wfc).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
sentence/0
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
% @doc
|
||||
% bit matrices
|
||||
-module(wfc_bm).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
bit/0,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
-module(wfc_eval).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
]).
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
-module(wfc_eval_context).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
context/0
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
%
|
||||
% mathematically, this is a variable like "a", "b", "c", etc
|
||||
-module(wfc_ltr).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
ltr/0
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
-module(wfc_pp).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export([
|
||||
eval_result/1,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
-module(wfc_read).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
]).
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
%
|
||||
% empty sentence is 0
|
||||
-module(wfc_sentence).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
sentence/0
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
% @doc
|
||||
% sentence-fun <-> truth table logic
|
||||
-module(wfc_sftt).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
sf/0, tt/0
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
% @doc
|
||||
% library of truth tables
|
||||
-module(wfc_ttfuns).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
bit/0,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
% @doc misc utility functions
|
||||
-module(wfc_utils).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export([err/2, str/2, emsg/2]).
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
%
|
||||
% operations assume all inputs are valid
|
||||
-module(wfc_word).
|
||||
-vsn("0.2.0").
|
||||
|
||||
-export_type([
|
||||
word/0
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
%%% @end
|
||||
|
||||
-module(zj).
|
||||
-vsn("1.1.2").
|
||||
-vsn("0.2.0").
|
||||
-author("Craig Everett <zxq9@zxq9.com>").
|
||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||
-license("MIT").
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{name,"front end web development lab"}.
|
||||
{type,app}.
|
||||
{modules,[]}.
|
||||
{author,"Peter Harpending"}.
|
||||
{prefix,"fd"}.
|
||||
{desc,"Front End Web Dev in Erlang stuff"}.
|
||||
{author,"Peter Harpending"}.
|
||||
{package_id,{"otpr","fewd",{0,1,0}}}.
|
||||
{package_id,{"otpr","fewd",{0,2,0}}}.
|
||||
{deps,[]}.
|
||||
{key_name,none}.
|
||||
{a_email,"peterharpending@qpq.swiss"}.
|
||||
|
||||
Reference in New Issue
Block a user