[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