diff options
author | EuAndreh <eu@euandre.org> | 2024-03-15 13:19:17 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2024-03-15 13:19:17 -0300 |
commit | 3c61a91f4bdf2b5cb5f195bc668ebd47fce66fc3 (patch) | |
tree | 00336363c9f4e285a2d3a8eb18a1f2d3200bb9fc | |
parent | src/hero.mjs: Add handlerForConnection() (diff) | |
download | papod-3c61a91f4bdf2b5cb5f195bc668ebd47fce66fc3.tar.gz papod-3c61a91f4bdf2b5cb5f195bc668ebd47fce66fc3.tar.xz |
src/hero.mjs: Add makeUpgradeListener()
-rw-r--r-- | src/hero.mjs | 20 | ||||
-rw-r--r-- | tests/js/hero.mjs | 60 |
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, |