Skip to content

Commit 463090a

Browse files
Websocket connection improvements. Should always reconnect on errors now.
1 parent 69acaba commit 463090a

File tree

3 files changed

+40
-141
lines changed

3 files changed

+40
-141
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ All notable changes to this project will be documented in this file.
7070
- History page now displays an image slider when loading the "edit/view" box. You can cycle through the thumbnails from your slicer if you use that plugin, or the captured image of the finished print taken from your webcam.
7171
- Added the option for websockets to follow 301 redirects. Should help with 301 errors.
7272
- Camera view now opens overlay with fullscreen.
73+
- Tweaks have been made to the websocket connection system. Should better recover from errors and state if user action required.
7374

7475
### Fixed
7576
- Fixed issue with File Manager not loading if printer in index 0 was offline.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "octofarm",
3-
"version": "1.1.6-dev14",
3+
"version": "1.1.6-dev15",
44
"description": "OctoFarm is a easy to setup and install web interface that unifies your Octoprint instances for easy monitoring of all your printers. OctoFarm allows you to connect to multiple octoprint instances on your network allowing creating a farm management system. You can control, manage, upload files to any of your instances without ever leaving the tab it's open in.",
55
"main": "app.js",
66
"scripts": {

server_src/runners/state.js

Lines changed: 38 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -166,18 +166,7 @@ WebSocketClient.prototype.open = function (url, index) {
166166
logger.info(
167167
`Cannot re-open web socket... : ${this.index}: ${this.url}`
168168
);
169-
PrinterTicker.addIssue(
170-
new Date(),
171-
farmPrinters[this.index].printerURL,
172-
"Client error, setting back up...",
173-
"Offline",
174-
farmPrinters[this.index]._id
175-
);
176-
setTimeout(async () => {
177-
this.instance.emit("error", e);
178-
Runner.reScanOcto(farmPrinters[this.index]._id);
179-
logger.info("Error with websockets... resetting up!");
180-
}, 5000);
169+
this.instance.emit("error", e);
181170
}
182171
});
183172
this.instance.on("pong", () => {
@@ -192,18 +181,7 @@ WebSocketClient.prototype.open = function (url, index) {
192181
e,
193182
"There was an issue opening the websocket... hard fail..."
194183
);
195-
PrinterTicker.addIssue(
196-
new Date(),
197-
farmPrinters[this.index].printerURL,
198-
"Client error, setting back up...",
199-
"Offline",
200-
farmPrinters[this.index]._id
201-
);
202-
setTimeout(async () => {
203-
this.instance.emit("error", e);
204-
Runner.reScanOcto(farmPrinters[this.index]._id);
205-
logger.info("Error with websockets... resetting up!");
206-
}, 5000);
184+
this.instance.emit("error", e);
207185
}
208186
});
209187
this.instance.on("close", (e) => {
@@ -272,30 +250,17 @@ WebSocketClient.prototype.open = function (url, index) {
272250
PrinterTicker.addIssue(
273251
new Date(),
274252
farmPrinters[this.index].printerURL,
275-
"Client error, setting back up...",
253+
"Client error, setting back up... in 10000ms",
276254
"Offline",
277255
farmPrinters[this.index]._id
278256
);
279257
setTimeout(async () => {
280258
Runner.reScanOcto(farmPrinters[this.index]._id);
281259
logger.info("Error with websockets... resetting up!");
282-
}, 5000);
260+
}, 10000);
283261
break;
284262
default:
285-
this.onclose(e);
286-
// Abnormal closure
287-
PrinterTicker.addIssue(
288-
new Date(),
289-
farmPrinters[this.index].printerURL,
290-
"Client error, setting back up...",
291-
"Offline",
292-
farmPrinters[this.index]._id
293-
);
294-
setTimeout(async () => {
295-
Runner.reScanOcto(farmPrinters[this.index]._id);
296-
logger.info("Error with websockets... resetting up!");
297-
}, 3000);
298-
break;
263+
console.log("ON CLOSE");
299264
}
300265

