So in a nextjs project Im working on, the client connects to a websocket server as such
<code>useEffect(() => {
async function fetchDocument(tableId: string) {
try {
const ydoc = new Y.Doc();
const provider = new WebsocketProvider("ws://localhost:3010", `table-${tableId}`, ydoc);
provider.on("status", (event: { status: any; }) => {
console.log(`connection status: ${event.status}`); // logs "connected" or "disconnected"
});
provider.on("sync", (isSynced: boolean) => {
console.log("Synced with server:", isSynced);
});
// Listen for remote changes and update the document state
ydoc.on("update", (update, origin) => {
console.log("Document updated:", ydoc.getText("shared-text").toString(), "origin:", origin);
// Update the document state
setDoc(ydoc);
});
// Ensure the shared-text type is initialized
ydoc.getText("shared-text");
setDoc(ydoc);
setProvider(provider);
} catch (err) {
console.error("Error fetching document:", err);
}
}
if (selectedTableId) {
fetchDocument(selectedTableId);
}
return () => {
if (provider) {
provider.destroy();
}
};
}, [connectionId, selectedTableId]);
</code>
<code>useEffect(() => {
async function fetchDocument(tableId: string) {
try {
const ydoc = new Y.Doc();
const provider = new WebsocketProvider("ws://localhost:3010", `table-${tableId}`, ydoc);
provider.on("status", (event: { status: any; }) => {
console.log(`connection status: ${event.status}`); // logs "connected" or "disconnected"
});
provider.on("sync", (isSynced: boolean) => {
console.log("Synced with server:", isSynced);
});
// Listen for remote changes and update the document state
ydoc.on("update", (update, origin) => {
console.log("Document updated:", ydoc.getText("shared-text").toString(), "origin:", origin);
// Update the document state
setDoc(ydoc);
});
// Ensure the shared-text type is initialized
ydoc.getText("shared-text");
setDoc(ydoc);
setProvider(provider);
} catch (err) {
console.error("Error fetching document:", err);
}
}
if (selectedTableId) {
fetchDocument(selectedTableId);
}
return () => {
if (provider) {
provider.destroy();
}
};
}, [connectionId, selectedTableId]);
</code>
useEffect(() => {
async function fetchDocument(tableId: string) {
try {
const ydoc = new Y.Doc();
const provider = new WebsocketProvider("ws://localhost:3010", `table-${tableId}`, ydoc);
provider.on("status", (event: { status: any; }) => {
console.log(`connection status: ${event.status}`); // logs "connected" or "disconnected"
});
provider.on("sync", (isSynced: boolean) => {
console.log("Synced with server:", isSynced);
});
// Listen for remote changes and update the document state
ydoc.on("update", (update, origin) => {
console.log("Document updated:", ydoc.getText("shared-text").toString(), "origin:", origin);
// Update the document state
setDoc(ydoc);
});
// Ensure the shared-text type is initialized
ydoc.getText("shared-text");
setDoc(ydoc);
setProvider(provider);
} catch (err) {
console.error("Error fetching document:", err);
}
}
if (selectedTableId) {
fetchDocument(selectedTableId);
}
return () => {
if (provider) {
provider.destroy();
}
};
}, [connectionId, selectedTableId]);
And on the websocket server side, it connects just fine and everything like so
<code>async function startServer() {
try {
console.log('Connected to database');
wss.on('connection', (ws) => {
const docName = 'not_untitled'; // TODO: Replace with table name logic
loadDocument(docName).then((doc) => {
console.log("Document loaded:" + docName + " " + doc.getText('shared-text').toString());
const awareness = new Awareness(doc);
setupWSConnection(ws, doc, { awareness });
doc.on('update', async () => {
await saveDocument(docName, doc);
});
ws.on('close', () => {
awareness.setLocalState(null);
console.log('Client disconnected');
});
}).catch((err) => {
console.error('Failed to load document:', err);
});
});
console.log(`WebSocket server is running on ws://localhost:3010`);
} catch (err) {
console.error('Failed to start server:', err);
}
}
startServer();
</code>
<code>async function startServer() {
try {
console.log('Connected to database');
wss.on('connection', (ws) => {
const docName = 'not_untitled'; // TODO: Replace with table name logic
loadDocument(docName).then((doc) => {
console.log("Document loaded:" + docName + " " + doc.getText('shared-text').toString());
const awareness = new Awareness(doc);
setupWSConnection(ws, doc, { awareness });
doc.on('update', async () => {
await saveDocument(docName, doc);
});
ws.on('close', () => {
awareness.setLocalState(null);
console.log('Client disconnected');
});
}).catch((err) => {
console.error('Failed to load document:', err);
});
});
console.log(`WebSocket server is running on ws://localhost:3010`);
} catch (err) {
console.error('Failed to start server:', err);
}
}
startServer();
</code>
async function startServer() {
try {
console.log('Connected to database');
wss.on('connection', (ws) => {
const docName = 'not_untitled'; // TODO: Replace with table name logic
loadDocument(docName).then((doc) => {
console.log("Document loaded:" + docName + " " + doc.getText('shared-text').toString());
const awareness = new Awareness(doc);
setupWSConnection(ws, doc, { awareness });
doc.on('update', async () => {
await saveDocument(docName, doc);
});
ws.on('close', () => {
awareness.setLocalState(null);
console.log('Client disconnected');
});
}).catch((err) => {
console.error('Failed to load document:', err);
});
});
console.log(`WebSocket server is running on ws://localhost:3010`);
} catch (err) {
console.error('Failed to start server:', err);
}
}
startServer();
However the doc on the websocket server and the client have different “shared-text” values and I am not quite sure how they are supposed to sync, as Ive tried doing what the documentation said and looking at similar posts here. The websocket server is getting the correct text from the database Im storing it in, but nothing is being sent between the client and server.