Для получения настроек модуля на клиенте нам приходится вызывать серверный скрипт.
Это операция долгая, так как серверные скрипты выполняются через очередь и в итоге наш виджет может ожидать довольно долгое время, прежде чем пользователь увидит результат.
Стандартный подход для получения настроек
Спойлер: Клиентский скрипт
Код:
/* Client scripts module */
async function Init(): Promise<void> {
await Server.rpc.LoadSettings();
}
async function canRender(): Promise<boolean> {
return Context.data.debug_key === 'enabled';
}
Спойлер: Серверный скрипт
Код:
/* Server scripts module */
async function LoadSettings(): Promise<void> {
Context.data.debug_key = Namespace.params.data.debug_key;
}
Оптимизация
Я предлагаю ускорить обращение за счет использования кэша модуля.
Подход такой - обращаемся сначала в кэш, если в кэше нет нашего ключа - обращаемся к серверному сценарию.
Код:
/* Client scripts module */
async function Init(): Promise<void> {
let debug_key: string|undefined;
// Получаем значение из кэша модуля
let cacheItem = await Namespace.cache.getItem('debug_key');
// Если в кэше что-то было
if (cacheItem) {
// Извлекаем значение настроек
debug_key = <string>JSON.parse(cacheItem);
// Сохраняем в контекстную переменную
Context.data.debug_key = debug_key;
}
// Если из кэша не получилось ничего достать
if (typeof debug_key === 'undefined') {
// Выполняем серверный сценарий
await Server.rpc.LoadSettings();
// Получаем результат через контекстную переменную
debug_key = Context.data.debug_key;
// Сохраняем значение в кэш модуля на 1 час
Namespace.cache.setItem('debug_key', JSON.stringify(debug_key), 60 * 60 * 1000);
}
}
Серверный скрипт оставляем без изменений.
Что получаем
В итоге получаем схему, что большинство запросов от пользователей будут выполнять быстро.
Периодически, (в данном случае 1 раз в час), будет отправляться запрос на сервер.
При работе с кэшем помните - значение в кэше может исчезнуть в любой момент. 1 час, который мы выставили - это максимальное время жизни кэша.
При большой нагрузке на сервер значение в кэше может обнулиться и раньше.
Дополнение
При таком подходе, мы можем пропустить обновление настроек модуля.
Если настройки модуля изменяются часто, то я предлагаю следующий подход
1. Создаем кастомную форму для настроек модуля
2. Добавляем стандартную форму элемента и кнопку
3. По клике на кнопку будем скидывать кэш.
Код:
async function cacheReset(): Promise<void> {
await Namespace.cache.setItem('debug_key', JSON.stringify(undefined));
}
4. Получим вот такую форму настроек модуля.