многорежимное хранилище на сервере сокетов узла - PullRequest
0 голосов
/ 02 мая 2018

Я сейчас учусь реагировать и излишне, и я делаю практический проект, чтобы столкнуться с некоторыми проблемами.

Проект представляет собой многопользовательский лабиринт, поэтому я решил, что использование сервера socket.io, а также этого игрока будет ограничено в игровом контексте лабиринта, поэтому я использую комнату (пространство имен io).

Весь игровой контекст хранится в резерве на сервере узла и подключается к пользовательскому интерфейсу клиентов.

из-за этого у меня есть многокомнатный сервер, я хочу отдельный магазин для каждой комнаты / игры. В абсолютном выражении я могу комбинировать редукторы, но это означает потерю производительности и требует мрачной архитектуры действий и хранения.

проблема в том, что я не знаю, как создать мульти-магазин на node.js

В данный момент сервер работает в этом случае -> при подключении клиента -> если текущая комната заполнена, сгенерировать новую игру, назначенную для текущей комнаты

  public generate = (server:SocketIO.Server) =>{
        let newIDGenetator = new Idgenerator();
        let store = redux.createStore(labActionReducer);
        let room = server.of('/room'+this.labs.length);
        let socketHandler =  new SocketHandler(room,store,newIDGenetator);
        this.labs.push(socketHandler);

this is the fonction call for generate a new game :
-> create idgenerator wich is just an incr who return is value cast in string 
-> create a new store 
-> create a io namespace 
-> create a new socketHandler which  implemente :


room.on('connect' , (client,store) => 
    client.on('foo',()=> 
         store.dispatch({type:bar});
    )
)

и прослушивание хранилища для отправки нового состояния каждому клиенту комнаты обработки

первая комната работает хорошо, но когда создается второй корень, клиент показывает данные о состоянии первой комнаты, когда я пытаюсь получить начальное состояние

Клиент подключен в хорошем пространстве имен,

Так что я полагаю, что createStore не создает новый магазин. Не могли бы вы помочь мне создать новый магазин, независимый от первого? если нужно больше подробностей, я могу дать вам ссылку на gitHub проекта.

спасибо, что прочитали:)

редактировать: socketHandler код:

export class SocketHandler{
    private playersId = {};
    private store:Store<Lab,LabActionTypes>;
    constructor(server:Namespace,store:Store<Lab,LabActionTypes>,idgenerator:Idgenerator){
        this.store = store;

        store.subscribe(()=>{
            console.log(this.store.getState());
            for(let playerId in this.playersId){
                let newState = this.store.getState() //utiliser reducer_relatif(state,playerId)
                this.playersId[playerId].emit('gridChanged',newState);
             }
        })

        server.on('connect',(client)=>{
            let newID = idgenerator.generetaId()
            this.playersId[newID]=client;
            store.dispatch(action.NewPlayer(newID));
            NewClient(client,store,this);
        });

    }
    public getPlayerBySocket = (socket:SocketIO.Socket)=>{
        for(let playerId in this.playersId){
            if(this.playersId[playerId]===socket){
                return playerId;
            }
        }
    }
}

export const NewClient = (client: SocketIO.Socket,store:redux.Store<Lab,LabActionTypes>,socketHandler:SocketHandler) => {                 


    client.on('up',()=>{
        let player = socketHandler.getPlayerBySocket(client);
        store.dispatch(action.PlayerMooveUp(player,store));
        console.log(JSON.stringify(store.getState()));
    })

    client.on('down',()=>{
        let player = socketHandler.getPlayerBySocket(client);
        store.dispatch(action.PlayerMooveDown(player,store));
    })

    client.on('left',()=>{
        let player = socketHandler.getPlayerBySocket(client);
        store.dispatch(action.PlayerMooveLeft(player,store));
    })

    client.on('right',()=>{
        let player = socketHandler.getPlayerBySocket(client);
        store.dispatch(action.PlayerMooveRight(player,store));
    })
...