ff-operation-server/src/websocket/endpoints/missionManagement.ts

102 lines
2.9 KiB
TypeScript
Raw Normal View History

2025-02-26 16:26:56 +01:00
import { Server, Socket } from "socket.io";
import { handleEvent } from "../handleEvent";
import { MissionMap } from "../../storage/missionMap";
import * as Y from "yjs";
export default (io: Server, socket: Socket) => {
socket.on(
"mission:join",
handleEvent(
{ type: "read", section: "operation", module: "mission" },
async (data: any) => {
socket.rooms.forEach((room) => {
if (room !== socket.id && room != "home") {
socket.leave(room);
}
});
try {
const doc = new Y.Doc();
doc.getMap("form");
doc.getText("editor");
// const ymap = ydoc.getMap('myMap');
// ymap.set('titel', 'Mein Dokument');
// ymap.set('inhalt', 'Hier ist der initiale Inhalt');
// ymap.set('erstelltAm', new Date().toISOString());
// const yarray = ydoc.getArray('meineArray');
// yarray.push(['Element 1', 'Element 2', 'Element 3']);
// const ytext = ydoc.getText('meinText');
// ytext.insert(0, 'Hier ist ein initialer Text');
// get mission data
MissionMap.write(data, {
missionId: data,
doc,
});
const mission = MissionMap.read(data);
socket.join(data);
socket.emit("status-mission:join", { status: "success" });
return {
type: "package-mission",
answer: Y.encodeStateAsUpdate(mission.doc),
};
} catch (error) {
return { type: "status-join:join", answer: { status: "failed", msg: error.message } };
}
},
socket
)
);
socket.on(
"mission:sync",
handleEvent(
{ type: "read", section: "operation", module: "mission" },
async (data: any) => {
const socketRooms = Array.from(socket.rooms).filter((room) => room !== socket.id && room !== "home");
try {
const mission = MissionMap.read(socketRooms[0]);
Y.applyUpdate(mission.doc, new Uint8Array(data));
socket.emit("status-mission:sync", { status: "success" });
return {
type: "package-sync",
answer: data,
room: socketRooms[0],
};
} catch (error) {
return { type: "status-mission:sync", answer: { status: "failed", msg: error.message } };
}
},
socket
)
);
socket.on(
"mission:leave",
handleEvent(
{ type: "read", section: "operation", module: "mission" },
async (data: any) => {
const socketRooms = Array.from(socket.rooms).filter((room) => room !== socket.id && room !== "home");
socket.leave(socketRooms[0]);
const clients = io.sockets.adapter.rooms.get(socketRooms[0]);
if (!clients || clients.size == 0) {
MissionMap.delete(socketRooms[0]);
}
return {
type: "deleted",
answer: "leave instance",
};
},
socket
)
);
};