diff --git a/package-lock.json b/package-lock.json index 0297ca2..bd591f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,7 +37,6 @@ "sqlite3": "^5.1.7", "typeorm": "^0.3.20", "uuid": "^10.0.0", - "y-protocols": "^1.0.6", "yjs": "^13.6.23" }, "devDependencies": { @@ -4832,26 +4831,6 @@ "node": ">=0.4" } }, - "node_modules/y-protocols": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz", - "integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==", - "license": "MIT", - "dependencies": { - "lib0": "^0.2.85" - }, - "engines": { - "node": ">=16.0.0", - "npm": ">=8.0.0" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - }, - "peerDependencies": { - "yjs": "^13.0.0" - } - }, "node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", diff --git a/package.json b/package.json index 5e482ae..edf5a42 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,6 @@ "sqlite3": "^5.1.7", "typeorm": "^0.3.20", "uuid": "^10.0.0", - "y-protocols": "^1.0.6", "yjs": "^13.6.23" }, "devDependencies": { diff --git a/src/helpers/missionDocHelper.ts b/src/helpers/missionDocHelper.ts index f93c772..f979059 100644 --- a/src/helpers/missionDocHelper.ts +++ b/src/helpers/missionDocHelper.ts @@ -1,5 +1,4 @@ import * as Y from "yjs"; -import * as AwarenessProtocol from "y-protocols/dist/awareness.cjs"; import { MissionMap } from "../storage/missionMap"; export default abstract class MissionDocHelper { @@ -20,15 +19,30 @@ export default abstract class MissionDocHelper { // const ytext = ydoc.getText('meinText'); // ytext.insert(0, 'Hier ist ein initialer Text'); - const awareness = new AwarenessProtocol.Awareness(doc); - awareness.setLocalState(null); + const awareness = 0; // TODO Awareness MissionMap.write(missionId, { missionId, doc, awareness, timestamp: 0 }); console.log(`created local doc ${missionId}`); } - public static async saveDoc(missionId: string) { - // store Data to database + public static docAsUpdate(missionId: string): Uint8Array { const mission = MissionMap.read(missionId); + return Y.encodeStateAsUpdate(mission.doc); + } + + public static docAsStateVector(missionId: string): Uint8Array { + const mission = MissionMap.read(missionId); + return Y.encodeStateVector(mission.doc); + } + + public static docTimestamp(missionId: string): number { + const mission = MissionMap.read(missionId); + return mission.timestamp; + } + + public static async saveDoc(missionId: string, update: Uint8Array) { + MissionMap.updateState(missionId, update); + const mission = MissionMap.read(missionId); + // store Data to database } } diff --git a/src/storage/missionMap.ts b/src/storage/missionMap.ts index a84bf35..57d7e9f 100644 --- a/src/storage/missionMap.ts +++ b/src/storage/missionMap.ts @@ -1,11 +1,10 @@ import * as Y from "yjs"; -import * as AwarenessProtocol from "y-protocols/dist/awareness.cjs"; import ms from "ms"; export interface missionStoreModel { missionId: string; doc: Y.Doc; - awareness: AwarenessProtocol.Awareness; + awareness: any; timestamp: number; } @@ -33,11 +32,13 @@ export abstract class MissionMap { this.write(identifier, mission, true); } - public static updateAwareness(identifier: string, data: Uint8Array, socketId: string): void { + public static updateAwareness(identifier: string, data: any): void { this.monitorAccess(identifier); let mission = this.read(identifier); - AwarenessProtocol.applyAwarenessUpdate(mission.awareness, data, socketId); + + // TODO save awareness + this.write(identifier, mission, true); } diff --git a/src/types/y-protocols.d.ts b/src/types/y-protocols.d.ts deleted file mode 100644 index a489418..0000000 --- a/src/types/y-protocols.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare module "y-protocols/dist/awareness.cjs" { - export * from "y-protocols/awareness"; -} diff --git a/src/websocket/endpoints/base.ts b/src/websocket/endpoints/base.ts index 8f9c403..0ba28d7 100644 --- a/src/websocket/endpoints/base.ts +++ b/src/websocket/endpoints/base.ts @@ -30,12 +30,14 @@ export default (io: Server, socket: Socket) => { socket.on("disconnecting", () => { console.log("socket disconnection: ", socket.id); 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]); + if (socketRooms[0]) { + socket.leave(socketRooms[0]); + const clients = io.sockets.adapter.rooms.get(socketRooms[0]); + if (!clients || clients.size == 0) { + MissionMap.delete(socketRooms[0]); + } } + SocketMap.delete(socket.id); }); diff --git a/src/websocket/endpoints/missionManagement.ts b/src/websocket/endpoints/missionManagement.ts index 030719b..53a4dd2 100644 --- a/src/websocket/endpoints/missionManagement.ts +++ b/src/websocket/endpoints/missionManagement.ts @@ -2,7 +2,6 @@ import { Server, Socket } from "socket.io"; import { handleEvent } from "../handleEvent"; import { MissionMap, missionStoreModel } from "../../storage/missionMap"; import * as Y from "yjs"; -import * as AwarenessProtocol from "y-protocols/dist/awareness.cjs"; import MissionDocHelper from "../../helpers/missionDocHelper"; export default (io: Server, socket: Socket) => { @@ -24,35 +23,30 @@ export default (io: Server, socket: Socket) => { await MissionDocHelper.populateDoc(missionId); } - const mission = MissionMap.read(missionId); - if (clientLastUpdate && clientLastUpdate.timestamp) { - if (mission.timestamp > clientLastUpdate.timestamp) { + if (MissionDocHelper.docTimestamp(missionId) > clientLastUpdate.timestamp) { socket.emit("package-sync", { - update: Y.encodeStateAsUpdate(mission.doc), - timestamp: mission.timestamp, + update: MissionDocHelper.docAsUpdate(missionId), + timestamp: MissionDocHelper.docTimestamp(missionId), source: "server", }); } else { socket.emit("sync-get-missing-updates", { - stateVector: Y.encodeStateVector(mission.doc), - timestamp: mission.timestamp, + stateVector: MissionDocHelper.docAsStateVector(missionId), + timestamp: MissionDocHelper.docTimestamp(missionId), source: "server", }); } } else { socket.emit("package-sync", { - update: Y.encodeStateAsUpdate(mission.doc), - timestamp: mission.timestamp, + update: MissionDocHelper.docAsUpdate(missionId), + timestamp: MissionDocHelper.docTimestamp(missionId), source: "server", }); } socket.emit("package-sync-awareness", { - update: AwarenessProtocol.encodeAwarenessUpdate( - mission.awareness, - Array.from(mission.awareness.getStates().keys()) - ), + update: [], // do awareness self source: "server", }); @@ -75,7 +69,7 @@ export default (io: Server, socket: Socket) => { async (data: { update: Array; timestamp: number }) => { const socketRooms = Array.from(socket.rooms).filter((room) => room !== socket.id && room !== "home"); try { - MissionMap.updateState(socketRooms[0], new Uint8Array(data.update)); + MissionDocHelper.saveDoc(socketRooms[0], new Uint8Array(data.update)); return { type: "package-sync", @@ -87,10 +81,9 @@ export default (io: Server, socket: Socket) => { room: socketRooms[0], }; } catch (error) { - const mission = MissionMap.read(socketRooms[0]); socket.emit("package-sync", { - update: Y.encodeStateAsUpdate(mission.doc), - timestamp: mission.timestamp, + update: MissionDocHelper.docAsUpdate(socketRooms[0]), + timestamp: MissionDocHelper.docTimestamp(socketRooms[0]), source: "server", error: true, }); @@ -115,7 +108,7 @@ export default (io: Server, socket: Socket) => { type: "package-sync", answer: { update: missingUpdates, - timestamp: mission.timestamp, + timestamp: MissionDocHelper.docTimestamp(socketRooms[0]), source: "server", }, }; @@ -134,7 +127,7 @@ export default (io: Server, socket: Socket) => { async (data: { update: Array; timestamp: number }) => { const socketRooms = Array.from(socket.rooms).filter((room) => room !== socket.id && room !== "home"); try { - MissionMap.updateAwareness(socketRooms[0], new Uint8Array(data.update), socket.id); + MissionMap.updateAwareness(socketRooms[0], new Uint8Array(data.update)); return { type: "package-sync-awareness", @@ -145,9 +138,8 @@ export default (io: Server, socket: Socket) => { room: socketRooms[0], }; } catch (error) { - const mission = MissionMap.read(socketRooms[0]); socket.emit("package-sync-awareness", { - update: Y.encodeStateAsUpdate(mission.doc), + update: MissionDocHelper.docAsUpdate(socketRooms[0]), source: "server", error: true, });