@featbit/js-client-sdk 3.0.13 → 4.0.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 (120) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +301 -301
  3. package/dist/esm/FbClientCore.d.ts +6 -5
  4. package/dist/esm/FbClientCore.d.ts.map +1 -1
  5. package/dist/esm/FbClientCore.js +27 -4
  6. package/dist/esm/FbClientCore.js.map +1 -1
  7. package/dist/esm/IFbClientCore.d.ts +8 -7
  8. package/dist/esm/IFbClientCore.d.ts.map +1 -1
  9. package/dist/esm/version.d.ts +1 -1
  10. package/dist/esm/version.d.ts.map +1 -1
  11. package/dist/esm/version.js +1 -1
  12. package/dist/esm/version.js.map +1 -1
  13. package/dist/umd/featbit-js-client-sdk-4.0.0.js +2 -0
  14. package/dist/umd/featbit-js-client-sdk-4.0.0.js.map +1 -0
  15. package/dist/umd/featbit-js-client-sdk.js +1 -1
  16. package/dist/umd/featbit-js-client-sdk.js.map +1 -1
  17. package/package.json +46 -46
  18. package/src/Configuration.ts +232 -232
  19. package/src/Context.ts +61 -61
  20. package/src/FbClientBuilder.ts +167 -167
  21. package/src/FbClientCore.ts +428 -405
  22. package/src/IContextProperty.ts +3 -3
  23. package/src/IDataKind.ts +11 -11
  24. package/src/IFbClient.ts +29 -29
  25. package/src/IFbClientCore.ts +291 -290
  26. package/src/IVersionedData.ts +18 -18
  27. package/src/bootstrap/IBootstrapProvider.ts +4 -4
  28. package/src/bootstrap/JsonBootstrapProvider.ts +34 -34
  29. package/src/bootstrap/NullBootstrapProvider.ts +20 -20
  30. package/src/bootstrap/index.ts +2 -2
  31. package/src/constants.ts +1 -1
  32. package/src/data-sources/DataSourceUpdates.ts +116 -116
  33. package/src/data-sources/createStreamListeners.ts +67 -67
  34. package/src/data-sources/index.ts +1 -1
  35. package/src/data-sync/DataSyncMode.ts +3 -3
  36. package/src/data-sync/IDataSynchronizer.ts +15 -15
  37. package/src/data-sync/IRequestor.ts +10 -10
  38. package/src/data-sync/NullDataSynchronizer.ts +14 -14
  39. package/src/data-sync/PollingDataSynchronizer.ts +125 -125
  40. package/src/data-sync/Requestor.ts +61 -61
  41. package/src/data-sync/WebSocketDataSynchronizer.ts +77 -77
  42. package/src/data-sync/index.ts +8 -8
  43. package/src/data-sync/types.ts +19 -19
  44. package/src/data-sync/utils.ts +31 -31
  45. package/src/errors.ts +47 -47
  46. package/src/evaluation/EvalResult.ts +35 -35
  47. package/src/evaluation/Evaluator.ts +26 -26
  48. package/src/evaluation/IEvalDetail.ts +23 -23
  49. package/src/evaluation/ReasonKinds.ts +9 -9
  50. package/src/evaluation/data/IFlag.ts +29 -29
  51. package/src/evaluation/index.ts +4 -4
  52. package/src/events/DefaultEventProcessor.ts +83 -83
  53. package/src/events/DefaultEventQueue.ts +49 -49
  54. package/src/events/DefaultEventSender.ts +73 -73
  55. package/src/events/DefaultEventSerializer.ts +11 -11
  56. package/src/events/EventDispatcher.ts +127 -127
  57. package/src/events/EventSerializer.ts +4 -4
  58. package/src/events/IEventProcessor.ts +8 -8
  59. package/src/events/IEventQueue.ts +16 -16
  60. package/src/events/IEventSender.ts +13 -13
  61. package/src/events/NullEventProcessor.ts +15 -15
  62. package/src/events/event.ts +129 -129
  63. package/src/events/index.ts +11 -11
  64. package/src/index.ts +21 -21
  65. package/src/integrations/TestLogger.ts +24 -24
  66. package/src/integrations/index.ts +1 -1
  67. package/src/integrations/test_data/FlagBuilder.ts +59 -59
  68. package/src/integrations/test_data/TestData.ts +57 -57
  69. package/src/integrations/test_data/TestDataSynchronizer.ts +49 -49
  70. package/src/integrations/test_data/index.ts +4 -4
  71. package/src/logging/BasicLogger.ts +108 -108
  72. package/src/logging/IBasicLoggerOptions.ts +46 -46
  73. package/src/logging/ILogger.ts +49 -49
  74. package/src/logging/LogLevel.ts +8 -8
  75. package/src/logging/SafeLogger.ts +69 -69
  76. package/src/logging/format.ts +154 -154
  77. package/src/logging/index.ts +5 -5
  78. package/src/options/ClientContext.ts +39 -39
  79. package/src/options/IClientContext.ts +53 -53
  80. package/src/options/IOptions.ts +123 -123
  81. package/src/options/IUser.ts +6 -6
  82. package/src/options/IValidatedOptions.ts +29 -29
  83. package/src/options/OptionMessages.ts +35 -35
  84. package/src/options/UserBuilder.ts +35 -35
  85. package/src/options/Validators.ts +300 -300
  86. package/src/options/index.ts +7 -7
  87. package/src/platform/IInfo.ts +102 -102
  88. package/src/platform/IPlatform.ts +20 -20
  89. package/src/platform/IStore.ts +112 -112
  90. package/src/platform/IWebSocket.ts +22 -22
  91. package/src/platform/browser/BrowserInfo.ts +24 -24
  92. package/src/platform/browser/BrowserPlatform.ts +19 -19
  93. package/src/platform/browser/BrowserRequests.ts +6 -6
  94. package/src/platform/browser/BrowserWebSocket.ts +147 -147
  95. package/src/platform/browser/FbClient.ts +65 -65
  96. package/src/platform/browser/LocalStorageStore.ts +59 -59
  97. package/src/platform/index.ts +11 -11
  98. package/src/platform/requests.ts +76 -76
  99. package/src/store/BaseStore.ts +125 -125
  100. package/src/store/DataKinds.ts +6 -6
  101. package/src/store/IDataSourceUpdates.ts +68 -68
  102. package/src/store/InMemoryStore.ts +36 -36
  103. package/src/store/index.ts +5 -5
  104. package/src/store/serialization.ts +52 -52
  105. package/src/store/store.ts +37 -37
  106. package/src/utils/Emits.ts +75 -75
  107. package/src/utils/EventEmitter.ts +128 -128
  108. package/src/utils/IEventEmitter.ts +14 -14
  109. package/src/utils/Regex.ts +21 -21
  110. package/src/utils/ValueConverters.ts +55 -55
  111. package/src/utils/canonicalizeUri.ts +3 -3
  112. package/src/utils/debounce.ts +33 -33
  113. package/src/utils/http.ts +40 -40
  114. package/src/utils/index.ts +5 -5
  115. package/src/utils/isNullOrUndefined.ts +2 -2
  116. package/src/utils/serializeUser.ts +27 -27
  117. package/src/utils/sleep.ts +5 -5
  118. package/src/version.ts +1 -1
  119. package/dist/umd/featbit-js-client-sdk-3.0.13.js +0 -2
  120. package/dist/umd/featbit-js-client-sdk-3.0.13.js.map +0 -1
