2025-09-05 14:59:21 +08:00

66 lines
1.5 KiB
JavaScript

import { useRuntimeConfig, refreshNuxtData } from "#imports";
const logger = {
log: (...args) => console.log("[Content]", ...args),
warn: (...args) => console.warn("[Content]", ...args)
};
let ws;
export function useContentWebSocket() {
if (!window.WebSocket) {
logger.warn("Could not enable hot reload, your browser does not support WebSocket.");
return;
}
const onMessage = (message) => {
try {
const data = JSON.parse(message.data);
if (!data) {
return;
}
refreshNuxtData();
} catch {
}
};
const onOpen = () => logger.log("WS connected!");
const onError = (e) => {
switch (e.code) {
case "ECONNREFUSED":
connect(true);
break;
default:
logger.warn("WS Error:", e);
break;
}
};
const onClose = (e) => {
if (e.code === 1e3 || e.code === 1005) {
logger.log("WS closed!");
} else {
connect(true);
}
};
const connect = (retry = false) => {
if (retry) {
logger.log("WS reconnecting..");
setTimeout(connect, 1e3);
return;
}
if (ws) {
try {
ws.close();
} catch {
}
ws = void 0;
}
const wsURL = `${useRuntimeConfig().public.content.wsUrl}ws`;
logger.log(`WS connect to ${wsURL}`);
ws = new WebSocket(wsURL);
ws.onopen = onOpen;
ws.onmessage = onMessage;
ws.onerror = onError;
ws.onclose = onClose;
};
connect();
return {
connect
};
}