server/Plugin.js

import BasePlugin from '../common/BasePlugin.js';

/**
 * Callback executed when the plugin state is updated.
 *
 * @callback server.Plugin~onStateChangeCallback
 * @param {server.Plugin#state} state - Current state of the plugin.
 */

/**
 * Delete the registered {@link server.Plugin~onStateChangeCallback}.
 *
 * @callback server.Plugin~deleteOnStateChangeCallback
 */

/**
 * Base class to extend in order to create the server-side counterpart of a
 * `soundworks` plugin.
 *
 * In the `soundworks` paradigm, a plugin is a component that allows to extend
 * the framework capabilities by encapsulating common and reusable logic in
 * an application wise perspective. For example, plugins are available to handle
 * clock synchronization, to deal with the file system, etc. Plugin should always
 * have both a client-side and a server-side part.
 *
 * See [https://soundworks.dev/guide/ecosystem](https://soundworks.dev/guide/ecosystem)
 * for more informations on the available plugins.
 *
 * _Creating new plugins should be considered an advanced usage._
 *
 * @memberof server
 * @extends BasePlugin
 * @inheritdoc
 */
class Plugin extends BasePlugin {
  #server = null;
  #clients = new Set();

  /**
   * @param {server.Server} server - The soundworks server instance.
   * @param {string} id - User defined id of the plugin as defined in
   *  {@link server.PluginManager#register}.
   */
  constructor(server, id) {
    super(id);
    this.#server = server;
  }

  /**
   * Instance of soundworks server.
   * @type {server.Server}
   * @see {@link server.Server}
   */
  get server() {
    return this.#server;
  }

  /**
   * Set of the clients registered in the plugin.
   * @type {Set<server.Client>}
   * @see {@link server.Client}
   */
  get clients() {
    return this.#clients;
  }

  /**
   * Method called when a client (which registered the client-side plugin),
   * connects to the application. Override this method if you need to perform
   * some particular logic (e.g. creating a shared state) for each clients.
   *
   * @param {server.Client} client
   */
  async addClient(client) {
    this.#clients.add(client);
  }

  /**
   * Method called when a client (which registered the client-side plugin),
   * disconnects from the application. Override this method if you need to perform
   * some particular logic (e.g. creating a shared state) for each clients.
   *
   * @param {server.Client} client
   */
  async removeClient(client) {
    this.#clients.delete(client);
  }
}

export default Plugin;