@featbit/js-client-sdk 3.0.11 → 3.0.13

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 (147) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +301 -301
  3. package/dist/esm/FbClientCore.d.ts.map +1 -1
  4. package/dist/esm/FbClientCore.js +1 -1
  5. package/dist/esm/FbClientCore.js.map +1 -1
  6. package/dist/esm/data-sources/DataSourceUpdates.d.ts +2 -2
  7. package/dist/esm/data-sources/DataSourceUpdates.d.ts.map +1 -1
  8. package/dist/esm/data-sources/DataSourceUpdates.js +55 -51
  9. package/dist/esm/data-sources/DataSourceUpdates.js.map +1 -1
  10. package/dist/esm/data-sources/createStreamListeners.d.ts +0 -9
  11. package/dist/esm/data-sources/createStreamListeners.d.ts.map +1 -1
  12. package/dist/esm/data-sources/createStreamListeners.js +10 -10
  13. package/dist/esm/data-sources/createStreamListeners.js.map +1 -1
  14. package/dist/esm/data-sync/IDataSynchronizer.d.ts +1 -1
  15. package/dist/esm/data-sync/IDataSynchronizer.d.ts.map +1 -1
  16. package/dist/esm/data-sync/NullDataSynchronizer.d.ts +1 -1
  17. package/dist/esm/data-sync/NullDataSynchronizer.d.ts.map +1 -1
  18. package/dist/esm/data-sync/NullDataSynchronizer.js +11 -0
  19. package/dist/esm/data-sync/NullDataSynchronizer.js.map +1 -1
  20. package/dist/esm/data-sync/PollingDataSynchronizer.d.ts +1 -1
  21. package/dist/esm/data-sync/PollingDataSynchronizer.d.ts.map +1 -1
  22. package/dist/esm/data-sync/PollingDataSynchronizer.js +42 -17
  23. package/dist/esm/data-sync/PollingDataSynchronizer.js.map +1 -1
  24. package/dist/esm/data-sync/WebSocketDataSynchronizer.d.ts +2 -1
  25. package/dist/esm/data-sync/WebSocketDataSynchronizer.d.ts.map +1 -1
  26. package/dist/esm/data-sync/WebSocketDataSynchronizer.js +20 -6
  27. package/dist/esm/data-sync/WebSocketDataSynchronizer.js.map +1 -1
  28. package/dist/esm/data-sync/types.d.ts +1 -1
  29. package/dist/esm/data-sync/types.d.ts.map +1 -1
  30. package/dist/esm/integrations/test_data/TestDataSynchronizer.d.ts +1 -1
  31. package/dist/esm/integrations/test_data/TestDataSynchronizer.d.ts.map +1 -1
  32. package/dist/esm/integrations/test_data/TestDataSynchronizer.js +3 -1
  33. package/dist/esm/integrations/test_data/TestDataSynchronizer.js.map +1 -1
  34. package/dist/esm/platform/browser/BrowserWebSocket.d.ts.map +1 -1
  35. package/dist/esm/platform/browser/BrowserWebSocket.js +4 -0
  36. package/dist/esm/platform/browser/BrowserWebSocket.js.map +1 -1
  37. package/dist/esm/store/IDataSourceUpdates.d.ts +2 -2
  38. package/dist/esm/store/IDataSourceUpdates.d.ts.map +1 -1
  39. package/dist/esm/version.d.ts +1 -1
  40. package/dist/esm/version.js +1 -1
  41. package/dist/umd/{featbit-js-client-sdk-3.0.11.js → featbit-js-client-sdk-3.0.13.js} +2 -2
  42. package/dist/umd/featbit-js-client-sdk-3.0.13.js.map +1 -0
  43. package/dist/umd/featbit-js-client-sdk.js +1 -1
  44. package/dist/umd/featbit-js-client-sdk.js.map +1 -1
  45. package/package.json +46 -46
  46. package/src/Configuration.ts +232 -232
  47. package/src/Context.ts +61 -61
  48. package/src/FbClientBuilder.ts +167 -167
  49. package/src/FbClientCore.ts +405 -401
  50. package/src/IContextProperty.ts +3 -3
  51. package/src/IDataKind.ts +11 -11
  52. package/src/IFbClient.ts +29 -29
  53. package/src/IFbClientCore.ts +290 -290
  54. package/src/IVersionedData.ts +18 -18
  55. package/src/bootstrap/IBootstrapProvider.ts +4 -4
  56. package/src/bootstrap/JsonBootstrapProvider.ts +34 -34
  57. package/src/bootstrap/NullBootstrapProvider.ts +20 -20
  58. package/src/bootstrap/index.ts +2 -2
  59. package/src/constants.ts +1 -1
  60. package/src/data-sources/DataSourceUpdates.ts +116 -116
  61. package/src/data-sources/createStreamListeners.ts +67 -66
  62. package/src/data-sources/index.ts +1 -1
  63. package/src/data-sync/DataSyncMode.ts +3 -3
  64. package/src/data-sync/IDataSynchronizer.ts +15 -15
  65. package/src/data-sync/IRequestor.ts +10 -10
  66. package/src/data-sync/NullDataSynchronizer.ts +14 -14
  67. package/src/data-sync/PollingDataSynchronizer.ts +125 -111
  68. package/src/data-sync/Requestor.ts +61 -61
  69. package/src/data-sync/WebSocketDataSynchronizer.ts +77 -73
  70. package/src/data-sync/index.ts +8 -8
  71. package/src/data-sync/types.ts +19 -19
  72. package/src/data-sync/utils.ts +31 -31
  73. package/src/errors.ts +47 -47
  74. package/src/evaluation/EvalResult.ts +35 -35
  75. package/src/evaluation/Evaluator.ts +26 -26
  76. package/src/evaluation/IEvalDetail.ts +23 -23
  77. package/src/evaluation/ReasonKinds.ts +9 -9
  78. package/src/evaluation/data/IFlag.ts +29 -29
  79. package/src/evaluation/index.ts +4 -4
  80. package/src/events/DefaultEventProcessor.ts +83 -83
  81. package/src/events/DefaultEventQueue.ts +49 -49
  82. package/src/events/DefaultEventSender.ts +73 -73
  83. package/src/events/DefaultEventSerializer.ts +11 -11
  84. package/src/events/EventDispatcher.ts +127 -127
  85. package/src/events/EventSerializer.ts +4 -4
  86. package/src/events/IEventProcessor.ts +8 -8
  87. package/src/events/IEventQueue.ts +16 -16
  88. package/src/events/IEventSender.ts +13 -13
  89. package/src/events/NullEventProcessor.ts +15 -15
  90. package/src/events/event.ts +129 -129
  91. package/src/events/index.ts +11 -11
  92. package/src/index.ts +21 -21
  93. package/src/integrations/TestLogger.ts +24 -24
  94. package/src/integrations/index.ts +1 -1
  95. package/src/integrations/test_data/FlagBuilder.ts +59 -59
  96. package/src/integrations/test_data/TestData.ts +57 -57
  97. package/src/integrations/test_data/TestDataSynchronizer.ts +49 -49
  98. package/src/integrations/test_data/index.ts +4 -4
  99. package/src/logging/BasicLogger.ts +108 -108
  100. package/src/logging/IBasicLoggerOptions.ts +46 -46
  101. package/src/logging/ILogger.ts +49 -49
  102. package/src/logging/LogLevel.ts +8 -8
  103. package/src/logging/SafeLogger.ts +69 -69
  104. package/src/logging/format.ts +154 -154
  105. package/src/logging/index.ts +5 -5
  106. package/src/options/ClientContext.ts +39 -39
  107. package/src/options/IClientContext.ts +53 -53
  108. package/src/options/IOptions.ts +123 -123
  109. package/src/options/IUser.ts +6 -6
  110. package/src/options/IValidatedOptions.ts +29 -29
  111. package/src/options/OptionMessages.ts +35 -35
  112. package/src/options/UserBuilder.ts +35 -35
  113. package/src/options/Validators.ts +300 -300
  114. package/src/options/index.ts +7 -7
  115. package/src/platform/IInfo.ts +102 -102
  116. package/src/platform/IPlatform.ts +20 -20
  117. package/src/platform/IStore.ts +112 -112
  118. package/src/platform/IWebSocket.ts +22 -22
  119. package/src/platform/browser/BrowserInfo.ts +24 -24
  120. package/src/platform/browser/BrowserPlatform.ts +19 -19
  121. package/src/platform/browser/BrowserRequests.ts +6 -6
  122. package/src/platform/browser/BrowserWebSocket.ts +147 -142
  123. package/src/platform/browser/FbClient.ts +65 -65
  124. package/src/platform/browser/LocalStorageStore.ts +59 -59
  125. package/src/platform/index.ts +11 -11
  126. package/src/platform/requests.ts +76 -76
  127. package/src/store/BaseStore.ts +125 -125
  128. package/src/store/DataKinds.ts +6 -6
  129. package/src/store/IDataSourceUpdates.ts +68 -68
  130. package/src/store/InMemoryStore.ts +36 -36
  131. package/src/store/index.ts +5 -5
  132. package/src/store/serialization.ts +52 -52
  133. package/src/store/store.ts +37 -37
  134. package/src/utils/Emits.ts +75 -75
  135. package/src/utils/EventEmitter.ts +128 -128
  136. package/src/utils/IEventEmitter.ts +14 -14
  137. package/src/utils/Regex.ts +21 -21
  138. package/src/utils/ValueConverters.ts +55 -55
  139. package/src/utils/canonicalizeUri.ts +3 -3
  140. package/src/utils/debounce.ts +33 -33
  141. package/src/utils/http.ts +40 -40
  142. package/src/utils/index.ts +5 -5
  143. package/src/utils/isNullOrUndefined.ts +2 -2
  144. package/src/utils/serializeUser.ts +27 -27
  145. package/src/utils/sleep.ts +5 -5
  146. package/src/version.ts +1 -1
  147. package/dist/umd/featbit-js-client-sdk-3.0.11.js.map +0 -1
