Задача координирующего сервера создать сессию для клиента или связать клиента с сессией, запланировать сессию, координирующий сервер знает все активные сессии и список серверов сессий с помощью файла конфига servers.json (обновляет раз в N секунд) и постоянного соединения с серверами: 1) имеет 2 файла конфига servers.json и configuration.json a) "servers.json" содержит список серверов "массив верхнего уровня": и их название, адрес, описание вида { "server_name1":"SomeName1", "ip":"0.0.0.0", "port":"111", "info":{ "deskription":[ {"en":"best RC and ..."}, {"ru":"луший ЖК и"} ]} } b) "configuration.json" содержит конфигурацию координатора {"ip":"0.0.0.2", "port":"333", "time_between_updates_seconds":"30"} 2) Подключаемся к координатору с помощью websocket и SSL, a) при подключении к координатору пользователь получает уникальный id {"verb":"GET_TITLES", "range":"X-Y"} (range это сервера с X до Y, например с 0-20 или 20-213, количество серверов = Y - X + 1) a) в случае успеха получаем {"msg":"SERVERS_FOUND", "servers":"{данные из примера "1)a)" }"} b) в случае неудачи получаем {"msg":"SERVERS_NOT_FOUND"} 3) Пользователь планирует сессию с помощью запроса {"verb":"PLAN_SESSION", "rc_name":"SomeRC", "date":"day/month/year", "time":"00:00"} a) в браузере доступен выбор только того времени которое не занято b) координатор сохраняет сессию в список запланированных сессий, файл формата JSON, sessions_planned.json и выдаёт четырёхзначный код с помощью которого можно будет подключиться к сессии в назначенное время {"msg":"CONNECTION_CODE", "code":"1234"} 4) Если пользователь хочет создать сессию без планирования то посылает запрос {"verb":"CREATE_SESSION", "rc_name":"SomeRC"}, координатор создаёт сессию на свободном сервере и возвращает {"verb":"CONNECT_TO_SESSION", "ip":"0.0.0.1", "port":"1111", "code":"1234"}, если все сервера заняты вернёт {"msg":"SERVERS_BUSY"}, когда координатор получает запрос "CREATE_SESSION": a) координатор проверяет список планирования чтобы убедиться что на данное время нет активных записей, затем свободному серверу сессий отправляет запрос на создание сессии {"verb":"CREATE_SESSION", "rc_name":"SomeRC", "user_id":"id123"}, если создать сессию можно, сервер сессий вернёт {"verb":"CONNECT_TO_SESSION", "ip":"0.0.0.1", "port":"1111", "code":"1234"} b) когда клиент получил данные для подключения к сессии он устанавливает соединение с сервером сессий с помощью сокета и разрывает соединение с координатором (может быть не стоит разрывать соединение с координатором) 5) Если пользователь хочет подключиться к сессии с помощью кода то посылает запрос {"verb":"CONNECT_SESSION_WITH_CODE", "code":"1234"}, в ответ придёт {"verb":"CONNECT_TO_SESSION", "ip":"0.0.0.1", "port":"1111", "code":"1234"}, или если сессии не существует {"msg":"SESSION_NOT_EXIST"}. COMMANDS: {"verb":"GET_TITLES", "start":0, "count":50} {"verb":"PLAN_SESSION", "title":"SomeRC", "year":2022, "month":11, "day":4, "hour":20, "minute":13, "period_minute":30} { "title":"SomeRC", "data":[ { "ip":"127.0.0.1", "port":"0000", "copies":5 }, { "ip":"127.0.0.2", "port":"0001", "copies":2 } ]} {"verb":"CREATE_SESSION", "title":"SomeRC"}