Библиотека STOMP.js построена вокруг событийной модели взаимодействия с брокером сообщений, поэтому большинство методов не возвращают данные в классическом смысле синхронного результата. Возвращаемые значения в API выполняют роль управляющих дескрипторов, подписок и структурированных сообщений, а не вычисляемых результатов.
Весь набор возвращаемых значений можно условно разделить на несколько категорий:
Такой подход соответствует природе протокола STOMP, где взаимодействие строится через обмен фреймами, а не через прямые вызовы функций с результатом.
client.activate()Метод активации соединения с брокером сообщений:
client.activate();
Возвращаемое значение: void.
Фактически этот метод лишь инициирует процесс подключения. Он не гарантирует моментального установления соединения и не предоставляет Promise. Состояние подключения отслеживается через события:
onConnectonStompErroronWebSocketCloseОтсутствие возвращаемого значения является важным архитектурным решением: клиент работает в реактивной модели, а не в модели запроса-ответа.
client.deactivate()await client.deactivate();
Возвращаемое значение: Promise<void>.
Здесь поведение отличается: деактивация соединения является асинхронной операцией, так как требует:
Promise позволяет корректно дождаться завершения всех процессов перед уничтожением клиента.
client.connectHeaders
и устаревшие connect-методыВ старых версиях STOMP использовался метод connect(),
который возвращал управление через callback’и:
client.connect(headers, onConnect, onError);
Возвращаемое значение: void.
Современная архитектура STOMP.js полностью отказалась от возврата результата через функцию подключения, перенеся всё в события и Promise-ориентированные lifecycle hooks.
client.subscribe(destination, callback)const subscription = client.subscribe('/topic/chat', (message) => {
console.log(message.body);
});
Возвращаемое значение: Subscription.
Объект Subscription является ключевым управляющим
элементом и содержит методы:
unsubscribe()id (идентификатор подписки)ack() (если включён ack-mode)Структура:
interface Subscription {
id: string;
unsubscribe(): void;
}
Фактически Subscription представляет собой ссылку на
серверную подписку, а не локальный event listener.
subscription.unsubscribe()subscription.unsubscribe();
Возвращаемое значение: void.
Операция является односторонней: клиент отправляет команду брокеру на удаление подписки, но не получает подтверждение в виде результата функции.
Подтверждение факта отписки происходит через:
client.publish()client.publish({
destination: '/app/message',
body: JSON.stringify({ text: 'hello' })
});
Возвращаемое значение: void.
Отправка сообщения реализована как fire-and-forget операция. Это соответствует протоколу STOMP, где:
Даже при наличии headers результат не выражается в return value.
STOMP.js не возвращает receipts напрямую через методы, но поддерживает механизм подтверждений через заголовки:
client.publish({
destination: '/app/task',
body: 'data',
headers: {
'receipt': 'msg-123'
}
});
Подтверждение приходит асинхронно через callback клиента:
client.onRece ipt = (frame) => {
console.log(frame);
};
Тип frame:
interface IFrame {
command: string;
headers: { [key: string]: string };
body: string;
}
Таким образом, receipt не является return value, а представляет собой отдельное событие.
(message: IMessage)client.subscribe('/topic/news', (message) => {
console.log(message.body);
});
Объект message имеет тип IMessage:
interface IMessage {
command: string;
headers: StompHeaders;
body: string;
ack(): void;
nack(): void;
}
Ключевые особенности:
body всегда строка (даже если отправлялся JSON)headers содержит метаданные брокераack() и nack() доступны только при
соответствующем режиме подпискиmessage.ack() и
message.nack()message.ack();
message.nack();
Возвращаемое значение: void.
Эти методы не возвращают результат выполнения, так как подтверждение доставки обрабатывается сервером асинхронно.
В STOMP.js практически отсутствуют синхронные возвращаемые данные, зависящие от сервера. Это принципиальная особенность:
Поэтому возвращаемые значения методов можно классифицировать так:
void — команды управления и отправкиPromise<void> — завершение жизненного циклаSubscription — управление подпискойIMessage / IFrame — входящие данныеSTOMP.js активно использует TypeScript, поэтому возвращаемые значения строго типизированы.
Примеры типов:
activate(): void;
deactivate(): Promise<void>;
subscribe(destination: string, callback: (message: IMessage) => void): Subscription;
publish(params: PublishParams): void;
Такое разделение позволяет:
Возвращаемые значения STOMP.js фактически отражают состояние системы:
Subscription — активная связь с топикомPromise<void> — процесс завершения
соединенияvoid — команда отправлена, но не контролируетсяIMessage — событие доставкиЭта модель делает библиотеку ближе к потоковым системам, чем к традиционным API-клиентам.
Ошибки в STOMP.js также не возвращаются через значения функций. Вместо этого используются:
client.onStompEr ror = (frame) => {
console.error(frame.headers['message']);
};
или:
client.onWebSocketEr ror = (event) => {};
Возвращаемое значение при этом отсутствует (void), что
подчёркивает асинхронный характер обработки ошибок.
STOMP.js можно формализовать через следующую схему:
void | Promise<void>SubscriptionIMessagevoidIFrame через событияЭта модель делает библиотеку предсказуемой в рамках потоковой архитектуры, где результат операции всегда отделён от её вызова и переносится в события или подписки.