summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2024-03-15 13:19:17 -0300
committerEuAndreh <eu@euandre.org>2024-03-15 13:19:17 -0300
commit3c61a91f4bdf2b5cb5f195bc668ebd47fce66fc3 (patch)
tree00336363c9f4e285a2d3a8eb18a1f2d3200bb9fc
parentsrc/hero.mjs: Add handlerForConnection() (diff)
downloadpapod-3c61a91f4bdf2b5cb5f195bc668ebd47fce66fc3.tar.gz
papod-3c61a91f4bdf2b5cb5f195bc668ebd47fce66fc3.tar.xz
src/hero.mjs: Add makeUpgradeListener()
-rw-r--r--src/hero.mjs20
-rw-r--r--tests/js/hero.mjs60
2 files changed, 80 insertions, 0 deletions
diff --git a/src/hero.mjs b/src/hero.mjs
index 61621af..4634e70 100644
--- a/src/hero.mjs
+++ b/src/hero.mjs
@@ -325,6 +325,26 @@ export const handlerForConnection = (table, method, path) => {
return handlerFn || fallback404Handler;
};
+export const makeUpgradeListener = table => async (req, socket, _head) => {
+ const { method, url, headers } = req;
+ const [ path, queryParams ] = url.split("?");
+ const handlerFn = handlerForConnection(table, method, path);
+
+ const request = {
+ params: {
+ path: {},
+ query: extractQueryParams(queryParams),
+ },
+ method,
+ path,
+ headers,
+ handler: handlerFn,
+ ref: req,
+ };
+
+ return await handlerFn(request, socket);
+};
+
export const makeRequestListener = table => async (req, res) => {
const { status, headers, body } = await handleRequest(table, req);
res.writeHead(status, headers);
diff --git a/tests/js/hero.mjs b/tests/js/hero.mjs
index 436535a..0c04db8 100644
--- a/tests/js/hero.mjs
+++ b/tests/js/hero.mjs
@@ -36,6 +36,7 @@ import {
fallback404Handler,
fallback405Handler,
handlerForConnection,
+ makeUpgradeListener,
makeRequestListener,
actionsFn,
lineHandlerFn,
@@ -1256,6 +1257,64 @@ export const test_handlerForConnection = async t => {
});
};
+const test_makeUpgradeListener = async t => {
+ t.start("makeUpgradeListener()");
+
+ await t.test("straightforward connection stablishing", async () => {
+ const calls = [];
+ const fn = (_req, socket) => calls.push(socket);
+ const routes = [[ "WEBSOCKET", "/sock", fn ]];
+ const table = buildRoutes(routes);
+ const upgradeListener = makeUpgradeListener(table);
+
+ const req = {
+ method: "GET",
+ url: "/sock",
+ };
+ const socket = "the socket"
+ await upgradeListener(req, socket);
+ assert.deepEqual(calls, ["the socket"]);
+ });
+
+ await t.test("early termination cases", async () => {
+ const calls = [];
+ const fn = (req, socket) => calls.push(socket);
+ const routes = [[ "WEBSOCKET", "/another", fn ]];
+ const table = buildRoutes(routes);
+ const upgradeListener = makeUpgradeListener(table);
+
+ const req405 = {
+ method: "PUT",
+ url: "/unused",
+ };
+ let destroyed405 = false
+ const socket405 = {
+ end: s => {
+ assert.equal(s, buildHttpPayload(405));
+ return socket405;
+ },
+ destroySoon: () => destroyed405 = true,
+ };
+ await upgradeListener(req405, socket405);
+ assert.ok(destroyed405);
+
+ const req404 = {
+ method: "GET",
+ url: "/bad/path",
+ };
+ let destroyed404 = false;
+ const socket404 = {
+ end: s => {
+ assert.equal(s, buildHttpPayload(404));
+ return socket404;
+ },
+ destroySoon: () => destroyed404 = true,
+ };
+ await upgradeListener(req404, socket404);
+ assert.ok(destroyed404);
+ });
+};
+
const test_makeRequestListener = async t => {
t.start("makeRequestListener()");
@@ -1951,6 +2010,7 @@ await runner.runTests([
test_emitHeaders,
test_buildHttpPayload,
test_handlerForConnection,
+ test_makeUpgradeListener,
test_makeRequestListener,
test_actionsFn,
test_lineHandlerFn,