@featbit/js-client-sdk 2.0.1 → 3.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 (564) hide show
  1. package/LICENSE +21 -201
  2. package/README.md +162 -150
  3. package/dist/esm/Configuration.d.ts +35 -0
  4. package/dist/esm/Configuration.d.ts.map +1 -0
  5. package/dist/esm/Configuration.js +179 -0
  6. package/dist/esm/Configuration.js.map +1 -0
  7. package/dist/esm/Context.d.ts +23 -0
  8. package/dist/esm/Context.d.ts.map +1 -0
  9. package/dist/esm/Context.js +49 -0
  10. package/dist/esm/Context.js.map +1 -0
  11. package/dist/esm/FbClientBuilder.d.ts +90 -0
  12. package/dist/esm/FbClientBuilder.d.ts.map +1 -0
  13. package/dist/esm/FbClientBuilder.js +133 -0
  14. package/dist/esm/FbClientBuilder.js.map +1 -0
  15. package/dist/esm/FbClientCore.d.ts +56 -0
  16. package/dist/esm/FbClientCore.d.ts.map +1 -0
  17. package/dist/esm/FbClientCore.js +283 -0
  18. package/dist/esm/FbClientCore.js.map +1 -0
  19. package/dist/esm/IContextProperty.d.ts +5 -0
  20. package/dist/esm/IContextProperty.d.ts.map +1 -0
  21. package/dist/esm/IContextProperty.js +3 -0
  22. package/dist/esm/IContextProperty.js.map +1 -0
  23. package/dist/esm/IDataKind.d.ts +12 -0
  24. package/dist/esm/IDataKind.d.ts.map +1 -0
  25. package/dist/esm/IDataKind.js +3 -0
  26. package/dist/esm/IDataKind.js.map +1 -0
  27. package/dist/esm/IFbClient.d.ts +30 -0
  28. package/dist/esm/IFbClient.d.ts.map +1 -0
  29. package/dist/esm/IFbClient.js +3 -0
  30. package/dist/esm/IFbClient.js.map +1 -0
  31. package/dist/esm/IFbClientCore.d.ts +240 -0
  32. package/dist/esm/IFbClientCore.d.ts.map +1 -0
  33. package/dist/esm/IFbClientCore.js +3 -0
  34. package/dist/esm/IFbClientCore.js.map +1 -0
  35. package/dist/esm/IVersionedData.d.ts +18 -0
  36. package/dist/esm/IVersionedData.d.ts.map +1 -0
  37. package/dist/esm/IVersionedData.js +3 -0
  38. package/dist/esm/IVersionedData.js.map +1 -0
  39. package/dist/esm/bootstrap/IBootstrapProvider.d.ts +5 -0
  40. package/dist/esm/bootstrap/IBootstrapProvider.d.ts.map +1 -0
  41. package/dist/esm/bootstrap/IBootstrapProvider.js +3 -0
  42. package/dist/esm/bootstrap/IBootstrapProvider.js.map +1 -0
  43. package/dist/esm/bootstrap/JsonBootstrapProvider.d.ts +9 -0
  44. package/dist/esm/bootstrap/JsonBootstrapProvider.d.ts.map +1 -0
  45. package/dist/esm/bootstrap/JsonBootstrapProvider.js +29 -0
  46. package/dist/esm/bootstrap/JsonBootstrapProvider.js.map +1 -0
  47. package/dist/esm/bootstrap/NullBootstrapProvider.d.ts +8 -0
  48. package/dist/esm/bootstrap/NullBootstrapProvider.d.ts.map +1 -0
  49. package/dist/esm/bootstrap/NullBootstrapProvider.js +19 -0
  50. package/dist/esm/bootstrap/NullBootstrapProvider.js.map +1 -0
  51. package/dist/esm/bootstrap/index.d.ts +4 -0
  52. package/dist/esm/bootstrap/index.d.ts.map +1 -0
  53. package/dist/esm/bootstrap/index.js +20 -0
  54. package/dist/esm/bootstrap/index.js.map +1 -0
  55. package/dist/esm/constants.d.ts +3 -0
  56. package/dist/esm/constants.d.ts.map +1 -0
  57. package/dist/esm/constants.js +6 -0
  58. package/dist/esm/constants.js.map +1 -0
  59. package/dist/esm/data-sources/DataSourceUpdates.d.ts +17 -0
  60. package/dist/esm/data-sources/DataSourceUpdates.d.ts.map +1 -0
  61. package/dist/esm/data-sources/DataSourceUpdates.js +84 -0
  62. package/dist/esm/data-sources/DataSourceUpdates.js.map +1 -0
  63. package/dist/esm/data-sources/createStreamListeners.d.ts +19 -0
  64. package/dist/esm/data-sources/createStreamListeners.d.ts.map +1 -0
  65. package/dist/esm/data-sources/createStreamListeners.js +49 -0
  66. package/dist/esm/data-sources/createStreamListeners.js.map +1 -0
  67. package/dist/esm/data-sources/index.d.ts +3 -0
  68. package/dist/esm/data-sources/index.d.ts.map +1 -0
  69. package/dist/esm/data-sources/index.js +19 -0
  70. package/dist/esm/data-sources/index.js.map +1 -0
  71. package/dist/esm/data-sync/DataSyncMode.d.ts +5 -0
  72. package/dist/esm/data-sync/DataSyncMode.d.ts.map +1 -0
  73. package/dist/esm/data-sync/DataSyncMode.js +9 -0
  74. package/dist/esm/data-sync/DataSyncMode.js.map +1 -0
  75. package/dist/esm/data-sync/IDataSynchronizer.d.ts +15 -0
  76. package/dist/esm/data-sync/IDataSynchronizer.d.ts.map +1 -0
  77. package/dist/esm/data-sync/IDataSynchronizer.js +3 -0
  78. package/dist/esm/data-sync/IDataSynchronizer.js.map +1 -0
  79. package/dist/esm/data-sync/IRequestor.d.ts +11 -0
  80. package/dist/esm/data-sync/IRequestor.d.ts.map +1 -0
  81. package/dist/esm/data-sync/IRequestor.js +3 -0
  82. package/dist/esm/data-sync/IRequestor.js.map +1 -0
  83. package/dist/esm/data-sync/NullDataSynchronizer.d.ts +8 -0
  84. package/dist/esm/data-sync/NullDataSynchronizer.d.ts.map +1 -0
  85. package/dist/esm/data-sync/NullDataSynchronizer.js +15 -0
  86. package/dist/esm/data-sync/NullDataSynchronizer.js.map +1 -0
  87. package/dist/esm/data-sync/PollingDataSynchronizer.d.ts +23 -0
  88. package/dist/esm/data-sync/PollingDataSynchronizer.d.ts.map +1 -0
  89. package/dist/esm/data-sync/PollingDataSynchronizer.js +87 -0
  90. package/dist/esm/data-sync/PollingDataSynchronizer.js.map +1 -0
  91. package/dist/esm/data-sync/Requestor.d.ts +20 -0
  92. package/dist/esm/data-sync/Requestor.d.ts.map +1 -0
  93. package/dist/esm/data-sync/Requestor.js +56 -0
  94. package/dist/esm/data-sync/Requestor.js.map +1 -0
  95. package/dist/esm/data-sync/WebSocketDataSynchronizer.d.ts +20 -0
  96. package/dist/esm/data-sync/WebSocketDataSynchronizer.d.ts.map +1 -0
  97. package/dist/esm/data-sync/WebSocketDataSynchronizer.js +55 -0
  98. package/dist/esm/data-sync/WebSocketDataSynchronizer.js.map +1 -0
  99. package/dist/esm/data-sync/index.d.ts +10 -0
  100. package/dist/esm/data-sync/index.d.ts.map +1 -0
  101. package/dist/esm/data-sync/index.js +26 -0
  102. package/dist/esm/data-sync/index.js.map +1 -0
  103. package/dist/esm/data-sync/types.d.ts +17 -0
  104. package/dist/esm/data-sync/types.d.ts.map +1 -0
  105. package/dist/esm/data-sync/types.js +9 -0
  106. package/dist/esm/data-sync/types.js.map +1 -0
  107. package/dist/esm/data-sync/utils.d.ts +3 -0
  108. package/dist/esm/data-sync/utils.d.ts.map +1 -0
  109. package/dist/esm/data-sync/utils.js +33 -0
  110. package/dist/esm/data-sync/utils.js.map +1 -0
  111. package/dist/esm/errors.d.ts +16 -0
  112. package/dist/esm/errors.d.ts.map +1 -0
  113. package/dist/esm/errors.js +41 -0
  114. package/dist/esm/errors.js.map +1 -0
  115. package/dist/esm/evaluation/EvalResult.d.ts +20 -0
  116. package/dist/esm/evaluation/EvalResult.d.ts.map +1 -0
  117. package/dist/esm/evaluation/EvalResult.js +33 -0
  118. package/dist/esm/evaluation/EvalResult.js.map +1 -0
  119. package/dist/esm/evaluation/Evaluator.d.ts +15 -0
  120. package/dist/esm/evaluation/Evaluator.d.ts.map +1 -0
  121. package/dist/esm/evaluation/Evaluator.js +28 -0
  122. package/dist/esm/evaluation/Evaluator.js.map +1 -0
  123. package/dist/esm/evaluation/IEvalDetail.d.ts +21 -0
  124. package/dist/esm/evaluation/IEvalDetail.d.ts.map +1 -0
  125. package/dist/esm/evaluation/IEvalDetail.js +3 -0
  126. package/dist/esm/evaluation/IEvalDetail.js.map +1 -0
  127. package/dist/esm/evaluation/ReasonKinds.d.ts +11 -0
  128. package/dist/esm/evaluation/ReasonKinds.d.ts.map +1 -0
  129. package/dist/esm/evaluation/ReasonKinds.js +15 -0
  130. package/dist/esm/evaluation/ReasonKinds.js.map +1 -0
  131. package/dist/esm/evaluation/data/IFlag.d.ts +26 -0
  132. package/dist/esm/evaluation/data/IFlag.d.ts.map +1 -0
  133. package/dist/esm/evaluation/data/IFlag.js +12 -0
  134. package/dist/esm/evaluation/data/IFlag.js.map +1 -0
  135. package/dist/esm/evaluation/data/index.d.ts +2 -0
  136. package/dist/esm/evaluation/data/index.d.ts.map +1 -0
  137. package/dist/esm/evaluation/data/index.js +18 -0
  138. package/dist/esm/evaluation/data/index.js.map +1 -0
  139. package/dist/esm/evaluation/index.d.ts +6 -0
  140. package/dist/esm/evaluation/index.d.ts.map +1 -0
  141. package/dist/esm/evaluation/index.js +22 -0
  142. package/dist/esm/evaluation/index.js.map +1 -0
  143. package/dist/esm/events/DefaultEventProcessor.d.ts +16 -0
  144. package/dist/esm/events/DefaultEventProcessor.d.ts.map +1 -0
  145. package/dist/esm/events/DefaultEventProcessor.js +79 -0
  146. package/dist/esm/events/DefaultEventProcessor.js.map +1 -0
  147. package/dist/esm/events/DefaultEventQueue.d.ts +18 -0
  148. package/dist/esm/events/DefaultEventQueue.d.ts.map +1 -0
  149. package/dist/esm/events/DefaultEventQueue.js +42 -0
  150. package/dist/esm/events/DefaultEventQueue.js.map +1 -0
  151. package/dist/esm/events/DefaultEventSender.d.ts +10 -0
  152. package/dist/esm/events/DefaultEventSender.d.ts.map +1 -0
  153. package/dist/esm/events/DefaultEventSender.js +67 -0
  154. package/dist/esm/events/DefaultEventSender.js.map +1 -0
  155. package/dist/esm/events/DefaultEventSerializer.d.ts +6 -0
  156. package/dist/esm/events/DefaultEventSerializer.d.ts.map +1 -0
  157. package/dist/esm/events/DefaultEventSerializer.js +14 -0
  158. package/dist/esm/events/DefaultEventSerializer.js.map +1 -0
  159. package/dist/esm/events/EventDispatcher.d.ts +17 -0
  160. package/dist/esm/events/EventDispatcher.d.ts.map +1 -0
  161. package/dist/esm/events/EventDispatcher.js +127 -0
  162. package/dist/esm/events/EventDispatcher.js.map +1 -0
  163. package/dist/esm/events/EventSerializer.d.ts +5 -0
  164. package/dist/esm/events/EventSerializer.d.ts.map +1 -0
  165. package/dist/esm/events/EventSerializer.js +3 -0
  166. package/dist/esm/events/EventSerializer.js.map +1 -0
  167. package/dist/esm/events/IEventProcessor.d.ts +7 -0
  168. package/dist/esm/events/IEventProcessor.d.ts.map +1 -0
  169. package/dist/esm/events/IEventProcessor.js +3 -0
  170. package/dist/esm/events/IEventProcessor.js.map +1 -0
  171. package/dist/esm/events/IEventQueue.d.ts +11 -0
  172. package/dist/esm/events/IEventQueue.d.ts.map +1 -0
  173. package/dist/esm/events/IEventQueue.js +3 -0
  174. package/dist/esm/events/IEventQueue.js.map +1 -0
  175. package/dist/esm/events/IEventSender.d.ts +13 -0
  176. package/dist/esm/events/IEventSender.d.ts.map +1 -0
  177. package/dist/esm/events/IEventSender.js +10 -0
  178. package/dist/esm/events/IEventSender.js.map +1 -0
  179. package/dist/esm/events/NullEventProcessor.d.ts +8 -0
  180. package/dist/esm/events/NullEventProcessor.d.ts.map +1 -0
  181. package/dist/esm/events/NullEventProcessor.js +16 -0
  182. package/dist/esm/events/NullEventProcessor.js.map +1 -0
  183. package/dist/esm/events/event.d.ts +44 -0
  184. package/dist/esm/events/event.d.ts.map +1 -0
  185. package/dist/esm/events/event.js +115 -0
  186. package/dist/esm/events/event.js.map +1 -0
  187. package/dist/esm/events/index.d.ts +12 -0
  188. package/dist/esm/events/index.d.ts.map +1 -0
  189. package/dist/esm/events/index.js +28 -0
  190. package/dist/esm/events/index.js.map +1 -0
  191. package/dist/esm/index.d.ts +20 -0
  192. package/dist/esm/index.d.ts.map +1 -0
  193. package/dist/esm/index.js +36 -0
  194. package/dist/esm/index.js.map +1 -0
  195. package/dist/esm/integrations/TestLogger.d.ts +10 -0
  196. package/dist/esm/integrations/TestLogger.d.ts.map +1 -0
  197. package/dist/esm/integrations/TestLogger.js +25 -0
  198. package/dist/esm/integrations/TestLogger.js.map +1 -0
  199. package/dist/esm/integrations/index.d.ts +3 -0
  200. package/dist/esm/integrations/index.d.ts.map +1 -0
  201. package/dist/esm/integrations/index.js +21 -0
  202. package/dist/esm/integrations/index.js.map +1 -0
  203. package/dist/esm/integrations/test_data/FlagBuilder.d.ts +19 -0
  204. package/dist/esm/integrations/test_data/FlagBuilder.d.ts.map +1 -0
  205. package/dist/esm/integrations/test_data/FlagBuilder.js +56 -0
  206. package/dist/esm/integrations/test_data/FlagBuilder.js.map +1 -0
  207. package/dist/esm/integrations/test_data/TestData.d.ts +18 -0
  208. package/dist/esm/integrations/test_data/TestData.d.ts.map +1 -0
  209. package/dist/esm/integrations/test_data/TestData.js +38 -0
  210. package/dist/esm/integrations/test_data/TestData.js.map +1 -0
  211. package/dist/esm/integrations/test_data/TestDataSynchronizer.d.ts +21 -0
  212. package/dist/esm/integrations/test_data/TestDataSynchronizer.d.ts.map +1 -0
  213. package/dist/esm/integrations/test_data/TestDataSynchronizer.js +50 -0
  214. package/dist/esm/integrations/test_data/TestDataSynchronizer.js.map +1 -0
  215. package/dist/esm/integrations/test_data/index.d.ts +5 -0
  216. package/dist/esm/integrations/test_data/index.d.ts.map +1 -0
  217. package/dist/esm/integrations/test_data/index.js +13 -0
  218. package/dist/esm/integrations/test_data/index.js.map +1 -0
  219. package/dist/esm/logging/BasicLogger.d.ts +34 -0
  220. package/dist/esm/logging/BasicLogger.d.ts.map +1 -0
  221. package/dist/esm/logging/BasicLogger.js +101 -0
  222. package/dist/esm/logging/BasicLogger.js.map +1 -0
  223. package/dist/esm/logging/IBasicLoggerOptions.d.ts +43 -0
  224. package/dist/esm/logging/IBasicLoggerOptions.d.ts.map +1 -0
  225. package/dist/esm/logging/IBasicLoggerOptions.js +3 -0
  226. package/dist/esm/logging/IBasicLoggerOptions.js.map +1 -0
  227. package/dist/esm/logging/ILogger.d.ts +47 -0
  228. package/dist/esm/logging/ILogger.d.ts.map +1 -0
  229. package/dist/esm/logging/ILogger.js +3 -0
  230. package/dist/esm/logging/ILogger.js.map +1 -0
  231. package/dist/esm/logging/LogLevel.d.ts +10 -0
  232. package/dist/esm/logging/LogLevel.d.ts.map +1 -0
  233. package/dist/esm/logging/LogLevel.js +3 -0
  234. package/dist/esm/logging/LogLevel.js.map +1 -0
  235. package/dist/esm/logging/SafeLogger.d.ts +28 -0
  236. package/dist/esm/logging/SafeLogger.d.ts.map +1 -0
  237. package/dist/esm/logging/SafeLogger.js +63 -0
  238. package/dist/esm/logging/SafeLogger.js.map +1 -0
  239. package/dist/esm/logging/format.d.ts +12 -0
  240. package/dist/esm/logging/format.d.ts.map +1 -0
  241. package/dist/esm/logging/format.js +156 -0
  242. package/dist/esm/logging/format.js.map +1 -0
  243. package/dist/esm/logging/index.d.ts +7 -0
  244. package/dist/esm/logging/index.d.ts.map +1 -0
  245. package/dist/esm/logging/index.js +23 -0
  246. package/dist/esm/logging/index.js.map +1 -0
  247. package/dist/esm/options/ClientContext.d.ts +28 -0
  248. package/dist/esm/options/ClientContext.d.ts.map +1 -0
  249. package/dist/esm/options/ClientContext.js +21 -0
  250. package/dist/esm/options/ClientContext.js.map +1 -0
  251. package/dist/esm/options/IClientContext.d.ts +45 -0
  252. package/dist/esm/options/IClientContext.d.ts.map +1 -0
  253. package/dist/esm/options/IClientContext.js +3 -0
  254. package/dist/esm/options/IClientContext.js.map +1 -0
  255. package/dist/esm/options/IOptions.d.ts +101 -0
  256. package/dist/esm/options/IOptions.d.ts.map +1 -0
  257. package/dist/esm/options/IOptions.js +3 -0
  258. package/dist/esm/options/IOptions.js.map +1 -0
  259. package/dist/esm/options/IUser.d.ts +7 -0
  260. package/dist/esm/options/IUser.d.ts.map +1 -0
  261. package/dist/esm/options/IUser.js +3 -0
  262. package/dist/esm/options/IUser.js.map +1 -0
  263. package/dist/esm/options/IValidatedOptions.d.ts +27 -0
  264. package/dist/esm/options/IValidatedOptions.d.ts.map +1 -0
  265. package/dist/esm/options/IValidatedOptions.js +3 -0
  266. package/dist/esm/options/IValidatedOptions.js.map +1 -0
  267. package/dist/esm/options/OptionMessages.d.ts +14 -0
  268. package/dist/esm/options/OptionMessages.d.ts.map +1 -0
  269. package/dist/esm/options/OptionMessages.js +33 -0
  270. package/dist/esm/options/OptionMessages.js.map +1 -0
  271. package/dist/esm/options/UserBuilder.d.ts +17 -0
  272. package/dist/esm/options/UserBuilder.d.ts.map +1 -0
  273. package/dist/esm/options/UserBuilder.js +35 -0
  274. package/dist/esm/options/UserBuilder.js.map +1 -0
  275. package/dist/esm/options/Validators.d.ts +111 -0
  276. package/dist/esm/options/Validators.d.ts.map +1 -0
  277. package/dist/esm/options/Validators.js +247 -0
  278. package/dist/esm/options/Validators.js.map +1 -0
  279. package/dist/esm/options/index.d.ts +9 -0
  280. package/dist/esm/options/index.d.ts.map +1 -0
  281. package/dist/esm/options/index.js +25 -0
  282. package/dist/esm/options/index.js.map +1 -0
  283. package/dist/esm/platform/IInfo.d.ts +73 -0
  284. package/dist/esm/platform/IInfo.d.ts.map +1 -0
  285. package/dist/esm/platform/IInfo.js +3 -0
  286. package/dist/esm/platform/IInfo.js.map +1 -0
  287. package/dist/esm/platform/IPlatform.d.ts +19 -0
  288. package/dist/esm/platform/IPlatform.d.ts.map +1 -0
  289. package/dist/esm/platform/IPlatform.js +3 -0
  290. package/dist/esm/platform/IPlatform.js.map +1 -0
  291. package/dist/esm/platform/IStore.d.ts +110 -0
  292. package/dist/esm/platform/IStore.d.ts.map +1 -0
  293. package/dist/esm/platform/IStore.js +3 -0
  294. package/dist/esm/platform/IStore.js.map +1 -0
  295. package/dist/esm/platform/IWebSocket.d.ts +21 -0
  296. package/dist/esm/platform/IWebSocket.d.ts.map +1 -0
  297. package/dist/esm/platform/IWebSocket.js +3 -0
  298. package/dist/esm/platform/IWebSocket.js.map +1 -0
  299. package/dist/esm/platform/browser/BrowserInfo.d.ts +7 -0
  300. package/dist/esm/platform/browser/BrowserInfo.d.ts.map +1 -0
  301. package/dist/esm/platform/browser/BrowserInfo.js +24 -0
  302. package/dist/esm/platform/browser/BrowserInfo.js.map +1 -0
  303. package/dist/esm/platform/browser/BrowserPlatform.d.ts +12 -0
  304. package/dist/esm/platform/browser/BrowserPlatform.d.ts.map +1 -0
  305. package/dist/esm/platform/browser/BrowserPlatform.js +17 -0
  306. package/dist/esm/platform/browser/BrowserPlatform.js.map +1 -0
  307. package/dist/esm/platform/browser/BrowserRequests.d.ts +5 -0
  308. package/dist/esm/platform/browser/BrowserRequests.d.ts.map +1 -0
  309. package/dist/esm/platform/browser/BrowserRequests.js +9 -0
  310. package/dist/esm/platform/browser/BrowserRequests.js.map +1 -0
  311. package/dist/esm/platform/browser/BrowserWebSocket.d.ts +38 -0
  312. package/dist/esm/platform/browser/BrowserWebSocket.d.ts.map +1 -0
  313. package/dist/esm/platform/browser/BrowserWebSocket.js +129 -0
  314. package/dist/esm/platform/browser/BrowserWebSocket.js.map +1 -0
  315. package/dist/esm/platform/browser/FbClient.d.ts +30 -0
  316. package/dist/esm/platform/browser/FbClient.d.ts.map +1 -0
  317. package/dist/esm/platform/browser/FbClient.js +47 -0
  318. package/dist/esm/platform/browser/FbClient.js.map +1 -0
  319. package/dist/esm/platform/browser/LocalStorageStore.d.ts +26 -0
  320. package/dist/esm/platform/browser/LocalStorageStore.d.ts.map +1 -0
  321. package/dist/esm/platform/browser/LocalStorageStore.js +122 -0
  322. package/dist/esm/platform/browser/LocalStorageStore.js.map +1 -0
  323. package/dist/esm/platform/index.d.ts +5 -0
  324. package/dist/esm/platform/index.d.ts.map +1 -0
  325. package/dist/esm/platform/index.js +21 -0
  326. package/dist/esm/platform/index.js.map +1 -0
  327. package/dist/esm/platform/requests.d.ts +64 -0
  328. package/dist/esm/platform/requests.d.ts.map +1 -0
  329. package/dist/esm/platform/requests.js +7 -0
  330. package/dist/esm/platform/requests.js.map +1 -0
  331. package/dist/esm/store/DataKinds.d.ts +5 -0
  332. package/dist/esm/store/DataKinds.d.ts.map +1 -0
  333. package/dist/esm/store/DataKinds.js +9 -0
  334. package/dist/esm/store/DataKinds.js.map +1 -0
  335. package/dist/esm/store/IDataSourceUpdates.d.ts +48 -0
  336. package/dist/esm/store/IDataSourceUpdates.d.ts.map +1 -0
  337. package/dist/esm/store/IDataSourceUpdates.js +3 -0
  338. package/dist/esm/store/IDataSourceUpdates.js.map +1 -0
  339. package/dist/esm/store/InMemoryStore.d.ts +24 -0
  340. package/dist/esm/store/InMemoryStore.d.ts.map +1 -0
  341. package/dist/esm/store/InMemoryStore.js +96 -0
  342. package/dist/esm/store/InMemoryStore.js.map +1 -0
  343. package/dist/esm/store/index.d.ts +6 -0
  344. package/dist/esm/store/index.d.ts.map +1 -0
  345. package/dist/esm/store/index.js +22 -0
  346. package/dist/esm/store/index.js.map +1 -0
  347. package/dist/esm/store/serialization.d.ts +23 -0
  348. package/dist/esm/store/serialization.d.ts.map +1 -0
  349. package/dist/esm/store/serialization.js +37 -0
  350. package/dist/esm/store/serialization.js.map +1 -0
  351. package/dist/esm/store/store.d.ts +30 -0
  352. package/dist/esm/store/store.d.ts.map +1 -0
  353. package/dist/esm/store/store.js +6 -0
  354. package/dist/esm/store/store.js.map +1 -0
  355. package/dist/esm/utils/Emits.d.ts +30 -0
  356. package/dist/esm/utils/Emits.d.ts.map +1 -0
  357. package/dist/esm/utils/Emits.js +64 -0
  358. package/dist/esm/utils/Emits.js.map +1 -0
  359. package/dist/esm/utils/EventEmitter.d.ts +22 -0
  360. package/dist/esm/utils/EventEmitter.d.ts.map +1 -0
  361. package/dist/esm/utils/EventEmitter.js +108 -0
  362. package/dist/esm/utils/EventEmitter.js.map +1 -0
  363. package/dist/esm/utils/IEventEmitter.d.ts +16 -0
  364. package/dist/esm/utils/IEventEmitter.d.ts.map +1 -0
  365. package/dist/esm/utils/IEventEmitter.js +3 -0
  366. package/dist/esm/utils/IEventEmitter.js.map +1 -0
  367. package/dist/esm/utils/Regex.d.ts +7 -0
  368. package/dist/esm/utils/Regex.d.ts.map +1 -0
  369. package/dist/esm/utils/Regex.js +22 -0
  370. package/dist/esm/utils/Regex.js.map +1 -0
  371. package/dist/esm/utils/ValueConverters.d.ts +13 -0
  372. package/dist/esm/utils/ValueConverters.d.ts.map +1 -0
  373. package/dist/esm/utils/ValueConverters.js +46 -0
  374. package/dist/esm/utils/ValueConverters.js.map +1 -0
  375. package/dist/esm/utils/VoidFunction.d.ts +2 -0
  376. package/dist/esm/utils/VoidFunction.d.ts.map +1 -0
  377. package/dist/esm/utils/VoidFunction.js +3 -0
  378. package/dist/esm/utils/VoidFunction.js.map +1 -0
  379. package/dist/esm/utils/canonicalizeUri.d.ts +2 -0
  380. package/dist/esm/utils/canonicalizeUri.d.ts.map +1 -0
  381. package/dist/esm/utils/canonicalizeUri.js +9 -0
  382. package/dist/esm/utils/canonicalizeUri.js.map +1 -0
  383. package/dist/esm/utils/http.d.ts +12 -0
  384. package/dist/esm/utils/http.d.ts.map +1 -0
  385. package/dist/esm/utils/http.js +26 -0
  386. package/dist/esm/utils/http.js.map +1 -0
  387. package/dist/esm/utils/index.d.ts +5 -0
  388. package/dist/esm/utils/index.d.ts.map +1 -0
  389. package/dist/esm/utils/index.js +21 -0
  390. package/dist/esm/utils/index.js.map +1 -0
  391. package/dist/esm/utils/isNullOrUndefined.d.ts +2 -0
  392. package/dist/esm/utils/isNullOrUndefined.d.ts.map +1 -0
  393. package/dist/esm/utils/isNullOrUndefined.js +8 -0
  394. package/dist/esm/utils/isNullOrUndefined.js.map +1 -0
  395. package/dist/esm/utils/serializeUser.d.ts +3 -0
  396. package/dist/esm/utils/serializeUser.d.ts.map +1 -0
  397. package/dist/esm/utils/serializeUser.js +24 -0
  398. package/dist/esm/utils/serializeUser.js.map +1 -0
  399. package/dist/esm/utils/sleep.d.ts +3 -0
  400. package/dist/esm/utils/sleep.d.ts.map +1 -0
  401. package/dist/esm/utils/sleep.js +18 -0
  402. package/dist/esm/utils/sleep.js.map +1 -0
  403. package/dist/esm/version.d.ts +3 -0
  404. package/dist/esm/version.d.ts.map +1 -0
  405. package/dist/esm/version.js +6 -0
  406. package/dist/esm/version.js.map +1 -0
  407. package/dist/umd/featbit-js-client-sdk-3.0.0.js +2 -0
  408. package/dist/umd/featbit-js-client-sdk-3.0.0.js.map +1 -0
  409. package/dist/umd/featbit-js-client-sdk.js +2 -0
  410. package/dist/umd/featbit-js-client-sdk.js.map +1 -0
  411. package/package.json +22 -24
  412. package/src/Configuration.ts +234 -0
  413. package/src/Context.ts +62 -0
  414. package/src/FbClientBuilder.ts +161 -0
  415. package/src/FbClientCore.ts +389 -0
  416. package/src/IContextProperty.ts +4 -0
  417. package/src/IDataKind.ts +11 -0
  418. package/src/IFbClient.ts +30 -0
  419. package/src/IFbClientCore.ts +291 -0
  420. package/src/IVersionedData.ts +18 -0
  421. package/src/bootstrap/IBootstrapProvider.ts +5 -0
  422. package/src/bootstrap/JsonBootstrapProvider.ts +35 -0
  423. package/src/bootstrap/NullBootstrapProvider.ts +21 -0
  424. package/src/bootstrap/index.ts +3 -0
  425. package/src/constants.ts +2 -6
  426. package/src/data-sources/DataSourceUpdates.ts +93 -0
  427. package/src/data-sources/createStreamListeners.ts +66 -0
  428. package/src/data-sources/index.ts +2 -0
  429. package/src/data-sync/DataSyncMode.ts +4 -0
  430. package/src/data-sync/IDataSynchronizer.ts +15 -0
  431. package/src/data-sync/IRequestor.ts +10 -0
  432. package/src/data-sync/NullDataSynchronizer.ts +15 -0
  433. package/src/data-sync/PollingDataSynchronizer.ts +111 -0
  434. package/src/data-sync/Requestor.ts +61 -0
  435. package/src/data-sync/WebSocketDataSynchronizer.ts +74 -0
  436. package/src/data-sync/index.ts +9 -0
  437. package/src/data-sync/types.ts +20 -0
  438. package/src/data-sync/utils.ts +32 -0
  439. package/src/errors.ts +41 -0
  440. package/src/evaluation/EvalResult.ts +36 -0
  441. package/src/evaluation/Evaluator.ts +27 -0
  442. package/src/evaluation/IEvalDetail.ts +24 -0
  443. package/src/evaluation/ReasonKinds.ts +10 -0
  444. package/src/evaluation/data/IFlag.ts +29 -0
  445. package/src/evaluation/data/index.ts +1 -0
  446. package/src/evaluation/index.ts +5 -0
  447. package/src/events/DefaultEventProcessor.ts +84 -0
  448. package/src/events/DefaultEventQueue.ts +50 -0
  449. package/src/events/DefaultEventSender.ts +75 -0
  450. package/src/events/DefaultEventSerializer.ts +12 -0
  451. package/src/events/EventDispatcher.ts +128 -0
  452. package/src/events/EventSerializer.ts +5 -0
  453. package/src/events/IEventProcessor.ts +9 -0
  454. package/src/events/IEventQueue.ts +17 -0
  455. package/src/events/IEventSender.ts +14 -0
  456. package/src/events/NullEventProcessor.ts +16 -0
  457. package/src/events/event.ts +130 -0
  458. package/src/events/index.ts +11 -0
  459. package/src/index.ts +19 -4
  460. package/src/integrations/TestLogger.ts +25 -0
  461. package/src/integrations/index.ts +2 -0
  462. package/src/integrations/test_data/FlagBuilder.ts +60 -0
  463. package/src/integrations/test_data/TestData.ts +58 -0
  464. package/src/integrations/test_data/TestDataSynchronizer.ts +50 -0
  465. package/src/integrations/test_data/index.ts +5 -0
  466. package/src/logging/BasicLogger.ts +108 -0
  467. package/src/logging/IBasicLoggerOptions.ts +46 -0
  468. package/src/logging/ILogger.ts +49 -0
  469. package/src/logging/LogLevel.ts +9 -0
  470. package/src/logging/SafeLogger.ts +70 -0
  471. package/src/logging/format.ts +154 -0
  472. package/src/logging/index.ts +6 -0
  473. package/src/options/ClientContext.ts +40 -0
  474. package/src/options/IClientContext.ts +54 -0
  475. package/src/options/IOptions.ts +124 -0
  476. package/src/options/IUser.ts +7 -0
  477. package/src/options/IValidatedOptions.ts +30 -0
  478. package/src/options/OptionMessages.ts +36 -0
  479. package/src/options/UserBuilder.ts +36 -0
  480. package/src/options/Validators.ts +301 -0
  481. package/src/options/index.ts +8 -0
  482. package/src/platform/IInfo.ts +82 -0
  483. package/src/platform/IPlatform.ts +21 -0
  484. package/src/platform/IStore.ts +119 -0
  485. package/src/platform/IWebSocket.ts +23 -0
  486. package/src/platform/browser/BrowserInfo.ts +25 -0
  487. package/src/platform/browser/BrowserPlatform.ts +20 -0
  488. package/src/platform/browser/BrowserRequests.ts +7 -0
  489. package/src/platform/browser/BrowserWebSocket.ts +143 -0
  490. package/src/platform/browser/FbClient.ts +59 -0
  491. package/src/platform/browser/LocalStorageStore.ts +153 -0
  492. package/src/platform/index.ts +4 -0
  493. package/src/platform/requests.ts +77 -0
  494. package/src/store/DataKinds.ts +7 -0
  495. package/src/store/IDataSourceUpdates.ts +49 -0
  496. package/src/store/InMemoryStore.ts +115 -0
  497. package/src/store/index.ts +5 -0
  498. package/src/store/serialization.ts +52 -0
  499. package/src/store/store.ts +38 -0
  500. package/src/utils/Emits.ts +76 -0
  501. package/src/utils/EventEmitter.ts +129 -0
  502. package/src/utils/IEventEmitter.ts +15 -0
  503. package/src/utils/Regex.ts +22 -0
  504. package/src/utils/ValueConverters.ts +56 -0
  505. package/src/utils/VoidFunction.ts +1 -0
  506. package/src/utils/canonicalizeUri.ts +4 -0
  507. package/src/utils/http.ts +40 -0
  508. package/src/utils/index.ts +4 -0
  509. package/src/utils/isNullOrUndefined.ts +3 -0
  510. package/src/utils/serializeUser.ts +28 -0
  511. package/src/utils/sleep.ts +6 -0
  512. package/src/version.ts +1 -0
  513. package/esm/constants.d.ts +0 -6
  514. package/esm/constants.js +0 -7
  515. package/esm/constants.js.map +0 -1
  516. package/esm/events.d.ts +0 -14
  517. package/esm/events.js +0 -27
  518. package/esm/events.js.map +0 -1
  519. package/esm/featbit.d.ts +0 -34
  520. package/esm/featbit.js +0 -382
  521. package/esm/featbit.js.map +0 -1
  522. package/esm/index.d.ts +0 -4
  523. package/esm/index.js +0 -5
  524. package/esm/index.js.map +0 -1
  525. package/esm/logger.d.ts +0 -4
  526. package/esm/logger.js +0 -20
  527. package/esm/logger.js.map +0 -1
  528. package/esm/network.service.d.ts +0 -27
  529. package/esm/network.service.js +0 -288
  530. package/esm/network.service.js.map +0 -1
  531. package/esm/optionMessages.d.ts +0 -5
  532. package/esm/optionMessages.js +0 -16
  533. package/esm/optionMessages.js.map +0 -1
  534. package/esm/queue.d.ts +0 -8
  535. package/esm/queue.js +0 -35
  536. package/esm/queue.js.map +0 -1
  537. package/esm/store.d.ts +0 -20
  538. package/esm/store.js +0 -143
  539. package/esm/store.js.map +0 -1
  540. package/esm/throttleutil.d.ts +0 -9
  541. package/esm/throttleutil.js +0 -133
  542. package/esm/throttleutil.js.map +0 -1
  543. package/esm/types.d.ts +0 -94
  544. package/esm/types.js +0 -24
  545. package/esm/types.js.map +0 -1
  546. package/esm/umd.d.ts +0 -2
  547. package/esm/utils.d.ts +0 -11
  548. package/esm/utils.js +0 -142
  549. package/esm/utils.js.map +0 -1
  550. package/src/events.ts +0 -29
  551. package/src/featbit.ts +0 -343
  552. package/src/logger.ts +0 -13
  553. package/src/network.service.ts +0 -223
  554. package/src/optionMessages.ts +0 -13
  555. package/src/queue.ts +0 -23
  556. package/src/store.ts +0 -169
  557. package/src/throttleutil.ts +0 -72
  558. package/src/types.ts +0 -113
  559. package/src/umd.ts +0 -15
  560. package/src/utils.ts +0 -173
  561. package/umd/featbit-js-client-sdk-2.0.1.js +0 -2
  562. package/umd/featbit-js-client-sdk-2.0.1.js.map +0 -1
  563. package/umd/featbit-js-client-sdk.js +0 -2
  564. package/umd/featbit-js-client-sdk.js.map +0 -1
