service_imiddleware.js

const debug = require('debug')('dataparty.service.IMiddleware')

/**
 * @interface module:Service.IMiddleware
 * @link module:Service
 */
module.exports = class IMiddleware {

  /**
   * @type string
   * @member module:Service.IMiddleware.Name
   */
  static get Name(){
    throw new Error('not implemented')
  }

  /**
   * Type of middleware. Allowed values are `pre` or `post`
   * @type {'pre' or 'post'}
   * @member module:Service.IMiddleware.Type
   */
  static get Type(){
    throw new Error('not implemented - pre or post')
  }

  /**
   * @type string
   * @member module:Service.IMiddleware.Description
   */
  static get Description(){
    throw new Error('not implemented')
  }

  /**
   * Joi validator that describes any expected config for this middleware
   * @type {Object}
   * @member module:Service.IMiddleware.ConfigSchema
   */
  static get ConfigSchema(){
    throw new Error('not implemented')
  }

  /**
   * @async
   * @method module:Service.IMiddleware.start
   * @param {module:Party.IParty} party 
   */
  static async start(party){

  }

  /**
   * @async
   * @method module:Service.IMiddleware.run
   * @param {module:Service.EndpointContext} context 
   * @param {*} options.Config  The config options set for this instance of middleware
   */
  static async run(context, {Config}){
    throw new Error('not implemented')
  }


  /**
   * @typedef {Object} module:Service.IMiddleware.MiddlewareInfo
   * @property {string} Name
   * @property {string} Type
   * @property {string} Description
   * @property {Object} ConfigSchema
   */

  /**
   * @type module:Service.IMiddleware.MiddlewareInfo
   * @member module:Service.IMiddleware.info
   */
  static get info(){
    return {
      Name: this.Name,
      Type: this.Type,
      Description: this.Description,
      ConfigSchema: this.ConfigSchema
    }
  }
}