301266
return "closed";
@@ -321,18 +286,7 @@ WebSocketClient.prototype.open = function (url, index) {
321286
`Couldn't set state of missing printer, safe to ignore: ${this.index}: ${this.url}`
322287
);
323288
}
324-
PrinterTicker.addIssue(
325-
new Date(),
326-
farmPrinters[this.index].printerURL,
327-
"Client error, setting back up...",
328-
"Offline",
329-
farmPrinters[this.index]._id
330-
);
331-
setTimeout(async () => {
332-
console.log("DOES THIS FAIL", farmPrinters[this.index]._id);
333-
Runner.reScanOcto(farmPrinters[this.index]._id);
334-
logger.info("Error with websockets... resetting up!");
335-
}, 3000);
289+
this.reconnect(e);
336290
break;
337291
case "ECONNRESET":
338292
logger.error(e, `${this.index}: ${this.url}`);
@@ -353,17 +307,7 @@ WebSocketClient.prototype.open = function (url, index) {
353307
`Couldn't set state of missing printer, safe to ignore: ${this.index}: ${this.url}`
354308
);
355309
}
356-
PrinterTicker.addIssue(
357-
new Date(),
358-
farmPrinters[this.index].printerURL,
359-
"Client error, setting back up...",
360-
"Offline",
361-
farmPrinters[this.index]._id
362-
);
363-
setTimeout(async () => {
364-
Runner.reScanOcto(farmPrinters[this.index]._id);
365-
logger.info("Error with websockets... resetting up!");
366-
}, 3000);
310+
this.reconnect(e);
367311
break;
368312
case "EHOSTUNREACH":
369313
logger.error(e, `${this.index}: ${this.url}`);
@@ -384,17 +328,7 @@ WebSocketClient.prototype.open = function (url, index) {
384328
`Couldn't set state of missing printer, safe to ignore: ${this.index}: ${this.url}`
385329
);
386330
}
387-
PrinterTicker.addIssue(
388-
new Date(),
389-
farmPrinters[this.index].printerURL,
390-
"Client error, setting back up...",
391-
"Offline",
392-
farmPrinters[this.index]._id
393-
);
394-
setTimeout(async () => {
395-
Runner.reScanOcto(farmPrinters[this.index]._id);
396-
logger.info("Error with websockets... resetting up!");
397-
}, 3000);
331+
this.reconnect(e);
398332
break;
399333
case "ENOTFOUND":
400334
logger.error(e, `${this.index}: ${this.url}`);
@@ -416,18 +350,7 @@ WebSocketClient.prototype.open = function (url, index) {
416350
`Couldn't set state of missing printer, safe to ignore: ${this.index}: ${this.url}`
417351
);
418352
}
419-
PrinterTicker.addIssue(
420-
new Date(),
421-
farmPrinters[this.index].printerURL,
422-
"Client error, setting back up...",
423-
"Offline",
424-
farmPrinters[this.index]._id
425-
);
426-
setTimeout(async () => {
427-
console.log("DOES THIS FAIL", farmPrinters[this.index]._id);
428-
Runner.reScanOcto(farmPrinters[this.index]._id);
429-
logger.info("Error with websockets... resetting up!");
430-
}, 3000);
353+
this.reconnect(e);
431354
break;
432355
default:
433356
logger.error(e, `${this.index}: ${this.url}`);
@@ -452,17 +375,7 @@ WebSocketClient.prototype.open = function (url, index) {
452375
);
453376
}
454377
logger.error(`WebSocket hard failure: ${this.index}: ${this.url}`);
455-
PrinterTicker.addIssue(
456-
new Date(),
457-
farmPrinters[this.index].printerURL,
458-
"Client error, setting back up...",
459-
"Offline",
460-
farmPrinters[this.index]._id
461-
);
462-
setTimeout(async () => {
463-
Runner.reScanOcto(farmPrinters[this.index]._id);
464-
logger.info("Error with websockets... resetting up!");
465-
}, 3000);
378+
this.reconnect(e);
466379
break;
467380
}
468381
});
@@ -472,15 +385,14 @@ WebSocketClient.prototype.open = function (url, index) {
472385
PrinterTicker.addIssue(
473386
new Date(),
474387
farmPrinters[this.index].printerURL,
475-
"Client error, setting back up...",
388+
"Client error, setting back up... in 10000ms",
476389
"Offline",
477390
farmPrinters[this.index]._id
478391
);
479392
setTimeout(async () => {
480-
this.instance.emit("error", e);
481393
Runner.reScanOcto(farmPrinters[this.index]._id);
482394
logger.info("Error with websockets... resetting up!");
483-
}, 3000);
395+
}, 10000);
484396
}
485397
};
486398
WebSocketClient.prototype.throttle = function (data) {
@@ -513,7 +425,7 @@ WebSocketClient.prototype.reconnect = async function (e) {
513425
PrinterTicker.addIssue(
514426
new Date(),
515427
farmPrinters[this.index].printerURL,
516-
"Connection lost... reconnecting...",
428+
"Connection lost... reconnecting in: " + this.autoReconnectInterval + "ms",
517429
"Active",
518430
farmPrinters[this.index]._id
519431
);
@@ -528,7 +440,6 @@ WebSocketClient.prototype.reconnect = async function (e) {
528440
farmPrinters[that.index].hostStateColour = Runner.getColour("Searching...");
529441
farmPrinters[that.index].hostDescription = "Searching for Host";
530442
logger.info(`Re-Opening Websocket: ${that.index}: ${that.url}`);
531-
await Runner.getUpdates(farmPrinters[that.index]._id);
532443
if (typeof farmPrinters[that.index] !== "undefined") {
533444
PrinterClean.generate(
534445
farmPrinters[that.index],
@@ -539,36 +450,7 @@ WebSocketClient.prototype.reconnect = async function (e) {
539450
}, this.autoReconnectInterval);
540451
return true;
541452
};
542-
WebSocketClient.prototype.reconnectDelay = async function (e) {
543-
const longerTime = 150000;
544-
PrinterTicker.addIssue(
545-
new Date(),
546-
farmPrinters[this.index].printerURL,
547-
"Connection lost... reconnecting...",
548-
"Active",
549-
farmPrinters[this.index]._id
550-
);
551-
logger.info(
552-
`WebSocketClient: retry in ${longerTime} ms`,
553-
`${e + this.index}: ${this.url}`
554-
);
555-
this.instance.removeAllListeners();
556-
const that = this;
557-
setTimeout(async function () {
558-
farmPrinters[that.index].hostStateColour = Runner.getColour("Searching...");
559-
farmPrinters[that.index].hostDescription = "Searching for Host";
560-
await Runner.getUpdates(farmPrinters[that.index]._id);
561-
if (typeof farmPrinters[that.index] !== "undefined") {
562-
PrinterClean.generate(
563-
farmPrinters[that.index],
564-
systemSettings.filamentManager
565-
);
566-
}
567-
logger.info(`Re-Opening Websocket: ${that.index}: ${that.url}`);
568-
that.open(that.url, that.index);
569-
}, longerTime);
570-
return true;
571-
};
453+
572454
WebSocketClient.prototype.onopen = async function (e) {
573455
// eslint-disable-next-line prefer-rest-params
574456
logger.info("WebSocketClient: open", arguments, `${this.index}: ${this.url}`);
@@ -586,7 +468,7 @@ WebSocketClient.prototype.onopen = async function (e) {
586468
PrinterTicker.addIssue(
587469
new Date(),
588470
farmPrinters[this.index].printerURL,
589-
"Opening the websocket connection...",
471+
"Opened the websocket connection...",
590472
"Active",
591473
farmPrinters[this.index]._id
592474
);
@@ -1019,7 +901,17 @@ WebSocketClient.prototype.onerror = function (e) {
1019901
} catch (e) {
1020902
logger.info(e, "Couldn't delete old listeners... must not exist.");
1021903
}
1022-
904+
// PrinterTicker.addIssue(
905+
// new Date(),
906+
// farmPrinters[this.index].printerURL,
907+
// "Client error, setting back up...",
908+
// "Offline",
909+
// farmPrinters[this.index]._id
910+
// );
911+
// setTimeout(async () => {
912+
// Runner.reScanOcto(farmPrinters[this.index]._id);
913+
// logger.info("Error with websockets... resetting up!");
914+
// }, 10000);
1023915
if (typeof farmPrinters[this.index] !== "undefined") {
1024916
PrinterClean.generate(
1025917
farmPrinters[this.index],
@@ -1325,7 +1217,7 @@ class Runner {
13251217
PrinterTicker.addIssue(
13261218
new Date(),
13271219
farmPrinters[i].printerURL,
1328-
`${e.message}`,
1220+
`${e.message}: API issues... halting!`,
13291221
"Disconnected",
13301222
farmPrinters[i]._id
13311223
);
@@ -1359,7 +1251,7 @@ class Runner {
13591251
PrinterTicker.addIssue(
13601252
new Date(),
13611253
farmPrinters[i].printerURL,
1362-
`${e.message}`,
1254+
`${e.message}: Connection refused, trying again in: ${systemSettings.timeout.apiRetry}`,
13631255
"Disconnected",
13641256
farmPrinters[i]._id
13651257
);
@@ -1396,7 +1288,7 @@ class Runner {
13961288
PrinterTicker.addIssue(
13971289
new Date(),
13981290
farmPrinters[i].printerURL,
1399-
`${e.message}`,
1291+
`${e.message}: Host not found, halting...`,
14001292
"Disconnected",
14011293
farmPrinters[i]._id
14021294
);
@@ -1953,7 +1845,13 @@ class Runner {
19531845
typeof farmPrinters[index].ws !== "undefined" &&
19541846
typeof farmPrinters[index].ws.instance !== "undefined"
19551847
) {
1956-
console.log(farmPrinters[index].ws.instance.readyState);
1848+
PrinterTicker.addIssue(
1849+
new Date(),
1850+
farmPrinters[index].printerURL,
1851+
`Websocket state ${farmPrinters[index].ws.instance.readyState}`,
1852+
"Active",
1853+
farmPrinters[index]._id
1854+
);
19571855
if (farmPrinters[index].ws.instance.readyState === 1) {
19581856
PrinterTicker.addIssue(
19591857
new Date(),
@@ -1975,7 +1873,7 @@ class Runner {
19751873
PrinterTicker.addIssue(
19761874
new Date(),
19771875
farmPrinters[index].printerURL,
1978-
`Socket in tentative state, awaiting for connection attempt to finish... retry in 500ms`,
1876+
`Socket in tentative state, awaiting for connection attempt to finish... retry in 2000ms`,
19791877
"Active",
19801878
farmPrinters[index]._id
19811879
);
@@ -2003,7 +1901,7 @@ class Runner {
20031901
farmPrinters[index]._id
20041902
);
20051903
Runner.reScanOcto(_id, skipAPI);
2006-
}, 5000);
1904+
}, 2000);
20071905
} else {
20081906
PrinterTicker.addIssue(
20091907
new Date(),

0 commit comments

Comments
 (0)