@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.
Files changed (38) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/cjs/DataManager.d.ts +2 -2
  3. package/dist/cjs/DataManager.d.ts.map +1 -1
  4. package/dist/cjs/datasource/DataSourceEventHandler.d.ts +4 -6
  5. package/dist/cjs/datasource/DataSourceEventHandler.d.ts.map +1 -1
  6. package/dist/cjs/datasource/DataSourceStatus.d.ts +64 -14
  7. package/dist/cjs/datasource/DataSourceStatus.d.ts.map +1 -1
  8. package/dist/cjs/datasource/DataSourceStatusManager.d.ts +6 -17
  9. package/dist/cjs/datasource/DataSourceStatusManager.d.ts.map +1 -1
  10. package/dist/cjs/datasource/Requestor.d.ts +2 -9
  11. package/dist/cjs/datasource/Requestor.d.ts.map +1 -1
  12. package/dist/cjs/flag-manager/bootstrap.d.ts +6 -0
  13. package/dist/cjs/flag-manager/bootstrap.d.ts.map +1 -0
  14. package/dist/cjs/index.cjs +156 -150
  15. package/dist/cjs/index.cjs.map +1 -1
  16. package/dist/cjs/index.d.ts +2 -1
  17. package/dist/cjs/index.d.ts.map +1 -1
  18. package/dist/cjs/streaming/StreamingProcessor.d.ts +1 -1
  19. package/dist/cjs/streaming/StreamingProcessor.d.ts.map +1 -1
  20. package/dist/esm/DataManager.d.ts +2 -2
  21. package/dist/esm/DataManager.d.ts.map +1 -1
  22. package/dist/esm/datasource/DataSourceEventHandler.d.ts +4 -6
  23. package/dist/esm/datasource/DataSourceEventHandler.d.ts.map +1 -1
  24. package/dist/esm/datasource/DataSourceStatus.d.ts +64 -14
  25. package/dist/esm/datasource/DataSourceStatus.d.ts.map +1 -1
  26. package/dist/esm/datasource/DataSourceStatusManager.d.ts +6 -17
  27. package/dist/esm/datasource/DataSourceStatusManager.d.ts.map +1 -1
  28. package/dist/esm/datasource/Requestor.d.ts +2 -9
  29. package/dist/esm/datasource/Requestor.d.ts.map +1 -1
  30. package/dist/esm/flag-manager/bootstrap.d.ts +6 -0
  31. package/dist/esm/flag-manager/bootstrap.d.ts.map +1 -0
  32. package/dist/esm/index.d.ts +2 -1
  33. package/dist/esm/index.d.ts.map +1 -1
  34. package/dist/esm/index.mjs +155 -150
  35. package/dist/esm/index.mjs.map +1 -1
  36. package/dist/esm/streaming/StreamingProcessor.d.ts +1 -1
  37. package/dist/esm/streaming/StreamingProcessor.d.ts.map +1 -1
  38. 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 default class DataSourceStatusManager {
8
- private readonly _emitter;
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
- * Updates the state of the manager.
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;AAGvE;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAOxC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAN3B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,UAAU,CAAC,CAA4B;IAC/C,OAAO,CAAC,YAAY,CAAe;gBAGhB,QAAQ,EAAE,SAAS,EACpC,WAAW,GAAE,MAAM,MAAyB;IAO9C,IAAI,MAAM,IAAI,gBAAgB,CAM7B;IAED;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAiBpB;;;;OAIG;IACH,kBAAkB,CAAC,KAAK,EAAE,eAAe;IAIzC;;;;;;;;;OASG;IACH,WAAW,CACT,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,GAAE,OAAe;CAgB/B"}
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 default class Requestor {
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":"AACA,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,CAAC,OAAO,OAAO,SAAS;IAE1B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAJf,SAAS,EAAE,QAAQ,EACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,EACnC,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,oBAAQ;IAG3B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;CAkBxC;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,aA0BxB"}
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,6 @@
1
+ import { LDLogger } from '@launchdarkly/js-sdk-common';
2
+ import { ItemDescriptor } from './ItemDescriptor';
3
+ export declare function readFlagsFromBootstrap(logger: LDLogger, data: any): {
4
+ [key: string]: ItemDescriptor;
5
+ };
6
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -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"}
@@ -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 Requestor, { makeRequestor } from './datasource/Requestor';
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 };
@@ -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,SAAS,EAAE,EAAE,aAAa,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;AAEpC,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"}
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"}
@@ -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
- var DataSourceState;
7
- (function (DataSourceState) {
8
- DataSourceState["Initializing"] = "INITIALIZING";
9
- DataSourceState["Valid"] = "VALID";
10
- DataSourceState["Interrupted"] = "INTERRUPTED";
11
- DataSourceState["SetOffline"] = "SET_OFFLINE";
12
- DataSourceState["Closed"] = "CLOSED";
13
- // TODO: SDK-702 - Implement network availability behaviors
14
- // NetworkUnavailable,
15
- })(DataSourceState || (DataSourceState = {}));
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 new Requestor(requests, uri, headers, method, body);
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
- class DataSourceEventHandler {
1935
- constructor(_flagManager, _statusManager, _logger) {
1936
- this._flagManager = _flagManager;
1937
- this._statusManager = _statusManager;
1938
- this._logger = _logger;
1939
- }
1940
- async handlePut(context, flags) {
1941
- this._logger.debug(`Got PUT: ${Object.keys(flags)}`);
1942
- // mapping flags to item descriptors
1943
- const descriptors = Object.entries(flags).reduce((acc, [key, flag]) => {
1944
- acc[key] = { version: flag.version, flag };
1945
- return acc;
1946
- }, {});
1947
- await this._flagManager.init(context, descriptors);
1948
- this._statusManager.requestStateUpdate(DataSourceState.Valid);
1949
- }
1950
- async handlePatch(context, patchFlag) {
1951
- this._logger.debug(`Got PATCH ${JSON.stringify(patchFlag, null, 2)}`);
1952
- this._flagManager.upsert(context, patchFlag.key, {
1953
- version: patchFlag.version,
1954
- flag: patchFlag,
1955
- });
1956
- }
1957
- async handleDelete(context, deleteFlag) {
1958
- this._logger.debug(`Got DELETE ${JSON.stringify(deleteFlag, null, 2)}`);
1959
- this._flagManager.upsert(context, deleteFlag.key, {
1960
- version: deleteFlag.version,
1961
- flag: {
1962
- ...deleteFlag,
1963
- deleted: true,
1964
- // props below are set to sensible defaults. they are irrelevant
1965
- // because this flag has been deleted.
1966
- flagVersion: 0,
1967
- value: undefined,
1968
- variation: 0,
1969
- trackEvents: false,
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
- * Tracks the current data source status and emits updates when the status changes.
1983
- */
1984
- class DataSourceStatusManager {
1985
- constructor(_emitter, timeStamper = () => Date.now()) {
1986
- this._emitter = _emitter;
1987
- this._state = DataSourceState.Closed;
1988
- this._stateSinceMillis = timeStamper();
1989
- this._timeStamper = timeStamper;
1990
- }
1991
- get status() {
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: this._state,
1994
- stateSince: this._stateSinceMillis,
1995
- lastError: this._errorInfo,
2011
+ state,
2012
+ stateSince: stateSinceMillis,
2013
+ lastError: errorInfo,
1996
2014
  };
1997
2015
  }
1998
- /**
1999
- * Updates the state of the manager.
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 = this._state !== newState;
2020
+ const changedState = state !== newState;
2009
2021
  if (changedState) {
2010
- this._state = newState;
2011
- this._stateSinceMillis = this._timeStamper();
2022
+ state = newState;
2023
+ stateSinceMillis = timeStamper();
2012
2024
  }
2013
2025
  if (changedState || isError) {
2014
- this._emitter.emit('dataSourceStatus', this.status);
2026
+ emitter.emit('dataSourceStatus', getStatus());
2015
2027
  }
2016
2028
  }
2017
- /**
2018
- * Requests the manager move to the provided state. This request may be ignored
2019
- * if the current state cannot transition to the requested state.
2020
- * @param state that is requested
2021
- */
2022
- requestStateUpdate(state) {
2023
- this._updateState(state);
2024
- }
2025
- /**
2026
- * Reports a datasource error to this manager. Since the {@link DataSourceStatus} includes error
2027
- * information, it is possible that that a {@link DataSourceStatus} update is emitted with
2028
- * the same {@link DataSourceState}.
2029
- *
2030
- * @param kind of the error
2031
- * @param message for the error
2032
- * @param statusCode of the error if there was one
2033
- * @param recoverable to indicate that the error is anticipated to be recoverable
2034
- */
2035
- reportError(kind, message, statusCode, recoverable = false) {
2036
- const errorInfo = {
2037
- kind,
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 = new DataSourceStatusManager(emitter);
2327
- this._dataSourceEventHandler = new DataSourceEventHandler(flagManager, this.dataSourceStatusManager, this.config.logger);
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(DataSourceState.Initializing);
2395
+ statusManager.requestStateUpdate('INITIALIZING');
2391
2396
  processor.start();
2392
2397
  },
2393
2398
  stop: () => {
2394
2399
  processor.stop();
2395
- statusManager.requestStateUpdate(DataSourceState.Closed);
2400
+ statusManager.requestStateUpdate('CLOSED');
2396
2401
  },
2397
2402
  close: () => {
2398
2403
  processor.close();
2399
- statusManager.requestStateUpdate(DataSourceState.Closed);
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, Requestor, makeRequestor, safeRegisterDebugOverridePlugins };
2414
+ export { BaseDataManager, DataSourceState, LDClientImpl, makeRequestor, readFlagsFromBootstrap, safeRegisterDebugOverridePlugins };
2410
2415
  //# sourceMappingURL=index.mjs.map