@@ -1,56 +1,56 @@
1
- import { Regex } from "./Regex";
2
-
3
- export interface IConvertResult<TValue> {
4
- isSucceeded: boolean,
5
- value?: TValue
6
- }
7
-
8
- export class ValueConverters {
9
- static bool(value: string): IConvertResult<boolean> {
10
- if (value?.toUpperCase() === 'TRUE') {
11
- return ValueConverters.success<boolean>(true);
12
- }
13
-
14
- if (value?.toUpperCase() === 'FALSE') {
15
- return ValueConverters.success<boolean>(false);
16
- }
17
-
18
- return ValueConverters.error<boolean>();
19
- }
20
-
21
- static number(value: string): IConvertResult<number> {
22
- const num = Number(value);
23
-
24
- if (Number.isNaN(num)) {
25
- return ValueConverters.error<number>();
26
- }
27
-
28
- return ValueConverters.success<number>(num);
29
- }
30
-
31
- static string(value: string): IConvertResult<string> {
32
- return ValueConverters.success<string>(value);
33
- }
34
-
35
- static json(value: string): IConvertResult<unknown> {
36
- try {
37
- const val = JSON.parse(value);
38
- return ValueConverters.success<unknown>(val);
39
- } catch (err) {
40
- return ValueConverters.error<unknown>();
41
- }
42
- }
43
-
44
- private static success<TValue>(value: TValue): IConvertResult<TValue> {
45
- return {
46
- isSucceeded: true,
47
- value: value
48
- }
49
- }
50
-
51
- private static error<TValue>(): IConvertResult<TValue> {
52
- return {
53
- isSucceeded: false
54
- }
55
- }
1
+ import { Regex } from "./Regex";
2
+
3
+ export interface IConvertResult<TValue> {
4
+ isSucceeded: boolean,
5
+ value?: TValue
6
+ }
7
+
8
+ export class ValueConverters {
9
+ static bool(value: string): IConvertResult<boolean> {
10
+ if (value?.toUpperCase() === 'TRUE') {
11
+ return ValueConverters.success<boolean>(true);
12
+ }
13
+
14
+ if (value?.toUpperCase() === 'FALSE') {
15
+ return ValueConverters.success<boolean>(false);
16
+ }
17
+
18
+ return ValueConverters.error<boolean>();
19
+ }
20
+
21
+ static number(value: string): IConvertResult<number> {
22
+ const num = Number(value);
23
+
24
+ if (Number.isNaN(num)) {
25
+ return ValueConverters.error<number>();
26
+ }
27
+
28
+ return ValueConverters.success<number>(num);
29
+ }
30
+
31
+ static string(value: string): IConvertResult<string> {
32
+ return ValueConverters.success<string>(value);
33
+ }
34
+
35
+ static json(value: string): IConvertResult<unknown> {
36
+ try {
37
+ const val = JSON.parse(value);
38
+ return ValueConverters.success<unknown>(val);
39
+ } catch (err) {
40
+ return ValueConverters.error<unknown>();
41
+ }
42
+ }
43
+
44
+ private static success<TValue>(value: TValue): IConvertResult<TValue> {
45
+ return {
46
+ isSucceeded: true,
47
+ value: value
48
+ }
49
+ }
50
+
51
+ private static error<TValue>(): IConvertResult<TValue> {
52
+ return {
53
+ isSucceeded: false
54
+ }
55
+ }
56
56
  }
@@ -1,4 +1,4 @@
1
- // This function is designed to remove any trailing forward slashes at the end of the provided URI string
2
- export function canonicalizeUri(uri: string): string {
3
- return uri.replace(/\/+$/, '');
1
+ // This function is designed to remove any trailing forward slashes at the end of the provided URI string
2
+ export function canonicalizeUri(uri: string): string {
3
+ return uri.replace(/\/+$/, '');
4
4
  }
@@ -1,33 +1,33 @@
1
- /**
2
- * Wait before calling the same function. Useful for expensive calls.
3
- * Adapted from https://amitd.co/code/typescript/debounce.
4
- *
5
- * @return The debounced function.
6
- *
7
- * @example
8
- *
9
- * ```js
10
- * const debouncedFunction = debounce(e => {
11
- * console.log(e);
12
- * }, 5000);
13
- *
14
- * // Console logs 'Hello world again ' after 5 seconds
15
- * debouncedFunction('Hello world');
16
- * debouncedFunction('Hello world again');
17
- * ```
18
- * @param fn The function to be debounced.
19
- * @param delayMs Defaults to 5 seconds.
20
- */
21
- export const debounce = <T extends (...args: any[]) => ReturnType<T>>(
22
- fn: T,
23
- delayMs: number = 5000,
24
- ): ((...args: Parameters<T>) => void) => {
25
- let timer: ReturnType<typeof setTimeout>;
26
-
27
- return (...args: Parameters<T>) => {
28
- clearTimeout(timer);
29
- timer = setTimeout(() => {
30
- fn(...args);
31
- }, delayMs);
32
- };
33
- };
1
+ /**
2
+ * Wait before calling the same function. Useful for expensive calls.
3
+ * Adapted from https://amitd.co/code/typescript/debounce.
4
+ *
5
+ * @return The debounced function.
6
+ *
7
+ * @example
8
+ *
9
+ * ```js
10
+ * const debouncedFunction = debounce(e => {
11
+ * console.log(e);
12
+ * }, 5000);
13
+ *
14
+ * // Console logs 'Hello world again ' after 5 seconds
15
+ * debouncedFunction('Hello world');
16
+ * debouncedFunction('Hello world again');
17
+ * ```
18
+ * @param fn The function to be debounced.
19
+ * @param delayMs Defaults to 5 seconds.
20
+ */
21
+ export const debounce = <T extends (...args: any[]) => ReturnType<T>>(
22
+ fn: T,
23
+ delayMs: number = 5000,
24
+ ): ((...args: Parameters<T>) => void) => {
25
+ let timer: ReturnType<typeof setTimeout>;
26
+
27
+ return (...args: Parameters<T>) => {
28
+ clearTimeout(timer);
29
+ timer = setTimeout(() => {
30
+ fn(...args);
31
+ }, delayMs);
32
+ };
33
+ };
package/src/utils/http.ts CHANGED
@@ -1,40 +1,40 @@
1
- import { IInfo } from "../platform/IInfo";
2
-
3
- export type Headers = {
4
- Authorization: string;
5
- 'X-User-Agent': string;
6
- 'Content-Type': string;
7
- };
8
-
9
- export function defaultHeaders(
10
- sdkKey: string,
11
- info: IInfo
12
- ): Headers {
13
- const {userAgent, version} = info.sdkData();
14
-
15
- const headers: Headers = {
16
- 'Content-Type': 'application/json',
17
- 'X-User-Agent': userAgent ?? `${info.appType}/${version}`,
18
- 'Authorization': sdkKey
19
- };
20
-
21
- return headers;
22
- }
23
-
24
- export function httpErrorMessage(
25
- err: {
26
- status: number;
27
- message: string;
28
- },
29
- context: string,
30
- retryMessage?: string,
31
- ): string {
32
- let desc;
33
- if (err.status) {
34
- desc = `error ${ err.status }${ err.status === 401 ? ' (invalid SDK key)' : '' }`;
35
- } else {
36
- desc = `I/O error (${ err.message || err })`;
37
- }
38
- const action = retryMessage ?? 'giving up permanently';
39
- return `Received ${ desc } for ${ context } - ${ action }`;
40
- }
1
+ import { IInfo } from "../platform/IInfo";
2
+
3
+ export type Headers = {
4
+ Authorization: string;
5
+ 'X-User-Agent': string;
6
+ 'Content-Type': string;
7
+ };
8
+
9
+ export function defaultHeaders(
10
+ sdkKey: string,
11
+ info: IInfo
12
+ ): Headers {
13
+ const {userAgent, version} = info.sdkData();
14
+
15
+ const headers: Headers = {
16
+ 'Content-Type': 'application/json',
17
+ 'X-User-Agent': userAgent ?? `${info.appType}/${version}`,
18
+ 'Authorization': sdkKey
19
+ };
20
+
21
+ return headers;
22
+ }
23
+
24
+ export function httpErrorMessage(
25
+ err: {
26
+ status: number;
27
+ message: string;
28
+ },
29
+ context: string,
30
+ retryMessage?: string,
31
+ ): string {
32
+ let desc;
33
+ if (err.status) {
34
+ desc = `error ${ err.status }${ err.status === 401 ? ' (invalid SDK key)' : '' }`;
35
+ } else {
36
+ desc = `I/O error (${ err.message || err })`;
37
+ }
38
+ const action = retryMessage ?? 'giving up permanently';
39
+ return `Received ${ desc } for ${ context } - ${ action }`;
40
+ }
@@ -1,6 +1,6 @@
1
- export * from './isNullOrUndefined';
2
- export * from './sleep';
3
- export * from './ValueConverters';
4
- export * from './VoidFunction';
5
- export * from './serializeUser';
1
+ export * from './isNullOrUndefined';
2
+ export * from './sleep';
3
+ export * from './ValueConverters';
4
+ export * from './VoidFunction';
5
+ export * from './serializeUser';
6
6
  export * from './debounce';
@@ -1,3 +1,3 @@
1
- export function isNullOrUndefined(val: any) {
2
- return val === null || val === undefined;
1
+ export function isNullOrUndefined(val: any) {
2
+ return val === null || val === undefined;
3
3
  }
@@ -1,28 +1,28 @@
1
- import { IUser } from "../options/IUser";
2
-
3
- export function serializeUser(user: IUser | undefined): string {
4
- if (!user) {
5
- return '';
6
- }
7
-
8
- const builtInProperties = `${user.keyId},${user.name}`;
9
-
10
- const customizedProperties = user.customizedProperties
11
- ?.sort((a, b) => {
12
- const nameA = a.name.toLowerCase();
13
- const nameB = b.name.toLowerCase();
14
- if (nameA < nameB) {
15
- return -1;
16
- }
17
-
18
- if (nameA > nameB) {
19
- return 1;
20
- }
21
-
22
- return 0;
23
- })
24
- .map(p => `${p.name}:${p.value}`)
25
- .join(',');
26
-
27
- return `${builtInProperties},${customizedProperties}`;
1
+ import { IUser } from "../options/IUser";
2
+
3
+ export function serializeUser(user: IUser | undefined): string {
4
+ if (!user) {
5
+ return '';
6
+ }
7
+
8
+ const builtInProperties = `${user.keyId},${user.name}`;
9
+
10
+ const customizedProperties = user.customizedProperties
11
+ ?.sort((a, b) => {
12
+ const nameA = a.name.toLowerCase();
13
+ const nameB = b.name.toLowerCase();
14
+ if (nameA < nameB) {
15
+ return -1;
16
+ }
17
+
18
+ if (nameA > nameB) {
19
+ return 1;
20
+ }
21
+
22
+ return 0;
23
+ })
24
+ .map(p => `${p.name}:${p.value}`)
25
+ .join(',');
26
+
27
+ return `${builtInProperties},${customizedProperties}`;
28
28
  }
@@ -1,6 +1,6 @@
1
- const sleep = async (delayMillis: number = 1000) =>
2
- new Promise((resolve) => {
3
- setTimeout(resolve, delayMillis);
4
- });
5
-
1
+ const sleep = async (delayMillis: number = 1000) =>
2
+ new Promise((resolve) => {
3
+ setTimeout(resolve, delayMillis);
4
+ });
5
+
6
6
  export default sleep;
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = "3.0.11"; export const name = "@featbit/js-client-sdk";
1
+ export const version = "3.0.13"; export const name = "@featbit/js-client-sdk";