Типы возвращаемых значений

Библиотека STOMP.js построена вокруг событийной модели взаимодействия с брокером сообщений, поэтому большинство методов не возвращают данные в классическом смысле синхронного результата. Возвращаемые значения в API выполняют роль управляющих дескрипторов, подписок и структурированных сообщений, а не вычисляемых результатов.

Весь набор возвращаемых значений можно условно разделить на несколько категорий:

  • управляющие объекты (Subscription, Client)
  • структурированные сообщения (IMessage)
  • отсутствующие возвращаемые значения (void)
  • асинхронные события через callback’и

Такой подход соответствует природе протокола STOMP, где взаимодействие строится через обмен фреймами, а не через прямые вызовы функций с результатом.


Возвращаемые значения при подключении клиента

client.activate()

Метод активации соединения с брокером сообщений:

client.activate();

Возвращаемое значение: void.

Фактически этот метод лишь инициирует процесс подключения. Он не гарантирует моментального установления соединения и не предоставляет Promise. Состояние подключения отслеживается через события:

  • onConnect
  • onStompError
  • onWebSocketClose

Отсутствие возвращаемого значения является важным архитектурным решением: клиент работает в реактивной модели, а не в модели запроса-ответа.


client.deactivate()

await client.deactivate();

Возвращаемое значение: Promise<void>.

Здесь поведение отличается: деактивация соединения является асинхронной операцией, так как требует:

  • закрытия WebSocket
  • завершения активных подписок
  • очистки внутренних очередей

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.

Операция является односторонней: клиент отправляет команду брокеру на удаление подписки, но не получает подтверждение в виде результата функции.

Подтверждение факта отписки происходит через:

  • отсутствие дальнейших сообщений
  • серверные receipts (если включены)

Возвращаемые значения при отправке сообщений

client.publish()

client.publish({
  destination: '/app/message',
  body: JSON.stringify({ text: 'hello' })
});

Возвращаемое значение: void.

Отправка сообщения реализована как fire-and-forget операция. Это соответствует протоколу STOMP, где:

  • клиент отправляет frame SEND
  • брокер асинхронно обрабатывает сообщение
  • ответ не возвращается на уровне метода

Даже при наличии headers результат не выражается в return value.


Receipt-based поведение (косвенные возвращаемые результаты)

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, а представляет собой отдельное событие.


Возвращаемые значения сообщений

Callback подписки (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 практически отсутствуют синхронные возвращаемые данные, зависящие от сервера. Это принципиальная особенность:

  • WebSocket не поддерживает RPC по умолчанию
  • STOMP работает поверх потоковой модели
  • ответы приходят через подписки, а не return

Поэтому возвращаемые значения методов можно классифицировать так:

  • void — команды управления и отправки
  • Promise<void> — завершение жизненного цикла
  • Subscription — управление подпиской
  • IMessage / IFrame — входящие данные
  • callbacks — основной канал получения результата

Поведение типов в TypeScript-реализации

STOMP.js активно использует TypeScript, поэтому возвращаемые значения строго типизированы.

Примеры типов:

activate(): void;

deactivate(): Promise<void>;

subscribe(destination: string, callback: (message: IMessage) => void): Subscription;

publish(params: PublishParams): void;

Такое разделение позволяет:

  • явно отделять синхронные и асинхронные операции
  • предотвращать ожидание результата там, где его нет
  • фиксировать контракт взаимодействия с брокером

Особенности управления жизненным циклом через return-типы

Возвращаемые значения STOMP.js фактически отражают состояние системы:

  • Subscription — активная связь с топиком
  • Promise<void> — процесс завершения соединения
  • void — команда отправлена, но не контролируется
  • IMessage — событие доставки

Эта модель делает библиотеку ближе к потоковым системам, чем к традиционным API-клиентам.


Ошибки и отсутствие return-значений

Ошибки в STOMP.js также не возвращаются через значения функций. Вместо этого используются:

client.onStompEr ror = (frame) => {
  console.error(frame.headers['message']);
};

или:

client.onWebSocketEr ror = (event) => {};

Возвращаемое значение при этом отсутствует (void), что подчёркивает асинхронный характер обработки ошибок.


Итоговая модель типов возвращаемых значений

STOMP.js можно формализовать через следующую схему:

  • Управление соединением → void | Promise<void>
  • Подписки → Subscription
  • Сообщения → IMessage
  • Ошибки → события (callbacks)
  • Отправка → void
  • Receipt → IFrame через события

Эта модель делает библиотеку предсказуемой в рамках потоковой архитектуры, где результат операции всегда отделён от её вызова и переносится в события или подписки.