Библиотека STOMP.js используется как клиентская реализация протокола STOMP поверх WebSocket и предназначена для взаимодействия с брокерами сообщений, поддерживающими этот протокол. В современных приложениях она применяется для организации двустороннего обмена сообщениями между клиентом и сервером в реальном времени.
Наиболее распространённый способ подключения STOMP.js в современных JavaScript-проектах — установка через npm-пакет.
Основной пакет:
npm install @stomp/stompjs
После установки библиотека становится доступной в проекте как модуль ES или CommonJS в зависимости от конфигурации окружения.
Использование в ES-модулях:
import { Client } from '@stomp/stompjs';
Использование в CommonJS:
const { Client } = require('@stomp/stompjs');
Важно учитывать, что современная версия библиотеки ориентирована на
работу в браузерных и Node.js окружениях через единый API клиента
Client.
При использовании yarn процесс аналогичен:
yarn add @stomp/stompjs
После установки импортирование выполняется теми же способами, что и в npm-сценарии.
Для простых проектов без сборщиков возможно подключение через CDN.
<script src="https://cdn.jsdelivr.net/npm/@stomp/stompjs@7.0.0/bundles/stomp.umd.min.js"></script>
После подключения библиотека становится доступной через глобальный объект:
const client = new StompJs.Client();
CDN-версия удобна для прототипов, тестов и небольших страниц, но ограничена по возможностям конфигурации сборки.
STOMP.js работает поверх WebSocket, поэтому наличие поддержки WebSocket в среде выполнения является обязательным.
В браузерах поддержка WebSocket встроена:
const ws = new WebSocket('ws://localhost:8080/ws');
В Node.js WebSocket не является встроенным API, поэтому требуется дополнительная библиотека:
npm install ws
И подключение через настройку глобального объекта:
import WebSocket from 'ws';
global.WebSocket = WebSocket;
Это позволяет STOMP.js использовать WebSocket в серверной среде.
Основной объект библиотеки — Client. Он инкапсулирует
подключение, переподключение, отправку и подписку на сообщения.
import { Client } from '@stomp/stompjs';
const client = new Client({
brokerURL: 'ws://localhost:8080/ws'
});
Параметр brokerURL указывает адрес WebSocket-соединения
брокера сообщений.
В случаях, когда требуется кастомизация создания WebSocket (например,
SockJS или дополнительные параметры), используется
webSocketFactory.
import { Client } from '@stomp/stompjs';
const client = new Client({
webSocketFactory: () => {
return new WebSocket('ws://localhost:8080/ws');
}
});
Этот вариант применяется при необходимости полного контроля над созданием соединения.
После создания клиента необходимо явно активировать соединение:
client.activate();
Метод activate() запускает процесс подключения к
брокеру. Внутри он создаёт WebSocket-соединение и выполняет STOMP
handshake.
Отключение выполняется методом:
client.deactivate();
STOMP.js предоставляет набор callback-хуков для управления состоянием соединения.
client.onConn ect = (frame) => {
console.log('Соединение установлено');
};
frame содержит данные STOMP-ответа брокера, включая
заголовки.
client.onStompEr ror = (frame) => {
console.error('STOMP ошибка:', frame.headers['message']);
};
Этот обработчик вызывается при ошибках протокольного уровня, например при отказе брокера.
client.onWebSocketEr ror = (event) => {
console.error('WebSocket ошибка', event);
};
Используется для отслеживания проблем на уровне транспортного соединения.
client.onWebSocketCl ose = () => {
console.log('Соединение закрыто');
};
STOMP.js предоставляет набор параметров для управления поведением клиента.
Задает задержку автоматического переподключения:
const client = new Client({
brokerURL: 'ws://localhost:8080/ws',
reconnectDelay: 5000
});
Значение указывается в миллисекундах. При 0
автоматическое переподключение отключается.
Механизм проверки живости соединения:
const client = new Client({
brokerURL: 'ws://localhost:8080/ws',
heartbeatIncoming: 4000,
heartbeatOutgoing: 4000
});
heartbeatIncoming — интервал ожидания сообщений от
сервера heartbeatOutgoing — интервал отправки heartbeat на
сервер
Функция логирования внутренних событий:
const client = new Client({
brokerURL: 'ws://localhost:8080/ws',
debug: (str) => {
console.log(str);
}
});
Используется для отладки соединения, STOMP-фреймов и состояния клиента.
STOMP позволяет передавать заголовки при установлении соединения.
client.connectHeaders = {
login: 'user',
passcode: 'password'
};
Эти данные отправляются в STOMP CONNECT frame и используются брокером для авторизации.
При использовании токенов JWT:
const client = new Client({
brokerURL: 'ws://localhost:8080/ws',
connectHeaders: {
Authorization: 'Bearer токен'
}
});
Заголовки могут быть проверены сервером при установке соединения.
В браузере STOMP.js напрямую использует встроенный WebSocket API без дополнительных зависимостей.
В Node.js необходимо:
webSocketFactoryПример для Node.js:
import { Client } from '@stomp/stompjs';
import WebSocket from 'ws';
global.WebSocket = WebSocket;
const client = new Client({
brokerURL: 'ws://localhost:8080/ws'
});
client.activate();
Подключение не устанавливается при использовании HTTP вместо WebSocket:
ws://localhost:8080/ws // корректно
http://localhost:8080/ws // некорректно
Ошибка возникает при отсутствии polyfill:
ReferenceError: WebSocket is not defined
Решается установкой пакета ws.
Если сервер не поддерживает STOMP поверх WebSocket, соединение устанавливается, но сообщения не обрабатываются.
После активации клиент имеет следующие ключевые компоненты:
Эти компоненты работают асинхронно и управляются внутренним event loop библиотеки.
При включённом reconnectDelay клиент автоматически
пытается восстановить соединение:
Это позволяет использовать STOMP.js в нестабильных сетевых условиях без ручного контроля соединения.