@launchdarkly/js-client-sdk-common 1.17.2 → 1.18.0
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 +7 -0
- package/dist/cjs/DataManager.d.ts +2 -2
- package/dist/cjs/DataManager.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 +156 -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/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 +155 -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.');
|
|
@@ -1931,117 +1918,135 @@ function safeRegisterDebugOverridePlugins(logger, debugOverride, plugins) {
|
|
|
1931
1918
|
});
|
|
1932
1919
|
}
|
|
1933
1920
|
|
|
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
|
-
}
|
|
1921
|
+
function readFlagsFromBootstrap(logger, data) {
|
|
1922
|
+
// If the bootstrap data came from an older server-side SDK, we'll have just a map of keys to values.
|
|
1923
|
+
// Newer SDKs that have an allFlagsState method will provide an extra "$flagsState" key that contains
|
|
1924
|
+
// the rest of the metadata we want. We do it this way for backward compatibility with older JS SDKs.
|
|
1925
|
+
const keys = Object.keys(data);
|
|
1926
|
+
const metadataKey = '$flagsState';
|
|
1927
|
+
const validKey = '$valid';
|
|
1928
|
+
const metadata = data[metadataKey];
|
|
1929
|
+
if (!metadata && keys.length) {
|
|
1930
|
+
logger.warn('LaunchDarkly client was initialized with bootstrap data that did not include flag' +
|
|
1931
|
+
' metadata. Events may not be sent correctly.');
|
|
1932
|
+
}
|
|
1933
|
+
if (data[validKey] === false) {
|
|
1934
|
+
logger.warn('LaunchDarkly bootstrap data is not available because the back end could not read the flags.');
|
|
1935
|
+
}
|
|
1936
|
+
const ret = {};
|
|
1937
|
+
keys.forEach((key) => {
|
|
1938
|
+
if (key !== metadataKey && key !== validKey) {
|
|
1939
|
+
let flag;
|
|
1940
|
+
if (metadata && metadata[key]) {
|
|
1941
|
+
flag = {
|
|
1942
|
+
value: data[key],
|
|
1943
|
+
...metadata[key],
|
|
1944
|
+
};
|
|
1945
|
+
}
|
|
1946
|
+
else {
|
|
1947
|
+
flag = {
|
|
1948
|
+
value: data[key],
|
|
1949
|
+
version: 0,
|
|
1950
|
+
};
|
|
1951
|
+
}
|
|
1952
|
+
ret[key] = {
|
|
1953
|
+
version: flag.version,
|
|
1954
|
+
flag,
|
|
1955
|
+
};
|
|
1956
|
+
}
|
|
1957
|
+
});
|
|
1958
|
+
return ret;
|
|
1979
1959
|
}
|
|
1980
1960
|
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1961
|
+
function createDataSourceEventHandler(flagManager, statusManager, logger) {
|
|
1962
|
+
return {
|
|
1963
|
+
async handlePut(context, flags) {
|
|
1964
|
+
logger.debug(`Got PUT: ${Object.keys(flags)}`);
|
|
1965
|
+
// mapping flags to item descriptors
|
|
1966
|
+
const descriptors = Object.entries(flags).reduce((acc, [key, flag]) => {
|
|
1967
|
+
acc[key] = { version: flag.version, flag };
|
|
1968
|
+
return acc;
|
|
1969
|
+
}, {});
|
|
1970
|
+
await flagManager.init(context, descriptors);
|
|
1971
|
+
statusManager.requestStateUpdate('VALID');
|
|
1972
|
+
},
|
|
1973
|
+
async handlePatch(context, patchFlag) {
|
|
1974
|
+
logger.debug(`Got PATCH ${JSON.stringify(patchFlag, null, 2)}`);
|
|
1975
|
+
flagManager.upsert(context, patchFlag.key, {
|
|
1976
|
+
version: patchFlag.version,
|
|
1977
|
+
flag: patchFlag,
|
|
1978
|
+
});
|
|
1979
|
+
},
|
|
1980
|
+
async handleDelete(context, deleteFlag) {
|
|
1981
|
+
logger.debug(`Got DELETE ${JSON.stringify(deleteFlag, null, 2)}`);
|
|
1982
|
+
flagManager.upsert(context, deleteFlag.key, {
|
|
1983
|
+
version: deleteFlag.version,
|
|
1984
|
+
flag: {
|
|
1985
|
+
...deleteFlag,
|
|
1986
|
+
deleted: true,
|
|
1987
|
+
// props below are set to sensible defaults. they are irrelevant
|
|
1988
|
+
// because this flag has been deleted.
|
|
1989
|
+
flagVersion: 0,
|
|
1990
|
+
value: undefined,
|
|
1991
|
+
variation: 0,
|
|
1992
|
+
trackEvents: false,
|
|
1993
|
+
},
|
|
1994
|
+
});
|
|
1995
|
+
},
|
|
1996
|
+
handleStreamingError(error) {
|
|
1997
|
+
statusManager.reportError(error.kind, error.message, error.code, error.recoverable);
|
|
1998
|
+
},
|
|
1999
|
+
handlePollingError(error) {
|
|
2000
|
+
statusManager.reportError(error.kind, error.message, error.status, error.recoverable);
|
|
2001
|
+
},
|
|
2002
|
+
};
|
|
2003
|
+
}
|
|
2004
|
+
|
|
2005
|
+
function createDataSourceStatusManager(emitter, timeStamper = () => Date.now()) {
|
|
2006
|
+
let state = 'CLOSED';
|
|
2007
|
+
let stateSinceMillis = timeStamper();
|
|
2008
|
+
let errorInfo;
|
|
2009
|
+
function getStatus() {
|
|
1992
2010
|
return {
|
|
1993
|
-
state
|
|
1994
|
-
stateSince:
|
|
1995
|
-
lastError:
|
|
2011
|
+
state,
|
|
2012
|
+
stateSince: stateSinceMillis,
|
|
2013
|
+
lastError: errorInfo,
|
|
1996
2014
|
};
|
|
1997
2015
|
}
|
|
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
|
|
2016
|
+
function updateState(requestedState, isError = false) {
|
|
2017
|
+
const newState = requestedState === 'INTERRUPTED' && state === 'INITIALIZING' // don't go to interrupted from initializing (recoverable errors when initializing are not noteworthy)
|
|
2018
|
+
? 'INITIALIZING'
|
|
2007
2019
|
: requestedState;
|
|
2008
|
-
const changedState =
|
|
2020
|
+
const changedState = state !== newState;
|
|
2009
2021
|
if (changedState) {
|
|
2010
|
-
|
|
2011
|
-
|
|
2022
|
+
state = newState;
|
|
2023
|
+
stateSinceMillis = timeStamper();
|
|
2012
2024
|
}
|
|
2013
2025
|
if (changedState || isError) {
|
|
2014
|
-
|
|
2026
|
+
emitter.emit('dataSourceStatus', getStatus());
|
|
2015
2027
|
}
|
|
2016
2028
|
}
|
|
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
|
-
}
|
|
2029
|
+
return {
|
|
2030
|
+
get status() {
|
|
2031
|
+
return getStatus();
|
|
2032
|
+
},
|
|
2033
|
+
requestStateUpdate(requestedState) {
|
|
2034
|
+
updateState(requestedState);
|
|
2035
|
+
},
|
|
2036
|
+
reportError(kind, message, statusCode, recoverable = false) {
|
|
2037
|
+
errorInfo = {
|
|
2038
|
+
kind,
|
|
2039
|
+
message,
|
|
2040
|
+
statusCode,
|
|
2041
|
+
time: timeStamper(),
|
|
2042
|
+
};
|
|
2043
|
+
updateState(recoverable ? 'INTERRUPTED' : 'CLOSED', true);
|
|
2044
|
+
},
|
|
2045
|
+
// TODO: SDK-702 - Implement network availability behaviors
|
|
2046
|
+
// setNetworkUnavailable() {
|
|
2047
|
+
// updateState(DataSourceState.NetworkUnavailable);
|
|
2048
|
+
// },
|
|
2049
|
+
};
|
|
2045
2050
|
}
|
|
2046
2051
|
|
|
2047
2052
|
function reportClosed(logger) {
|
|
@@ -2323,8 +2328,8 @@ class BaseDataManager {
|
|
|
2323
2328
|
this.diagnosticsManager = diagnosticsManager;
|
|
2324
2329
|
this.closed = false;
|
|
2325
2330
|
this.logger = config.logger;
|
|
2326
|
-
this.dataSourceStatusManager =
|
|
2327
|
-
this._dataSourceEventHandler =
|
|
2331
|
+
this.dataSourceStatusManager = createDataSourceStatusManager(emitter);
|
|
2332
|
+
this._dataSourceEventHandler = createDataSourceEventHandler(flagManager, this.dataSourceStatusManager, this.config.logger);
|
|
2328
2333
|
}
|
|
2329
2334
|
/**
|
|
2330
2335
|
* Set additional connection parameters for requests polling/streaming.
|
|
@@ -2387,16 +2392,16 @@ class BaseDataManager {
|
|
|
2387
2392
|
return {
|
|
2388
2393
|
start: () => {
|
|
2389
2394
|
// update status before starting processor to ensure potential errors are reported after initializing
|
|
2390
|
-
statusManager.requestStateUpdate(
|
|
2395
|
+
statusManager.requestStateUpdate('INITIALIZING');
|
|
2391
2396
|
processor.start();
|
|
2392
2397
|
},
|
|
2393
2398
|
stop: () => {
|
|
2394
2399
|
processor.stop();
|
|
2395
|
-
statusManager.requestStateUpdate(
|
|
2400
|
+
statusManager.requestStateUpdate('CLOSED');
|
|
2396
2401
|
},
|
|
2397
2402
|
close: () => {
|
|
2398
2403
|
processor.close();
|
|
2399
|
-
statusManager.requestStateUpdate(
|
|
2404
|
+
statusManager.requestStateUpdate('CLOSED');
|
|
2400
2405
|
},
|
|
2401
2406
|
};
|
|
2402
2407
|
}
|
|
@@ -2406,5 +2411,5 @@ class BaseDataManager {
|
|
|
2406
2411
|
}
|
|
2407
2412
|
}
|
|
2408
2413
|
|
|
2409
|
-
export { BaseDataManager, DataSourceState, LDClientImpl,
|
|
2414
|
+
export { BaseDataManager, DataSourceState, LDClientImpl, makeRequestor, readFlagsFromBootstrap, safeRegisterDebugOverridePlugins };
|
|
2410
2415
|
//# sourceMappingURL=index.mjs.map
|