|
var http = require('http'); |
|
var logger = require('./logger'); |
|
var PORT = 1337; |
|
|
|
// |
|
// Methods of task execution |
|
// |
|
function takeItEasy(duration) { |
|
return function () { |
|
var callee = arguments.callee; |
|
if (arguments.length > 0) { |
|
var args = Array.prototype.slice.apply(arguments); |
|
args.shift()(); |
|
setTimeout(function () { |
|
callee.apply(null, args); |
|
}, duration); |
|
} |
|
}; |
|
} |
|
|
|
function imperative() { |
|
for (var i = 0; i < arguments.length; i++) { |
|
arguments[i](); |
|
} |
|
} |
|
|
|
function serial() { |
|
if (arguments.length > 0) { |
|
var args = Array.prototype.slice.apply(arguments); |
|
args.shift()(function () { |
|
serial.apply(null, args); |
|
}); |
|
} |
|
} |
|
|
|
// |
|
// Server and client |
|
// |
|
function createServer(execMethod, onListening, onClose) { |
|
var server = http.createServer(); |
|
server.on('request', function (req, res) { |
|
logger.server('Req received header'); |
|
req.on('data', function (chunk) { |
|
logger.server('Req received', chunk.toString()); |
|
}); |
|
req.on('end', function () { |
|
logger.server('Req end'); |
|
execMethod(function () { |
|
logger.server('Res writing header'); |
|
res.writeHead(200, { 'Content-Type': 'text/plain'}); |
|
}, function () { |
|
logger.server('Res sending Foo'); |
|
res.write('Foo'); |
|
}, function () { |
|
logger.server('Res ending with Bar'); |
|
res.end('Bar'); |
|
}, function () { |
|
logger.server('Closing'); |
|
server.close(); |
|
}); |
|
}); |
|
}); |
|
server.on('listening', function () { |
|
logger.server('Listening') |
|
onListening(); |
|
}); |
|
server.on('close', onClose); |
|
server.listen(PORT); |
|
} |
|
|
|
function createClient(execMethod) { |
|
var messages = ['Hello', 'World']; |
|
var req; |
|
|
|
execMethod(function () { |
|
logger.client('Req requesting') |
|
var options = { host: 'localhost', port: PORT, path: '/' }; |
|
req = http.request(options); |
|
req.on('response', function (res) { |
|
logger.client('Res received header'); |
|
res.on('data', function (chunk) { |
|
logger.client('Res received', chunk.toString()); |
|
}); |
|
res.on('end', function () { |
|
logger.client('Res end'); |
|
}) |
|
}); |
|
}, function () { |
|
logger.client('Req setting content-length'); |
|
var contentLength = messages.reduce(function (sum, value) { |
|
return sum + Buffer.byteLength(value); |
|
}, 0); |
|
req.setHeader('Content-Length', contentLength); |
|
}, function () { |
|
logger.client('Req sending', messages[0]); |
|
req.write(messages[0]); |
|
}, function () { |
|
logger.client('Req sending', messages[1]); |
|
req.write(messages[1]); |
|
}, function () { |
|
logger.client('Req ending'); |
|
req.end(); |
|
}); |
|
} |
|
|
|
// |
|
// Make experiments |
|
// |
|
function experiment(name, execMethod) { |
|
return function (callback) { |
|
console.log('---------', name, '---------'); |
|
createServer(execMethod, createClient.bind(null, execMethod), callback); |
|
}; |
|
} |
|
|
|
serial( |
|
experiment('setTimeout 1000', takeItEasy(1000)), |
|
experiment('setTimeout 0', takeItEasy(0)), |
|
experiment('imperative', imperative), |
|
function (callback) { |
|
callback(); |
|
} |
|
); |