node-xyz/xyz-core

View on GitHub
src/Service/Middleware/service.first.find.ts

Summary

Maintainability
A
0 mins
Test Coverage
/** @module service-middlewares */

import { IServDiscMwParam } from './../service.interfaces'
import { bold } from './../../Util/Util'
import XYZ from './../../xyz'

/**
 * Will resolve the service path to an array of nodes that can responde to
 * the target path given. It will then send the message to first node in the array.
 * @method _firstFind
 * @param  {Array}       params [description]
 * @param  {Function}     next   used to call the next middleware
 * @param  {Function}     done   used to end the middleware stack
 * @param  {Object}       xyz    reference to the caller's xyz instance
 */
function _firstFind (params: IServDiscMwParam, next, done, xyz: XYZ) {
  let servicePath = params.opt.servicePath
  let userPayload = params.opt.payload
  let responseCallback = params.responseCallback
  let route = params.opt.route
  let redirect = params.opt.redirect

  let foreignNodes = xyz.serviceRepository.foreignNodes
  let transport = xyz.serviceRepository.transport
  let Path = xyz.path

  let logger = xyz.logger
  let wrapper = xyz.Util.wrapper

  logger.debug(`${bold('FIRST FIND')} :: invoking self with ${JSON.stringify(foreignNodes)}`)
  let matches
  for (let node in foreignNodes) {
    matches = Path.match(servicePath, foreignNodes[node])
    if (matches.length) {
      logger.verbose(`${wrapper('bold', 'FIRST FIND')} :: determined node for service ${wrapper('bold', servicePath)} by first find strategy : ${wrapper('bold', node + ':' + matches[0])}`)
      params.targets.push({node: node, service: matches[0]})
      break
    }
  }
  if ( next ) next()
}

module.exports = _firstFind