src/Service/Middleware/service.generic.transport.ts
import { logger } from './../../Log/Logger'
import { ITransportSendMessageParams } from './../../Transport/transport.interfaces'
import { IServDiscMwParam } from './../service.interfaces'
import XYZ from './../../xyz'
import * as http from 'http'
export function _genericTransportInvoke (params: IServDiscMwParam, next, end, xyz: XYZ) {
const targets = params.targets
const transport = xyz.serviceRepository.transport
const responseCallback = params.responseCallback
const logger = xyz.logger
logger.verbose(`SR :: Generic service discovery message emitter. invoking Transport layer with ${params.targets.map(o => o.node + o.service).join(', ')} | service: ${params.opt.servicePath}.`)
if (targets.length === 0) {
logger.warn(`Sending a message to ${params.opt.servicePath} failed (Local Response)`)
responseCallback(http.STATUS_CODES[404], null, null)
} else if ( targets.length === 1 ) {
let config: ITransportSendMessageParams = {
redirect: params.opt.redirect,
route: params.opt.route,
node: params.targets[0].node,
payload: params.opt.payload ,
service: params.targets[0].service
}
transport.send(config, responseCallback)
end()
} else if (targets.length > 1) {
let wait = 0
let responses = {}
for ( let target of targets ) {
let config: ITransportSendMessageParams = {
redirect: params.opt.redirect,
route: params.opt.route,
node: target.node,
payload: params.opt.payload ,
service: target.service
}
if ( responseCallback ) {
transport.send(config, function (_target, err, body, response) {
responses[`${target.node}:${target.service}`] = [err, body]
wait += 1
if (wait === targets.length) {
responseCallback(null, responses, null)
if (end) end()
}
}.bind(null, target))
} else {
transport.send(config)
}
}
}
}