У меня есть socket.io с node.js, который отлично работает с редактором CodeMirror для синхронизации кода между несколькими пользователями.Однако стек отмены / восстановления связан со всеми правками независимо от пользователя.Как мне сделать так, чтобы у каждого пользователя был свой собственный стек отмены / повторения, а не отменять / отменять правки других пользователей?Вот мой код сервера:
var package = require("../../package.json");
// packages
var express = require("express");
var fs = require("fs");
// express (web server and http server)
var app = express();
var server = require("https").Server(options, app).listen(3100);
var io = require("socket.io")(server, { pingTimeout: 4000, pingInterval: 2000 });
// starts the array of sockets
var clients = [];
// checks if a connection is made
io.sockets.on("connection", function (socket) {
// gets the file ID
var ciphertext = socket.handshake.query["ciphertext"];
// adds the socket to the socket array
socket.ciphertext = ciphertext;
socket.username = socket.handshake.query["username"];
socket.user = socket.handshake.query["user"];
// adds the socket to the list of clients
clients.push(socket);
// checks if the change code has been sent
socket.on("change", function(op) {
// sees if the user has typed, pasted, cut, or deleted text or if the editor has autocompleted
if (op.origin == "+input" || op.origin == "paste" || op.origin == "cut" || op.origin == "+delete" || op.origin == "+insert" || op.origin == "complete" || op.origin == "undo" || op.origin == "redo" ) {
// loops through all sockets and pushes the changes if not the current socket and the same page
clients.forEach(function (client) {
if (client != socket && client.ciphertext == ciphertext) client.emit("change", op);
});
};
});
// checks if the socket disconnected and clears the highlighted text for the socket
socket.on("disconnect", function(){
var existingClients = [];
var i = clients.indexOf(socket);
clients.splice(i, 1);
clients.forEach( function (client) {
existingClients.push(client.username);
});
clients.forEach( function (client) {
client.emit("end", existingClients);
});
});
});