CaptureBridge.js

import Plugin from './Plugin.js'
import { BASE_URL, checkResponse } from './Common.js'

/**
 * Capture Bridge
 *
 * @classdesc Class for interacting with the HTTP API's base methods.
 */
class CaptureBridge {
  baseUrl
  /**
   * Instantiate a client for interacting with the Capture Bridge service.
   * @constructor
   * @param {string} [baseURL] - Protocol, domain, and port for the service.
   * @example
   * const captureBridge = new CaptureBridge()
   */
  constructor (baseUrl = BASE_URL) {
    this.baseUrl = baseUrl
  }

  /**
   * Get service version info
   * @method
   * @async
   * @returns {object} Service version info.
   * @see {@link https://local.capturebridge.net:9001/doc/#api-Service-GetVersion|API Endpoint (/version)}
   * @example
   * const captureBridge = new CaptureBridge()
   * const {version} = await captureBridge.version()
   * console.log(version)
   */
  async version () {
    const response = await fetch(`${this.baseUrl}/version`)
    return await response.json()
  }

  /**
   * Get service status information
   * @method
   * @async
   * @see {@link https://local.capturebridge.net:9001/doc/#api-Service-GetStatus|API Endpoint (/status)}
   * @returns {object} Service status information.
   * @example
   * const captureBridge = new CaptureBridge()
   * const statusInfo = await captureBridge.status()
   * console.log(statusInfo)
   */
  async status () {
    const response = await fetch(`${this.baseUrl}/status`)
    return await response.json()
  }

  /**
   * Get instance configuration details
   * @method
   * @async
   * @see {@link https://local.capturebridge.net:9001/doc/#api-Service-GetConfig|API Endpoint (/config)}
   * @returns {object} Instance configuration information.
   * @example
   * const captureBridge = new CaptureBridge()
   * const configInfo = await captureBridge.config()
   * console.log(configInfo)
   */
  async config () {
    const response = await fetch(`${this.baseUrl}/config`)
    return await response.json()
  }

  /**
   * Get all installed plugins
   * @method
   * @async
   * @see {@link https://local.capturebridge.net:9001/doc/#api-Plugin-GetPlugins|API Endpoint (/plugin)}
   * @see {@link Plugin}
   * @returns {object[]} Array of {@link Plugin} objects.
   * @example
   * const plugins = await captureBridge.plugins()
   */
  async plugins () {
    const response = await fetch(`${this.baseUrl}/plugin`)
    const plugins = await response.json()
    return plugins.map(p => new Plugin(p, this.baseUrl))
  }

  /**
   * Get a single plugin by ID
   * @method
   * @async
   * @see {@link https://local.capturebridge.net:9001/doc/#api-Plugin-GetPlugins|API Endpoint (/plugin)}
   * @see {@link Plugin}
   * @param {string} id - Plugin ID
   * @returns {object?} {@link Plugin} object or null
   * @example
   * const plugin = await captureBridge.plugin('capture_camera_canon')
   */
  async plugin (id) {
    const response = await fetch(`${this.baseUrl}/plugin/${id}`)
    await checkResponse(response)
    const pluginJSON = await response.json()
    return new Plugin(pluginJSON)
  }
}

export default CaptureBridge