conduit
Version:
Evented pipelines.
68 lines (54 loc) • 2.24 kB
JavaScript
// Control-flow utilities.
var cadence = require('cadence')
// Return the first not null-like value.
var coalesce = require('extant')
// Proxied header constructor.
var Header = require('./header')
// An evented message queue.
var Procession = require('procession')
// Pluck a shutdown timeout if it is the first argument to a constructor.
var Timeout = require('./timeout')
// Send a Node.js HTTP stream over a Conduit event stream.
var Sender = require('./sender')
// Convert a Conduit event stream into an HTTP write.
var Consumer = require('./consumer')
var operation = require('operation')
var abend = require('abend')
// Create a new request that proxies the given Node.js HTTP request and response
// through the given Conduit client. An optional rewrite function can be used to
// amend the HTTP headers before the request is proxied.
//
function Requester (destructible, vargs) {
destructible.destruct.wait(destructible.durable('terminator'))
var timeout = Timeout(15000, vargs)
this._conduit = vargs.shift()
this._rewrite = operation.shift(vargs)
this._instance = 0
this._destructible = destructible
}
// http://stackoverflow.com/a/5426648
Requester.prototype.request = function (request, response) {
this._destructible.ephemeral([ 'request', this._instance++ ], this, '_request', request, response, null)
}
Requester.prototype._request = cadence(function (async, destructible, request, response) {
var receiver = { outbox: new Procession, inbox: new Procession }
var header = new Header(request)
this._rewrite.call(null, header)
var receiver = { outbox: new Procession, inbox: new Procession }
var _request = this._conduit.connect({
module: 'conduit/requester',
method: 'header',
body: header,
inbox: true,
outbox: true
})
var consumer = new Consumer(response, 'conduit/middleware')
_request.inbox.pump(consumer, 'enqueue').run(destructible.durable('consumer'))
Sender(request, _request.outbox, 'conduit/requester', async())
})
module.exports = cadence(function (async, destructible) {
var vargs = []
vargs.push.apply(vargs, arguments)
vargs.splice(0, 2)
return new Requester(destructible, vargs)
})