Skip to content
Merged
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
"test": "echo Please run tests for individual packages.",
"coverage": "npm run test -- --coverage",
"contract-test-service": "npm --prefix contract-tests install && npm --prefix contract-tests start",
"contract-test-harness": "curl -s https://raw.githubusercontent.com/launchdarkly/sdk-test-harness/master/downloader/run.sh \\ | VERSION=v2 PARAMS=\"-url http://localhost:8000 -debug -stop-service-at-end $TEST_HARNESS_PARAMS\" sh",
"contract-test-harness": "curl -s https://raw.githubusercontent.com/launchdarkly/sdk-test-harness/master/downloader/run.sh \\ | VERSION=v2 PARAMS=\"-url http://localhost:8000 -debug --skip-from=./contract-tests/testharness-suppressions.txt -stop-service-at-end $TEST_HARNESS_PARAMS\" sh",
"contract-tests": "npm run contract-test-service & npm run contract-test-harness",
"prettier": "npx prettier --write \"**/*.{js,ts,tsx,json,yaml,yml,md}\" --log-level warn",
"check": "yarn && yarn prettier && yarn lint && tsc && yarn build"
Expand Down
10 changes: 6 additions & 4 deletions packages/sdk/browser/src/platform/DefaultBrowserEventSource.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import {
DefaultBackoff,
EventListener,
EventName,
EventSourceInitDict,
HttpErrorResponse,
EventSource as LDEventSource,
} from '@launchdarkly/js-client-sdk-common';

import Backoff from './Backoff';

/**
* Implementation Notes:
*
Expand All @@ -22,7 +21,7 @@ import Backoff from './Backoff';
*/
export default class DefaultBrowserEventSource implements LDEventSource {
private _es?: EventSource;
private _backoff: Backoff;
private _backoff: DefaultBackoff;
private _errorFilter: (err: HttpErrorResponse) => boolean;

// The type of the handle can be platform specific and we treat is opaquely.
Expand All @@ -34,7 +33,10 @@ export default class DefaultBrowserEventSource implements LDEventSource {
private readonly _url: string,
options: EventSourceInitDict,
) {
this._backoff = new Backoff(options.initialRetryDelayMillis, options.retryResetIntervalMillis);
this._backoff = new DefaultBackoff(
options.initialRetryDelayMillis,
options.retryResetIntervalMillis,
);
this._errorFilter = options.errorFilter;
this._openConnection();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
import Backoff from '../../src/platform/Backoff';
import { DefaultBackoff } from '../../src/datasource/Backoff';

const noJitter = (): number => 0;
const maxJitter = (): number => 1;
const defaultResetInterval = 60 * 1000;

it.each([1, 1000, 5000])('has the correct starting delay', (initialDelay) => {
const backoff = new Backoff(initialDelay, defaultResetInterval, noJitter);
const backoff = new DefaultBackoff(initialDelay, defaultResetInterval, noJitter);
expect(backoff.fail()).toEqual(initialDelay);
});

it.each([1, 1000, 5000])('doubles delay on consecutive failures', (initialDelay) => {
const backoff = new Backoff(initialDelay, defaultResetInterval, noJitter);
const backoff = new DefaultBackoff(initialDelay, defaultResetInterval, noJitter);
expect(backoff.fail()).toEqual(initialDelay);
expect(backoff.fail()).toEqual(initialDelay * 2);
expect(backoff.fail()).toEqual(initialDelay * 4);
});

it('stops increasing delay when the max backoff is encountered', () => {
const backoff = new Backoff(5000, defaultResetInterval, noJitter);
const backoff = new DefaultBackoff(5000, defaultResetInterval, noJitter);
expect(backoff.fail()).toEqual(5000);
expect(backoff.fail()).toEqual(10000);
expect(backoff.fail()).toEqual(20000);
expect(backoff.fail()).toEqual(30000);

const backoff2 = new Backoff(1000, defaultResetInterval, noJitter);
const backoff2 = new DefaultBackoff(1000, defaultResetInterval, noJitter);
expect(backoff2.fail()).toEqual(1000);
expect(backoff2.fail()).toEqual(2000);
expect(backoff2.fail()).toEqual(4000);
Expand All @@ -33,12 +33,12 @@ it('stops increasing delay when the max backoff is encountered', () => {
});

it('handles an initial retry delay longer than the maximum retry delay', () => {
const backoff = new Backoff(40000, defaultResetInterval, noJitter);
const backoff = new DefaultBackoff(40000, defaultResetInterval, noJitter);
expect(backoff.fail()).toEqual(30000);
});

it('jitters the backoff value', () => {
const backoff = new Backoff(1000, defaultResetInterval, maxJitter);
const backoff = new DefaultBackoff(1000, defaultResetInterval, maxJitter);
expect(backoff.fail()).toEqual(500);
expect(backoff.fail()).toEqual(1000);
expect(backoff.fail()).toEqual(2000);
Expand All @@ -51,7 +51,7 @@ it.each([10 * 1000, 60 * 1000])(
'resets the delay when the last successful connection was connected greater than the retry reset interval',
(retryResetInterval) => {
let time = 1000;
const backoff = new Backoff(1000, retryResetInterval, noJitter);
const backoff = new DefaultBackoff(1000, retryResetInterval, noJitter);
expect(backoff.fail(time)).toEqual(1000);
time += 1;
backoff.success(time);
Expand All @@ -69,7 +69,7 @@ it.each([10 * 1000, 60 * 1000])(
it.each([10 * 1000, 60 * 1000])(
'does not reset the delay when the connection did not persist longer than the retry reset interval',
(retryResetInterval) => {
const backoff = new Backoff(1000, retryResetInterval, noJitter);
const backoff = new DefaultBackoff(1000, retryResetInterval, noJitter);

let time = 1000;
expect(backoff.fail(time)).toEqual(1000);
Expand Down
Loading