67abbf19b5
CI / Generate TypeScript types (push) Successful in 10s
CI / Server unit tests (push) Successful in 20s
CI / Build server (push) Successful in 26s
CI / Build client (push) Successful in 35s
CI / Playwright E2E tests (push) Failing after 1m56s
CI / Build and push Docker image (push) Has been skipped
CI / Notify (push) Successful in 1s
- Socket.io Redis adapter pro sdílený stav přes repliky - graceful shutdown serveru - WATCH/MULTI v updateData pro race-condition-safe aktualizace - lease mechanismus pro push reminder (zabrání duplicitnímu odesílání) - k8s/ manifesty pro testovací kind cluster - Dockerfile: opraven EXPOSE port na 3001 - .gitignore: ignorovány Claude pracovní soubory
35 lines
1.1 KiB
JavaScript
35 lines
1.1 KiB
JavaScript
import React from 'react';
|
|
import socketio from "socket.io-client";
|
|
|
|
let socketUrl;
|
|
let socketPath;
|
|
if (process.env.NODE_ENV === 'development') {
|
|
socketUrl = `http://localhost:3001`;
|
|
socketPath = undefined;
|
|
} else {
|
|
socketUrl = `${globalThis.location.host}`;
|
|
socketPath = '/socket.io';
|
|
}
|
|
|
|
export const socket = socketio.connect(socketUrl, { path: socketPath, transports: ["websocket"] });
|
|
export const SocketContext = React.createContext();
|
|
|
|
// Prohlížeče throttlují setTimeout v neaktivních tabech, což zdržuje automatické
|
|
// znovupřipojení socket.io. Po návratu do tabu nebo focusu okna se připojíme hned.
|
|
document.addEventListener('visibilitychange', () => {
|
|
if (document.visibilityState === 'visible' && !socket.connected) {
|
|
socket.connect();
|
|
}
|
|
});
|
|
window.addEventListener('focus', () => {
|
|
if (!socket.connected) {
|
|
socket.connect();
|
|
}
|
|
});
|
|
|
|
// Konstanty websocket eventů, musí odpovídat těm na serveru!
|
|
export const EVENT_CONNECT = 'connect';
|
|
export const EVENT_DISCONNECT = 'disconnect';
|
|
export const EVENT_MESSAGE = 'message';
|
|
export const EVENT_PENDING_QR = 'pendingQr';
|