remove y-protcol

This commit is contained in:
Julian Krauser 2025-03-03 17:05:55 +01:00
parent 50c48746df
commit 5fbc189884
7 changed files with 45 additions and 61 deletions

21
package-lock.json generated
View file

@ -37,7 +37,6 @@
"sqlite3": "^5.1.7", "sqlite3": "^5.1.7",
"typeorm": "^0.3.20", "typeorm": "^0.3.20",
"uuid": "^10.0.0", "uuid": "^10.0.0",
"y-protocols": "^1.0.6",
"yjs": "^13.6.23" "yjs": "^13.6.23"
}, },
"devDependencies": { "devDependencies": {
@ -4832,26 +4831,6 @@
"node": ">=0.4" "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": { "node_modules/y18n": {
"version": "4.0.3", "version": "4.0.3",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",

View file

@ -52,7 +52,6 @@
"sqlite3": "^5.1.7", "sqlite3": "^5.1.7",
"typeorm": "^0.3.20", "typeorm": "^0.3.20",
"uuid": "^10.0.0", "uuid": "^10.0.0",
"y-protocols": "^1.0.6",
"yjs": "^13.6.23" "yjs": "^13.6.23"
}, },
"devDependencies": { "devDependencies": {

View file

@ -1,5 +1,4 @@
import * as Y from "yjs"; import * as Y from "yjs";
import * as AwarenessProtocol from "y-protocols/dist/awareness.cjs";
import { MissionMap } from "../storage/missionMap"; import { MissionMap } from "../storage/missionMap";
export default abstract class MissionDocHelper { export default abstract class MissionDocHelper {
@ -20,15 +19,30 @@ export default abstract class MissionDocHelper {
// const ytext = ydoc.getText('meinText'); // const ytext = ydoc.getText('meinText');
// ytext.insert(0, 'Hier ist ein initialer Text'); // ytext.insert(0, 'Hier ist ein initialer Text');
const awareness = new AwarenessProtocol.Awareness(doc); const awareness = 0; // TODO Awareness
awareness.setLocalState(null);
MissionMap.write(missionId, { missionId, doc, awareness, timestamp: 0 }); MissionMap.write(missionId, { missionId, doc, awareness, timestamp: 0 });
console.log(`created local doc ${missionId}`); console.log(`created local doc ${missionId}`);
} }
public static async saveDoc(missionId: string) { public static docAsUpdate(missionId: string): Uint8Array {
// store Data to database
const mission = MissionMap.read(missionId); 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
} }
} }

View file

@ -1,11 +1,10 @@
import * as Y from "yjs"; import * as Y from "yjs";
import * as AwarenessProtocol from "y-protocols/dist/awareness.cjs";
import ms from "ms"; import ms from "ms";
export interface missionStoreModel { export interface missionStoreModel {
missionId: string; missionId: string;
doc: Y.Doc; doc: Y.Doc;
awareness: AwarenessProtocol.Awareness; awareness: any;
timestamp: number; timestamp: number;
} }
@ -33,11 +32,13 @@ export abstract class MissionMap {
this.write(identifier, mission, true); 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); this.monitorAccess(identifier);
let mission = this.read(identifier); let mission = this.read(identifier);
AwarenessProtocol.applyAwarenessUpdate(mission.awareness, data, socketId);
// TODO save awareness
this.write(identifier, mission, true); this.write(identifier, mission, true);
} }

View file

@ -1,3 +0,0 @@
declare module "y-protocols/dist/awareness.cjs" {
export * from "y-protocols/awareness";
}

View file

@ -30,12 +30,14 @@ export default (io: Server, socket: Socket) => {
socket.on("disconnecting", () => { socket.on("disconnecting", () => {
console.log("socket disconnection: ", socket.id); console.log("socket disconnection: ", socket.id);
const socketRooms = Array.from(socket.rooms).filter((room) => room !== socket.id && room !== "home"); const socketRooms = Array.from(socket.rooms).filter((room) => room !== socket.id && room !== "home");
socket.leave(socketRooms[0]); if (socketRooms[0]) {
socket.leave(socketRooms[0]);
const clients = io.sockets.adapter.rooms.get(socketRooms[0]); const clients = io.sockets.adapter.rooms.get(socketRooms[0]);
if (!clients || clients.size == 0) { if (!clients || clients.size == 0) {
MissionMap.delete(socketRooms[0]); MissionMap.delete(socketRooms[0]);
}
} }
SocketMap.delete(socket.id); SocketMap.delete(socket.id);
}); });

View file

@ -2,7 +2,6 @@ import { Server, Socket } from "socket.io";
import { handleEvent } from "../handleEvent"; import { handleEvent } from "../handleEvent";
import { MissionMap, missionStoreModel } from "../../storage/missionMap"; import { MissionMap, missionStoreModel } from "../../storage/missionMap";
import * as Y from "yjs"; import * as Y from "yjs";
import * as AwarenessProtocol from "y-protocols/dist/awareness.cjs";
import MissionDocHelper from "../../helpers/missionDocHelper"; import MissionDocHelper from "../../helpers/missionDocHelper";
export default (io: Server, socket: Socket) => { export default (io: Server, socket: Socket) => {
@ -24,35 +23,30 @@ export default (io: Server, socket: Socket) => {
await MissionDocHelper.populateDoc(missionId); await MissionDocHelper.populateDoc(missionId);
} }
const mission = MissionMap.read(missionId);
if (clientLastUpdate && clientLastUpdate.timestamp) { if (clientLastUpdate && clientLastUpdate.timestamp) {
if (mission.timestamp > clientLastUpdate.timestamp) { if (MissionDocHelper.docTimestamp(missionId) > clientLastUpdate.timestamp) {
socket.emit("package-sync", { socket.emit("package-sync", {
update: Y.encodeStateAsUpdate(mission.doc), update: MissionDocHelper.docAsUpdate(missionId),
timestamp: mission.timestamp, timestamp: MissionDocHelper.docTimestamp(missionId),
source: "server", source: "server",
}); });
} else { } else {
socket.emit("sync-get-missing-updates", { socket.emit("sync-get-missing-updates", {
stateVector: Y.encodeStateVector(mission.doc), stateVector: MissionDocHelper.docAsStateVector(missionId),
timestamp: mission.timestamp, timestamp: MissionDocHelper.docTimestamp(missionId),
source: "server", source: "server",
}); });
} }
} else { } else {
socket.emit("package-sync", { socket.emit("package-sync", {
update: Y.encodeStateAsUpdate(mission.doc), update: MissionDocHelper.docAsUpdate(missionId),
timestamp: mission.timestamp, timestamp: MissionDocHelper.docTimestamp(missionId),
source: "server", source: "server",
}); });
} }
socket.emit("package-sync-awareness", { socket.emit("package-sync-awareness", {
update: AwarenessProtocol.encodeAwarenessUpdate( update: [], // do awareness self
mission.awareness,
Array.from(mission.awareness.getStates().keys())
),
source: "server", source: "server",
}); });
@ -75,7 +69,7 @@ export default (io: Server, socket: Socket) => {
async (data: { update: Array<number>; timestamp: number }) => { async (data: { update: Array<number>; timestamp: number }) => {
const socketRooms = Array.from(socket.rooms).filter((room) => room !== socket.id && room !== "home"); const socketRooms = Array.from(socket.rooms).filter((room) => room !== socket.id && room !== "home");
try { try {
MissionMap.updateState(socketRooms[0], new Uint8Array(data.update)); MissionDocHelper.saveDoc(socketRooms[0], new Uint8Array(data.update));
return { return {
type: "package-sync", type: "package-sync",
@ -87,10 +81,9 @@ export default (io: Server, socket: Socket) => {
room: socketRooms[0], room: socketRooms[0],
}; };
} catch (error) { } catch (error) {
const mission = MissionMap.read(socketRooms[0]);
socket.emit("package-sync", { socket.emit("package-sync", {
update: Y.encodeStateAsUpdate(mission.doc), update: MissionDocHelper.docAsUpdate(socketRooms[0]),
timestamp: mission.timestamp, timestamp: MissionDocHelper.docTimestamp(socketRooms[0]),
source: "server", source: "server",
error: true, error: true,
}); });
@ -115,7 +108,7 @@ export default (io: Server, socket: Socket) => {
type: "package-sync", type: "package-sync",
answer: { answer: {
update: missingUpdates, update: missingUpdates,
timestamp: mission.timestamp, timestamp: MissionDocHelper.docTimestamp(socketRooms[0]),
source: "server", source: "server",
}, },
}; };
@ -134,7 +127,7 @@ export default (io: Server, socket: Socket) => {
async (data: { update: Array<number>; timestamp: number }) => { async (data: { update: Array<number>; timestamp: number }) => {
const socketRooms = Array.from(socket.rooms).filter((room) => room !== socket.id && room !== "home"); const socketRooms = Array.from(socket.rooms).filter((room) => room !== socket.id && room !== "home");
try { try {
MissionMap.updateAwareness(socketRooms[0], new Uint8Array(data.update), socket.id); MissionMap.updateAwareness(socketRooms[0], new Uint8Array(data.update));
return { return {
type: "package-sync-awareness", type: "package-sync-awareness",
@ -145,9 +138,8 @@ export default (io: Server, socket: Socket) => {
room: socketRooms[0], room: socketRooms[0],
}; };
} catch (error) { } catch (error) {
const mission = MissionMap.read(socketRooms[0]);
socket.emit("package-sync-awareness", { socket.emit("package-sync-awareness", {
update: Y.encodeStateAsUpdate(mission.doc), update: MissionDocHelper.docAsUpdate(socketRooms[0]),
source: "server", source: "server",
error: true, error: true,
}); });