From 34f44cb5d5d6316009f242d27d2f3d69f4d5b90e Mon Sep 17 00:00:00 2001 From: Brian Picciano Date: Thu, 2 Sep 2021 17:02:20 -0600 Subject: implementation of basic chat page which can show history and not much else --- static/src/assets/api.js | 52 +++++++++++++++++-- static/src/chat.md | 126 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+), 3 deletions(-) create mode 100644 static/src/chat.md (limited to 'static/src') diff --git a/static/src/assets/api.js b/static/src/assets/api.js index 7ce2e89..4447bb1 100644 --- a/static/src/assets/api.js +++ b/static/src/assets/api.js @@ -1,5 +1,7 @@ import * as utils from "/assets/utils.js"; +const csrfTokenCookie = "csrf_token"; + const doFetch = async (req) => { let res, jsonRes; try { @@ -53,13 +55,13 @@ const call = async (route, opts = {}) => { requiresPow = false, } = opts; - if (!utils.cookies["csrf_token"]) - throw "csrf_token cookie not set, can't make api call"; + if (!utils.cookies[csrfTokenCookie]) + throw `${csrfTokenCookie} cookie not set, can't make api call`; const reqOpts = { method, headers: { - "X-CSRF-Token": utils.cookies["csrf_token"], + "X-CSRF-Token": utils.cookies[csrfTokenCookie], }, }; @@ -80,6 +82,50 @@ const call = async (route, opts = {}) => { return doFetch(req); } +const ws = async (route, opts = {}) => { + const { + requiresPow = false, + } = opts; + + const docURL = new URL(document.URL); + const protocol = docURL.protocol == "http:" ? "ws:" : "wss:"; + + const params = new URLSearchParams(); + const csrfToken = utils.cookies[csrfTokenCookie]; + + if (!csrfToken) + throw `${csrfTokenCookie} cookie not set, can't make api call`; + + params.set("csrfToken", csrfToken); + + if (requiresPow) { + const {seed, solution} = await solvePow(); + params.set("powSeed", seed); + params.set("powSolution", solution); + } + + const rawConn = new WebSocket(`${protocol}//${docURL.host}${route}?${params.toString()}`); + + const conn = { + next: () => new Promise((resolve, reject) => { + rawConn.onmessage = (m) => { + const mj = JSON.parse(m.data); + resolve(mj); + }; + rawConn.onerror = reject; + rawConn.onclose = reject; + }), + + close: rawConn.close, + }; + + return new Promise((resolve, reject) => { + rawConn.onopen = () => resolve(conn); + rawConn.onerror = reject; + }); +} + export { call, + ws } diff --git a/static/src/chat.md b/static/src/chat.md new file mode 100644 index 0000000..c7471ef --- /dev/null +++ b/static/src/chat.md @@ -0,0 +1,126 @@ +--- +layout: page +--- + + + + + +
+ + + + -- cgit v1.2.3