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 ) ); };