socket.io Отменить / повторить стек с несколькими пользователями - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть 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);
        });
    });
});
...