package/README.md CHANGED
@@ -1,8 +1,12 @@
1
- # FeatBit Client-Side SDK for JavaScript
1
+ > **Attention**
2
+ >
3
+ > If you are using the v1 or v2 of the SDK, please refer to this [doc](https://github.com/featbit/featbit-js-client-sdk/tree/v2)
4
+
5
+ # FeatBit Client SDK for JavaScript
2
6
 
3
7
  ## Introduction
4
8
 
5
- This is the client side SDK for the feature management platform [FeatBit](https://github.com/featbit/featbit).
9
+ This is the Client-Side SDK for the 100% open-source feature flags management platform [FeatBit](https://github.com/featbit/featbit).
6
10
 
7
11
  Be aware, this is a client side SDK, it is intended for use in a single-user context, which can be mobile, desktop or embedded applications. This SDK can only be ran in a browser environment, it is not suitable for NodeJs applications.
8
12
 
@@ -11,127 +15,137 @@ Be aware, this is a client side SDK, it is intended for use in a single-user con
11
15
  ### Installation
12
16
 
13
17
  ```bash
14
- npm install @featbit/js-client-sdk
18
+ npm install --save @featbit/js-client-sdk
15
19
  ```
16
-
17
20
  ### Prerequisite
18
21
 
19
- Before using the SDK, you need to obtain the environment secret and SDK URLs.
22
+ Before using the SDK, you need to obtain the environment secret (the sdkKey) and SDK URLs.
20
23
 
21
24
  Follow the documentation below to retrieve these values
22
-
23
- - [How to get the environment secret](https://docs.featbit.co/sdk/faq#how-to-get-the-environment-secret)
24
- - [How to get the SDK URLs](https://docs.featbit.co/sdk/faq#how-to-get-the-sdk-urls)
25
+ - [How to get environment secret](https://docs.featbit.co/sdk/faq#how-to-get-the-environment-secret)
26
+ - [How to get SDK URLs](https://docs.featbit.co/sdk/faq#how-to-get-the-sdk-urls)
25
27
 
26
28
  ### Quick Start
27
29
 
28
- The following code demonstrates:
29
- 1. Initialize the SDK
30
- 2. Evaluate flag
31
- 3. Subscribe to flag change
30
+ The following code demonstrates the basic usage of `@featbit/js-client-sdk`.
32
31
 
33
32
  ```javascript
34
- import fbClient from '@featbit/js-client-sdk';
35
-
36
- const option = {
37
- secret: "your env secret",
38
- api:"http://localhost:5100", // the Streaming URL
39
- user: {
40
- name: "Bot",
41
- keyId: "bot-id",
42
- customizedProperties: [
43
- {
44
- "name": "level",
45
- "value": "high"
46
- }
47
- ]
33
+ import { FbClientBuilder, UserBuilder } from "@featbit/js-client-sdk";
34
+
35
+ const bob = new UserBuilder('a-unique-key-of-user')
36
+ .name('bob')
37
+ .custom('age', '18')
38
+ .custom('country', 'FR')
39
+ .build();
40
+
41
+ // setup SDK client with websocket streaming
42
+ const fbClient = new FbClientBuilder()
43
+ .sdkKey("your_sdk_key")
44
+ .streamingUri('ws://localhost:5100')
45
+ .eventsUri("http://localhost:5100")
46
+ .user(bob)
47
+ .build();
48
+
49
+ (async () => {
50
+ // wait for the SDK to be initialized
51
+ try {
52
+ await fbClient.waitForInitialization();
53
+ } catch(err) {
54
+ // failed to initialize the SDK
55
+ console.log(err);
48
56
  }
49
- };
50
57
 
51
- // initialization
52
- fbClient.init(option);
58
+ // flag to be evaluated
59
+ const flagKey = "game-runner";
53
60
 
54
- // evaluation
55
- const flagValue = fbClient.variation("YOUR_FEATURE_KEY", defaultValue);
61
+ // evaluate a feature flag for a given user
62
+ const boolVariation = await fbClient.boolVariation(flagKey, false);
56
63
 
57
- // subscribe to flag change
58
- fbClient.on('ff_update:YOUR_FEATURE_KEY', (change) => {
59
- // change has this structure {id: 'the feature_flag_key', oldValue: theOldValue, newValue: theNewValue }
60
- // the type of theOldValue and theNewValue is defined on FeatBit
61
-
62
- // defaultValue should have the same type as theOldValue and theNewValue
63
- const myFeature = fbClient.variation('YOUR_FEATURE_KEY', defaultValue);
64
- });
64
+ // switch user
65
+ const alice = new UserBuilder('another-unique-key-of-user')
66
+ .name('alice')
67
+ .custom('country', 'UK')
68
+ .custom('age', 36)
69
+ .build();
70
+
71
+ await fbClient.identify(alice);
72
+ })();
65
73
  ```
66
74
 
67
75
  ## Examples
68
-
69
- - [Vue](https://github.com/featbit/featbit-samples/tree/main/samples/dino-game/interactive-demo-vue)
76
+ - [web App](./examples/console-app)
70
77
  - For how to use FeatBit with React, please refer to the [react-client-sdk](https://github.com/featbit/featbit-react-client-sdk)
71
78
 
72
79
  ## SDK
73
80
 
74
- ### Initialization
81
+ ### FbClient
75
82
 
76
- Before initializing the SDK, you need to get the client-side env secret of your environment from FeatBit.
83
+ The `FbClient` is the heart of the SDK which provides access to FeatBit server. Applications should instantiate a single instance for the lifetime of the application.
77
84
 
78
- ```javascript
79
- const option = {
80
- secret: "your env secret",
81
- streamingUri:"ws://localhost:5100",
82
- eventsUri:"http://localhost:5100",
83
- user: {
84
- name: "Bot",
85
- keyId: "bot-id",
86
- customizedProperties: [
87
- {
88
- "name": "level",
89
- "value": "high"
90
- }
91
- ]
92
- }
93
- };
85
+ `FbClientBuilder` is used to construct a `FbClient` instance. The builder exposes methods to configure the SDK, and finally to create the `FbClient` instance.
86
+
87
+ #### FbClient Using Streaming
94
88
 
95
- fbClient.init(option);
89
+ ```javascript
90
+ import { FbClientBuilder, UserBuilder } from "@featbit/js-client-sdk";
91
+
92
+ const user = new UserBuilder('a-unique-key-of-user')
93
+ .name('bob')
94
+ .build();
95
+
96
+ const fbClient = new FbClientBuilder()
97
+ .sdkKey("your_sdk_key")
98
+ .streamingUri('ws://localhost:5100')
99
+ .eventsUri("http://localhost:5100")
100
+ .user(user)
101
+ .build();
96
102
  ```
103
+ #### FbClient Using Polling
97
104
 
98
- The user has three properties:
99
- - name(**requried**): The user's name, useful when viewing users in the portal.
100
- - keyId(**requried**): The unique user identifier.
101
- - streamingUri: The streaming URL.
102
- - eventsUri: The events URL.
103
- - customizedProperties(**optional**): Any other customized properties. Users can be targeted by these customized properties. Here is the format definition:
104
- ```json
105
- [
106
- {
107
- "name": "the name of the property",
108
- "value": "the value of the property"
109
- }
110
- ]
105
+ ```javascript
106
+ import { FbClientBuilder, UserBuilder, DataSyncMode } from "@featbit/browser-server-sdk";
107
+
108
+ const user = new UserBuilder('a-unique-key-of-user')
109
+ .name('bob')
110
+ .build();
111
+
112
+ const fbClient = new FbClientBuilder()
113
+ .sdkKey("your_sdk_key")
114
+ .dataSyncMode(DataSyncMode.POLLING)
115
+ .pollingUri('http://localhost:5100')
116
+ .eventsUri("http://localhost:5100")
117
+ .pollingInterval(10000)
118
+ .build();
111
119
  ```
112
120
 
113
- This table lists all available options
121
+ #### IUser
122
+
123
+ `IUser` defines the attributes of a user for whom you are evaluating feature flags. IUser has two built-in attributes: key and name. The only mandatory attribute of a IUser is the key, which must uniquely identify each user.
124
+
125
+ Besides these built-in properties, you can define any additional attributes associated with the user using `custom(string key, string value)` method on UserBuilder. Both built-in attributes and custom attributes can be referenced in targeting rules, and are included in analytics data.
126
+
127
+ `UserBuilder` is used to construct a `IUser` instance. The builder exposes methods to configure the IUser, and finally to create the IUser instance.
114
128
 
115
- | Options | Defaults | Description |
116
- |-----------------------|--------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
117
- | secret (**required**) | - | The client side secret of your environment. |
118
- | user (**required**) | - | The user connected to your APP, can be ignored if anonymous equals to true. |
119
- | anonymous | `false` | Set to true if you want to use a anonymous user, which is the case before user login to your APP. If that is your case, the user can be set later with the identify method after the user has logged in. |
120
- | enableDataSync | `true` | Set to false if you do not want to sync data with remote server, in this case feature flags must be set to bootstrap option or be passed to the method bootstrap. |
121
- | bootstrap | `[ ]` | Init the SDK with feature flags, this will trigger the ready event immediately instead of requesting from the remote. |
122
- | streamingUri | `` | The evaluation server streaming URL. |
123
- | eventsUri | `` | The evaluation server events URL. |
124
- | appType | `javascript` | The app type. |
129
+ ```javascript
130
+ import { UserBuilder } from "@featbit/js-client-sdk";
131
+
132
+ const bob = new UserBuilder("unique_key_for_bob")
133
+ .name("Bob")
134
+ .custom('age', 18)
135
+ .custom('country', 'FR')
136
+ .build();
137
+ ```
125
138
 
126
139
  ### Bootstrap
127
- If you already have the feature flags available, two ways to pass them to the SDK instead of requesting from the remote.
128
- - By the **init** method
140
+ If you already have the feature flags available, you can pass them to the SDK instead of requesting from the remote.
141
+
142
+
143
+ > **_NOTE:_** The bootstrapped flags will be overridden by the remote flags if they are available.
129
144
 
130
145
  ```javascript
131
146
  // define the option with the bootstrap parameter
132
- const option = {
147
+ const options = {
133
148
  ...
134
- // the array should contain all your feature flags
135
149
  bootstrap = [{
136
150
  // feature flag key name
137
151
  id: string,
@@ -139,41 +153,57 @@ const option = {
139
153
  variation: string,
140
154
  // variation data type, string will be used if not specified
141
155
  variationType: VariationDataType
142
- }],
143
- ...
156
+ }]
144
157
  }
145
158
 
146
- fbClient.init(option);
159
+ const fbClient = new FbClientBuilder(options).build();
160
+ // or
161
+ const fbClient = new FbClientBuilder()
162
+ //... other options
163
+ .bootstrap(options.bootstrap)
164
+ .build();
147
165
  ```
148
166
 
149
- - By the **bootstrap** method
167
+ ### Evaluation
168
+
169
+ After initialization, the SDK has all the feature flags locally, and it does not need to request the remote server for any feature flag evaluation. All evaluation is done locally and synchronously, the average evaluation time is less than 1 ms.
170
+
171
+ There is a `variation` method that returns a flag value, and a `variationDetail` method that returns an object
172
+ describing how the value was determined for each type.
173
+
174
+ - boolVariation/boolVariationDetail
175
+ - stringVariation/stringVariationDetail
176
+ - numberVariation/numberVariationDetail
177
+ - jsonVariation/jsonVariationDetail
178
+
179
+ Variation calls take the feature flag key and a default value. If any error makes it impossible to
180
+ evaluate the flag (for instance, the feature flag key does not match any existing flag), default value is returned.
150
181
 
151
182
  ```javascript
152
- // this array should contain all your feature flags
153
- const featureflags = [{
154
- // feature flag key name
155
- id: string,
156
- // variation value
157
- variation: string,
158
- // variation data type, string will used if not specified
159
- variationType: VariationDataType
160
- }]
161
-
162
- fbClient.bootstrap(featureflags);
163
- ```
183
+ // flag to be evaluated
184
+ const flagKey = "game-runner";
164
185
 
165
- **If you want to disable the synchronization with remote server, set enableDataSync to false in option**. In this case, bootstrap option must be set or bootstrap method must be called with feature flags.
186
+ // evaluate a feature flag for a given user
187
+ const boolVariation = await fbClient.boolVariation(flagKey, false);
166
188
 
167
- ### Evaluation
189
+ // evaluate a boolean flag for a given user with evaluation detail
190
+ const boolVariationDetail = await fbClient.boolVariationDetail(flagKey, false);
191
+ ```
168
192
 
169
- After initialization, the SDK has all the feature flags locally, and it does not need to request the remote server for any feature flag evaluation. All evaluation is done locally and synchronously, the average evaluation time is about **1** ms.
193
+ ### Offline Mode
170
194
 
195
+ In some situations, you might want to stop making remote calls to FeatBit. Here is how:
171
196
  ```javascript
172
- // Use this method for all cases
173
- // This method supports type inspection, it returns the value with the type defined on FeatBit,
174
- // so defaultValue should have the same type as defined on FeatBit
175
- const flagValue = fbClient.variation("YOUR_FEATURE_KEY", defaultValue);
197
+ import { FbClientBuilder } from "@featbit/browser-server-sdk";
198
+
199
+ const fbClient = new FbClientBuilder()
200
+ //... other options
201
+ .offline(true)
202
+ .build();
203
+
176
204
  ```
205
+ When Offline mode is enabled, you should provide the flags with the [bootstrap](#bootstrap) option,
206
+ otherwise, the SDK would return the defaul value you passed to the `variation` method.
177
207
 
178
208
  ### Events
179
209
 
@@ -184,27 +214,25 @@ To find out when the client is ready, you can use one of two mechanisms: events
184
214
  The client object can emit JavaScript events. It emits a ready event when it receives initial flag values from the server. You can listen for this event to determine when the client is ready to evaluate flags.
185
215
 
186
216
  ```javascript
187
- fbClient.on('ready', (data) => {
188
- // data has the following structure [ {id: 'featureFlagKey', variation: variationValue} ]
189
- // variationValue has the type as defined on remote
217
+ fbClient.on('ready', () => {
190
218
  var flagValue = fbClient.variation("YOUR_FEATURE_KEY", defaultValue);
191
219
  });
192
220
  ```
193
221
 
194
- Or, you can use a promise instead of an event. The SDK has a method that return a promise for initialization: waitUntilReady(). The behavior of waitUntilReady() is equivalent to the ready event. The promise resolves when the client receives its initial flag data. As with all promises, you can either use .then() to provide a callback, or use await if you are writing asynchronous code.
222
+ Or, you can use a promise instead of an event. The SDK has a method that returns a promise for initialization: **waitForInitialization()**. The behavior of waitUntilReady() is equivalent to the ready event. The promise resolves when the client receives its initial flag data. As with all promises, you can either use .then() to provide a callback, or use await if you are writing asynchronous code.
195
223
 
196
224
  ```javascript
197
- fbClient.waitUntilReady().then((data) => {
225
+ fbClient.waitForInitialization().then((data) => {
198
226
  // data has the following structure [ {id: 'featureFlagKey', variation: variationValue } ]
199
227
  // variationValue has the type as defined on remote
200
228
  // initialization succeeded, flag values are now available
201
229
  });
202
230
  // or, with await:
203
- const featureFlags = await fbClient.waitUntilReady();
231
+ const featureFlags = await fbClient.waitForInitialization();
204
232
  // initialization succeeded, flag values are now available
205
233
  ```
206
234
 
207
- The SDK only decides initialization has failed if it receives an error response indicating that the environment ID is invalid. If it has trouble connecting to feature-flags.co, it will keep retrying until it succeeds.
235
+ The SDK only decides initialization has failed if it receives an error response indicating that the environment ID is invalid. If it has trouble connecting to FeatBit, it will keep retrying until it succeeds.
208
236
 
209
237
  #### Subscribe to flag(s) changes
210
238
 
@@ -212,10 +240,7 @@ To get notified when a feature flag is changed, we offer two methods
212
240
  - subscribe to the changes of any feature flag(s)
213
241
 
214
242
  ```javascript
215
- fbClient.on('ff_update', (changes) => {
216
- // changes has this structure [{id: 'the feature_flag_key', oldValue: theOldValue, newValue: theNewValue }]
217
- // the type of theOldValue and theNewValue is defined on FeatBit
218
-
243
+ fbClient.on('update', (keys: string[]) => {
219
244
  // do something when any feature flag changes
220
245
  });
221
246
 
@@ -224,66 +249,53 @@ fbClient.on('ff_update', (changes) => {
224
249
 
225
250
  ```javascript
226
251
  // replace feature_flag_key with your feature flag key
227
- fbClient.on('ff_update:feature_flag_key', (change) => {
228
- // change has this structure {id: 'the feature_flag_key', oldValue: theOldValue, newValue: theNewValue }
229
- // the type of theOldValue and theNewValue is defined on FeatBit
230
-
231
- // defaultValue should have the same type as theOldValue and theNewValue
232
- // this is the prefered way than calling change.newValue as each time you call fbClient.variation,
233
- // the insight data is sent to server automatically
252
+ fbClient.on('update:feature_flag_key', (key) => {
234
253
  const myFeature = fbClient.variation('feature_flag_key', defaultValue);
235
254
  });
236
255
 
237
256
  ```
238
257
 
239
258
  ### Switch user after initialization
240
- If the user parameter cannot be passed by the init method, the following method can be used to set the user after initialization.
259
+ If the user changed after some process, login for example, the following method can be used to set the user after initialization.
241
260
 
242
261
  ```javascript
243
262
  await fbClient.identify(user);
244
263
  ```
245
264
 
246
- We can manually call the method logout, which will switch the current user back to anonymous user if exists already or create a new anonymous user.
247
-
248
- ```javascript
249
- fbClient.logout(user);
250
- ```
251
265
 
252
266
  ### Data synchronization
253
267
 
254
- We use websocket to make the local data synchronized with the server, and then store them in memory by default. Whenever there is any change to a feature flag or its related data, this change will be pushed to the SDK, the average synchronization time is less than 100ms. Be aware the websocket connection may be interrupted due to internet outage, but it will be resumed automatically once the problem is gone.
268
+ We use **WebSocket** or **Polling** to make the local data synchronized with the server, and then store them in localStorage by default. Whenever there is any change to a feature flag or its related data, this change will be pushed to the SDK, the average synchronization time is less than **100ms** if WebSocket is configured. Be aware the WebSocket/Polling connection may be interrupted due to internet outage, but it will be resumed automatically once the problem is gone.
255
269
 
256
270
  ### Network failure handling
257
271
 
258
272
  As all data is stored locally in the localStorage, in the following situations, the SDK would still work when there is temporarily no internet connection:
259
273
  - it has already received the data from previous connections
260
- - the fbClient.bootstrap(featureFlags) method is called with all necessary feature flags
274
+ - the `fbClient.bootstrap(featureFlags)` method is called with all necessary feature flags
261
275
 
262
276
  In the meantime, the SDK would try to reconnect to the server by an incremental interval, this makes sure that the websocket would be restored when the internet connection is back.
263
277
 
264
-
265
278
  ### Experiments (A/B/n Testing)
266
279
 
267
- We support automatic experiments for page views and clicks, you just need to set your experiment on FeatBit portal, then you should be able to see the result in near real time after the experiment is started.
280
+ We support automatic experiments for pageviews and clicks, you just need to set your experiment on our SaaS platform,
281
+ then you should be able to see the result in near real time after the experiment is started.
268
282
 
269
283
  In case you need more control over the experiment data sent to our server, we offer a method to send custom event.
270
284
 
271
285
  ```javascript
272
- fbClient.sendCustomEvent([{
273
- eventName: 'your event name',
274
- numericValue: 1
275
- }])
286
+ fbClient.track(eventName, numericValue);
276
287
  ```
277
288
 
278
- **numericValue** is not mandatory, the default value is **1**.
289
+ **numericValue** is not mandatory, the default value is **1.0**.
279
290
 
280
- Make sure sendCustomEvent is called after the related feature flag is called by simply calling **fbClient.variation('featureFlagKeyName', 'default value')**, otherwise, the custom event won't be included into the experiment result.
291
+ Make sure `track` is called after the related feature flag is called, otherwise the custom event won't be included
292
+ into the experiment result.
281
293
 
282
294
  ## Getting support
283
-
284
- - If you have a specific question about using this SDK, we encourage you to [ask it in Slack](https://join.slack.com/t/featbit/shared_invite/zt-1ew5e2vbb-x6Apan1xZOaYMnFzqZkGNQ).
285
- - If you encounter a bug or would like to request a feature, [submit an issue](https://github.com/featbit/featbit-js-client-sdk/issues).
295
+ - If you have a specific question about using this sdk, we encourage you
296
+ to [ask it in our slack](https://join.slack.com/t/featbit/shared_invite/zt-1ew5e2vbb-x6Apan1xZOaYMnFzqZkGNQ).
297
+ - If you encounter a bug or would like to request a
298
+ feature, [submit an issue](https://github.com/featbit/dotnet-server-sdk/issues/new).
286
299
 
287
300
  ## See Also
288
-
289
- - [Connect To JavaScript Sdk](https://docs.featbit.co/getting-started/connect-an-sdk#javascript)
301
+ - [Connect To JavaScript Sdk](https://docs.featbit.co/getting-started/connect-an-sdk#javascript)
@@ -0,0 +1,35 @@
1
+ import { IOptions } from "./options/IOptions";
2
+ import { ILogger } from "./logging/ILogger";
3
+ import { IValidatedOptions } from "./options/IValidatedOptions";
4
+ import { IStore } from "./platform/IStore";
5
+ import { IClientContext } from "./options/IClientContext";
6
+ import { IDataSynchronizer } from "./data-sync/IDataSynchronizer";
7
+ import { IDataSourceUpdates } from "./store/IDataSourceUpdates";
8
+ import { VoidFunction } from "./utils/VoidFunction";
9
+ import { IBootstrapProvider } from "./bootstrap/IBootstrapProvider";
10
+ import { DataSyncModeEnum } from "./data-sync/DataSyncMode";
11
+ import { IUser } from "./options/IUser";
12
+ /**
13
+ * @internal
14
+ */
15
+ export declare const defaultValues: IValidatedOptions;
16
+ export default class Configuration {
17
+ readonly startWaitTime: number;
18
+ readonly sdkKey: string;
19
+ readonly streamingUri: string;
20
+ readonly pollingUri: string;
21
+ readonly eventsUri: string;
22
+ readonly webSocketPingInterval: number;
23
+ readonly logger?: ILogger;
24
+ readonly flushInterval: number;
25
+ readonly maxEventsInQueue: number;
26
+ readonly pollingInterval: number;
27
+ readonly offline: boolean;
28
+ readonly dataSyncMode: DataSyncModeEnum;
29
+ readonly bootstrapProvider: IBootstrapProvider;
30
+ readonly user: IUser;
31
+ readonly storeFactory: (clientContext: IClientContext) => IStore;
32
+ readonly dataSynchronizerFactory?: (clientContext: IClientContext, store: IStore, dataSourceUpdates: IDataSourceUpdates, initSuccessHandler: VoidFunction, errorHandler?: (e: Error) => void) => IDataSynchronizer;
33
+ constructor(options?: IOptions);
34
+ }
35
+ //# sourceMappingURL=Configuration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Configuration.d.ts","sourceRoot":"","sources":["../../src/Configuration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGhE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAgCxC;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,iBAgB3B,CAAC;AAiEF,MAAM,CAAC,OAAO,OAAO,aAAa;IAChC,SAAgB,aAAa,EAAE,MAAM,CAAC;IAEtC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,SAAgB,YAAY,EAAE,MAAM,CAAC;IAErC,SAAgB,UAAU,EAAE,MAAM,CAAC;IAEnC,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC,SAAgB,qBAAqB,EAAE,MAAM,CAAC;IAE9C,SAAgB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjC,SAAgB,aAAa,EAAE,MAAM,CAAC;IAEtC,SAAgB,gBAAgB,EAAE,MAAM,CAAC;IAEzC,SAAgB,eAAe,EAAE,MAAM,CAAC;IAExC,SAAgB,OAAO,EAAE,OAAO,CAAC;IAEjC,SAAgB,YAAY,EAAE,gBAAgB,CAAC;IAE/C,SAAgB,iBAAiB,EAAE,kBAAkB,CAA+B;IAEpF,SAAgB,IAAI,EAAE,KAAK,CAAC;IAE5B,SAAgB,YAAY,EAAE,CAAC,aAAa,EAAE,cAAc,KAAK,MAAM,CAAC;IAExE,SAAgB,uBAAuB,CAAC,EAAE,CACxC,aAAa,EAAE,cAAc,EAC7B,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,kBAAkB,EACrC,kBAAkB,EAAE,YAAY,EAChC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,KAC9B,iBAAiB,CAAC;gBAEX,OAAO,GAAE,QAAa;CA6DnC"}