102 lines
2.9 KiB
TypeScript
102 lines
2.9 KiB
TypeScript
|
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
|
||
|
)
|
||
|
);
|
||
|
};
|