Skip to content

Commit

Permalink
[ru] update Web/API/EventSource translation (#24681)
Browse files Browse the repository at this point in the history
[ru] update 'Web/API/EventSource' translation
  • Loading branch information
leon-win authored Nov 29, 2024
1 parent 8a33fb2 commit 091a469
Showing 1 changed file with 98 additions and 31 deletions.
129 changes: 98 additions & 31 deletions files/ru/web/api/eventsource/index.md
Original file line number Diff line number Diff line change
@@ -1,54 +1,116 @@
---
title: EventSource
slug: Web/API/EventSource
l10n:
sourceCommit: f216422c99b6c7014e398803b70600501bce8a48
---

{{APIRef("Websockets API")}}
{{APIRef("Server Sent Events")}}{{AvailableInWorkers}}

`Интерфейс EventSource` используется для получения серверных событий (Server-sent events). Он устанавливает соединение с сервером по HTTP и получает события в формате text/event-stream без закрытия соединения.
**`EventSource`** — это интерфейс веб-контента для [отправляемых сервером событиям](/ru/docs/Web/API/Server-sent_events).

Вы можете присвоить атрибуту `onmessage` JavaScript-функцию для получения нетипизированных сообщений (то есть сообщений без поля `event`). Вы так же можете вызвать функцию `addEventListener()` для обработки событий так же, как для любого другого источника событий.
Экземпляр `EventSource` открывает постоянное соединение с [HTTP](/ru/docs/Web/HTTP)-сервером, который отправляет [события](/ru/docs/Learn/JavaScript/Building_blocks/Events) в формате `text/event-stream`.
Соединение остаётся открытым до тех пор, пока не будет закрыто вызовом {{domxref("EventSource.close()")}}.

См. [Using server-sent events](/en/Server-sent_events/Using_server-sent_events) для более детальной информации
{{InheritanceDiagram}}

## Свойства
После открытия соединения входящие сообщения с сервера доставляются в клиентский код в виде событий.
Если во входящем сообщении есть поле события, то вызывается событие, совпадающее со значением этого поля.
Если поле события отсутствует, то запускается общее событие {{domxref("EventSource/message_event", "message")}}.

| Attribute | Type | Description |
| ------------ | -------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `onerror` | `nsIDOMEventListener` | JavaScript-функция, вызываемая при появлении ошибки |
| `onmessage` | `nsIDOMEventListener` | JavaScript-функция, вызываемая при приходе сообщения без поля `event` |
| `onopen` | `nsIDOMEventListener` | JavaScript-функция, вызываемая после открытия соединения |
| `readyState` | [`long`](/en/long) | Состояние соединения, должно иметь одно из значений `CONNECTING`, `OPEN`, или `CLOSED`. **Только для чтения** |
| `url` | {{ domxref("DOMString") }} | **Только для чтения** |
В отличие от [WebSockets](/ru/docs/Web/API/WebSockets_API), отправляемые сервером события являются однонаправленными, то есть сообщения с данными доставляются в одном направлении, от сервера к клиенту (например, веб-браузеру пользователя).
Это делает их отличным выбором, когда нет необходимости отправлять данные в форме сообщений от клиента к серверу. Например, `EventSource` будет полезным для реализации таких функций, как обновление новостной ленты и статуса в социальных сетях, доставки данных в механизм [хранилища на стороне клиента](/ru/docs/Learn/JavaScript/Client-side_web_APIs/Client-side_storage), такой как [IndexedDB](/ru/docs/Web/API/IndexedDB_API) или [веб-хранилища](/ru/docs/Web/API/Web_Storage_API).

В дополнение к открытым атрибутам два внутренних атрибута, которые не открыты напрямую:
> [!WARNING] **Без использования HTTP/2**, максимальное количество открытых SSE-соединений может быть ограничено, что может быть особенно заметным при открытии нескольких вкладок, поскольку ограничение действует _на браузер_ и установлено в очень низкое значение (6). Эта проблема отмечена как «Не будет исправлена» в [Chrome](https://crbug.com/275955) и [Firefox](https://bugzil.la/906896). Ограничение действует на связку «браузер + домен», то есть можно открыть только 6 SSE-соединений к `www.example1.com` для всех вкладок и ещё 6 SSE-соединений к `www.example2.com` (согласно [StackOverflow](https://stackoverflow.com/questions/5195452/websockets-vs-server-sent-events-eventsource/5326159)). При использовании HTTP/2, максимальное количество одновременных _HTTP-потоков_ согласовывается между сервером и клиентом (по умолчанию оно равно 100).

- reconnection time
- : Это время в миллисекундах, используемое для определения продолжительности ожидания после неудачной попытки соединения до повторного соединения
- last event ID string
- : По умолчанию пустая строка. Сервер может отправлять сообщение с полем `id` для установки этого значения.
## Конструктор

## Константы
- {{domxref("EventSource.EventSource", "EventSource()")}}
- : Создаёт новый `EventSource` для обработки отправленных сервером событий с указанного URL-адреса, при необходимости с учётными данными.

| Constant | Value | Description |
| ------------ | ----- | ---------------------------------------------------------------------- |
| `CONNECTING` | `0` | Соединение устанавливается |
| `OPEN` | `1` | Соединение открыто, получение событий |
| `CLOSED` | `2` | Соединение не устанавливается, закрыто, или произошла фатальная ошибка |
## Свойства экземпляра

## Методы
_Этот интерфейс наследует свойства своего родителя, {{domxref("EventTarget")}}._

### close()
- {{domxref("EventSource.readyState")}} {{ReadOnlyInline}}
- : Число, представляющее состояние соединения. Допустимые значения: `CONNECTING` (`0`), `OPEN` (`1`) или `CLOSED` (`2`).
- {{domxref("EventSource.url")}} {{ReadOnlyInline}}
- : Строка, представляющая URL-адрес источника.
- {{domxref("EventSource.withCredentials")}} {{ReadOnlyInline}}
- : Логическое значение, указывающее, был ли объект `EventSource` создан с кросс-доменными ([CORS](/ru/docs/Web/HTTP/CORS)) учётными данными (`true`) или нет (`false`, по умолчанию).

Закрывает соединение, если оно существует и устанавливает атрибут `readyState` в значение `CLOSED`. Если соединение уже закрыто, этот метод ничего не делает.
## Методы экземпляра

```
void close();
```
_Этот интерфейс наследует методы своего родителя, {{domxref("EventTarget")}}._

- {{domxref("EventSource.close()")}}
- : Закрывает соединение и устанавливает атрибут `readyState` в значение `CLOSED`. Если соединение было уже закрыто, то этот метод ничего не делает.

## События

- {{domxref("EventSource/error_event", "error")}}
- : Возникает, когда не удаётся установить соединение с источником событий.
- {{domxref("EventSource/message_event", "message")}}
- : Возникает при получении данных от источника событий.
- {{domxref("EventSource/open_event", "open")}}
- : Возникает при открытии соединения с источником событий.

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

## Примеры

###### Параметры
В этом общем примере объект `EventSource` создаётся для получения неименованных событий, получаемых от сервера.
Страница с именем `sse.php` отвечает за генерацию событий.

Нет
```js
const evtSource = new EventSource("sse.php");
const eventList = document.querySelector("ul");

evtSource.onmessage = (e) => {
const newElement = document.createElement("li");

newElement.textContent = `Сообщение: ${e.data}`;
eventList.appendChild(newElement);
};
```

Каждое полученное событие запускает обработчик `onmessage` объекта `EventSource`, который, создаёт новый элемент {{HTMLElement("li")}}, записывает в него текст сообщения и добавляет его в элемент списка, который был создан заранее.

> [!NOTE]
> Полный код этого примера можно найти на GitHub, смотрите [Simple SSE demo using PHP](https://github.com/mdn/dom-examples/tree/main/server-sent-events).
Для обработки именованных событий необходимо установить обработчик для каждого типа события.

```js
const sse = new EventSource("/api/v1/sse");

/*
* Такой обработчик будет вызываться при поступлении событий такого вида:
*
* event: notice
* data: useful data
* id: some-id
*/
sse.addEventListener("notice", (e) => {
console.log(e.data);
});

/*
* Аналогично, такой код будет обрабатывать события с полем `event: update`
*/
sse.addEventListener("update", (e) => {
console.log(e.data);
});

/*
* Событие "message" является особым случаем.
* Этот обработчик будет вызываться для неименованных событий и для событий с типом `event: message`.
* Он не будет обрабатывать события с другим типом.
*/
sse.addEventListener("message", (e) => {
console.log(e.data);
});
```

## Спецификации

Expand All @@ -57,3 +119,8 @@ void close();
## Совместимость с браузерами

{{Compat}}

## Смотрите также

- [Отправляемые сервером события](/ru/docs/Web/API/Server-sent_events)
- [Использование отправляемых сервером событий](/ru/docs/Web/API/Server-sent_events/Using_server-sent_events)

0 comments on commit 091a469

Please sign in to comment.