@launchdarkly/js-client-sdk-common 1.17.2 → 1.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/cjs/DataManager.d.ts +2 -2
- package/dist/cjs/DataManager.d.ts.map +1 -1
- package/dist/cjs/LDEmitter.d.ts.map +1 -1
- package/dist/cjs/datasource/DataSourceEventHandler.d.ts +4 -6
- package/dist/cjs/datasource/DataSourceEventHandler.d.ts.map +1 -1
- package/dist/cjs/datasource/DataSourceStatus.d.ts +64 -14
- package/dist/cjs/datasource/DataSourceStatus.d.ts.map +1 -1
- package/dist/cjs/datasource/DataSourceStatusManager.d.ts +6 -17
- package/dist/cjs/datasource/DataSourceStatusManager.d.ts.map +1 -1
- package/dist/cjs/datasource/Requestor.d.ts +2 -9
- package/dist/cjs/datasource/Requestor.d.ts.map +1 -1
- package/dist/cjs/flag-manager/bootstrap.d.ts +6 -0
- package/dist/cjs/flag-manager/bootstrap.d.ts.map +1 -0
- package/dist/cjs/index.cjs +160 -150
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/streaming/StreamingProcessor.d.ts +1 -1
- package/dist/cjs/streaming/StreamingProcessor.d.ts.map +1 -1
- package/dist/esm/DataManager.d.ts +2 -2
- package/dist/esm/DataManager.d.ts.map +1 -1
- package/dist/esm/LDEmitter.d.ts.map +1 -1
- package/dist/esm/datasource/DataSourceEventHandler.d.ts +4 -6
- package/dist/esm/datasource/DataSourceEventHandler.d.ts.map +1 -1
- package/dist/esm/datasource/DataSourceStatus.d.ts +64 -14
- package/dist/esm/datasource/DataSourceStatus.d.ts.map +1 -1
- package/dist/esm/datasource/DataSourceStatusManager.d.ts +6 -17
- package/dist/esm/datasource/DataSourceStatusManager.d.ts.map +1 -1
- package/dist/esm/datasource/Requestor.d.ts +2 -9
- package/dist/esm/datasource/Requestor.d.ts.map +1 -1
- package/dist/esm/flag-manager/bootstrap.d.ts +6 -0
- package/dist/esm/flag-manager/bootstrap.d.ts.map +1 -0
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.mjs +159 -150
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/streaming/StreamingProcessor.d.ts +1 -1
- package/dist/esm/streaming/StreamingProcessor.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,26 +1,13 @@
|
|
|
1
1
|
import { DataSourceErrorKind } from '@launchdarkly/js-sdk-common';
|
|
2
2
|
import LDEmitter from '../LDEmitter';
|
|
3
|
-
import DataSourceStatus, { DataSourceState } from './DataSourceStatus';
|
|
3
|
+
import DataSourceStatus, { type DataSourceState } from './DataSourceStatus';
|
|
4
4
|
/**
|
|
5
5
|
* Tracks the current data source status and emits updates when the status changes.
|
|
6
6
|
*/
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
private _state;
|
|
10
|
-
private _stateSinceMillis;
|
|
11
|
-
private _errorInfo?;
|
|
12
|
-
private _timeStamper;
|
|
13
|
-
constructor(_emitter: LDEmitter, timeStamper?: () => number);
|
|
14
|
-
get status(): DataSourceStatus;
|
|
7
|
+
export interface DataSourceStatusManager {
|
|
8
|
+
readonly status: DataSourceStatus;
|
|
15
9
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* @param requestedState to track
|
|
19
|
-
* @param isError to indicate that the state update is a result of an error occurring.
|
|
20
|
-
*/
|
|
21
|
-
private _updateState;
|
|
22
|
-
/**
|
|
23
|
-
* Requests the manager move to the provided state. This request may be ignored
|
|
10
|
+
* Requests the manager move to the provided state. This request may be ignored
|
|
24
11
|
* if the current state cannot transition to the requested state.
|
|
25
12
|
* @param state that is requested
|
|
26
13
|
*/
|
|
@@ -37,4 +24,6 @@ export default class DataSourceStatusManager {
|
|
|
37
24
|
*/
|
|
38
25
|
reportError(kind: DataSourceErrorKind, message: string, statusCode?: number, recoverable?: boolean): void;
|
|
39
26
|
}
|
|
27
|
+
export declare function createDataSourceStatusManager(emitter: LDEmitter, timeStamper?: () => number): DataSourceStatusManager;
|
|
28
|
+
export default DataSourceStatusManager;
|
|
40
29
|
//# sourceMappingURL=DataSourceStatusManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataSourceStatusManager.d.ts","sourceRoot":"","sources":["../../src/datasource/DataSourceStatusManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,gBAAgB,EAAE,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"DataSourceStatusManager.d.ts","sourceRoot":"","sources":["../../src/datasource/DataSourceStatusManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,gBAAgB,EAAE,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG5E;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAElC;;;;OAIG;IACH,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAEjD;;;;;;;;;OASG;IACH,WAAW,CACT,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,OAAO,GACpB,IAAI,CAAC;CAIT;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,SAAS,EAClB,WAAW,GAAE,MAAM,MAAyB,GAC3C,uBAAuB,CA2DzB;AAED,eAAe,uBAAuB,CAAC"}
|
|
@@ -8,19 +8,12 @@ export declare class LDRequestError extends Error implements HttpErrorResponse {
|
|
|
8
8
|
* Note: The requestor is implemented independently from polling such that it can be used to
|
|
9
9
|
* make a one-off request.
|
|
10
10
|
*/
|
|
11
|
-
export
|
|
12
|
-
private _requests;
|
|
13
|
-
private readonly _uri;
|
|
14
|
-
private readonly _headers;
|
|
15
|
-
private readonly _method;
|
|
16
|
-
private readonly _body?;
|
|
17
|
-
constructor(_requests: Requests, _uri: string, _headers: {
|
|
18
|
-
[key: string]: string;
|
|
19
|
-
}, _method: string, _body?: string | undefined);
|
|
11
|
+
export interface Requestor {
|
|
20
12
|
requestPayload(): Promise<string>;
|
|
21
13
|
}
|
|
22
14
|
export declare function makeRequestor(plainContextString: string, serviceEndpoints: ServiceEndpoints, paths: DataSourcePaths, requests: Requests, encoding: Encoding, baseHeaders?: LDHeaders, baseQueryParams?: {
|
|
23
15
|
key: string;
|
|
24
16
|
value: string;
|
|
25
17
|
}[], withReasons?: boolean, useReport?: boolean, secureModeHash?: string): Requestor;
|
|
18
|
+
export default Requestor;
|
|
26
19
|
//# sourceMappingURL=Requestor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Requestor.d.ts","sourceRoot":"","sources":["../../src/datasource/Requestor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Requestor.d.ts","sourceRoot":"","sources":["../../src/datasource/Requestor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAER,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,gBAAgB,EACjB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAMrD,qBAAa,cAAe,SAAQ,KAAM,YAAW,iBAAiB;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEX,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAK7C;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,wBAAgB,aAAa,CAC3B,kBAAkB,EAAE,MAAM,EAC1B,gBAAgB,EAAE,gBAAgB,EAClC,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,WAAW,CAAC,EAAE,SAAS,EACvB,eAAe,CAAC,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EAClD,WAAW,CAAC,EAAE,OAAO,EACrB,SAAS,CAAC,EAAE,OAAO,EACnB,cAAc,CAAC,EAAE,MAAM,GACtB,SAAS,CA6CX;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/flag-manager/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAGvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,QAAQ,EAChB,IAAI,EAAE,GAAG,GACR;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAAA;CAAE,CAyCnC"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { LDClientInternalOptions } from './configuration/Configuration';
|
|
2
2
|
import DataSourceStatus, { DataSourceState } from './datasource/DataSourceStatus';
|
|
3
3
|
import DataSourceStatusErrorInfo from './datasource/DataSourceStatusErrorInfo';
|
|
4
|
-
import
|
|
4
|
+
import { makeRequestor, Requestor } from './datasource/Requestor';
|
|
5
5
|
import LDClientImpl from './LDClientImpl';
|
|
6
6
|
import LDEmitter, { EventName } from './LDEmitter';
|
|
7
7
|
export * from '@launchdarkly/js-sdk-common';
|
|
@@ -14,6 +14,7 @@ export type { Configuration } from './configuration/Configuration';
|
|
|
14
14
|
export type { LDEmitter };
|
|
15
15
|
export type { ItemDescriptor } from './flag-manager/ItemDescriptor';
|
|
16
16
|
export type { Flag } from './types';
|
|
17
|
+
export { readFlagsFromBootstrap } from './flag-manager/bootstrap';
|
|
17
18
|
export { DataSourcePaths } from './streaming';
|
|
18
19
|
export { BaseDataManager } from './DataManager';
|
|
19
20
|
export { makeRequestor, Requestor };
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,gBAAgB,EAAE,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,yBAAyB,MAAM,wCAAwC,CAAC;AAC/E,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,gBAAgB,EAAE,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,yBAAyB,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEnD,cAAc,6BAA6B,CAAC;AAE5C,OAAO,KAAK,QAAQ,MAAM,6BAA6B,CAAC;AAMxD,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,QAAQ,EACR,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,IAAI,EACJ,YAAY,EACZ,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,8BAA8B,EAC9B,6BAA6B,EAC7B,+BAA+B,EAC/B,6BAA6B,EAC7B,8BAA8B,EAC9B,SAAS,EACT,eAAe,GAChB,MAAM,OAAO,CAAC;AAEf,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACvF,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAC;AAC9F,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,YAAY,EAAE,SAAS,EAAE,CAAC;AAC1B,YAAY,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,YAAY,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;AAEpC,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,YAAY,EACZ,uBAAuB,EACvB,eAAe,EACf,SAAS,IAAI,kBAAkB,GAChC,CAAC"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -3,18 +3,17 @@ export * from '@launchdarkly/js-sdk-common';
|
|
|
3
3
|
import * as jsSdkCommon from '@launchdarkly/js-sdk-common';
|
|
4
4
|
export { jsSdkCommon as platform };
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
6
|
+
// This is a temporary compat for react native. We should remove this once we
|
|
7
|
+
// major version react native SDK.
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-redeclare
|
|
9
|
+
const DataSourceState = {
|
|
10
|
+
Initializing: 'INITIALIZING',
|
|
11
|
+
Valid: 'VALID',
|
|
12
|
+
Interrupted: 'INTERRUPTED',
|
|
13
|
+
SetOffline: 'SET_OFFLINE',
|
|
14
|
+
Closed: 'CLOSED',
|
|
15
|
+
};
|
|
16
16
|
|
|
17
|
-
// eslint-disable-next-line max-classes-per-file
|
|
18
17
|
function isOk(status) {
|
|
19
18
|
return status >= 200 && status <= 299;
|
|
20
19
|
}
|
|
@@ -25,38 +24,6 @@ class LDRequestError extends Error {
|
|
|
25
24
|
this.name = 'LaunchDarklyRequestError';
|
|
26
25
|
}
|
|
27
26
|
}
|
|
28
|
-
/**
|
|
29
|
-
* Note: The requestor is implemented independently from polling such that it can be used to
|
|
30
|
-
* make a one-off request.
|
|
31
|
-
*/
|
|
32
|
-
class Requestor {
|
|
33
|
-
constructor(_requests, _uri, _headers, _method, _body) {
|
|
34
|
-
this._requests = _requests;
|
|
35
|
-
this._uri = _uri;
|
|
36
|
-
this._headers = _headers;
|
|
37
|
-
this._method = _method;
|
|
38
|
-
this._body = _body;
|
|
39
|
-
}
|
|
40
|
-
async requestPayload() {
|
|
41
|
-
let status;
|
|
42
|
-
try {
|
|
43
|
-
const res = await this._requests.fetch(this._uri, {
|
|
44
|
-
method: this._method,
|
|
45
|
-
headers: this._headers,
|
|
46
|
-
body: this._body,
|
|
47
|
-
});
|
|
48
|
-
if (isOk(res.status)) {
|
|
49
|
-
return await res.text();
|
|
50
|
-
}
|
|
51
|
-
// Assigning so it can be thrown after the try/catch.
|
|
52
|
-
status = res.status;
|
|
53
|
-
}
|
|
54
|
-
catch (err) {
|
|
55
|
-
throw new LDRequestError(err?.message);
|
|
56
|
-
}
|
|
57
|
-
throw new LDRequestError(`Unexpected status code: ${status}`, status);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
27
|
function makeRequestor(plainContextString, serviceEndpoints, paths, requests, encoding, baseHeaders, baseQueryParams, withReasons, useReport, secureModeHash) {
|
|
61
28
|
let body;
|
|
62
29
|
let method = 'GET';
|
|
@@ -77,7 +44,27 @@ function makeRequestor(plainContextString, serviceEndpoints, paths, requests, en
|
|
|
77
44
|
parameters.push({ key: 'h', value: secureModeHash });
|
|
78
45
|
}
|
|
79
46
|
const uri = getPollingUri(serviceEndpoints, path, parameters);
|
|
80
|
-
return
|
|
47
|
+
return {
|
|
48
|
+
async requestPayload() {
|
|
49
|
+
let status;
|
|
50
|
+
try {
|
|
51
|
+
const res = await requests.fetch(uri, {
|
|
52
|
+
method,
|
|
53
|
+
headers,
|
|
54
|
+
body,
|
|
55
|
+
});
|
|
56
|
+
if (isOk(res.status)) {
|
|
57
|
+
return await res.text();
|
|
58
|
+
}
|
|
59
|
+
// Assigning so it can be thrown after the try/catch.
|
|
60
|
+
status = res.status;
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
throw new LDRequestError(err?.message);
|
|
64
|
+
}
|
|
65
|
+
throw new LDRequestError(`Unexpected status code: ${status}`, status);
|
|
66
|
+
},
|
|
67
|
+
};
|
|
81
68
|
}
|
|
82
69
|
|
|
83
70
|
const duplicateExecutionError = new Error('Task has already been executed or shed. This is likely an implementation error. The task will not be executed again.');
|
|
@@ -1321,6 +1308,10 @@ class LDEmitter {
|
|
|
1321
1308
|
this._listeners = new Map();
|
|
1322
1309
|
}
|
|
1323
1310
|
on(name, listener) {
|
|
1311
|
+
if (typeof name !== 'string') {
|
|
1312
|
+
this._logger?.warn('Only string event names are supported.');
|
|
1313
|
+
return;
|
|
1314
|
+
}
|
|
1324
1315
|
if (!this._listeners.has(name)) {
|
|
1325
1316
|
this._listeners.set(name, [listener]);
|
|
1326
1317
|
}
|
|
@@ -1931,117 +1922,135 @@ function safeRegisterDebugOverridePlugins(logger, debugOverride, plugins) {
|
|
|
1931
1922
|
});
|
|
1932
1923
|
}
|
|
1933
1924
|
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
}
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
}
|
|
1973
|
-
handleStreamingError(error) {
|
|
1974
|
-
this._statusManager.reportError(error.kind, error.message, error.code, error.recoverable);
|
|
1975
|
-
}
|
|
1976
|
-
handlePollingError(error) {
|
|
1977
|
-
this._statusManager.reportError(error.kind, error.message, error.status, error.recoverable);
|
|
1978
|
-
}
|
|
1925
|
+
function readFlagsFromBootstrap(logger, data) {
|
|
1926
|
+
// If the bootstrap data came from an older server-side SDK, we'll have just a map of keys to values.
|
|
1927
|
+
// Newer SDKs that have an allFlagsState method will provide an extra "$flagsState" key that contains
|
|
1928
|
+
// the rest of the metadata we want. We do it this way for backward compatibility with older JS SDKs.
|
|
1929
|
+
const keys = Object.keys(data);
|
|
1930
|
+
const metadataKey = '$flagsState';
|
|
1931
|
+
const validKey = '$valid';
|
|
1932
|
+
const metadata = data[metadataKey];
|
|
1933
|
+
if (!metadata && keys.length) {
|
|
1934
|
+
logger.warn('LaunchDarkly client was initialized with bootstrap data that did not include flag' +
|
|
1935
|
+
' metadata. Events may not be sent correctly.');
|
|
1936
|
+
}
|
|
1937
|
+
if (data[validKey] === false) {
|
|
1938
|
+
logger.warn('LaunchDarkly bootstrap data is not available because the back end could not read the flags.');
|
|
1939
|
+
}
|
|
1940
|
+
const ret = {};
|
|
1941
|
+
keys.forEach((key) => {
|
|
1942
|
+
if (key !== metadataKey && key !== validKey) {
|
|
1943
|
+
let flag;
|
|
1944
|
+
if (metadata && metadata[key]) {
|
|
1945
|
+
flag = {
|
|
1946
|
+
value: data[key],
|
|
1947
|
+
...metadata[key],
|
|
1948
|
+
};
|
|
1949
|
+
}
|
|
1950
|
+
else {
|
|
1951
|
+
flag = {
|
|
1952
|
+
value: data[key],
|
|
1953
|
+
version: 0,
|
|
1954
|
+
};
|
|
1955
|
+
}
|
|
1956
|
+
ret[key] = {
|
|
1957
|
+
version: flag.version,
|
|
1958
|
+
flag,
|
|
1959
|
+
};
|
|
1960
|
+
}
|
|
1961
|
+
});
|
|
1962
|
+
return ret;
|
|
1979
1963
|
}
|
|
1980
1964
|
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1965
|
+
function createDataSourceEventHandler(flagManager, statusManager, logger) {
|
|
1966
|
+
return {
|
|
1967
|
+
async handlePut(context, flags) {
|
|
1968
|
+
logger.debug(`Got PUT: ${Object.keys(flags)}`);
|
|
1969
|
+
// mapping flags to item descriptors
|
|
1970
|
+
const descriptors = Object.entries(flags).reduce((acc, [key, flag]) => {
|
|
1971
|
+
acc[key] = { version: flag.version, flag };
|
|
1972
|
+
return acc;
|
|
1973
|
+
}, {});
|
|
1974
|
+
await flagManager.init(context, descriptors);
|
|
1975
|
+
statusManager.requestStateUpdate('VALID');
|
|
1976
|
+
},
|
|
1977
|
+
async handlePatch(context, patchFlag) {
|
|
1978
|
+
logger.debug(`Got PATCH ${JSON.stringify(patchFlag, null, 2)}`);
|
|
1979
|
+
flagManager.upsert(context, patchFlag.key, {
|
|
1980
|
+
version: patchFlag.version,
|
|
1981
|
+
flag: patchFlag,
|
|
1982
|
+
});
|
|
1983
|
+
},
|
|
1984
|
+
async handleDelete(context, deleteFlag) {
|
|
1985
|
+
logger.debug(`Got DELETE ${JSON.stringify(deleteFlag, null, 2)}`);
|
|
1986
|
+
flagManager.upsert(context, deleteFlag.key, {
|
|
1987
|
+
version: deleteFlag.version,
|
|
1988
|
+
flag: {
|
|
1989
|
+
...deleteFlag,
|
|
1990
|
+
deleted: true,
|
|
1991
|
+
// props below are set to sensible defaults. they are irrelevant
|
|
1992
|
+
// because this flag has been deleted.
|
|
1993
|
+
flagVersion: 0,
|
|
1994
|
+
value: undefined,
|
|
1995
|
+
variation: 0,
|
|
1996
|
+
trackEvents: false,
|
|
1997
|
+
},
|
|
1998
|
+
});
|
|
1999
|
+
},
|
|
2000
|
+
handleStreamingError(error) {
|
|
2001
|
+
statusManager.reportError(error.kind, error.message, error.code, error.recoverable);
|
|
2002
|
+
},
|
|
2003
|
+
handlePollingError(error) {
|
|
2004
|
+
statusManager.reportError(error.kind, error.message, error.status, error.recoverable);
|
|
2005
|
+
},
|
|
2006
|
+
};
|
|
2007
|
+
}
|
|
2008
|
+
|
|
2009
|
+
function createDataSourceStatusManager(emitter, timeStamper = () => Date.now()) {
|
|
2010
|
+
let state = 'CLOSED';
|
|
2011
|
+
let stateSinceMillis = timeStamper();
|
|
2012
|
+
let errorInfo;
|
|
2013
|
+
function getStatus() {
|
|
1992
2014
|
return {
|
|
1993
|
-
state
|
|
1994
|
-
stateSince:
|
|
1995
|
-
lastError:
|
|
2015
|
+
state,
|
|
2016
|
+
stateSince: stateSinceMillis,
|
|
2017
|
+
lastError: errorInfo,
|
|
1996
2018
|
};
|
|
1997
2019
|
}
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
* @param requestedState to track
|
|
2002
|
-
* @param isError to indicate that the state update is a result of an error occurring.
|
|
2003
|
-
*/
|
|
2004
|
-
_updateState(requestedState, isError = false) {
|
|
2005
|
-
const newState = requestedState === DataSourceState.Interrupted && this._state === DataSourceState.Initializing // don't go to interrupted from initializing (recoverable errors when initializing are not noteworthy)
|
|
2006
|
-
? DataSourceState.Initializing
|
|
2020
|
+
function updateState(requestedState, isError = false) {
|
|
2021
|
+
const newState = requestedState === 'INTERRUPTED' && state === 'INITIALIZING' // don't go to interrupted from initializing (recoverable errors when initializing are not noteworthy)
|
|
2022
|
+
? 'INITIALIZING'
|
|
2007
2023
|
: requestedState;
|
|
2008
|
-
const changedState =
|
|
2024
|
+
const changedState = state !== newState;
|
|
2009
2025
|
if (changedState) {
|
|
2010
|
-
|
|
2011
|
-
|
|
2026
|
+
state = newState;
|
|
2027
|
+
stateSinceMillis = timeStamper();
|
|
2012
2028
|
}
|
|
2013
2029
|
if (changedState || isError) {
|
|
2014
|
-
|
|
2030
|
+
emitter.emit('dataSourceStatus', getStatus());
|
|
2015
2031
|
}
|
|
2016
2032
|
}
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
message,
|
|
2039
|
-
statusCode,
|
|
2040
|
-
time: this._timeStamper(),
|
|
2041
|
-
};
|
|
2042
|
-
this._errorInfo = errorInfo;
|
|
2043
|
-
this._updateState(recoverable ? DataSourceState.Interrupted : DataSourceState.Closed, true);
|
|
2044
|
-
}
|
|
2033
|
+
return {
|
|
2034
|
+
get status() {
|
|
2035
|
+
return getStatus();
|
|
2036
|
+
},
|
|
2037
|
+
requestStateUpdate(requestedState) {
|
|
2038
|
+
updateState(requestedState);
|
|
2039
|
+
},
|
|
2040
|
+
reportError(kind, message, statusCode, recoverable = false) {
|
|
2041
|
+
errorInfo = {
|
|
2042
|
+
kind,
|
|
2043
|
+
message,
|
|
2044
|
+
statusCode,
|
|
2045
|
+
time: timeStamper(),
|
|
2046
|
+
};
|
|
2047
|
+
updateState(recoverable ? 'INTERRUPTED' : 'CLOSED', true);
|
|
2048
|
+
},
|
|
2049
|
+
// TODO: SDK-702 - Implement network availability behaviors
|
|
2050
|
+
// setNetworkUnavailable() {
|
|
2051
|
+
// updateState(DataSourceState.NetworkUnavailable);
|
|
2052
|
+
// },
|
|
2053
|
+
};
|
|
2045
2054
|
}
|
|
2046
2055
|
|
|
2047
2056
|
function reportClosed(logger) {
|
|
@@ -2323,8 +2332,8 @@ class BaseDataManager {
|
|
|
2323
2332
|
this.diagnosticsManager = diagnosticsManager;
|
|
2324
2333
|
this.closed = false;
|
|
2325
2334
|
this.logger = config.logger;
|
|
2326
|
-
this.dataSourceStatusManager =
|
|
2327
|
-
this._dataSourceEventHandler =
|
|
2335
|
+
this.dataSourceStatusManager = createDataSourceStatusManager(emitter);
|
|
2336
|
+
this._dataSourceEventHandler = createDataSourceEventHandler(flagManager, this.dataSourceStatusManager, this.config.logger);
|
|
2328
2337
|
}
|
|
2329
2338
|
/**
|
|
2330
2339
|
* Set additional connection parameters for requests polling/streaming.
|
|
@@ -2387,16 +2396,16 @@ class BaseDataManager {
|
|
|
2387
2396
|
return {
|
|
2388
2397
|
start: () => {
|
|
2389
2398
|
// update status before starting processor to ensure potential errors are reported after initializing
|
|
2390
|
-
statusManager.requestStateUpdate(
|
|
2399
|
+
statusManager.requestStateUpdate('INITIALIZING');
|
|
2391
2400
|
processor.start();
|
|
2392
2401
|
},
|
|
2393
2402
|
stop: () => {
|
|
2394
2403
|
processor.stop();
|
|
2395
|
-
statusManager.requestStateUpdate(
|
|
2404
|
+
statusManager.requestStateUpdate('CLOSED');
|
|
2396
2405
|
},
|
|
2397
2406
|
close: () => {
|
|
2398
2407
|
processor.close();
|
|
2399
|
-
statusManager.requestStateUpdate(
|
|
2408
|
+
statusManager.requestStateUpdate('CLOSED');
|
|
2400
2409
|
},
|
|
2401
2410
|
};
|
|
2402
2411
|
}
|
|
@@ -2406,5 +2415,5 @@ class BaseDataManager {
|
|
|
2406
2415
|
}
|
|
2407
2416
|
}
|
|
2408
2417
|
|
|
2409
|
-
export { BaseDataManager, DataSourceState, LDClientImpl,
|
|
2418
|
+
export { BaseDataManager, DataSourceState, LDClientImpl, makeRequestor, readFlagsFromBootstrap, safeRegisterDebugOverridePlugins };
|
|
2410
2419
|
//# sourceMappingURL=index.mjs.map
|