Skip to content
This repository has been archived by the owner on Apr 20, 2019. It is now read-only.

Commit

Permalink
Merge pull request #64 from cadecairos/node-6
Browse files Browse the repository at this point in the history
Node 4 and 6 support
  • Loading branch information
Christopher De Cairos committed May 26, 2016
2 parents 6ee525a + 32fabe8 commit a5c5702
Show file tree
Hide file tree
Showing 7 changed files with 256 additions and 235 deletions.
7 changes: 4 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
language: node_js

sudo: false

node_js:
- 0.10
- 0.12
- iojs
- 4
- 6
15 changes: 7 additions & 8 deletions examples/batch.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
'use strict';

// Load modules

var Hapi = require('hapi');
const Hapi = require('hapi');


// Declare internals

var internals = {};
const internals = {};


/**
Expand Down Expand Up @@ -53,7 +55,7 @@ internals.requestBatch = function (request, reply) {
method: 'POST',
url: '/batch',
payload: '{ "requests": [{ "method": "get", "path": "/profile" }, { "method": "get", "path": "/item" }, { "method": "get", "path": "/item/$1.id" }] }'
}, function (res) {
}, (res) => {

reply(res.result);
});
Expand All @@ -72,16 +74,13 @@ internals.main = function () {
{ method: 'GET', path: '/request', handler: internals.requestBatch }
]);

internals.http.register(require('../'), function (err) {
internals.http.register(require('../'), (err) => {

if (err) {
console.log(err);
}
else {
internals.http.start(function () {

console.log('Server started.');
});
internals.http.start(() => console.log('Server started.'));
}
});
};
Expand Down
122 changes: 70 additions & 52 deletions lib/batch.js
Original file line number Diff line number Diff line change
@@ -1,36 +1,44 @@
'use strict';

// Load modules

var Url = require('url');
var Async = require('async');
var Boom = require('boom');
var Traverse = require('traverse');
var Hoek = require('hoek');
var Joi = require('joi');
const Url = require('url');
const Async = require('async');
const Boom = require('boom');
const Traverse = require('traverse');
const Hoek = require('hoek');
const Joi = require('joi');

// Declare internals

var internals = {};
const internals = {};

module.exports.config = function (settings) {

return {
handler: function (request, reply) {

var resultsData = {
const resultsData = {
results: [],
resultsMap: []
};

var requests = [];
var requestRegex = /(?:\/)(?:\$(\d)+\.)?([^\/\$]*)/g; // /project/$1.project/tasks, does not allow using array responses
const requests = [];
const requestRegex = /(?:\/)(?:\$(\d)+\.)?([^\/\$]*)/g; // /project/$1.project/tasks, does not allow using array responses

var payloads = [];
var payloadRegex = /^\$(\d+)(?:\.([^\s\$]*))?/;
const payloads = [];
const payloadRegex = /^\$(\d+)(?:\.([^\s\$]*))?/;

// Validate requests

var errorMessage = null;
var parseRequest = function ($0, $1, $2) {
let errorMessage = null;
let i = 0;
let requestParts;
let result;

const il = request.payload.requests.length;

const parseRequest = function ($0, $1, $2) {

if ($1) {
if ($1 < i) {
Expand All @@ -46,12 +54,12 @@ module.exports.config = function (settings) {
return '';
};

for (var i = 0, il = request.payload.requests.length; i < il; ++i) {
for ( ; i < il; ++i) {

// Break into parts

var requestParts = [];
var result = request.payload.requests[i].path.replace(requestRegex, parseRequest);
requestParts = [];
result = request.payload.requests[i].path.replace(requestRegex, parseRequest);

// Make sure entire string was processed (empty)

Expand All @@ -63,8 +71,8 @@ module.exports.config = function (settings) {
break;
}

var payload = request.payload.requests[i].payload;
var payloadParts = internals.parsePayload(payloadRegex, payload);
const payload = request.payload.requests[i].payload;
const payloadParts = internals.parsePayload(payloadRegex, payload);

payloads.push(payloadParts || []);
}
Expand Down Expand Up @@ -95,20 +103,23 @@ module.exports.config = function (settings) {

internals.process = function (request, requests, payloads, resultsData, reply) {

var fnsParallel = [];
var fnsSerial = [];
const fnsParallel = [];
const fnsSerial = [];

var callBatch = function (pos, requestParts, payloadParts) {
const callBatch = function (pos, requestParts, payloadParts) {

return function (callback) {
return (callback) => {

internals.batch(request, resultsData, pos, requestParts, payloadParts, callback);
};
};

for (var i = 0, il = requests.length; i < il; ++i) {
var requestParts = requests[i];
var payloadParts = payloads[i];
let i = 0;
const il = requests.length;

for ( ; i < il; ++i) {
const requestParts = requests[i];
const payloadParts = payloads[i];

if (internals.hasRefPart(requestParts) || payloadParts.length) {
fnsSerial.push(callBatch(i, requestParts, payloadParts));
Expand All @@ -119,15 +130,15 @@ internals.process = function (request, requests, payloads, resultsData, reply) {
}

Async.series([
function (callback) {
(callback) => {

Async.parallel(fnsParallel, callback);
},
function (callback) {
(callback) => {

Async.series(fnsSerial, callback);
}
], function (err) {
], (err) => {

if (err) {
reply(err);
Expand All @@ -141,7 +152,9 @@ internals.process = function (request, requests, payloads, resultsData, reply) {

internals.hasRefPart = function (parts) {

for (var i = 0, il = parts.length; i < il; ++i) {
let i = 0;
const il = parts.length;
for ( ; i < il; ++i) {
if (parts[i].type === 'ref') {
return true;
}
Expand All @@ -152,17 +165,19 @@ internals.hasRefPart = function (parts) {

internals.buildPath = function (resultsData, pos, parts) {

var path = '';
var error = null;
let path = '';
let error = null;
let i = 0;
const il = parts.length;

for (var i = 0, il = parts.length; i < il; ++i) {
for ( ; i < il; ++i) {
path += '/';

if (parts[i].type === 'ref') {
var ref = resultsData.resultsMap[parts[i].index];
const ref = resultsData.resultsMap[parts[i].index];

if (ref) {
var value = Hoek.reach(ref, parts[i].value);
const value = Hoek.reach(ref, parts[i].value);

if (value !== null && value !== undefined) {

Expand Down Expand Up @@ -194,7 +209,7 @@ internals.buildPath = function (resultsData, pos, parts) {

internals.parsePayload = function (re, obj) {

var payloadParts = [];
const payloadParts = [];

if (!obj) {
return null;
Expand All @@ -203,7 +218,7 @@ internals.parsePayload = function (re, obj) {
Traverse(obj).forEach(function (value) {

if (typeof value === 'string') {
var match = value.match(re);
const match = value.match(re);
if (match) {
payloadParts.push({
path: this.path,
Expand All @@ -219,24 +234,27 @@ internals.parsePayload = function (re, obj) {

internals.evalResults = function (results, index, path) {

var result = results[index];
let result = results[index];

if (path) {
result = Hoek.reach(result, path);
result = Hoek.reach(result, path) || {};
}

return result;
};

internals.buildPayload = function (payload, resultsData, parts) {

for (var i = 0, il = parts.length; i < il; ++i) {
let i = 0;
const il = parts.length;
for ( ; i < il; ++i) {

var result = internals.evalResults(resultsData.resultsMap, parts[i].resultIndex, parts[i].resultPath);
const result = internals.evalResults(resultsData.resultsMap, parts[i].resultIndex, parts[i].resultPath);

if (parts[i].path.length) {
Traverse(payload).set(parts[i].path, result);
} else {
}
else {
payload = result;
}
}
Expand All @@ -246,7 +264,7 @@ internals.buildPayload = function (payload, resultsData, parts) {

internals.batch = function (batchRequest, resultsData, pos, requestParts, payloadParts, callback) {

var path = internals.buildPath(resultsData, pos, requestParts);
const path = internals.buildPath(resultsData, pos, requestParts);

if (path instanceof Error) {
resultsData.results[pos] = path;
Expand All @@ -257,7 +275,7 @@ internals.batch = function (batchRequest, resultsData, pos, requestParts, payloa
batchRequest.payload.requests[pos].path = path;

if (payloadParts && payloadParts.length) {
var payload = internals.buildPayload(
const payload = internals.buildPayload(
batchRequest.payload.requests[pos].payload,
resultsData,
payloadParts
Expand All @@ -267,14 +285,14 @@ internals.batch = function (batchRequest, resultsData, pos, requestParts, payloa
batchRequest.payload.requests[pos].payload = payload;
}

internals.dispatch(batchRequest, batchRequest.payload.requests[pos], function (data) {
internals.dispatch(batchRequest, batchRequest.payload.requests[pos], (data) => {

// If redirection
if (('' + data.statusCode).indexOf('3') === 0) {
batchRequest.payload.requests[pos].path = data.headers.location;
internals.dispatch(batchRequest, batchRequest.payload.requests[pos], function (batchData) {
internals.dispatch(batchRequest, batchRequest.payload.requests[pos], (batchData) => {

var batchResult = batchData.result;
const batchResult = batchData.result;

resultsData.results[pos] = batchResult;
resultsData.resultsMap[pos] = batchResult;
Expand All @@ -283,7 +301,7 @@ internals.batch = function (batchRequest, resultsData, pos, requestParts, payloa
return;
}

var result = data.result;
const result = data.result;
resultsData.results[pos] = result;
resultsData.resultsMap[pos] = result;
callback(null, result);
Expand All @@ -293,18 +311,18 @@ internals.batch = function (batchRequest, resultsData, pos, requestParts, payloa

internals.dispatch = function (batchRequest, request, callback) {

var path = request.path;
let path = request.path;

if (request.query) {
var urlObject = {
const urlObject = {
pathname: request.path,
query: request.query
};
path = Url.format(urlObject);
}

var body = (request.payload !== null && request.payload !== undefined ? JSON.stringify(request.payload) : null); // payload can be '' or 0
var injectOptions = {
const body = (request.payload !== null && request.payload !== undefined ? JSON.stringify(request.payload) : null); // payload can be '' or 0
const injectOptions = {
url: path,
method: request.method,
headers: batchRequest.headers,
Expand Down
10 changes: 6 additions & 4 deletions lib/index.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
'use strict';

// Load modules

var Hoek = require('hoek');
var Batch = require('./batch');
const Hoek = require('hoek');
const Batch = require('./batch');


// Declare internals

var internals = {
const internals = {
defaults: {
batchEndpoint: '/batch',
description: 'Batch endpoint',
Expand All @@ -18,7 +20,7 @@ var internals = {

exports.register = function (server, options, next) {

var settings = Hoek.applyToDefaults(internals.defaults, options);
const settings = Hoek.applyToDefaults(internals.defaults, options);

server.route({
method: 'POST',
Expand Down
Loading

0 comments on commit a5c5702

Please sign in to comment.