WIP
This commit is contained in:
@@ -1,12 +1,13 @@
|
|||||||
import { assertEquals } from "jsr:@std/assert";
|
import { assertEquals } from "jsr:@std/assert";
|
||||||
|
import { createSession } from "#/server/handler.ts";
|
||||||
import handler from "./handler.ts";
|
import handler from "./handler.ts";
|
||||||
import { close, connect, flush, href, setup } from "./testSetup.ts";
|
import { close, connect, flush, href, setup } from "./testSetup.ts";
|
||||||
|
|
||||||
Deno.test(
|
Deno.test(
|
||||||
"test",
|
"test",
|
||||||
setup(async () => {
|
setup(async () => {
|
||||||
const t1 = "123-abc";
|
const sessionId = createSession();
|
||||||
const [s1, m1] = await connect(`${href}?ticket=${t1}`);
|
const [s1, m1] = await connect(`${href}?sessionId=${sessionId}`);
|
||||||
await flush();
|
await flush();
|
||||||
assertEquals(m1, []);
|
assertEquals(m1, []);
|
||||||
await close(s1);
|
await close(s1);
|
||||||
|
|||||||
+55
-23
@@ -2,14 +2,12 @@ import { STATUS_CODE, STATUS_TEXT, type StatusCode } from "jsr:@std/http";
|
|||||||
|
|
||||||
const ALLOWED_ORIGIN = "http://0.0.0.0:8042";
|
const ALLOWED_ORIGIN = "http://0.0.0.0:8042";
|
||||||
|
|
||||||
const sessions = new Map<string, WebSocket>();
|
type Session = {
|
||||||
|
id: string;
|
||||||
function createSession(socket: WebSocket): string {
|
connId: number;
|
||||||
const session = crypto.randomUUID();
|
createdAt: number;
|
||||||
sessions.set(session, socket);
|
lastSeenAt: number;
|
||||||
|
};
|
||||||
return session;
|
|
||||||
}
|
|
||||||
|
|
||||||
function createResponse(
|
function createResponse(
|
||||||
status: StatusCode,
|
status: StatusCode,
|
||||||
@@ -18,32 +16,66 @@ function createResponse(
|
|||||||
return new Response(body, { status, statusText: STATUS_TEXT[status] });
|
return new Response(body, { status, statusText: STATUS_TEXT[status] });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const sessions = new Map<string, Session>();
|
||||||
|
const connections = new Map<number, WebSocket>();
|
||||||
|
|
||||||
|
export function createSession(): string {
|
||||||
|
const id = crypto.randomUUID();
|
||||||
|
const now = Date.now();
|
||||||
|
sessions.set(id, {
|
||||||
|
id,
|
||||||
|
connId: 0,
|
||||||
|
createdAt: now,
|
||||||
|
lastSeenAt: 0,
|
||||||
|
});
|
||||||
|
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
let currentId = 1;
|
||||||
|
const nextId = (): number => {
|
||||||
|
return currentId++;
|
||||||
|
};
|
||||||
|
|
||||||
|
const connectSession = (session: Session, request: Request): Response => {
|
||||||
|
const { response, socket } = Deno.upgradeWebSocket(request);
|
||||||
|
const connId = nextId();
|
||||||
|
|
||||||
|
socket.onopen = () => {
|
||||||
|
session.lastSeenAt = Date.now();
|
||||||
|
session.connId = connId;
|
||||||
|
connections.set(connId, socket);
|
||||||
|
};
|
||||||
|
socket.onclose = () => {
|
||||||
|
session.lastSeenAt = Date.now();
|
||||||
|
connections.delete(connId);
|
||||||
|
};
|
||||||
|
socket.onmessage = () => {
|
||||||
|
session.lastSeenAt = Date.now();
|
||||||
|
};
|
||||||
|
socket.onerror = (e) => {
|
||||||
|
session.lastSeenAt = Date.now();
|
||||||
|
console.error(e);
|
||||||
|
};
|
||||||
|
|
||||||
|
return response;
|
||||||
|
};
|
||||||
|
|
||||||
export default function (request: Request): Response {
|
export default function (request: Request): Response {
|
||||||
if (request.headers.get("upgrade")?.toLowerCase() !== "websocket") {
|
if (request.headers.get("upgrade")?.toLowerCase() !== "websocket") {
|
||||||
return createResponse(STATUS_CODE.UpgradeRequired);
|
return createResponse(STATUS_CODE.UpgradeRequired);
|
||||||
}
|
}
|
||||||
|
|
||||||
const url = new URL(request.url);
|
const url = new URL(request.url);
|
||||||
if (url.origin !== ALLOWED_ORIGIN) {
|
const sessionId = url.searchParams.get("sessionId");
|
||||||
|
if (url.origin !== ALLOWED_ORIGIN || sessionId === null) {
|
||||||
return createResponse(STATUS_CODE.BadRequest);
|
return createResponse(STATUS_CODE.BadRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
const sessionId = url.searchParams.get("sessionId");
|
|
||||||
|
|
||||||
if (sessionId === null) {
|
|
||||||
const upgrade = Deno.upgradeWebSocket(request);
|
|
||||||
createSession(upgrade.socket);
|
|
||||||
|
|
||||||
return upgrade.response;
|
|
||||||
} else {
|
|
||||||
const session = sessions.get(sessionId);
|
const session = sessions.get(sessionId);
|
||||||
if (session === null) {
|
if (session === undefined) {
|
||||||
return createResponse(STATUS_CODE.Unauthorized);
|
return createResponse(STATUS_CODE.Unauthorized);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO
|
return connectSession(session, request);
|
||||||
// I need a new socket every time
|
|
||||||
}
|
|
||||||
|
|
||||||
return createResponse(STATUS_CODE.InternalServerError);
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user