Skip to content

Commit 409040a

Browse files
prepare 3.2.0 release (#12)
1 parent 603e2ae commit 409040a

23 files changed

+1230
-199
lines changed

.eslintrc.yaml

Lines changed: 38 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ parser: babel-eslint
33
root: true
44
extends:
55
- prettier
6+
- eslint:recommended # https://eslint.org/docs/rules/
67
env:
78
es6: true
89
node: true
@@ -19,24 +20,37 @@ globals:
1920
afterAll: true
2021
beforeEach: true
2122
afterEach: true
22-
window: true
23-
document: true
23+
window: false # platform-agnostic code should *not* reference "window" or "document"
24+
document: false
2425
rules:
25-
# https://github.com/prettier/eslint-plugin-prettier
26-
prettier/prettier:
26+
# https://eslint.org/docs/rules/array-callback-return
27+
array-callback-return: error
28+
29+
# https://eslint.org/docs/rules/arrow-body-style
30+
arrow-body-style:
2731
- error
28-
32+
- as-needed
33+
2934
# https://github.com/babel/eslint-plugin-babel
3035
babel/semi: error
3136

32-
# https://eslint.org/docs/rules/array-callback-return
33-
array-callback-return: error
37+
# Deprecations are required to turn enforce this
38+
camelcase: warn
3439

3540
# https://eslint.org/docs/rules/curly
3641
curly:
3742
- error
3843
- all
3944

45+
# https://eslint.org/docs/rules/eqeqeq
46+
eqeqeq: error
47+
48+
# https://eslint.org/docs/rules/no-array-constructor
49+
no-array-constructor: error
50+
51+
# https://eslint.org/docs/rules/no-eval
52+
no-eval: error
53+
4054
# https://eslint.org/docs/rules/no-implicit-coercion
4155
no-implicit-coercion:
4256
- 'off'
@@ -45,12 +59,18 @@ rules:
4559
string: true
4660
allow: []
4761

48-
# https://eslint.org/docs/rules/no-eval
49-
no-eval: error
50-
5162
# https://eslint.org/docs/rules/no-implied-eval
5263
no-implied-eval: error
5364

65+
# https://eslint.org/docs/rules/no-nested-ternary
66+
no-nested-ternary: error
67+
68+
# https://eslint.org/docs/rules/no-new-object
69+
no-new-object: error
70+
71+
# https://eslint.org/docs/rules/no-new-wrappers
72+
no-new-wrappers: error
73+
5474
# https://eslint.org/docs/rules/no-param-reassign
5575
no-param-reassign:
5676
- error
@@ -62,51 +82,23 @@ rules:
6282
# https://eslint.org/docs/rules/no-self-compare
6383
no-self-compare: error
6484

65-
# https://eslint.org/docs/rules/radix
66-
radix: error
67-
68-
# https://eslint.org/docs/rules/no-array-constructor
69-
no-array-constructor: error
70-
71-
# https://eslint.org/docs/rules/no-new-wrappers
72-
no-new-wrappers: error
73-
74-
# https://eslint.org/docs/rules/no-cond-assign
75-
no-cond-assign: error
76-
7785
# https://eslint.org/docs/rules/no-use-before-define
7886
no-use-before-define:
7987
- error
8088
- functions: false
8189

82-
# https://eslint.org/docs/rules/eqeqeq
83-
eqeqeq: error
84-
85-
# Deprecations are required to turn enforce this
86-
camelcase: warn
87-
88-
# https://eslint.org/docs/rules/no-new-object
89-
no-new-object: error
90-
91-
# https://eslint.org/docs/rules/no-nested-ternary
92-
no-nested-ternary: error
93-
94-
# https://eslint.org/docs/rules/no-unused-vars
95-
no-unused-vars: error
96-
9790
# https://eslint.org/docs/rules/no-var
9891
no-var: error
9992

100-
# https://eslint.org/docs/rules/prefer-const
101-
prefer-const: error
102-
10393
# https://eslint.org/docs/rules/prefer-arrow-callback
10494
prefer-arrow-callback: error
10595

106-
# https://eslint.org/docs/rules/arrow-body-style
107-
arrow-body-style:
108-
- error
109-
- as-needed
96+
# https://eslint.org/docs/rules/prefer-const
97+
prefer-const: error
11098

111-
# https://eslint.org/docs/rules/no-undef
112-
no-undef: error
99+
# https://github.com/prettier/eslint-plugin-prettier
100+
prettier/prettier:
101+
- error
102+
103+
# https://eslint.org/docs/rules/radix
104+
radix: error

package-lock.json

Lines changed: 8 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "launchdarkly-js-sdk-common",
3-
"version": "3.1.2",
3+
"version": "3.2.0-beta3",
44
"description": "LaunchDarkly SDK for JavaScript - common code",
55
"author": "LaunchDarkly <team@launchdarkly.com>",
66
"license": "Apache-2.0",

src/EventProcessor.js

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,17 @@ import * as errors from './errors';
55
import * as messages from './messages';
66
import * as utils from './utils';
77

8-
export default function EventProcessor(platform, options, environmentId, emitter = null, sender = null) {
8+
export default function EventProcessor(
9+
platform,
10+
options,
11+
environmentId,
12+
diagnosticsAccumulator = null,
13+
emitter = null,
14+
sender = null
15+
) {
916
const processor = {};
10-
const eventSender = sender || EventSender(platform, options.eventsUrl, environmentId, options);
17+
const eventSender = sender || EventSender(platform, environmentId, options);
18+
const mainEventsUrl = options.eventsUrl + '/events/bulk/' + environmentId;
1119
const summarizer = EventSummarizer();
1220
const userFilter = UserFilter(options);
1321
const inlineUsers = options.inlineUsersInEvents;
@@ -62,6 +70,10 @@ export default function EventProcessor(platform, options, environmentId, emitter
6270
exceededCapacity = true;
6371
logger.warn(messages.eventCapacityExceeded());
6472
}
73+
if (diagnosticsAccumulator) {
74+
// For diagnostic events, we track how many times we had to drop an event due to exceeding the capacity.
75+
diagnosticsAccumulator.incrementDroppedEvents();
76+
}
6577
}
6678
}
6779

@@ -109,12 +121,18 @@ export default function EventProcessor(platform, options, environmentId, emitter
109121
summary.kind = 'summary';
110122
eventsToSend.push(summary);
111123
}
124+
if (diagnosticsAccumulator) {
125+
// For diagnostic events, we record how many events were in the queue at the last flush (since "how
126+
// many events happened to be in the queue at the moment we decided to send a diagnostic event" would
127+
// not be a very useful statistic).
128+
diagnosticsAccumulator.setEventsInLastBatch(eventsToSend.length);
129+
}
112130
if (eventsToSend.length === 0) {
113131
return Promise.resolve();
114132
}
115133
queue = [];
116134
logger.debug(messages.debugPostingEvents(eventsToSend.length));
117-
return eventSender.sendEvents(eventsToSend).then(responseInfo => {
135+
return eventSender.sendEvents(eventsToSend, mainEventsUrl).then(responseInfo => {
118136
if (responseInfo) {
119137
if (responseInfo.serverTime) {
120138
lastKnownPastTime = responseInfo.serverTime;

src/EventSender.js

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import uuidv1 from 'uuid/v1';
44

55
const MAX_URL_LENGTH = 2000;
66

7-
export default function EventSender(platform, eventsUrl, environmentId, options) {
8-
const postUrl = eventsUrl + '/events/bulk/' + environmentId;
9-
const imageUrl = eventsUrl + '/a/' + environmentId + '.gif';
7+
export default function EventSender(platform, environmentId, options) {
8+
const imageUrlPath = '/a/' + environmentId + '.gif';
9+
const baseHeaders = utils.extend({ 'Content-Type': 'application/json' }, utils.getLDHeaders(platform, options));
1010
const httpFallbackPing = platform.httpFallbackPing; // this will be set for us if we're in the browser SDK
1111
const sender = {};
1212

@@ -22,21 +22,19 @@ export default function EventSender(platform, eventsUrl, environmentId, options)
2222
return ret;
2323
}
2424

25-
function sendChunk(events, usePost) {
25+
sender.sendChunk = (events, url, isDiagnostic, usePost) => {
2626
const jsonBody = JSON.stringify(events);
27-
const payloadId = uuidv1();
27+
const payloadId = isDiagnostic ? null : uuidv1();
2828

2929
function doPostRequest(canRetry) {
30-
const headers = utils.extend(
31-
{
32-
'Content-Type': 'application/json',
33-
'X-LaunchDarkly-Event-Schema': '3',
34-
'X-LaunchDarkly-Payload-ID': payloadId,
35-
},
36-
utils.getLDHeaders(platform, options)
37-
);
30+
const headers = isDiagnostic
31+
? baseHeaders
32+
: utils.extend({}, baseHeaders, {
33+
'X-LaunchDarkly-Event-Schema': '3',
34+
'X-LaunchDarkly-Payload-ID': payloadId,
35+
});
3836
return platform
39-
.httpRequest('POST', postUrl, headers, jsonBody)
37+
.httpRequest('POST', url, headers, jsonBody)
4038
.promise.then(result => {
4139
if (!result) {
4240
// This was a response from a fire-and-forget request, so we won't have a status.
@@ -59,12 +57,12 @@ export default function EventSender(platform, eventsUrl, environmentId, options)
5957
if (usePost) {
6058
return doPostRequest(true).catch(() => {});
6159
} else {
62-
httpFallbackPing && httpFallbackPing(imageUrl + '?d=' + utils.base64URLEncode(jsonBody));
60+
httpFallbackPing && httpFallbackPing(url + imageUrlPath + '?d=' + utils.base64URLEncode(jsonBody));
6361
return Promise.resolve(); // we don't wait for this request to complete, it's just a one-way ping
6462
}
65-
}
63+
};
6664

67-
sender.sendEvents = function(events) {
65+
sender.sendEvents = function(events, url, isDiagnostic) {
6866
if (!platform.httpRequest) {
6967
return Promise.resolve();
7068
}
@@ -74,11 +72,11 @@ export default function EventSender(platform, eventsUrl, environmentId, options)
7472
// no need to break up events into chunks if we can send a POST
7573
chunks = [events];
7674
} else {
77-
chunks = utils.chunkUserEventsForUrl(MAX_URL_LENGTH - eventsUrl.length, events);
75+
chunks = utils.chunkUserEventsForUrl(MAX_URL_LENGTH - url.length, events);
7876
}
7977
const results = [];
8078
for (let i = 0; i < chunks.length; i++) {
81-
results.push(sendChunk(chunks[i], canPost));
79+
results.push(sender.sendChunk(chunks[i], url, isDiagnostic, canPost));
8280
}
8381
return Promise.all(results);
8482
};

src/Stream.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { base64URLEncode, getLDHeaders } from './utils';
1010
// it is in an active state (connected or connecting).
1111
// eventSourceAllowsReport: true if REPORT is supported.
1212

13-
export default function Stream(platform, config, environment, hash) {
13+
export default function Stream(platform, config, environment, diagnosticsAccumulator, hash) {
1414
const baseUrl = config.streamUrl;
1515
const logger = config.logger;
1616
const stream = {};
@@ -22,6 +22,7 @@ export default function Stream(platform, config, environment, hash) {
2222
let firstConnectionErrorLogged = false;
2323
let es = null;
2424
let reconnectTimeoutReference = null;
25+
let connectionAttemptStartTime;
2526
let user = null;
2627
let handlers = null;
2728

@@ -35,6 +36,7 @@ export default function Stream(platform, config, environment, hash) {
3536
// We will decorate *all* handlers to do this to keep this abstraction agnostic
3637
// for different stream implementations.
3738
firstConnectionErrorLogged = false;
39+
logConnectionResult(true);
3840
newHandlers[key] && newHandlers[key](e);
3941
};
4042
}
@@ -56,6 +58,7 @@ export default function Stream(platform, config, environment, hash) {
5658
logger.warn(messages.streamError(err, streamReconnectDelay));
5759
firstConnectionErrorLogged = true;
5860
}
61+
logConnectionResult(false);
5962
closeConnection();
6063
tryConnect(streamReconnectDelay);
6164
}
@@ -100,6 +103,8 @@ export default function Stream(platform, config, environment, hash) {
100103

101104
closeConnection();
102105
logger.info(messages.streamConnecting(url));
106+
logConnectionStarted();
107+
103108
es = platform.eventSourceFactory(url, options);
104109
for (const key in handlers) {
105110
if (handlers.hasOwnProperty(key)) {
@@ -119,5 +124,20 @@ export default function Stream(platform, config, environment, hash) {
119124
}
120125
}
121126

127+
function logConnectionStarted() {
128+
connectionAttemptStartTime = new Date().getTime();
129+
}
130+
131+
function logConnectionResult(success) {
132+
if (connectionAttemptStartTime && diagnosticsAccumulator) {
133+
diagnosticsAccumulator.recordStreamInit(
134+
connectionAttemptStartTime,
135+
!success,
136+
new Date().getTime() - connectionAttemptStartTime
137+
);
138+
}
139+
connectionAttemptStartTime = null;
140+
}
141+
122142
return stream;
123143
}

src/UserValidator.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ export default function UserValidator(localStorageProvider, logger) {
4343
if (userOut.key !== null && userOut.key !== undefined) {
4444
userOut.key = userOut.key.toString();
4545
return Promise.resolve(userOut);
46-
return;
4746
}
4847
if (userOut.anonymous) {
4948
return getCachedUserId().then(cachedId => {

0 commit comments

Comments
 (0)