|
@@ -1,18 +1,27 @@
|
|
|
import { defineBoot } from "#q-app/wrappers";
|
|
import { defineBoot } from "#q-app/wrappers";
|
|
|
import { io } from "socket.io-client";
|
|
import { io } from "socket.io-client";
|
|
|
-import { reactive } from "vue";
|
|
|
|
|
|
|
+import { reactive, watch } from "vue";
|
|
|
|
|
+import { realtimeRoom } from "src/realtime/rooms";
|
|
|
|
|
+import { userStore } from "src/stores/user";
|
|
|
|
|
|
|
|
const state = reactive({
|
|
const state = reactive({
|
|
|
activeRooms: new Set(),
|
|
activeRooms: new Set(),
|
|
|
isConnected: false,
|
|
isConnected: false,
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
+const log = (...args) => {
|
|
|
|
|
+ if (process.env.DEV) {
|
|
|
|
|
+ console.log("[realtime]", ...args);
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
const socket = io(process.env.WEBSOCKET_API, {
|
|
const socket = io(process.env.WEBSOCKET_API, {
|
|
|
transport: ["websocket"],
|
|
transport: ["websocket"],
|
|
|
path: process.env.WEBSOCKET_PATH,
|
|
path: process.env.WEBSOCKET_PATH,
|
|
|
auth: {
|
|
auth: {
|
|
|
apiKey: process.env.WEBSOCKET_API_KEY,
|
|
apiKey: process.env.WEBSOCKET_API_KEY,
|
|
|
},
|
|
},
|
|
|
|
|
+ autoConnect: false,
|
|
|
reconnection: true,
|
|
reconnection: true,
|
|
|
reconnectionDelay: 1000,
|
|
reconnectionDelay: 1000,
|
|
|
timeout: 20000,
|
|
timeout: 20000,
|
|
@@ -26,15 +35,15 @@ const socket = io(process.env.WEBSOCKET_API, {
|
|
|
const joinRoom = (roomName) => {
|
|
const joinRoom = (roomName) => {
|
|
|
if (!roomName) return false;
|
|
if (!roomName) return false;
|
|
|
|
|
|
|
|
- const fullRoomName = `${process.env.WEBSOCKET_ROOM}:${roomName}`;
|
|
|
|
|
|
|
+ const fullRoomName = `${process.env.WEBSOCKET_PROJECT}:${roomName}`;
|
|
|
|
|
|
|
|
state.activeRooms.add(fullRoomName);
|
|
state.activeRooms.add(fullRoomName);
|
|
|
|
|
|
|
|
if (state.isConnected) {
|
|
if (state.isConnected) {
|
|
|
socket.emit("join", fullRoomName);
|
|
socket.emit("join", fullRoomName);
|
|
|
- console.log(`Joined room: ${fullRoomName}`);
|
|
|
|
|
|
|
+ log(`Joined room: ${fullRoomName}`);
|
|
|
} else {
|
|
} else {
|
|
|
- console.log(`Room ${fullRoomName} will join upon connection`);
|
|
|
|
|
|
|
+ log(`Room ${fullRoomName} will join upon connection`);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
return true;
|
|
@@ -47,42 +56,25 @@ const joinRoom = (roomName) => {
|
|
|
const leaveRoom = (roomName) => {
|
|
const leaveRoom = (roomName) => {
|
|
|
if (!roomName) return;
|
|
if (!roomName) return;
|
|
|
|
|
|
|
|
- const fullRoomName = `${process.env.WEBSOCKET_ROOM}:${roomName}`;
|
|
|
|
|
|
|
+ const fullRoomName = `${process.env.WEBSOCKET_PROJECT}:${roomName}`;
|
|
|
|
|
|
|
|
state.activeRooms.delete(fullRoomName);
|
|
state.activeRooms.delete(fullRoomName);
|
|
|
|
|
|
|
|
if (state.isConnected) {
|
|
if (state.isConnected) {
|
|
|
socket.emit("leave", fullRoomName);
|
|
socket.emit("leave", fullRoomName);
|
|
|
- console.log(`Left room: ${fullRoomName}`);
|
|
|
|
|
|
|
+ log(`Left room: ${fullRoomName}`);
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-const sendEventToLaravel = (eventName, data) => {
|
|
|
|
|
- const channel = process.env.WEBSOCKET_ROOM + ":" + eventName;
|
|
|
|
|
- socket.emit("eventWrapperToLaravel", {
|
|
|
|
|
- channel: channel,
|
|
|
|
|
- data: data,
|
|
|
|
|
- });
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
-const sendEvent = (room, eventName, data) => {
|
|
|
|
|
- const channel = process.env.WEBSOCKET_ROOM + ":" + room + "@" + eventName;
|
|
|
|
|
- socket.emit("eventWrapperToNode", {
|
|
|
|
|
- channel: channel,
|
|
|
|
|
- data: data,
|
|
|
|
|
- });
|
|
|
|
|
-};
|
|
|
|
|
-
|
|
|
|
|
export default defineBoot(async () => {
|
|
export default defineBoot(async () => {
|
|
|
socket.on("connect", () => {
|
|
socket.on("connect", () => {
|
|
|
- console.log("Connected to websocket server!");
|
|
|
|
|
|
|
+ log("Connected to websocket server!");
|
|
|
state.isConnected = true;
|
|
state.isConnected = true;
|
|
|
|
|
|
|
|
// Rejoin all active rooms after reconnection
|
|
// Rejoin all active rooms after reconnection
|
|
|
if (state.activeRooms.size > 0) {
|
|
if (state.activeRooms.size > 0) {
|
|
|
- console.log(
|
|
|
|
|
- `Rejoining ${state.activeRooms.size} rooms after reconnection`,
|
|
|
|
|
- );
|
|
|
|
|
|
|
+ log(`Rejoining ${state.activeRooms.size} rooms after reconnection`);
|
|
|
|
|
+
|
|
|
state.activeRooms.forEach((room) => {
|
|
state.activeRooms.forEach((room) => {
|
|
|
socket.emit("join", room);
|
|
socket.emit("join", room);
|
|
|
});
|
|
});
|
|
@@ -90,31 +82,40 @@ export default defineBoot(async () => {
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
socket.on("disconnect", () => {
|
|
socket.on("disconnect", () => {
|
|
|
- console.log("Disconnected from websocket server!");
|
|
|
|
|
|
|
+ log("Disconnected from websocket server!");
|
|
|
state.isConnected = false;
|
|
state.isConnected = false;
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
socket.on("connect_error", (error) => {
|
|
socket.on("connect_error", (error) => {
|
|
|
- console.error("Websocket connection error: ", error);
|
|
|
|
|
|
|
+ console.error("Websocket connection error: ", error.message);
|
|
|
state.isConnected = false;
|
|
state.isConnected = false;
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- socket.on("connect_timeout", (timeout) => {
|
|
|
|
|
- console.error("Websocket connection timeout: ", timeout);
|
|
|
|
|
- state.isConnected = false;
|
|
|
|
|
- });
|
|
|
|
|
|
|
|
|
|
- socket.on("reconnect", (attemptNumber) => {
|
|
|
|
|
- console.log(
|
|
|
|
|
- "Reconnected to websocket server! Attempt number: ",
|
|
|
|
|
- attemptNumber,
|
|
|
|
|
- );
|
|
|
|
|
- state.isConnected = true;
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ const store = userStore();
|
|
|
|
|
|
|
|
- socket.on("reconnect_attempt", (attemptNumber) => {
|
|
|
|
|
- console.log("Reconnect attempt number: ", attemptNumber);
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ watch(
|
|
|
|
|
+ () => store.user?.id,
|
|
|
|
|
+ (userId, previousUserId) => {
|
|
|
|
|
+ if (previousUserId && previousUserId !== userId) {
|
|
|
|
|
+ leaveRoom(realtimeRoom.user(previousUserId));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!userId) {
|
|
|
|
|
+ state.activeRooms.clear();
|
|
|
|
|
+ socket.disconnect();
|
|
|
|
|
+
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ joinRoom(realtimeRoom.user(userId));
|
|
|
|
|
+
|
|
|
|
|
+ if (!socket.connected) {
|
|
|
|
|
+ socket.connect();
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ { immediate: true },
|
|
|
|
|
+ );
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -147,12 +148,4 @@ const onceEvent = (event, callback, roomName = null) => {
|
|
|
};
|
|
};
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-export {
|
|
|
|
|
- socket,
|
|
|
|
|
- joinRoom,
|
|
|
|
|
- leaveRoom,
|
|
|
|
|
- sendEvent,
|
|
|
|
|
- sendEventToLaravel,
|
|
|
|
|
- onceEvent,
|
|
|
|
|
- state,
|
|
|
|
|
-};
|
|
|
|
|
|
|
+export { socket, joinRoom, leaveRoom, onceEvent, state };
|