All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.scalecube.services.gateway.websocket.GatewayMessages Maven / Gradle / Ivy

The newest version!
package io.scalecube.services.gateway.websocket;

import io.scalecube.services.api.ServiceMessage;
import io.scalecube.services.exceptions.ServiceProviderErrorMapper;

public final class GatewayMessages {

  static final String QUALIFIER_FIELD = "q";
  static final String STREAM_ID_FIELD = "sid";
  static final String DATA_FIELD = "d";
  static final String SIGNAL_FIELD = "sig";
  static final String INACTIVITY_FIELD = "i";
  static final String RATE_LIMIT_FIELD = "rlimit";

  private GatewayMessages() {
    // Do not instantiate
  }

  /**
   * Returns cancel message by given arguments.
   *
   * @param sid sid
   * @param qualifier qualifier
   * @return {@link ServiceMessage} instance as the cancel signal
   */
  public static ServiceMessage newCancelMessage(long sid, String qualifier) {
    return ServiceMessage.builder()
        .qualifier(qualifier)
        .header(STREAM_ID_FIELD, sid)
        .header(SIGNAL_FIELD, Signal.CANCEL.code())
        .build();
  }

  /**
   * Returns error message by given arguments.
   *
   * @param errorMapper error mapper
   * @param request request
   * @param th cause
   * @return {@link ServiceMessage} instance as the error signal
   */
  public static ServiceMessage toErrorResponse(
      ServiceProviderErrorMapper errorMapper, ServiceMessage request, Throwable th) {

    final String qualifier = request.qualifier() != null ? request.qualifier() : "scalecube/error";
    final String sid = request.header(STREAM_ID_FIELD);
    final ServiceMessage errorMessage = errorMapper.toMessage(qualifier, th);

    if (sid == null) {
      return ServiceMessage.from(errorMessage).header(SIGNAL_FIELD, Signal.ERROR.code()).build();
    }

    return ServiceMessage.from(errorMessage)
        .header(SIGNAL_FIELD, Signal.ERROR.code())
        .header(STREAM_ID_FIELD, sid)
        .build();
  }

  /**
   * Returns complete message by given arguments.
   *
   * @param sid sid
   * @param qualifier qualifier
   * @return {@link ServiceMessage} instance as the complete signal
   */
  public static ServiceMessage newCompleteMessage(long sid, String qualifier) {
    return ServiceMessage.builder()
        .qualifier(qualifier)
        .header(STREAM_ID_FIELD, sid)
        .header(SIGNAL_FIELD, Signal.COMPLETE.code())
        .build();
  }

  /**
   * Returns response message by given arguments.
   *
   * @param sid sid
   * @param message request
   * @param isErrorResponse should the message be marked as an error?
   * @return {@link ServiceMessage} instance as the response
   */
  public static ServiceMessage newResponseMessage(
      long sid, ServiceMessage message, boolean isErrorResponse) {
    if (isErrorResponse) {
      return ServiceMessage.from(message)
          .header(STREAM_ID_FIELD, sid)
          .header(SIGNAL_FIELD, Signal.ERROR.code())
          .build();
    }
    return ServiceMessage.from(message).header(STREAM_ID_FIELD, sid).build();
  }

  /**
   * Verifies the sid existence in a given message.
   *
   * @param message message
   * @return incoming message
   */
  public static ServiceMessage validateSid(ServiceMessage message) {
    if (message.header(STREAM_ID_FIELD) == null) {
      throw WebsocketContextException.badRequest("sid is missing", message);
    } else {
      return message;
    }
  }

  /**
   * Verifies the sid is not used in a given session.
   *
   * @param session session
   * @param message message
   * @return incoming message
   */
  public static ServiceMessage validateSidOnSession(
      WebsocketGatewaySession session, ServiceMessage message) {
    long sid = getSid(message);
    if (session.containsSid(sid)) {
      throw WebsocketContextException.badRequest("sid=" + sid + " is already registered", message);
    } else {
      return message;
    }
  }

  /**
   * Verifies the qualifier existence in a given message.
   *
   * @param message message
   * @return incoming message
   */
  public static ServiceMessage validateQualifier(ServiceMessage message) {
    if (message.qualifier() == null) {
      throw WebsocketContextException.badRequest("qualifier is missing", message);
    }
    return message;
  }

  /**
   * Returns sid from a given message.
   *
   * @param message message
   * @return sid
   */
  public static long getSid(ServiceMessage message) {
    return Long.parseLong(message.header(STREAM_ID_FIELD));
  }

  /**
   * Returns signal from a given message.
   *
   * @param message message
   * @return signal
   */
  public static Signal getSignal(ServiceMessage message) {
    String header = message.header(SIGNAL_FIELD);
    return header != null ? Signal.from(Integer.parseInt(header)) : null;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy