sockets now prod, handles when not available

This commit is contained in:
2024-11-15 08:42:36 -07:00
parent 578ac3fee9
commit 0c1b85af1a
3 changed files with 53 additions and 35 deletions

View File

@@ -29,5 +29,4 @@ COPY --from=builder /app/public ./public
RUN mkdir -p storage && rm -rf /app/storage/* RUN mkdir -p storage && rm -rf /app/storage/*
# CMD [ "pnpm", "run", "start" ] CMD [ "pnpm", "run", "start" ]
CMD [ "pnpm", "run", "socketProd" ]

View File

@@ -3,11 +3,11 @@
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "devNoSocket": "next dev",
"socket": "node src/websocket.js", "dev": "node src/websocket.js",
"build": "next build", "build": "next build",
"start": "next start", "startNoSocket": "next start",
"socketProd": "NODE_ENV=production node src/websocket.js", "start": "NODE_ENV=production node src/websocket.js",
"lint": "tsc && next lint", "lint": "tsc && next lint",
"test": "vitest" "test": "vitest"
}, },

View File

@@ -1,7 +1,7 @@
"use client"; "use client";
import { trpc } from "@/services/trpc/utils"; import { trpc } from "@/services/trpc/utils";
import React, { useEffect } from "react"; import React, { useCallback, useEffect, useState } from "react";
import { io, Socket } from "socket.io-client"; import { io, Socket } from "socket.io-client";
interface ServerToClientEvents { interface ServerToClientEvents {
@@ -24,18 +24,48 @@ function removeFileExtension(fileName: string): string {
} }
export function ClientCacheInvalidation() { export function ClientCacheInvalidation() {
const utils = trpc.useUtils(); const invalidateCache = useFilePathInvalidation();
const [connectionAttempted, setConnectionAttempted] = useState(false);
useEffect(() => { useEffect(() => {
if (!connectionAttempted) {
socket.connect();
setConnectionAttempted(true);
}
socket.on("connect", () => {
console.log("Socket connected successfully.");
});
socket.on("message", (data) => { socket.on("message", (data) => {
console.log("Received message:", data); console.log("Received message:", data);
}); });
socket.on("fileChanged", (filePath) => { socket.on("fileChanged", invalidateCache);
socket.on("connect_error", (error) => {
console.error("Connection error:", error);
console.error("File system real time updates disabled");
socket.disconnect();
});
return () => {
socket.off("message");
socket.off("fileChanged");
socket.off("connect_error");
};
}, [connectionAttempted, invalidateCache]);
return <></>;
}
const useFilePathInvalidation = () => {
const utils = trpc.useUtils();
return useCallback(
(filePath: string) => {
const [courseName, moduleOrLectures, itemType, itemFile] = const [courseName, moduleOrLectures, itemType, itemFile] =
filePath.split("/"); filePath.split("/");
const itemName = itemFile ? removeFileExtension(itemFile) : undefined; const itemName = itemFile ? removeFileExtension(itemFile) : undefined;
const allParts = [courseName, moduleOrLectures, itemType, itemName]; const allParts = [courseName, moduleOrLectures, itemType, itemName];
if (moduleOrLectures === "settings.yml") { if (moduleOrLectures === "settings.yml") {
@@ -91,18 +121,8 @@ export function ClientCacheInvalidation() {
}); });
return; return;
} }
}); },
[
socket.on("connect_error", (error) => {
console.error("Connection error:", error);
});
return () => {
socket.off("message");
socket.off("fileChanged");
socket.off("connect_error");
};
}, [
utils.assignment.getAllAssignments, utils.assignment.getAllAssignments,
utils.assignment.getAssignment, utils.assignment.getAssignment,
utils.lectures.getLectures, utils.lectures.getLectures,
@@ -112,7 +132,6 @@ export function ClientCacheInvalidation() {
utils.quiz.getQuiz, utils.quiz.getQuiz,
utils.settings.allCoursesSettings, utils.settings.allCoursesSettings,
utils.settings.courseSettings, utils.settings.courseSettings,
]); ]
);
return <></>; };
}