import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/ru/functional-basic/Classes/BroadcastMessage - Сообщения BroadcastChannel'/>

# Класс BroadcastMessage

Класс для работы с сообщениями между различными контекстами браузера (вкладками, окнами, iframe) с использованием API `BroadcastChannel`. Предоставляет удобный интерфейс для отправки и получения данных с автоматическим управлением жизненным циклом канала и обработкой ошибок.

Включает автоматическое префиксное именование для предотвращения конфликтов и интегрируется с `ErrorCenter` для мониторинга сбоев инициализации.

## Ключевые особенности

- **Межконтекстное взаимодействие** — простая синхронизация данных между всеми окнами одного и того же источника (origin).
- **На основе колбэков** — автоматическая обработка входящих сообщений и ошибок через регистрируемые функции обратного вызова.
- **Безопасность выполнения** — встроенная проверка среды DOM предотвращает ошибки при серверном рендеринге (SSR).
- **Изоляция каналов** — автоматическое добавление уникального префикса к именам каналов через `DataStorage`.
- **Строгая типизация** — полная поддержка TypeScript дженериков для обеспечения целостности данных сообщения.

## Инициализация

Для инициализации объекта вызовите конструктор `BroadcastMessage(name, callback, callbackError, errorCenter)`.

### Ограничения дженериков (Generic Constraints)

- `Message = any` — тип полезной нагрузки сообщения.

**Параметры:**
- `name: string` — уникальное имя канала связи.
- `callback?: (event: MessageEvent<Message>) => void` — функция обратного вызова при получении сообщения.
- `callbackError?: (event: MessageEvent<Message>) => void` — функция обратного вызова при ошибке сообщения.
- `errorCenter: ErrorCenterInstance` — экземпляр центра ошибок (по умолчанию: `ErrorCenter.getItem()`).

```typescript
import { BroadcastMessage } from '@dxtmisha/functional-basic'

const messenger = new BroadcastMessage<string>(
  'my-channel',
  (event) => console.log('Получено:', event.data)
)
```

## Методы

### Действие

- `post(message: Message): this` — Отправляет сообщение всем слушателям в том же канале.
- `destroy(): this` — Закрывает канал и прекращает прослушивание сообщений.

### Настройка и доступ

- `getChannel(): BroadcastChannel | undefined` — Возвращает базовый экземпляр `BroadcastChannel`.
- `setCallback(callback: Function): this` — Обновляет функцию обработки входящих сообщений.
- `setCallbackError(callbackError: Function): this` — Обновляет функцию обработки ошибок.

## Примеры

### Синхронизация состояния между вкладками

```typescript
import { BroadcastMessage } from '@dxtmisha/functional'

// Во всех вкладках приложения
const authChannel = new BroadcastMessage<string>('auth-status', (event) => {
  if (event.data === 'LOGOUT') {
    authModule.clearSession()
    window.location.reload()
  }
})

// При выходе пользователя в одной из вкладок
function onLogout() {
  authChannel.post('LOGOUT')
}
```

### Обновление обработчика на лету

```typescript
const messenger = new BroadcastMessage('data-sync')

messenger.setCallback((event) => {
  console.log('Данные получены:', event.data)
})

messenger.post({ id: 1, status: 'active' })
```
