From a3042432f2fb387abadeaac75c40ff3af2cc7d3e Mon Sep 17 00:00:00 2001 From: nolan Date: Tue, 30 Sep 2025 19:30:27 -0400 Subject: [PATCH 1/4] Configured to add network delay and check message IDs --- client.py | 7 ++++++- server.py | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/client.py b/client.py index c9dcb9d..c009343 100644 --- a/client.py +++ b/client.py @@ -35,7 +35,12 @@ class TestClient: async def receive(self) -> None: while (self.connected): response: str = await self.connection.recv() + data: dict = json.loads(response) print(f"Received: {response}") - + print(f"CURRENT MESSAGE ID: {self.msgId} - RECEIVED MESSAGE ID: {data["ID"]}") + if (data["ID"] != self.msgId - 1): + print("MESSAGE DISCARDED\n") + else: + print("MESSAGE UP TO DATE. ACCEPTED\n") if __name__ == "__main__": client = TestClient() diff --git a/server.py b/server.py index 0463db8..8e2c822 100644 --- a/server.py +++ b/server.py @@ -1,5 +1,5 @@ from websockets import * -import asyncio, json, signal, sys +import asyncio, json, signal, sys, time, random class WebSocketServer: server: Server = None @@ -22,6 +22,7 @@ class WebSocketServer: raw: str = await connection.recv() message = json.loads(raw) print(f"Received: {message["message"]} width id {message["ID"]}") + time.sleep(random.randrange(1, 10) / 10) response = {"ID": message["ID"], "message": f"received: {message["message"]}"} await connection.send(json.dumps(response)) print("Server replied") -- 2.47.2 From 3d6ae21a7d85d46c2ec8db2f902cf68572e595dd Mon Sep 17 00:00:00 2001 From: nolan Date: Tue, 30 Sep 2025 22:49:43 -0400 Subject: [PATCH 2/4] Updated server to cancel the response task if a new request is submitted --- server.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/server.py b/server.py index 8e2c822..77fd28b 100644 --- a/server.py +++ b/server.py @@ -18,14 +18,19 @@ class WebSocketServer: async def handleConnection(self, connection: ServerConnection) -> None: #TODO: Make this actually do something print(f"{connection.remote_address} Connected") connected: bool = True + task: asyncio.Task = None while (connected): raw: str = await connection.recv() - message = json.loads(raw) - print(f"Received: {message["message"]} width id {message["ID"]}") - time.sleep(random.randrange(1, 10) / 10) - response = {"ID": message["ID"], "message": f"received: {message["message"]}"} - await connection.send(json.dumps(response)) - print("Server replied") + if task != None and task.cancel(): print("TASK CANCELED") + task = asyncio.create_task(self.respond(raw, connection)) + + async def respond(self, raw: str, connection: ServerConnection) -> None: + message = json.loads(raw) + print(f"Received: {message["message"]} width id {message["ID"]}") + await asyncio.sleep(random.randrange(1, 10) / 10) + response = {"ID": message["ID"], "message": f"received: {message["message"]}"} + await connection.send(json.dumps(response)) + print("Server replied") def serverController(self) -> None: #TODO: Make ways of actually controlling the server with this print("Server controller. Now die") -- 2.47.2 From 82999e37f8f561ef113dced39ee3c1578e45ec01 Mon Sep 17 00:00:00 2001 From: nc5432 Date: Tue, 7 Oct 2025 13:02:52 -0400 Subject: [PATCH 3/4] Got started on a worker process --- TimeWaster.py | 35 +++++++++++++++++++++++++++++++++++ server.py | 4 +++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 TimeWaster.py diff --git a/TimeWaster.py b/TimeWaster.py new file mode 100644 index 0000000..595bb64 --- /dev/null +++ b/TimeWaster.py @@ -0,0 +1,35 @@ +import time, uuid, signal, random, os + +class TimeWaster: + def __init__(self): + self.running = True + self.jobs: dict = {} + + def handleNewJob(self): + jobId: uuid.UUID = uuid.uuid4() + self.jobs[jobId] = "exists i guess" + + def handleCancelJob(self): + pass + + def quit(self): + self.running = False + + def main(self): + while self.running: + if len(self.jobs) == 0: + time.sleep(0.01) + else: + uuid = self.jobs.keys[0] + job = self.jobs[uuid] + time.sleep(random.randrange(1, 10) / 10) + result: JobResult = JobResult(uuid, "done i guess") + os.write(1, result) + +class JobResult: + def __init__(self, uuid, result) -> None: + self.uuid = uuid + self.result = result + +if __name__ == "__main__": + TimeWaster().main() diff --git a/server.py b/server.py index 77fd28b..21e3be4 100644 --- a/server.py +++ b/server.py @@ -1,5 +1,5 @@ from websockets import * -import asyncio, json, signal, sys, time, random +import asyncio, json, signal, sys, time, random, subprocess, os class WebSocketServer: server: Server = None @@ -17,6 +17,8 @@ class WebSocketServer: async def handleConnection(self, connection: ServerConnection) -> None: #TODO: Make this actually do something print(f"{connection.remote_address} Connected") + stdio: tuple(int, int) = os.pipe2() + worker: subprocess.Popen = subprocess.Popen(["python3", "TimeWaster.py"], stdin=stdio[0], stdout=stdio[1]) connected: bool = True task: asyncio.Task = None while (connected): -- 2.47.2 From 3f8f2fd26f64508b52e19cc3ed11d597b09376a2 Mon Sep 17 00:00:00 2001 From: nc5432 Date: Tue, 7 Oct 2025 18:32:13 -0400 Subject: [PATCH 4/4] Couple of changes --- TimeWaster.py | 26 ++++++++++++++++++-------- server.py | 2 ++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/TimeWaster.py b/TimeWaster.py index 595bb64..1a246d3 100644 --- a/TimeWaster.py +++ b/TimeWaster.py @@ -1,4 +1,10 @@ import time, uuid, signal, random, os +from enum import Enum + +class JobStatus(Enum): + QUEUED = 1 + FINISHED = 2 + ERRORED = 3 class TimeWaster: def __init__(self): @@ -6,8 +12,11 @@ class TimeWaster: self.jobs: dict = {} def handleNewJob(self): - jobId: uuid.UUID = uuid.uuid4() - self.jobs[jobId] = "exists i guess" + msg = os.read(0, 1024) + if (msg) == "job": + jobId: uuid.UUID = uuid.uuid4() + self.jobs[jobId] = JobResult(jobId, JobStatus.QUEUED, "exists I guess") + os.write(1, self.jobs[jobId]) def handleCancelJob(self): pass @@ -18,17 +27,18 @@ class TimeWaster: def main(self): while self.running: if len(self.jobs) == 0: - time.sleep(0.01) + self.handleNewJob() else: - uuid = self.jobs.keys[0] - job = self.jobs[uuid] + job: JobResult = self.jobs[self.jobs.keys[0]] time.sleep(random.randrange(1, 10) / 10) - result: JobResult = JobResult(uuid, "done i guess") - os.write(1, result) + job.status = JobStatus.FINISHED + job.result = "done i guess" + os.write(1, job) class JobResult: - def __init__(self, uuid, result) -> None: + def __init__(self, uuid: uuid.UUID, status: JobStatus, result) -> None: self.uuid = uuid + self.status = status self.result = result if __name__ == "__main__": diff --git a/server.py b/server.py index 21e3be4..31592e9 100644 --- a/server.py +++ b/server.py @@ -1,4 +1,5 @@ from websockets import * +from TimeWaster import * import asyncio, json, signal, sys, time, random, subprocess, os class WebSocketServer: @@ -23,6 +24,7 @@ class WebSocketServer: task: asyncio.Task = None while (connected): raw: str = await connection.recv() + os.write(stdio[1], bytes("job")) if task != None and task.cancel(): print("TASK CANCELED") task = asyncio.create_task(self.respond(raw, connection)) -- 2.47.2