Skip to content

Commit 45a7d14

Browse files
authored
Merge pull request #3434 from JdeRobot/improve-ram-connection
Reduce number of failed connections with Robotics Backend
2 parents 272431d + 8ad722d commit 45a7d14

6 files changed

Lines changed: 57 additions & 36 deletions

File tree

react_frontend/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"name": "react_frontend",
3-
"version": "1.0.0",
3+
"version": "6.1.0",
44
"description": "React frontend for Robotics Academy",
5-
"main": "index.js",
5+
"main": "src/index.tsx",
66
"author": "Javier Izquierdo <javizqh@pm.me>",
7-
"license": "MIT",
7+
"license": "GPL-3.0-only",
88
"scripts": {
99
"dev": "webpack --mode development --output-path ./static/react_frontend --watch",
1010
"build": "webpack --mode production --output-path ./static/react_frontend",
@@ -62,7 +62,7 @@
6262
"@types/styled-components": "^5.1.34",
6363
"axios": "^1.12.0",
6464
"glob": "^8.0.3",
65-
"jderobot-commsmanager": "1.0.16",
65+
"jderobot-commsmanager": "1.0.24",
6666
"jderobot-ide-interface": "0.2.137",
6767
"jszip": "^3.10.1",
6868
"react-router-dom": "^7.12.0",

react_frontend/src/components/buttons/PlayPause.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,7 @@ const PlayPauseButton = ({
3737
const entrypointRef = useRef<Entry | undefined>(undefined);
3838
const runningFilesRef = useRef<Entry[]>([]);
3939
const runningEntrypointRef = useRef<Entry | undefined>(undefined);
40-
const [state, setState] = useState<string>(
41-
CommsManager.getInstance().getState()
42-
);
40+
const [state, setState] = useState<string>(states.IDLE);
4341
const [loading, setLoading] = useState<boolean>(false);
4442
const isCodeUpdatedRef = useRef<boolean | undefined>(undefined);
4543
const [, _updateCode] = useState<boolean | undefined>(false);

react_frontend/src/components/exercise/WebGUIContainer.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ export const connectApplication = (
4444
resizeRef?: MutableRefObject<HTMLImageElement | null>,
4545
resizeObserver?: ResizeObserver
4646
) => {
47-
const ref = useRef<NodeJS.Timer>();
47+
const intRef = useRef<number | null>(null);
4848

4949
const onStateChange = (message: ManagerMsg) => {
5050
const state = message.data.state as string;
@@ -95,19 +95,20 @@ export const connectApplication = (
9595
return;
9696
}
9797

98-
ref.current = setInterval(() => {
98+
const timer = window.setInterval(async () => {
9999
try {
100-
manager.send("gui", "start");
100+
await manager.send("gui", "start");
101101
} catch {
102-
end();
102+
window.clearInterval(timer);
103103
}
104104
}, 1000);
105+
intRef.current = timer;
105106
};
106107

107108
const end = () => {
108-
if (ref.current !== undefined) {
109-
clearInterval(ref.current);
110-
ref.current = undefined;
109+
if (intRef.current !== null) {
110+
window.clearInterval(intRef.current);
111+
intRef.current = null;
111112
}
112113
};
113114
};

react_frontend/src/components/layouts/ExerciseContainer.tsx

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
import Frequencies from "Components/statusBar/Frequencies";
2020
import { StyledExerciseContainer } from "Styles/layouts/ExerciseContainer.styles";
2121
import { getHalGuiMethods } from "Helpers/editor";
22-
import { subscribe, unsubscribe } from "Helpers/utils";
22+
import { clearTimeouts, subscribe, unsubscribe } from "Helpers/utils";
2323
import { fileExplorer } from "Helpers/explorer";
2424
import getTools from "Helpers/tools";
2525

@@ -47,6 +47,9 @@ const ExerciseContainer = ({
4747
multiLanguage: boolean;
4848
children: JSX.Element;
4949
}) => {
50+
const hasTriedToConnect = useRef(false);
51+
const timeoutRef = useRef<number | null>(null);
52+
const connectTimeoutRef = useRef<number | null>(null);
5053
const [manager, setManager] = useState<CommsManager | null>(null);
5154
const [universes, setUniverses] = useState<string[] | undefined>(undefined);
5255
const toolsList = getTools(manager, tools, children);
@@ -63,9 +66,6 @@ const ExerciseContainer = ({
6366
setUniverses(list);
6467
};
6568

66-
// RB manager setup
67-
const connected = useRef<boolean>(false);
68-
6969
const resetUniverse = (e: unknown) => {
7070
const T = CustomEvent<{ detail: unknown }>;
7171
if (e instanceof T) {
@@ -76,49 +76,60 @@ const ExerciseContainer = ({
7676
};
7777

7878
useEffect(() => {
79-
const manager = CommsManager.getInstance();
80-
setManager(manager);
8179
subscribe("CommsManagerStateChange", resetUniverse);
8280

8381
return () => {
8482
unsubscribe("CommsManagerStateChange", () => {});
85-
const currManager = CommsManager.getInstance();
86-
if (currManager) {
87-
currManager.disconnect();
83+
84+
if (hasTriedToConnect.current) {
85+
const currManager = CommsManager.getInstance();
86+
if (currManager) {
87+
currManager.disconnect();
88+
CommsManager.deleteInstance();
89+
setManager(null);
90+
}
8891
}
92+
93+
clearTimeouts([timeoutRef, connectTimeoutRef]);
8994
};
9095
}, []);
9196

9297
const connectWithRetry = async (
9398
desiredState?: string,
9499
callback?: () => void
95100
) => {
96-
console.log(manager?.getState(), CommsManager.getInstance().getState());
97-
if (!manager || manager?.getState() != "idle") {
98-
return;
99-
}
100101
try {
101102
const currManager = CommsManager.getInstance();
102-
console.log(currManager);
103+
hasTriedToConnect.current = true;
103104
await currManager.connect();
104105
getUniverseList(project);
105106
console.log("Connected!", currManager.getState());
106-
connected.current = true;
107107
setManager(currManager);
108108
if (callback) {
109109
waitManagerState(desiredState ? desiredState : "connected", callback);
110110
}
111111
} catch {
112112
console.log("Connection failed, trying again!");
113-
setTimeout(connectWithRetry, 2000, desiredState, callback);
113+
timeoutRef.current = window.setTimeout(
114+
connectWithRetry,
115+
2000,
116+
desiredState,
117+
callback
118+
);
114119
}
115120
};
116121

117122
const waitManagerState = async (state: string, callback: () => void) => {
118-
if (manager?.getState() === state) {
123+
const currManager = CommsManager.getInstance();
124+
if (currManager?.getState() === state) {
119125
callback();
120126
} else {
121-
return setTimeout(waitManagerState, 100, state, callback);
127+
connectTimeoutRef.current = window.setTimeout(
128+
waitManagerState,
129+
100,
130+
state,
131+
callback
132+
);
122133
}
123134
};
124135

react_frontend/src/helpers/utils.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { getFile, getHelperFile } from "Api";
22
import { Entry } from "jderobot-ide-interface";
33
import JSZip from "jszip";
4+
import { MutableRefObject } from "react";
45

56
export const saveCode = (
67
fileName: string,
@@ -142,3 +143,13 @@ const zipCodeFolder = async (zip: JSZip, file: Entry, project: string) => {
142143
}
143144
}
144145
};
146+
147+
export const clearTimeouts = (
148+
timeoutsRef: MutableRefObject<number | null>[]
149+
) => {
150+
for (const element of timeoutsRef) {
151+
if (element.current) {
152+
window.clearTimeout(element.current);
153+
}
154+
}
155+
};

react_frontend/yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3998,10 +3998,10 @@ jackspeak@^3.1.2:
39983998
optionalDependencies:
39993999
"@pkgjs/parseargs" "^0.11.0"
40004000

4001-
jderobot-commsmanager@1.0.16:
4002-
version "1.0.16"
4003-
resolved "https://registry.npmjs.org/jderobot-commsmanager/-/jderobot-commsmanager-1.0.16.tgz"
4004-
integrity sha512-rEMr1DRqcexrtvyzNvLsWW4+DOVj+V8l4eI8HP7IAWc25NbK+OtexXJZ1Fk+v+WSdffE8n0J0k17rIryzFEm3w==
4001+
jderobot-commsmanager@1.0.24:
4002+
version "1.0.24"
4003+
resolved "https://registry.yarnpkg.com/jderobot-commsmanager/-/jderobot-commsmanager-1.0.24.tgz#b6e7a0ff0e886ee051c4693ccfd0de54b8eca72e"
4004+
integrity sha512-mbdgWG+O6cWPxQs16jdTbVjHQ65/lANJyVCEgzr1FZKi9bHPNrJFjGQW0qqVksIzuVwr4+zmg2PCFcTIAe2seQ==
40054005
dependencies:
40064006
uuid "^11.1.0"
40074007

0 commit comments

Comments
 (0)