[Pkg-javascript-commits] [node-connect-timeout] 02/11: Imported Upstream version 1.3.0
Leo Iannacone
l3on-guest at moszumanska.debian.org
Fri Oct 10 14:47:11 UTC 2014
This is an automated email from the git hooks/post-receive script.
l3on-guest pushed a commit to branch master
in repository node-connect-timeout.
commit 64808f9cbd13d96076eff5fcc94077c1e22379fb
Author: Leo Iannacone <l3on at ubuntu.com>
Date: Fri Oct 10 16:21:36 2014 +0200
Imported Upstream version 1.3.0
---
.npmignore | 2 -
.travis.yml | 4 +-
HISTORY.md | 44 +++++++++++
History.md | 17 -----
LICENSE | 23 ++++++
README.md | 67 ++++++++--------
index.js | 33 ++++----
package.json | 42 +++++------
test/test.js | 243 ++++++++++++++++++++++++++++++++++-------------------------
9 files changed, 286 insertions(+), 189 deletions(-)
diff --git a/.npmignore b/.npmignore
deleted file mode 100644
index ac0bfb9..0000000
--- a/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-test/
-.travis.yml
diff --git a/.travis.yml b/.travis.yml
index 1e3e05b..1ff243c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,4 +6,6 @@ node_js:
matrix:
allow_failures:
- node_js: "0.11"
- fast_finish: true
\ No newline at end of file
+ fast_finish: true
+script: "npm run-script test-travis"
+after_script: "npm install coveralls at 2.10.0 && cat ./coverage/lcov.info | coveralls"
diff --git a/HISTORY.md b/HISTORY.md
new file mode 100644
index 0000000..1334340
--- /dev/null
+++ b/HISTORY.md
@@ -0,0 +1,44 @@
+1.3.0 / 2014-09-03
+==================
+
+ * deps: debug@~2.0.0
+
+1.2.2 / 2014-08-10
+==================
+
+ * deps: on-headers@~1.0.0
+
+1.2.1 / 2014-07-22
+==================
+
+ * deps: debug at 1.0.4
+
+1.2.0 / 2014-07-11
+==================
+
+ * Accept string for `time` (converted by `ms`)
+ * deps: debug at 1.0.3
+ - Add support for multiple wildcards in namespaces
+
+1.1.1 / 2014-06-16
+==================
+
+ * deps: debug at 1.0.2
+
+1.1.0 / 2014-04-29
+==================
+
+ * Add `req.timedout` property
+ * Add `respond` option to constructor
+
+1.0.1 / 2014-04-28
+==================
+
+ * Clear timer on socket destroy
+ * Compatible with node.js 0.8
+ * deps: debug at 0.8.1
+
+1.0.0 / 2014-03-05
+==================
+
+ * Genesis from `connect`
diff --git a/History.md b/History.md
deleted file mode 100644
index eba8b9c..0000000
--- a/History.md
+++ /dev/null
@@ -1,17 +0,0 @@
-1.1.0 / 2014-04-29
-==================
-
- * Add `req.timedout` property
- * Add `respond` option to constructor
-
-1.0.1 / 2014-04-28
-==================
-
- * Clear timer on socket destroy
- * Compatible with node.js 0.8
- * deps: debug at 0.8.1
-
-1.0.0 / 2014-03-05
-==================
-
- * Genesis from `connect`
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..53e49a3
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,23 @@
+(The MIT License)
+
+Copyright (c) 2014 Jonathan Ong <me at jongleberry.com>
+Copyright (c) 2014 Douglas Christopher Wilson <doug at somethingdoug.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
index d9b18b9..9b1aec2 100644
--- a/README.md
+++ b/README.md
@@ -1,18 +1,28 @@
-# connect-timeout [![Build Status](https://travis-ci.org/expressjs/timeout.svg)](https://travis-ci.org/expressjs/timeout) [![NPM version](https://badge.fury.io/js/connect-timeout.svg)](http://badge.fury.io/js/connect-timeout)
+# connect-timeout
+
+[![NPM Version][npm-image]][npm-url]
+[![NPM Downloads][downloads-image]][downloads-url]
+[![Build Status][travis-image]][travis-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+[![Gratipay][gratipay-image]][gratipay-url]
Times out the request in `ms`, defaulting to `5000`.
## Install
- npm install connect-timeout
+```sh
+$ npm install connect-timeout
+```
## API
-**NOTE** This module is not recommend as a "top-level" middleware (i.e. do not recommend for use as `app.use(timeout(5000))`).
+**NOTE** This module is not recommend as a "top-level" middleware (i.e. `app.use(timeout('5s'))`) unless
+you take precautions to halt your own middleware processing. See [as top-level middleware](#as-top-level-middleware)
+for how to use as a top-level middleware.
-### timeout(ms, options)
+### timeout(time, options)
-Returns middleware that times out in `ms` milliseconds. On timeout, `req` will emit `"timeout"`.
+Returns middleware that times out in `time` milliseconds. `time` can also be a string accepted by the [ms](https://www.npmjs.org/package/ms#readme) module. On timeout, `req` will emit `"timeout"`.
#### options
@@ -30,6 +40,11 @@ Clears the timeout on the request.
### as top-level middleware
+Because of the way middleware processing works, this once this module passes the request
+to the next middleware (which it has to do in order for you to do work), it can no longer
+stop the flow, so you must take care to check if the request has timedout before you
+continue to act on the request.
+
```javascript
var express = require('express');
var timeout = require('connect-timeout');
@@ -37,7 +52,7 @@ var timeout = require('connect-timeout');
// example of using this top-level; note the use of haltOnTimedout
// after every middleware; it will stop the request flow on a timeout
var app = express();
-app.use(timeout(5000));
+app.use(timeout('5s'));
app.use(bodyParser());
app.use(haltOnTimedout);
app.use(cookieParser());
@@ -60,7 +75,7 @@ var bodyParser = require('body-parser');
var timeout = require('connect-timeout');
var app = express();
-app.post('/save', timeout(5000), bodyParser.json(), haltOnTimedout, function(req, res, next){
+app.post('/save', timeout('5s'), bodyParser.json(), haltOnTimedout, function(req, res, next){
savePost(req.body, function(err, id){
if (err) return next(err);
if (req.timedout) return;
@@ -81,14 +96,15 @@ function savePost(post, cb){
app.listen(3000);
```
-### connect 2.x
+### connect
```javascript
+var bodyParser = require('body-parser');
var connect = require('connect');
var timeout = require('connect-timeout');
var app = require('connect');
-app.use('/save', timeout(5000), connect.json(), haltOnTimedout, function(req, res, next){
+app.use('/save', timeout('5s'), bodyParser.json(), haltOnTimedout, function(req, res, next){
savePost(req.body, function(err, id){
if (err) return next(err);
if (req.timedout) return;
@@ -111,24 +127,15 @@ app.listen(3000);
## License
-The MIT License (MIT)
-
-Copyright (c) 2014 Jonathan Ong me at jongleberry.com
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
+[MIT](LICENSE)
+
+[npm-image]: https://img.shields.io/npm/v/connect-timeout.svg?style=flat
+[npm-url]: https://npmjs.org/package/connect-timeout
+[travis-image]: https://img.shields.io/travis/expressjs/timeout.svg?style=flat
+[travis-url]: https://travis-ci.org/expressjs/timeout
+[coveralls-image]: https://img.shields.io/coveralls/expressjs/timeout.svg?style=flat
+[coveralls-url]: https://coveralls.io/r/expressjs/timeout?branch=master
+[downloads-image]: https://img.shields.io/npm/dm/connect-timeout.svg?style=flat
+[downloads-url]: https://npmjs.org/package/connect-timeout
+[gratipay-image]: https://img.shields.io/gratipay/dougwilson.svg?style=flat
+[gratipay-url]: https://www.gratipay.com/dougwilson/
diff --git a/index.js b/index.js
index b8279cf..44e41f7 100644
--- a/index.js
+++ b/index.js
@@ -1,6 +1,7 @@
/*!
- * Expressjs | Connect - timeout
- * Ported from https://github.com/LearnBoost/connect-timeout
+ * connect-timeout
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2014 Douglas Christopher Wilson
* MIT Licensed
*/
@@ -9,33 +10,38 @@
*/
var debug = require('debug')('connect:timeout');
+var ms = require('ms');
+var onHeaders = require('on-headers');
/**
* Timeout:
*
* See README.md for documentation.
*
- * @param {Number} ms
+ * @param {Number} time
* @param {Object} options
* @return {Function} middleware
* @api public
*/
-module.exports = function timeout(ms, options) {
- ms = ms || 5000;
+module.exports = function timeout(time, options) {
options = options || {};
+ time = typeof time === 'string'
+ ? ms(time)
+ : Number(time || 5000);
+
var respond = !('respond' in options) || options.respond === true;
return function(req, res, next) {
var destroy = req.socket.destroy;
var id = setTimeout(function(){
req.timedout = true;
- req.emit('timeout', ms);
- }, ms);
+ req.emit('timeout', time);
+ }, time);
if (respond) {
- req.on('timeout', onTimeout(ms, next));
+ req.on('timeout', onTimeout(time, next));
}
req.clearTimeout = function(){
@@ -49,11 +55,9 @@ module.exports = function timeout(ms, options) {
req.timedout = false;
- var writeHead = res.writeHead;
- res.writeHead = function(){
+ onHeaders(res, function(){
clearTimeout(id);
- writeHead.apply(res, arguments);
- }
+ });
next();
};
@@ -66,11 +70,10 @@ function generateTimeoutError(){
return err;
}
-function onTimeout(ms, cb){
+function onTimeout(time, cb){
return function(){
- if (this._header) return debug('response started, cannot timeout');
var err = generateTimeoutError();
- err.timeout = ms;
+ err.timeout = time;
cb(err);
};
}
diff --git a/package.json b/package.json
index d731aa4..78ceb65 100644
--- a/package.json
+++ b/package.json
@@ -1,35 +1,35 @@
{
"name": "connect-timeout",
"description": "timeout middleware",
- "version": "1.1.0",
- "author": {
- "name": "Jonathan Ong",
- "email": "me at jongleberry.com",
- "url": "http://jongleberry.com",
- "twitter": "https://twitter.com/jongleberry"
- },
+ "version": "1.3.0",
+ "contributors": [
+ "Douglas Christopher Wilson <doug at somethingdoug.com>",
+ "Jonathan Ong <me at jongleberry.com> (http://jongleberry.com)"
+ ],
"license": "MIT",
- "repository": {
- "type": "git",
- "url": "https://github.com/expressjs/timeout.git"
- },
- "bugs": {
- "mail": "me at jongleberry.com",
- "url": "https://github.com/expressjs/timeout/issues"
- },
+ "repository": "expressjs/timeout",
"dependencies": {
- "debug": "0.8.1"
+ "debug": "~2.0.0",
+ "ms": "0.6.2",
+ "on-headers": "~1.0.0"
},
"devDependencies": {
- "mocha": ">= 1.18.0 < 2.0",
- "should": ">= 3.3.0 < 4.0",
- "supertest": "*",
- "connect": "*"
+ "istanbul": "0.3.0",
+ "mocha": "~1.21.4",
+ "should": "~4.0.4",
+ "supertest": "~0.13.0"
},
+ "files": [
+ "LICENSE",
+ "HISTORY.md",
+ "index.js"
+ ],
"engines": {
"node": ">= 0.8"
},
"scripts": {
- "test": "mocha --reporter spec --require should"
+ "test": "mocha --reporter spec --bail --check-leaks test/",
+ "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
+ "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot --check-leaks test/"
}
}
diff --git a/test/test.js b/test/test.js
index 0cb7690..9c673ce 100644
--- a/test/test.js
+++ b/test/test.js
@@ -1,130 +1,123 @@
-process.env.NODE_ENV = 'test';
-
-var connect = require('connect');
+var http = require('http');
var request = require('supertest');
+var should = require('should');
var timeout = require('..');
-var app = connect()
- .use(timeout(300))
- .use(function(req, res){
- res.end('Hello');
- });
-
describe('timeout()', function(){
+ it('should have a default timeout', function (done) {
+ this.timeout(10000)
+ var server = createServer()
+ request(server)
+ .get('/')
+ .expect(503, done)
+ })
+
+ it('should accept millisecond timeout', function (done) {
+ var server = createServer(123)
+ request(server)
+ .get('/')
+ .expect(503, /123ms/, done)
+ })
+
+ it('should accept string timeout', function (done) {
+ var server = createServer('45ms')
+ request(server)
+ .get('/')
+ .expect(503, /45ms/, done)
+ })
+
describe('when below the timeout', function(){
it('should do nothing', function(done){
- request(app.listen())
+ var server = createServer(null, function(req, res){
+ res.end('Hello')
+ })
+ request(server)
.get('/')
- .expect('Hello', done);
+ .expect(200, 'Hello', done)
})
})
describe('when above the timeout', function(){
describe('with no response made', function(){
it('should respond with 503 Request timeout', function(done){
- var app = connect()
- .use(timeout(300))
- .use(function(req, res){
- setTimeout(function(){
- req.timedout.should.be.true;
- res.end('Hello');
- }, 400);
- });
-
- request(app.listen())
+ var server = createServer(null, null, function(req, res){
+ req.timedout.should.be.true
+ res.end('Hello')
+ })
+
+ request(server)
.get('/')
- .expect(503, done);
+ .expect(503, done)
})
it('should pass the error to next()', function(done){
- var app = connect()
- .use(timeout(300))
- .use(function(req, res){
- setTimeout(function(){
- req.timedout.should.be.true;
- res.end('Hello');
- }, 400);
- })
- .use(function(err, req, res, next){
- res.statusCode = err.status;
- res.end('timeout of ' + err.timeout + 'ms exceeded');
- });
+ var server = createServer(null, null, function(req, res){
+ req.timedout.should.be.true
+ res.end('Hello')
+ })
- request(app.listen())
+ request(server)
.get('/')
- .expect('timeout of 300ms exceeded', done);
+ .expect('Response timeout after 100ms', done);
})
})
describe('with a partial response', function(){
it('should do nothing', function(done){
- var app = connect()
- .use(timeout(300))
- .use(function(req, res){
- res.write('Hello');
- setTimeout(function(){
- req.timedout.should.be.false;
- res.end(' World');
- }, 400);
- });
-
- request(app.listen())
+ var server = createServer(null,
+ function(req, res){ res.write('Hello') },
+ function(req, res){
+ req.timedout.should.be.false
+ res.end(' World')
+ })
+
+ request(server)
.get('/')
- .expect('Hello World', done);
+ .expect(200, 'Hello World', done)
})
})
})
describe('options', function(){
it('can disable auto response', function(done){
- var app = connect()
- .use(timeout(300, {respond: false}))
- .use(function(req, res){
- setTimeout(function(){
- res.end('Timedout ' + req.timedout);
- }, 400);
- });
-
- request(app.listen())
+ var server = createServer({respond: false}, null, function(req, res){
+ res.end('Timedout ' + req.timedout)
+ })
+
+ request(server)
.get('/')
- .expect('Timedout true', done);
+ .expect(200, 'Timedout true', done)
})
})
describe('req.clearTimeout()', function(){
it('should revert this behavior', function(done){
- var app = connect()
- .use(timeout(300))
- .use(function(req, res){
- req.clearTimeout();
- setTimeout(function(){
- req.timedout.should.be.false;
- res.end('Hello');
- }, 400);
- });
-
- request(app.listen())
+ var server = createServer(null,
+ function(req, res){ req.clearTimeout() },
+ function(req, res){
+ req.timedout.should.be.false
+ res.end('Hello')
+ })
+
+ request(server)
.get('/')
- .expect('Hello', done);
+ .expect(200, 'Hello', done)
})
})
describe('destroy()', function(){
it('req should clear timer', function(done){
- var app = connect()
- .use(timeout(100))
- .use(function(req, res){
- req.destroy();
- setTimeout(function(){
- error.code.should.equal('ECONNRESET');
- req.timedout.should.be.false;
- done();
- }, 200);
- });
+ var server = createServer(null,
+ function(req, res){ req.destroy() },
+ function(req, res){
+ error.code.should.equal('ECONNRESET')
+ req.timedout.should.be.false
+ done()
+ })
var error;
- request(app.listen())
+ request(server)
.get('/')
.end(function(err){
error = err
@@ -132,19 +125,16 @@ describe('timeout()', function(){
})
it('res should clear timer', function(done){
- var app = connect()
- .use(timeout(100))
- .use(function(req, res){
- res.destroy();
- setTimeout(function(){
- error.code.should.equal('ECONNRESET');
- req.timedout.should.be.false;
- done();
- }, 200);
- });
+ var server = createServer(null,
+ function(req, res){ res.destroy() },
+ function(req, res){
+ error.code.should.equal('ECONNRESET')
+ req.timedout.should.be.false
+ done()
+ })
var error;
- request(app.listen())
+ request(server)
.get('/')
.end(function(err){
error = err
@@ -152,23 +142,70 @@ describe('timeout()', function(){
})
it('socket should clear timer', function(done){
- var app = connect()
- .use(timeout(100))
- .use(function(req, res){
- req.socket.destroy();
- setTimeout(function(){
- error.code.should.equal('ECONNRESET');
- req.timedout.should.be.false;
- done();
- }, 200);
- });
+ var server = createServer(null,
+ function(req, res){ req.socket.destroy() },
+ function(req, res){
+ error.code.should.equal('ECONNRESET')
+ req.timedout.should.be.false
+ done()
+ })
var error;
- request(app.listen())
+ request(server)
.get('/')
.end(function(err){
error = err
});
})
})
+
+ describe('when request aborted', function(){
+ it('should clear timeout', function(done){
+ var aborted = false
+ var server = createServer(null,
+ function(req, res){
+ req.on('aborted', function(){ aborted = true })
+ test.abort()
+ },
+ function(req, res){
+ aborted.should.be.true
+ req.timedout.should.be.false
+ done()
+ })
+ var error
+ var test = request(server).post('/')
+ test.write('0')
+ })
+ })
})
+
+function createServer(options, before, after) {
+ var _ms = 100
+
+ if (typeof options !== 'object') {
+ _ms = options
+ options = {}
+ }
+
+ var _timeout = timeout(_ms, options)
+
+ return http.createServer(function (req, res) {
+ _timeout(req, res, function (err) {
+ if (err) {
+ res.statusCode = err.status || 500
+ res.end(err.message + ' after ' + err.timeout + 'ms')
+ return
+ }
+
+ if (before) {
+ before(req, res)
+ }
+
+ if (after) {
+ setTimeout(function(){
+ after(req, res)
+ }, (_ms + 100))
+ }
+ })
+ })
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-connect-timeout.git
More information about the Pkg-javascript-commits
mailing list