Skip to content
Snippets Groups Projects
Commit 084da62c authored by Sebastian Mohr's avatar Sebastian Mohr
Browse files

Disconnect worker on unmount of workerContext otherwise socket connection

is retained on page switch.
parent 7de0a027
No related branches found
No related tags found
No related merge requests found
Pipeline #482494 passed
...@@ -10,6 +10,7 @@ build ...@@ -10,6 +10,7 @@ build
.gitignore .gitignore
.pnpm-store .pnpm-store
.gitlab .gitlab
.gitlab-ci-local
.vscode .vscode
node_modules node_modules
......
FROM node:20-bookworm as base FROM node:21-bookworm as base
ENV PNPM_HOME="/pnpm" ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH" ENV PATH="$PNPM_HOME:$PATH"
......
"use client"; "use client";
import { createContext, useContext, useEffect, useState } from "react"; import { createContext, useContext, useEffect, useRef, useState } from "react";
import { useSocketContext } from "../useSocketContext"; import { useSocketContext } from "../useSocketContext";
...@@ -34,40 +34,69 @@ export function WorkerContextProvider({ ...@@ -34,40 +34,69 @@ export function WorkerContextProvider({
/* Scaling and create the workers dynamically */ /* Scaling and create the workers dynamically */
useEffect(() => { useEffect(() => {
let w = worker; setWorker((w) => {
let o = overlayWorker; //Scale up
if (w.size < n) {
//Scale up for (let i = w.size; i < n; i++) {
if (w.size < n) { w.set(w.size, new PageWorker());
for (let i = w.size; i < n; i++) { }
w.set(w.size, new PageWorker()); return new Map(w);
o.set(o.size, new OverlayWorker(socket)); }
//Scale down
else if (w.size > n) {
for (let i = w.size - 1; i >= n; i--) {
const worker = w.get(i);
if (worker) {
worker.terminate().then(() => {
w.delete(i);
});
}
}
return new Map(w);
} }
w = new Map(w); return w;
o = new Map(o); });
setWorker(w);
setOverlayWorker(o);
}
//Scale down setOverlayWorker((o) => {
if (w.size > n) { if (o.size < n) {
for (let i = w.size - 1; i >= n; i--) { for (let i = o.size; i < n; i++) {
w.get(i) o.set(o.size, new OverlayWorker(socket));
.terminate() }
.then(() => { return new Map(o);
w.delete(i); } else if (o.size > n) {
}); for (let i = o.size - 1; i >= n; i--) {
o.get(i).terminate(); const worker = o.get(i);
o.delete(i); if (worker) {
worker.terminate();
o.delete(i);
}
}
return new Map(o);
} }
return o;
});
}, [n, socket]);
w = new Map(w); useEffect(() => {
o = new Map(o); setWorker((p) => p);
setWorker(w); setOverlayWorker((o) => o);
setOverlayWorker(o); return () => {
} setWorker((w) => {
console.log("WorkerContextProvider", w.size, o.size); w.forEach((worker, i) => {
}, [n, overlayWorker, socket, worker]); worker.terminate();
w.delete(i);
});
return new Map();
});
setOverlayWorker((o) => {
o.forEach((worker, i) => {
worker.terminate();
o.delete(i);
});
return new Map();
});
};
}, []);
return ( return (
<WorkerContext.Provider value={{ worker, overlayWorker }}> <WorkerContext.Provider value={{ worker, overlayWorker }}>
......
...@@ -169,7 +169,8 @@ export function PlacementContextProvider({ children }: ToolContextProps) { ...@@ -169,7 +169,8 @@ export function PlacementContextProvider({ children }: ToolContextProps) {
const posDB = useMemo(() => { const posDB = useMemo(() => {
const wrapper = pageWrappersRef.current?.get(0); const wrapper = pageWrappersRef.current?.get(0);
if (!wrapper) return [NaN, NaN] as [number, number]; if (!wrapper || !currentOverlayWorker)
return [NaN, NaN] as [number, number];
const pageDiv = wrapper.children[0] as HTMLDivElement; const pageDiv = wrapper.children[0] as HTMLDivElement;
const xy = currentOverlayWorker.canvasCoords_2_dbCoords([ const xy = currentOverlayWorker.canvasCoords_2_dbCoords([
overlayRect.x - pageDiv.offsetLeft, overlayRect.x - pageDiv.offsetLeft,
......
...@@ -22,9 +22,9 @@ const debug = (...args: unknown[]) => { ...@@ -22,9 +22,9 @@ const debug = (...args: unknown[]) => {
}; };
export class OverlayWorker extends RenderWorker { export class OverlayWorker extends RenderWorker {
private ctx: CanvasRenderingContext2D; private ctx?: CanvasRenderingContext2D;
private stack = new Set<(ctx: CanvasRenderingContext2D) => void>(); private stack = new Set<(ctx: CanvasRenderingContext2D) => void>();
private socket: Socket; private socket?: Socket;
// Canvas size in db coordinates // Canvas size in db coordinates
private max: [number, number] = [1400, 2000]; private max: [number, number] = [1400, 2000];
...@@ -154,7 +154,7 @@ export class OverlayWorker extends RenderWorker { ...@@ -154,7 +154,7 @@ export class OverlayWorker extends RenderWorker {
}; };
public terminate() { public terminate() {
this.ctx.clearRect(0, 0, 1400, 2000); this.ctx?.clearRect(0, 0, 1400, 2000);
debug("Terminated"); debug("Terminated");
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment