From 3a4fcdc3d2475d84d0ebf24f5015b7b84e351370 Mon Sep 17 00:00:00 2001 From: Tyler Brandt Date: Mon, 25 Jun 2018 11:07:07 -0700 Subject: [PATCH 1/4] Fix(nodejs/event_dispatcher): update error/resp handlers (#123) - (nodejs) Prevent crash when `http`/`https` emits an error by adding an 'error' listener - (nodejs) Fix `requestCallback` to conform to its role as a 'response' listener; notably, ensure it is called when the first argument is interpeted as the `http.IncomingMessage`, and _not_ called in the event of an error (as expected by `Optimizely#_sendImpressionEvent`/`Optimizely#track`). Tested that this version (as 2.1.2-0) _does_ emit the messages expected in the demo app. Fixes #122 Fixes #124 --- .../plugins/event_dispatcher/index.node.js | 9 ++--- .../event_dispatcher/index.node.tests.js | 34 ++++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/packages/optimizely-sdk/lib/plugins/event_dispatcher/index.node.js b/packages/optimizely-sdk/lib/plugins/event_dispatcher/index.node.js index 378fe51a8..0b6e2b9cf 100644 --- a/packages/optimizely-sdk/lib/plugins/event_dispatcher/index.node.js +++ b/packages/optimizely-sdk/lib/plugins/event_dispatcher/index.node.js @@ -30,7 +30,6 @@ module.exports = { dispatchEvent: function(eventObj, callback) { // Non-POST requests not supported if (eventObj.httpVerb !== 'POST') { - callback(new Error('httpVerb not supported: ' + eventObj.httpVerb)); return; } @@ -52,13 +51,15 @@ module.exports = { } }; - var requestCallback = function(error, response, body) { - if (response && response.statusCode && response.statusCode >= 200 && response.statusCode < 400 && callback && typeof callback === 'function') { - callback(); + var requestCallback = function(response) { + if (response && response.statusCode && response.statusCode >= 200 && response.statusCode < 400) { + callback(response); } }; var req = (parsedUrl.protocol === 'http:' ? http : https).request(requestOptions, requestCallback); + // Add no-op error listener to prevent this from throwing + req.on('error', function() {}); req.write(dataString); req.end(); return req; diff --git a/packages/optimizely-sdk/lib/plugins/event_dispatcher/index.node.tests.js b/packages/optimizely-sdk/lib/plugins/event_dispatcher/index.node.tests.js index 971199040..82ec57ee5 100644 --- a/packages/optimizely-sdk/lib/plugins/event_dispatcher/index.node.tests.js +++ b/packages/optimizely-sdk/lib/plugins/event_dispatcher/index.node.tests.js @@ -49,13 +49,9 @@ describe('lib/plugins/event_dispatcher/node', function() { httpVerb: 'POST', }; - eventDispatcher.dispatchEvent(eventObj) - .on('response', function(response) { - assert.isTrue(response.statusCode === 200); + eventDispatcher.dispatchEvent(eventObj, function(resp) { + assert.equal(200, resp.statusCode); done(); - }) - .on('error', function(error) { - assert.fail('status code okay', 'status code not okay', ''); }); }); @@ -70,15 +66,15 @@ describe('lib/plugins/event_dispatcher/node', function() { eventDispatcher.dispatchEvent(eventObj, stubCallback.callback) .on('response', function(response) { - done(); sinon.assert.calledOnce(stubCallback.callback); + done(); }) .on('error', function(error) { assert.fail('status code okay', 'status code not okay', ''); }); }); - it('rejects GET httpVerb', function(done) { + it('rejects GET httpVerb', function() { var eventObj = { url: 'https://cdn.com/event', params: { @@ -87,16 +83,22 @@ describe('lib/plugins/event_dispatcher/node', function() { httpVerb: 'GET', }; - var callback = function(err) { - if (err) { - done(); - } else { - done(new Error('expected error not thrown')); - } - }; - + var callback = sinon.spy(); eventDispatcher.dispatchEvent(eventObj, callback); + sinon.assert.notCalled(callback); }); }); + + it('does not throw in the event of an error', function() { + var eventObj = { + url: 'https://example', + params: {}, + httpVerb: 'POST', + }; + + var callback = sinon.spy(); + eventDispatcher.dispatchEvent(eventObj, callback); + sinon.assert.notCalled(callback); + }); }); }); From 31fb5dc57f9c430d63a73a307f29e1811b033f55 Mon Sep 17 00:00:00 2001 From: Tyler Brandt Date: Mon, 25 Jun 2018 14:21:02 -0700 Subject: [PATCH 2/4] chore(doc): update changelog for 2.1.2 --- packages/optimizely-sdk/CHANGELOG.MD | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/optimizely-sdk/CHANGELOG.MD b/packages/optimizely-sdk/CHANGELOG.MD index 19149da7b..9cd5591dd 100644 --- a/packages/optimizely-sdk/CHANGELOG.MD +++ b/packages/optimizely-sdk/CHANGELOG.MD @@ -1,3 +1,9 @@ +## 2.1.2 +June 25, 2018 + +* Fix: Failure to log success message when event dispatched ([#123](https://github.com/optimizely/javascript-sdk/pull/123)) +* Fix: Don't call success message when event fails to send ([#123](https://github.com/optimizely/javascript-sdk/pull/123)) + ## 2.1.1 June 19, 2018 From 46f259a5b79043ad11876d33d38cb61e39112907 Mon Sep 17 00:00:00 2001 From: Tyler Brandt Date: Mon, 25 Jun 2018 14:25:54 -0700 Subject: [PATCH 3/4] Update changelog for 2.0.5 --- packages/optimizely-sdk/CHANGELOG.MD | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/optimizely-sdk/CHANGELOG.MD b/packages/optimizely-sdk/CHANGELOG.MD index 9cd5591dd..c0a954612 100644 --- a/packages/optimizely-sdk/CHANGELOG.MD +++ b/packages/optimizely-sdk/CHANGELOG.MD @@ -4,6 +4,12 @@ June 25, 2018 * Fix: Failure to log success message when event dispatched ([#123](https://github.com/optimizely/javascript-sdk/pull/123)) * Fix: Don't call success message when event fails to send ([#123](https://github.com/optimizely/javascript-sdk/pull/123)) +## 2.0.5 +June 25, 2018 + +* Fix: Failure to log success message when event dispatched ([#123](https://github.com/optimizely/javascript-sdk/pull/123)) +* Fix: Don't call success message when event fails to send ([#123](https://github.com/optimizely/javascript-sdk/pull/123)) + ## 2.1.1 June 19, 2018 From 70dcbd0d4973c7c038519812707b91d6ad129701 Mon Sep 17 00:00:00 2001 From: Tyler Brandt Date: Mon, 25 Jun 2018 14:26:45 -0700 Subject: [PATCH 4/4] 2.1.2 --- packages/optimizely-sdk/lib/utils/enums/index.js | 2 +- packages/optimizely-sdk/package-lock.json | 2 +- packages/optimizely-sdk/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/optimizely-sdk/lib/utils/enums/index.js b/packages/optimizely-sdk/lib/utils/enums/index.js index a5ac00e57..2f9401eb6 100644 --- a/packages/optimizely-sdk/lib/utils/enums/index.js +++ b/packages/optimizely-sdk/lib/utils/enums/index.js @@ -137,7 +137,7 @@ exports.CONTROL_ATTRIBUTES = { exports.JAVASCRIPT_CLIENT_ENGINE = 'javascript-sdk'; exports.NODE_CLIENT_ENGINE = 'node-sdk'; -exports.NODE_CLIENT_VERSION = '2.1.1'; +exports.NODE_CLIENT_VERSION = '2.1.2'; /* * Notification types for use with NotificationCenter diff --git a/packages/optimizely-sdk/package-lock.json b/packages/optimizely-sdk/package-lock.json index ea1ac3f9e..723829bb2 100644 --- a/packages/optimizely-sdk/package-lock.json +++ b/packages/optimizely-sdk/package-lock.json @@ -1,6 +1,6 @@ { "name": "@optimizely/optimizely-sdk", - "version": "2.1.1", + "version": "2.1.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index 2d0defbf1..99b5cfaa6 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@optimizely/optimizely-sdk", - "version": "2.1.1", + "version": "2.1.2", "description": "JavaScript SDK package for Optimizely X Full Stack", "main": "dist/optimizely.node.js", "browser": "lib/index.browser.js",