From 2e185dc7e25e234662c1f2a7775bf81c36191c33 Mon Sep 17 00:00:00 2001 From: Steve Konves Date: Wed, 2 May 2018 19:17:04 -0700 Subject: [PATCH 1/6] chore: add build for node 10 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 352da14..66a9829 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ node_js: - "8" - "9" - "9.5.0" + - "10.4" before_install: - npm i -g npm@^5.7.0 install: From f96238011c714e80fb1306353fe4ede0621bf3d5 Mon Sep 17 00:00:00 2001 From: Steve Konves Date: Wed, 2 May 2018 20:30:35 -0700 Subject: [PATCH 2/6] test: use native promises This plrecludes any unexpected behavior in third-party promise libraries. --- tests/express-test-harness.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/express-test-harness.js b/tests/express-test-harness.js index dd88ed5..99792ae 100644 --- a/tests/express-test-harness.js +++ b/tests/express-test-harness.js @@ -3,7 +3,6 @@ const assert = require('chai').assert; const express = require('express'); const supertest = require('supertest'); -const bluebird = require('bluebird'); const httpContext = require('../index'); @@ -71,7 +70,7 @@ describe('express-http-context', function () { httpContext.set('value', valueFromRequest); const doJob = async () => { - await bluebird.delay(delay); + await new Promise(resolve => setTimeout(resolve, delay)); const valueFromContext = httpContext.get('value'); res.status(200).json({ value: valueFromContext From 06dde149df522dd79c9514d2919bd508e7ac499e Mon Sep 17 00:00:00 2001 From: Steve Konves Date: Wed, 2 May 2018 20:26:35 -0700 Subject: [PATCH 3/6] chore: remove bluebird from dev dependencies --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index c927778..6dc2526 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "cls-hooked": "^4.2.2" }, "devDependencies": { - "bluebird": "^3.5.1", "chai": "^4.1.2", "coveralls": "^3.0.1", "express": "^4.16.2", From 33fd6d77969f416f01e7c31fb0343b9944060656 Mon Sep 17 00:00:00 2001 From: Steve Konves Date: Wed, 2 May 2018 20:31:40 -0700 Subject: [PATCH 4/6] test: add test for "thened" promise --- tests/express-test-harness.js | 58 ++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 8 deletions(-) diff --git a/tests/express-test-harness.js b/tests/express-test-harness.js index 99792ae..f7493da 100644 --- a/tests/express-test-harness.js +++ b/tests/express-test-harness.js @@ -19,7 +19,7 @@ describe('express-http-context', function () { assert.notOk(result); }); - it('maintains unique value across concurrent requests', function (done) { + it('maintains unique value across concurrent requests with callbacks', function (done) { // ARRANGE const app = express(); @@ -57,6 +57,48 @@ describe('express-http-context', function () { }); }); + it('maintains unique value across concurrent requests with native promises', function (done) { + // ARRANGE + const app = express(); + + app.use(httpContext.middleware); + + app.get('/test', (req, res) => { + const delay = new Number(req.query.delay); + const valueFromRequest = req.query.value; + + httpContext.set('value', valueFromRequest); + + const doJob = () => { + new Promise(resolve => setTimeout(resolve, delay)).then(() => { + const valueFromContext = httpContext.get('value'); + res.status(200).json({ + value: valueFromContext + }); + }); + }; + + doJob(); + }); + + const sut = supertest(app); + + const value1 = 'value1'; + const value2 = 'value2'; + + // ACT + sut.get('/test').query({ delay: 100, value: value1 }).end((err, res) => { + // ASSERT + assert.equal(res.body.value, value1); + done(); + }); + + sut.get('/test').query({ delay: 50, value: value2 }).end((err, res) => { + // ASSERT + assert.equal(res.body.value, value2); + }); + }); + it('maintains unique value across concurrent requests with async/await', function (done) { // ARRANGE const app = express(); @@ -64,7 +106,7 @@ describe('express-http-context', function () { app.use(httpContext.middleware); app.get('/test', (req, res) => { - const delay = new Number(req.query.delay); + const delay = new Number(req.query.delay); const valueFromRequest = req.query.value; httpContext.set('value', valueFromRequest); @@ -90,12 +132,12 @@ describe('express-http-context', function () { // ASSERT assert.equal(res.body.value, value1); done(); - }); - - sut.get('/test').query({ delay: 50, value: value2 }).end((err, res) => { - // ASSERT - assert.equal(res.body.value, value2); - }); + }); + + sut.get('/test').query({ delay: 50, value: value2 }).end((err, res) => { + // ASSERT + assert.equal(res.body.value, value2); + }); }); it('returns undefined when key is not found', function (done) { From 3a967fe3c7e70930224cc91c6722fac7301be703 Mon Sep 17 00:00:00 2001 From: Steve Konves Date: Wed, 6 Jun 2018 14:01:23 -0700 Subject: [PATCH 5/6] chore: restrict engine versions --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6dc2526..9f12450 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Get and set request-scoped context anywhere", "main": "index.js", "engines": { - "node": ">=8.0.0" + "node": ">=8.0.0 - <10.0.0 || >=10.4.0" }, "scripts": { "cover": "istanbul cover _mocha index.js -R ./tests --coverage", From eda0739005a7de97fcfc3cf31ad36eae44ab40ee Mon Sep 17 00:00:00 2001 From: Steve Konves Date: Wed, 6 Jun 2018 14:02:03 -0700 Subject: [PATCH 6/6] docs: add node 10 async/await notice --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 8291016..684c92f 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,9 @@ To avoid weird behavior with express: 1. Make sure you require `express-http-context` in the first row of your app. Some popular packages use async which breaks CLS. 1. If you are using `body-parser` and context is getting lost, register it in express before you register `express-http-context`'s middleware. +For users of Node 10 +1. Node 10.0.x - 10.3.x are not supported. V8 version 6.6 introduced a bug breaks async_hooks during async/await. Node 10.4.x uses V8 v6.7 in which the bug is fixed. See: https://github.com/nodejs/node/issues/20274. + See [Issue #4](https://github.com/skonves/express-http-context/issues/4) for more context. If you find any other weird behaviors, please feel free to open an issue. ## Contributors