Source: client/subscribing-client.js

/*
 * Copyright 2023, TeamDev. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Redistribution and use in source and/or binary forms, with or without
 * modification, must retain the above copyright notice and the following
 * disclaimer.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import {EventSubscriptionRequest, SubscriptionRequest} from "./subscribing-request";

/**
 * A client which manages entity state and event subscriptions.
 *
 * @abstract
 */
export class SubscribingClient {

  /**
   * @param {!ActorRequestFactory} actorRequestFactory
   *        a request factory to build requests to Spine server
   */
  constructor(actorRequestFactory) {
    this._requestFactory = actorRequestFactory;
  }

  /**
   * Creates a new subscription request.
   *
   * @param {!Class<Message>} type the target entity type
   * @param {!Client} client the client that initiated the request
   * @return {SubscriptionRequest} a new subscription request
   */
  subscribeTo(type, client) {
    return new SubscriptionRequest(type, client, this._requestFactory);
  }

  /**
   * Subscribes to a given topic which targets an entity type.
   *
   * @param {!spine.client.Topic} topic a topic to subscribe to
   * @return {Promise<EntitySubscriptionObject<Message>>} a subscription object
   *
   * @template <T> a Protobuf type of entities being the target of a subscription
   */
  subscribe(topic) {
    throw new Error('Not implemented in abstract base.');
  }

  /**
   * Creates a new event subscription request.
   *
   * @param {!Class<Message>} type the target event type
   * @param {!Client} client the client that initiated the request
   * @return {EventSubscriptionRequest} a new event subscription request
   */
  subscribeToEvent(type, client) {
    return new EventSubscriptionRequest(type, client, this._requestFactory);
  }

  /**
   * Subscribes to the given topic which targets an event type.
   *
   * @param {!spine.client.Topic} topic a topic to subscribe to
   * @return {Promise<EventSubscriptionObject>} a subscription object
   */
  subscribeToEvents(topic) {
    throw new Error('Not implemented in abstract base.');
  }

  /**
   * Cancels all subscriptions, which were created through this instance of subscribing client.
   */
  cancelAllSubscriptions() {
    throw new Error('Not implemented in abstract base.');
  }

  /**
   * Returns a new topic factory instance which can be further used for the `Topic` creation.
   *
   * @return {TopicFactory}
   */
  newTopic() {
    return this._requestFactory.topic();
  }
}

const SUBSCRIPTIONS_NOT_SUPPORTED = 'Subscriptions are not supported.';

/**
 * A {@link SubscribingClient} which does not create subscriptions.
 */
export class NoOpSubscribingClient extends SubscribingClient {

  constructor(actorRequestFactory) {
    super(actorRequestFactory)
  }

  /**
   * Always throws an error.
   *
   * @override
   */
  subscribe(topic) {
    throw new Error(SUBSCRIPTIONS_NOT_SUPPORTED);
  }

  /**
   * Always throws an error.
   *
   * @override
   */
  subscribeToEvents(topic) {
    throw new Error(SUBSCRIPTIONS_NOT_SUPPORTED);
  }

  /**
   * Always throws an error.
   *
   * @override
   */
  cancelAllSubscriptions() {
    throw new Error(SUBSCRIPTIONS_NOT_SUPPORTED);
  }
}