66 lines
1.5 KiB
JavaScript
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
|
|
};
|
|
}
|