Архитектура браузерного клиента

часть 1
часть 2

Разработка идет своим ходом, однако поток новой информации уже не такой сильный. Больше времени уходит на анализ имеющегося, разбор деталей и построение концепций, перенос кода на новые концепции (например, последним серьезным изменением был перенос "движка" с FIFO из массивов на события, на коих строится большая часть работы JS)

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

Архитектура браузерного клиента Nektome, Программирование, Длиннопост

Сам движок чата "зашифрован" в chatwss.js
Оранжевым и сиреневым отмечены модули графического интерфейса.

Архитектура

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

Примерно так работает веб-клиент чата (андроид-клиента я не разбирал, но, думаю, примерно так же устроен и он):

Пользователь  работает с GUI, нажимает кнопочки, набирает сообщения. На кнопках висят события, которые, как правило, дают задания ChatEngine.


ChatEngine  в свою очередь является подобием обертки для работы с сокетом. Он формирует и отсылает сообщения на сервер, параллельно передавая команды в GUI.


HandlerMessage - приемник сообщений. Передает новые сообщения и уведомления (о прочтенных сообщениях, о наборе текста, об отключении собеседника) на отрисовку в окне чата.

Архитектура браузерного клиента Nektome, Программирование, Длиннопост

Один из методов ChatEngine:

searchCompany: function(_1) { //на вход принимает данные поиска

_1[action] = SEARCH_COMPANY; //указывает тип действия

stepShow(search_company_step); //несколько команд интерфейсу

$(# closeDialogBtn)[removeClass](disabled);

$(# search_company_loading)[css](visibility, visible);

Socket[send](_1) //отсылка сообщения

},

Сервер получает вот такое сообщение, а в окне запускается поиск собеседника:

{

my_sex: "M",

wish_sex: "F",

my_age_from: "25",

my_age_to: "35",

action: "SEARCH_COMPANY"

}

Пример сообщения от сервера (юзер печатает текст):

{

message: {

dialog_id: 35703950,

typing: true,

uid: 4564686

},

notice: "user_typing_a_message"

}

Отсылка команд на обработку. Не очень безопасно, но весьма практично. Берется  значения поля notice  и запускается метод хэндлера с таким же именем.

ws[onmessage] = function(_E) {  //прием сообщения от сервера

var _6 = JSON[parse](_E[data]); //разобрка принятой строки в JSON-объект

if (HandlerMessage[_6[notice]]) { //проверка наличия метода в хэндлере

if (_6[request_id]) {  

HandlerMessage[_6[notice]](_6[message], _6[request_id])  // вызов 1

} else {

HandlerMessage[_6[notice]](_6[message]) //вызов 2

}

}

};

Примерно так выглядит обмен сообщениями на сокете. Зеленым обозначены исходящие сообщения, остальное - принимаемые.

Архитектура браузерного клиента Nektome, Программирование, Длиннопост

Начинается с авторизации, затем поиск, открытие диалога. Кстати, идет постоянный спам сообщениями о количестве онлайн-пользователей.

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

P.S. как тут код отформатировать? Пробелы в начале строки отрезает

DELETED
Автор поста оценил этот комментарий

ееееее, потрашки....вкусняшка

раскрыть ветку