@@ -1,124 +1,124 @@
1
- import { ILogger } from "../logging/ILogger";
2
- import { IDataSynchronizer } from "../data-sync/IDataSynchronizer";
3
- import { IClientContext } from "./IClientContext";
4
- import { IDataSourceUpdates } from "../store/IDataSourceUpdates";
5
- import { VoidFunction } from "../utils/VoidFunction";
6
- import { IStore } from "../platform/IStore";
7
- import { DataSyncModeEnum } from "../data-sync/DataSyncMode";
8
- import { IUser } from "./IUser";
9
- import { IFlagBase } from "../evaluation";
10
-
11
- export interface IOptions {
12
- /**
13
- * The user for whom you are evaluating feature flags.
14
- */
15
- user?: IUser;
16
-
17
- /**
18
- * How long the client constructor will block awaiting a successful connection to FeatBit, in milliseconds.
19
- *
20
- * Defaults to 5000 milliseconds.
21
- */
22
- startWaitTime?: number;
23
-
24
- /**
25
- * The SDK key for your FeatBit environment.
26
- */
27
- sdkKey?: string;
28
-
29
- /**
30
- * The mode to sync flag end segment data with the FeatBit server. See {@link DataSyncModeEnum} for possible values.
31
- *
32
- * Defaults to {@link DataSyncModeEnum.STREAMING}.
33
- */
34
- dataSyncMode?: DataSyncModeEnum;
35
-
36
- /**
37
- * The base URI of the data-sync service, mandatory if the {@link dataSyncMode} is set to {@link DataSyncModeEnum.STREAMING}.
38
- */
39
- streamingUri?: string;
40
-
41
- /**
42
- * The base URI of the polling service, mandatory if the {@link dataSyncMode} option is set to {@link DataSyncModeEnum.POLLING}.
43
- */
44
- pollingUri?: string;
45
-
46
- /**
47
- * The base URI of the event service
48
- */
49
- eventsUri?: string;
50
-
51
- /**
52
- * Whether this client is offline. If true, no calls to FeatBit will be made.
53
- *
54
- * Defaults to false
55
- */
56
- offline?: boolean;
57
-
58
- /**
59
- * The time between polling requests, in milliseconds. Ignored in data-sync mode.
60
- *
61
- * Defaults to 30 000 milliseconds.
62
- */
63
- pollingInterval?: number;
64
-
65
- /**
66
- * The interval in between flushes of events queue, in milliseconds.
67
- *
68
- * The default value is 2 000 milliseconds.
69
- */
70
- flushInterval?: number;
71
-
72
- /**
73
- * The max number of events in the events queue.
74
- * defaults to 10 000
75
- */
76
- maxEventsInQueue?: number;
77
-
78
- /**
79
- * Configures a logger for warnings and errors generated by the SDK.
80
- *
81
- * The logger can be any object that conforms to the {@link ILogger} interface.
82
- * For a simple implementation that lets you filter by log level, see
83
- * {@link BasicLogger}. You can also use an instance of `winston.Logger` from
84
- * the Winston logging package.
85
- *
86
- * If you do not set this property, the SDK uses {@link BasicLogger} with a
87
- * minimum level of `info`.
88
- */
89
- logger?: ILogger;
90
-
91
- /**
92
- * The interval in between sending WebSocket ping messages to evaluation server, in milliseconds.
93
-
94
- * Defaults to 18 000 milliseconds.
95
- */
96
- webSocketPingInterval?: number;
97
-
98
- /**
99
- * The flags to bootstrap the client, which should be the string representation of type {@link IFlagBase[]}.
100
- */
101
- bootstrap?: IFlagBase[];
102
-
103
- /**
104
- * The store to use for caching feature flag data.
105
- *
106
- * Defaults to {@link InMemoryStore}.
107
- */
108
- store?: IStore | ((options: IOptions) => IStore);
109
-
110
- /**
111
- * A component that obtains feature flag data and puts it in the store.
112
- *
113
- * Defaults to {@link WebSocketDataSynchronizer}.
114
- */
115
- dataSynchronizer?:
116
- | object
117
- | ((
118
- clientContext: IClientContext,
119
- store: IStore,
120
- dataSourceUpdates: IDataSourceUpdates,
121
- initSuccessHandler: VoidFunction,
122
- errorHandler?: (e: Error) => void,
123
- ) => IDataSynchronizer);
1
+ import { ILogger } from "../logging/ILogger";
2
+ import { IDataSynchronizer } from "../data-sync/IDataSynchronizer";
3
+ import { IClientContext } from "./IClientContext";
4
+ import { IDataSourceUpdates } from "../store/IDataSourceUpdates";
5
+ import { VoidFunction } from "../utils/VoidFunction";
6
+ import { IStore } from "../platform/IStore";
7
+ import { DataSyncModeEnum } from "../data-sync/DataSyncMode";
8
+ import { IUser } from "./IUser";
9
+ import { IFlagBase } from "../evaluation";
10
+
11
+ export interface IOptions {
12
+ /**
13
+ * The user for whom you are evaluating feature flags.
14
+ */
15
+ user?: IUser;
16
+
17
+ /**
18
+ * How long the client constructor will block awaiting a successful connection to FeatBit, in milliseconds.
19
+ *
20
+ * Defaults to 5000 milliseconds.
21
+ */
22
+ startWaitTime?: number;
23
+
24
+ /**
25
+ * The SDK key for your FeatBit environment.
26
+ */
27
+ sdkKey?: string;
28
+
29
+ /**
30
+ * The mode to sync flag end segment data with the FeatBit server. See {@link DataSyncModeEnum} for possible values.
31
+ *
32
+ * Defaults to {@link DataSyncModeEnum.STREAMING}.
33
+ */
34
+ dataSyncMode?: DataSyncModeEnum;
35
+
36
+ /**
37
+ * The base URI of the data-sync service, mandatory if the {@link dataSyncMode} is set to {@link DataSyncModeEnum.STREAMING}.
38
+ */
39
+ streamingUri?: string;
40
+
41
+ /**
42
+ * The base URI of the polling service, mandatory if the {@link dataSyncMode} option is set to {@link DataSyncModeEnum.POLLING}.
43
+ */
44
+ pollingUri?: string;
45
+
46
+ /**
47
+ * The base URI of the event service
48
+ */
49
+ eventsUri?: string;
50
+
51
+ /**
52
+ * Whether this client is offline. If true, no calls to FeatBit will be made.
53
+ *
54
+ * Defaults to false
55
+ */
56
+ offline?: boolean;
57
+
58
+ /**
59
+ * The time between polling requests, in milliseconds. Ignored in data-sync mode.
60
+ *
61
+ * Defaults to 30 000 milliseconds.
62
+ */
63
+ pollingInterval?: number;
64
+
65
+ /**
66
+ * The interval in between flushes of events queue, in milliseconds.
67
+ *
68
+ * The default value is 2 000 milliseconds.
69
+ */
70
+ flushInterval?: number;
71
+
72
+ /**
73
+ * The max number of events in the events queue.
74
+ * defaults to 10 000
75
+ */
76
+ maxEventsInQueue?: number;
77
+
78
+ /**
79
+ * Configures a logger for warnings and errors generated by the SDK.
80
+ *
81
+ * The logger can be any object that conforms to the {@link ILogger} interface.
82
+ * For a simple implementation that lets you filter by log level, see
83
+ * {@link BasicLogger}. You can also use an instance of `winston.Logger` from
84
+ * the Winston logging package.
85
+ *
86
+ * If you do not set this property, the SDK uses {@link BasicLogger} with a
87
+ * minimum level of `info`.
88
+ */
89
+ logger?: ILogger;
90
+
91
+ /**
92
+ * The interval in between sending WebSocket ping messages to evaluation server, in milliseconds.
93
+
94
+ * Defaults to 18 000 milliseconds.
95
+ */
96
+ webSocketPingInterval?: number;
97
+
98
+ /**
99
+ * The flags to bootstrap the client, which should be the string representation of type {@link IFlagBase[]}.
100
+ */
101
+ bootstrap?: IFlagBase[];
102
+
103
+ /**
104
+ * The store to use for caching feature flag data.
105
+ *
106
+ * Defaults to {@link InMemoryStore}.
107
+ */
108
+ store?: IStore | ((options: IOptions) => IStore);
109
+
110
+ /**
111
+ * A component that obtains feature flag data and puts it in the store.
112
+ *
113
+ * Defaults to {@link WebSocketDataSynchronizer}.
114
+ */
115
+ dataSynchronizer?:
116
+ | object
117
+ | ((
118
+ clientContext: IClientContext,
119
+ store: IStore,
120
+ dataSourceUpdates: IDataSourceUpdates,
121
+ initSuccessHandler: VoidFunction,
122
+ errorHandler?: (e: Error) => void,
123
+ ) => IDataSynchronizer);
124
124
  }
@@ -1,7 +1,7 @@
1
- import { IContextProperty } from "../IContextProperty";
2
-
3
- export interface IUser {
4
- keyId: string;
5
- name?: string;
6
- customizedProperties?: IContextProperty[];
1
+ import { IContextProperty } from "../IContextProperty";
2
+
3
+ export interface IUser {
4
+ keyId: string;
5
+ name?: string;
6
+ customizedProperties?: IContextProperty[];
7
7
  }
@@ -1,30 +1,30 @@
1
- import { ILogger } from "../logging/ILogger";
2
- import { IStore } from "../platform/IStore";
3
- import { IOptions } from "./IOptions";
4
- import { IDataSynchronizer } from "../data-sync/IDataSynchronizer";
5
- import { DataSyncModeEnum } from "../data-sync/DataSyncMode";
6
- import { IUser } from "./IUser";
7
- import { IBootstrapProvider } from "../bootstrap";
8
- import { IFlagBase } from "../evaluation";
9
-
10
- export interface IValidatedOptions {
11
- startWaitTime: number;
12
- sdkKey: string;
13
- pollingUri: string;
14
- streamingUri: string;
15
- eventsUri: string;
16
- dataSyncMode: DataSyncModeEnum;
17
- webSocketPingInterval?: number;
18
- flushInterval: number;
19
- maxEventsInQueue: number;
20
- pollingInterval: number;
21
- offline: boolean;
22
- store: IStore | ((options: IOptions) => IStore);
23
- dataSynchronizer?: IDataSynchronizer;
24
- logger?: ILogger;
25
- user?: IUser;
26
- bootstrap?: IFlagBase[];
27
-
28
- // Allow indexing this by a string for the validation step.
29
- [index: string]: any;
1
+ import { ILogger } from "../logging/ILogger";
2
+ import { IStore } from "../platform/IStore";
3
+ import { IOptions } from "./IOptions";
4
+ import { IDataSynchronizer } from "../data-sync/IDataSynchronizer";
5
+ import { DataSyncModeEnum } from "../data-sync/DataSyncMode";
6
+ import { IUser } from "./IUser";
7
+ import { IBootstrapProvider } from "../bootstrap";
8
+ import { IFlagBase } from "../evaluation";
9
+
10
+ export interface IValidatedOptions {
11
+ startWaitTime: number;
12
+ sdkKey: string;
13
+ pollingUri: string;
14
+ streamingUri: string;
15
+ eventsUri: string;
16
+ dataSyncMode: DataSyncModeEnum;
17
+ webSocketPingInterval?: number;
18
+ flushInterval: number;
19
+ maxEventsInQueue: number;
20
+ pollingInterval: number;
21
+ offline: boolean;
22
+ store: IStore | ((options: IOptions) => IStore);
23
+ dataSynchronizer?: IDataSynchronizer;
24
+ logger?: ILogger;
25
+ user?: IUser;
26
+ bootstrap?: IFlagBase[];
27
+
28
+ // Allow indexing this by a string for the validation step.
29
+ [index: string]: any;
30
30
  }
@@ -1,36 +1,36 @@
1
- /**
2
- * Messages for issues which can be encountered from processing the configuration options.
3
- */
4
- export default class OptionMessages {
5
- static optionBelowMinimum(name: string, value: number, min: number): string {
6
- return `Config option "${ name }" had invalid value of ${ value }, using minimum of ${ min } instead`;
7
- }
8
-
9
- static unknownOption(name: string): string {
10
- return `Ignoring unknown config option "${ name }"`;
11
- }
12
-
13
- static wrongOptionType(name: string, expectedType: string, actualType: string): string {
14
- return `Config option "${ name }" should be of type ${ expectedType }, got ${ actualType }, using default value`;
15
- }
16
-
17
- static wrongOptionTypeBoolean(name: string, actualType: string): string {
18
- return `Config option "${ name }" should be a boolean, got ${ actualType }, converting to boolean`;
19
- }
20
-
21
- static partialEndpoint(name: string): string {
22
- return `You have set custom uris without specifying the ${ name } URI; connections may not work properly`;
23
- }
24
-
25
- static mandatory(name: string): string {
26
- return `${ name } is mandatory`;
27
- }
28
-
29
- static invalidOptionValue(name: string): string {
30
- return `Invalid option value: ${ name }`;
31
- }
32
-
33
- static missingKeyInBootstrapValue(key: string): string {
34
- return `Missing key "${ key }" in bootstrap value`;
35
- }
1
+ /**
2
+ * Messages for issues which can be encountered from processing the configuration options.
3
+ */
4
+ export default class OptionMessages {
5
+ static optionBelowMinimum(name: string, value: number, min: number): string {
6
+ return `Config option "${ name }" had invalid value of ${ value }, using minimum of ${ min } instead`;
7
+ }
8
+
9
+ static unknownOption(name: string): string {
10
+ return `Ignoring unknown config option "${ name }"`;
11
+ }
12
+
13
+ static wrongOptionType(name: string, expectedType: string, actualType: string): string {
14
+ return `Config option "${ name }" should be of type ${ expectedType }, got ${ actualType }, using default value`;
15
+ }
16
+
17
+ static wrongOptionTypeBoolean(name: string, actualType: string): string {
18
+ return `Config option "${ name }" should be a boolean, got ${ actualType }, converting to boolean`;
19
+ }
20
+
21
+ static partialEndpoint(name: string): string {
22
+ return `You have set custom uris without specifying the ${ name } URI; connections may not work properly`;
23
+ }
24
+
25
+ static mandatory(name: string): string {
26
+ return `${ name } is mandatory`;
27
+ }
28
+
29
+ static invalidOptionValue(name: string): string {
30
+ return `Invalid option value: ${ name }`;
31
+ }
32
+
33
+ static missingKeyInBootstrapValue(key: string): string {
34
+ return `Missing key "${ key }" in bootstrap value`;
35
+ }
36
36
  }
@@ -1,36 +1,36 @@
1
- import { IUser } from "./IUser";
2
- import {IContextProperty} from "../IContextProperty";
3
-
4
- /**
5
- * Creates an instance of the FeatBit user.
6
- *
7
- * @return
8
- * The new {@link IUser} instance.
9
- */
10
- export class UserBuilder {
11
- private _keyId: string = '';
12
- private _name: string = '';
13
- private _custom: IContextProperty[] = [];
14
-
15
- constructor(keyId: string) {
16
- this._keyId = keyId;
17
- }
18
-
19
- name(name: string): UserBuilder {
20
- this._name = name;
21
- return this;
22
- }
23
-
24
- custom(propertyName: string, value: string): UserBuilder {
25
- this._custom?.push({ name: propertyName, value: `${value}` });
26
- return this;
27
- }
28
-
29
- build(): IUser {
30
- return {
31
- name: this._name,
32
- keyId: this._keyId,
33
- customizedProperties: this._custom
34
- };
35
- }
1
+ import { IUser } from "./IUser";
2
+ import {IContextProperty} from "../IContextProperty";
3
+
4
+ /**
5
+ * Creates an instance of the FeatBit user.
6
+ *
7
+ * @return
8
+ * The new {@link IUser} instance.
9
+ */
10
+ export class UserBuilder {
11
+ private _keyId: string = '';
12
+ private _name: string = '';
13
+ private _custom: IContextProperty[] = [];
14
+
15
+ constructor(keyId: string) {
16
+ this._keyId = keyId;
17
+ }
18
+
19
+ name(name: string): UserBuilder {
20
+ this._name = name;
21
+ return this;
22
+ }
23
+
24
+ custom(propertyName: string, value: string): UserBuilder {
25
+ this._custom?.push({ name: propertyName, value: `${value}` });
26
+ return this;
27
+ }
28
+
29
+ build(): IUser {
30
+ return {
31
+ name: this._name,
32
+ keyId: this._keyId,
33
+ customizedProperties: this._custom
34
+ };
35
+ }
36
36
  }