> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mastermindcms.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Utils

> Универсальные вызовы и общие хелперы, которые экспортирует msm-components

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

## Универсальные WebSocket вызовы

Эти функции используют инстанс встроенного клиента (экспортируется как `MSM2App`), чтобы вызывать unified WebSocket JSON API:

* `callService(beanId, scope, functionName, args, eventType?, endpoint?)`
* `callRepository(repositoryId, query, eventType?, endpoint?)`
* `updateBean(beanId, scope, payload, eventType?, endpoint?)`

### Вызов backend-сервиса

`callService` возвращает `Promise` с полным ответом клиента. Полезная нагрузка находится в `response.result`:

```js theme={null}
import { callService } from "msm-components/dist/services.js";

const response = await callService(
  "sellerRegistrationServiceImpl",
  "PROTOTYPE",
  "getLoggedProfile",
  []
);

const profile = response.result;
```

Аргументы backend-метода передаются массивом в том же порядке, что и в его Java-сигнатуре. Например, поиск из клиентского приложения:

```js theme={null}
const request = {
  query: { isPublishedForSale: true },
  ignoreRegexWrap: ["isPublishedForSale"],
  offset: 0,
  limit: 10,
  sortName: "createdDate",
  sortDirection: "DESC",
};

const response = await callService(
  "searchManagerServiceImpl",
  "PROTOTYPE",
  "search",
  [request]
);

const items = response.result?.data?.content ?? [];
```

Если backend-метод ожидает строку, сериализуйте запрос перед передачей:

```js theme={null}
await callService(
  "contentContainerServiceImpl",
  "PROTOTYPE",
  "searchContainersResults",
  [JSON.stringify(request)]
);
```

`scope` обычно равен `PROTOTYPE`. `eventType` определяет область публикации ответа (`USER`, `SHARED` или `GLOBAL`), а `endpoint` позволяет указать дополнительный destination для событий.

### Вызов репозитория

`callRepository` принимает имя репозитория и Mongo-подобный объект запроса:

```js theme={null}
import { callRepository } from "msm-components/dist/services.js";

const response = await callRepository("blogCategoryRepository", {
  query: { _id: categoryId },
  sortName: "_id",
  sortDirection: "ASC",
  skip: 0,
  limit: 1,
});

const category = response.result?.[0];
```

### Обновление bean

`updateBean` обновляет значения bean, зарегистрированного с помощью `@Component` или `@Service`, и отправляет payload на backend без ручной работы с RxJS. Например, можно обновить `DummyBean`:

```js theme={null}
import { updateBean } from "msm-components/dist/services.js";

const response = await updateBean(
  "dummyBean",
  "PROTOTYPE",
  { description: "Updated description" }
);

const bean = response.result;
```

Все три helper-функции используют встроенный `MSM2App`, поэтому библиотека должна быть инициализирована до вызова сервиса. Ошибки и права доступа следует обрабатывать на уровне вызывающего кода.

## Хелперы контекста и настроек

* `getLangCode()`
* `getActiveLanguages()`
* `getLanguageDetection()`
* `getWebSiteSettings()`
* `getCdnFolder()`
* `getSecuredFolder()`
* `getSeoUrl(entityId, repositoryName)`
* `getSuperUserLogin()`
* `getAttributeTypes()`
* `getAttributeAreaTypes()`
* `getFormattedDate(date, pattern)`
* `isLogged()`
* `getLoggedProfile()`
* `isOpenAiActive()`

Пример получения настроек сайта и URL SEO:

```js theme={null}
import {
  getWebSiteSettings,
  getSeoUrl,
} from "msm-components/dist/services.js";

const settings = await getWebSiteSettings();
const url = await getSeoUrl(entityId, "sellerSkuRepository");
```

## Cookies и URL хелперы

* `getCookie(name)`
* `setCookie(name, value, expires?, domain?, path?)`
* `deleteAllCookies(ignore)`
* `getDomainName()`
* `languageAwareUrl(url)`
* `setPlatformInfo()`
* `escapeRegExp(string)`
* `getPayloadOfForm(element)`

Пример языко-зависимого URL и cookie:

```js theme={null}
import {
  languageAwareUrl,
  getCookie,
  setCookie,
} from "msm-components/dist/services.js";

setCookie("promo", "spring", null, null, "/");
const language = getCookie("i18next");
const url = await languageAwareUrl("/catalog");
```
