@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.
Files changed (40) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/DataManager.d.ts +2 -2
  3. package/dist/cjs/DataManager.d.ts.map +1 -1
  4. package/dist/cjs/LDEmitter.d.ts.map +1 -1
  5. package/dist/cjs/datasource/DataSourceEventHandler.d.ts +4 -6
  6. package/dist/cjs/datasource/DataSourceEventHandler.d.ts.map +1 -1
  7. package/dist/cjs/datasource/DataSourceStatus.d.ts +64 -14
  8. package/dist/cjs/datasource/DataSourceStatus.d.ts.map +1 -1
  9. package/dist/cjs/datasource/DataSourceStatusManager.d.ts +6 -17
  10. package/dist/cjs/datasource/DataSourceStatusManager.d.ts.map +1 -1
  11. package/dist/cjs/datasource/Requestor.d.ts +2 -9
  12. package/dist/cjs/datasource/Requestor.d.ts.map +1 -1
  13. package/dist/cjs/flag-manager/bootstrap.d.ts +6 -0
  14. package/dist/cjs/flag-manager/bootstrap.d.ts.map +1 -0
  15. package/dist/cjs/index.cjs +160 -150
  16. package/dist/cjs/index.cjs.map +1 -1
  17. package/dist/cjs/index.d.ts +2 -1
  18. package/dist/cjs/index.d.ts.map +1 -1
  19. package/dist/cjs/streaming/StreamingProcessor.d.ts +1 -1
  20. package/dist/cjs/streaming/StreamingProcessor.d.ts.map +1 -1
  21. package/dist/esm/DataManager.d.ts +2 -2
  22. package/dist/esm/DataManager.d.ts.map +1 -1
  23. package/dist/esm/LDEmitter.d.ts.map +1 -1
  24. package/dist/esm/datasource/DataSourceEventHandler.d.ts +4 -6
  25. package/dist/esm/datasource/DataSourceEventHandler.d.ts.map +1 -1
  26. package/dist/esm/datasource/DataSourceStatus.d.ts +64 -14
  27. package/dist/esm/datasource/DataSourceStatus.d.ts.map +1 -1
  28. package/dist/esm/datasource/DataSourceStatusManager.d.ts +6 -17
  29. package/dist/esm/datasource/DataSourceStatusManager.d.ts.map +1 -1
  30. package/dist/esm/datasource/Requestor.d.ts +2 -9
  31. package/dist/esm/datasource/Requestor.d.ts.map +1 -1
  32. package/dist/esm/flag-manager/bootstrap.d.ts +6 -0
  33. package/dist/esm/flag-manager/bootstrap.d.ts.map +1 -0
  34. package/dist/esm/index.d.ts +2 -1
  35. package/dist/esm/index.d.ts.map +1 -1
  36. package/dist/esm/index.mjs +159 -150
  37. package/dist/esm/index.mjs.map +1 -1
  38. package/dist/esm/streaming/StreamingProcessor.d.ts +1 -1
  39. package/dist/esm/streaming/StreamingProcessor.d.ts.map +1 -1
  40. 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.');
@@ -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
- 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
- }
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
- * 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() {
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: this._state,
1994
- stateSince: this._stateSinceMillis,
1995
- lastError: this._errorInfo,
2015
+ state,
2016
+ stateSince: stateSinceMillis,
2017
+ lastError: errorInfo,
1996
2018
  };
1997
2019
  }
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
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 = this._state !== newState;
2024
+ const changedState = state !== newState;
2009
2025
  if (changedState) {
2010
- this._state = newState;
2011
- this._stateSinceMillis = this._timeStamper();
2026
+ state = newState;
2027
+ stateSinceMillis = timeStamper();
2012
2028
  }
2013
2029
  if (changedState || isError) {
2014
- this._emitter.emit('dataSourceStatus', this.status);
2030
+ emitter.emit('dataSourceStatus', getStatus());
2015
2031
  }
2016
2032
  }
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
- }
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 = new DataSourceStatusManager(emitter);
2327
- this._dataSourceEventHandler = new DataSourceEventHandler(flagManager, this.dataSourceStatusManager, this.config.logger);
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(DataSourceState.Initializing);
2399
+ statusManager.requestStateUpdate('INITIALIZING');
2391
2400
  processor.start();
2392
2401
  },
2393
2402
  stop: () => {
2394
2403
  processor.stop();
2395
- statusManager.requestStateUpdate(DataSourceState.Closed);
2404
+ statusManager.requestStateUpdate('CLOSED');
2396
2405
  },
2397
2406
  close: () => {
2398
2407
  processor.close();
2399
- statusManager.requestStateUpdate(DataSourceState.Closed);
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, Requestor, makeRequestor, safeRegisterDebugOverridePlugins };
2418
+ export { BaseDataManager, DataSourceState, LDClientImpl, makeRequestor, readFlagsFromBootstrap, safeRegisterDebugOverridePlugins };
2410
2419
  //# sourceMappingURL=index.mjs.map