on-finished
Advanced tools
Comparing version 2.1.0 to 2.1.1
@@ -0,1 +1,6 @@ | ||
2.1.1 / 2014-10-22 | ||
================== | ||
* Fix handling of pipelined requests | ||
2.1.0 / 2014-08-16 | ||
@@ -2,0 +7,0 @@ ================== |
82
index.js
@@ -53,3 +53,3 @@ /*! | ||
/** | ||
* Determine is message is already finished. | ||
* Determine if message is already finished. | ||
* | ||
@@ -66,3 +66,3 @@ * @param {object} msg | ||
// OutgoingMessage | ||
return Boolean(!socket || msg.finished || !socket.writable) | ||
return Boolean(msg.finished || (socket && !socket.writable)) | ||
} | ||
@@ -80,2 +80,52 @@ | ||
/** | ||
* Attach a finished listener to the message. | ||
* | ||
* @param {object} msg | ||
* @param {function} callback | ||
* @private | ||
*/ | ||
function attachFinishedListener(msg, callback) { | ||
var eeMsg | ||
var eeSocket | ||
var finished = false | ||
function onFinish(error) { | ||
eeMsg.cancel() | ||
eeSocket.cancel() | ||
finished = true | ||
callback(error) | ||
} | ||
// finished on first message event | ||
eeMsg = eeSocket = first([[msg, 'end', 'finish']], onFinish) | ||
function onSocket(socket) { | ||
// remove listener | ||
msg.removeListener('socket', onSocket) | ||
if (finished) return | ||
if (eeMsg !== eeSocket) return | ||
// finished on first socket event | ||
eeSocket = first([[socket, 'error', 'close']], onFinish) | ||
} | ||
if (msg.socket) { | ||
// socket already assigned | ||
onSocket(msg.socket) | ||
return | ||
} | ||
// wait for socket to be assigned | ||
msg.on('socket', onSocket) | ||
if (msg.socket === undefined) { | ||
// node.js 0.8 patch | ||
patchAssignSocket(msg, onSocket) | ||
} | ||
} | ||
/** | ||
* Attach the listener to the message. | ||
@@ -90,3 +140,2 @@ * | ||
var attached = msg.__onFinished | ||
var socket = msg.socket | ||
@@ -96,8 +145,3 @@ // create a private single listener with queue | ||
attached = msg.__onFinished = createListener(msg) | ||
// finished on first event | ||
first([ | ||
[socket, 'error', 'close'], | ||
[msg, 'end', 'finish'], | ||
], attached) | ||
attachFinishedListener(msg, attached) | ||
} | ||
@@ -133,1 +177,21 @@ | ||
} | ||
/** | ||
* Patch ServerResponse.prototype.assignSocket for node.js 0.8. | ||
* | ||
* @param {ServerResponse} res | ||
* @param {function} callback | ||
* @private | ||
*/ | ||
function patchAssignSocket(res, callback) { | ||
var assignSocket = res.assignSocket | ||
if (typeof assignSocket !== 'function') return | ||
// res.on('socket', callback) is broken in 0.8 | ||
res.assignSocket = function _assignSocket(socket) { | ||
assignSocket.call(this, socket) | ||
callback(socket) | ||
} | ||
} |
{ | ||
"name": "on-finished", | ||
"description": "Execute a callback when a request closes, finishes, or errors", | ||
"version": "2.1.0", | ||
"version": "2.1.1", | ||
"contributors": [ | ||
@@ -12,10 +12,10 @@ "Douglas Christopher Wilson <doug@somethingdoug.com>", | ||
"dependencies": { | ||
"ee-first": "1.0.5" | ||
"ee-first": "1.1.0" | ||
}, | ||
"devDependencies": { | ||
"istanbul": "0.3.0", | ||
"mocha": "~1.21.4" | ||
"istanbul": "0.3.2", | ||
"mocha": "~2.0.0" | ||
}, | ||
"engine": { | ||
"node": ">= 0.8.0" | ||
"engines": { | ||
"node": ">= 0.8" | ||
}, | ||
@@ -22,0 +22,0 @@ "files": [ |
# on-finished | ||
[![NPM Version](http://img.shields.io/npm/v/on-finished.svg?style=flat)](https://www.npmjs.org/package/on-finished) | ||
[![Node.js Version](http://img.shields.io/badge/node.js->=_0.8-brightgreen.svg?style=flat)](http://nodejs.org/download/) | ||
[![Build Status](http://img.shields.io/travis/jshttp/on-finished.svg?style=flat)](https://travis-ci.org/jshttp/on-finished) | ||
[![Coverage Status](https://img.shields.io/coveralls/jshttp/on-finished.svg?style=flat)](https://coveralls.io/r/jshttp/on-finished) | ||
[![NPM Version][npm-image]][npm-url] | ||
[![NPM Downloads][downloads-image]][downloads-url] | ||
[![Node.js Version][node-version-image]][node-version-url] | ||
[![Build Status][travis-image]][travis-url] | ||
[![Test Coverage][coveralls-image]][coveralls-url] | ||
@@ -77,3 +78,3 @@ Execute a callback when a request closes, finishes, or errors. | ||
var http = require('http') | ||
var onFinished = require('finished') | ||
var onFinished = require('on-finished') | ||
@@ -92,1 +93,12 @@ http.createServer(function onRequest(req, res) { | ||
[MIT](LICENSE) | ||
[npm-image]: https://img.shields.io/npm/v/on-finished.svg?style=flat | ||
[npm-url]: https://npmjs.org/package/on-finished | ||
[node-version-image]: https://img.shields.io/node/v/on-finished.svg?style=flat | ||
[node-version-url]: http://nodejs.org/download/ | ||
[travis-image]: https://img.shields.io/travis/jshttp/on-finished.svg?style=flat | ||
[travis-url]: https://travis-ci.org/jshttp/on-finished | ||
[coveralls-image]: https://img.shields.io/coveralls/jshttp/on-finished.svg?style=flat | ||
[coveralls-url]: https://coveralls.io/r/jshttp/on-finished?branch=master | ||
[downloads-image]: https://img.shields.io/npm/dm/on-finished.svg?style=flat | ||
[downloads-url]: https://npmjs.org/package/on-finished |
9824
151
103
+ Addedee-first@1.1.0(transitive)
- Removedee-first@1.0.5(transitive)
Updatedee-first@1.1.0