-
Для балансировки пакетов были использованы такие структуры как
array
иobject
, поскольку на более низком уровне абстракцииarray
реализован так же как и список, то между ними нет большой разницы и сообразнее использоватьarray
. -
const mainQueue = [];
- объявление главной очереди, в которой данные будут лежать в уже необходимом для нас порядке. -
const clientQueue = {};
- объявление очереди клиента, куда будут скалдываться все данные от всех клиентов и в будущем перемещаться в основную.
- После того, как сервер был запущен, мы используем
EventEmitter
подписавшись на событиеmessage
, кадждый раз получая данные от клиента активируется функцияbalancer
:
connection.on('message', (message) => { balancer(message, address, handler); });
куда мы передаем следующие данные: message
- данные в виде объекта, address
- уникальный адрес клиента, ip, handler
- сервераная функция обработчик ./handler.js
.
-
Данные из сервера попадают в
balancer.js
в функцию
const processClientMessage = (message, address, handler) => {
гдеmessage
переводим из строчки в объектconst value = JSON.parse(message[message.type + 'Data']);
, чтобы обращаться к данным было проще. -
Если же это первый пакет от нашего клиента, то запишем его имя в переменную
clientName = value.client.name;
-
Если же это не первый пакет от нашего клиента, то будем считывать непосредственно сообщение которое нам пришло
value.edit
:
clientQueue[address] = [value.edit.value];
- сообщение пришло в первый раз и нам нужно создать его очередь в клиентской.clientQueue[address].push(value.edit.value);
- сообщение уже не первое, просто помещаем в клиентскую очередь.queuePush(Object.values(clientQueue).concat());
- собираем сообщения клиентов и отправляем их на перераспределение.if (mainQueue.length !== 0) handler(mainQueue.shift(), address, clientName);
если очередь не пуста, то отдаемhandler'у
пакеты на обработку.