@featbit/js-client-sdk 2.0.2 → 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 +160 -152
  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.2.js +0 -2
  562. package/umd/featbit-js-client-sdk-2.0.2.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
@@ -0,0 +1,20 @@
1
+ import { IPlatform } from "../IPlatform";
2
+ import { IInfo } from "../IInfo";
3
+ import { IRequests } from "../requests";
4
+ import { IOptions } from "../../options/IOptions";
5
+ import BrowserInfo from "./BrowserInfo";
6
+ import BrowserRequests from "./BrowserRequests";
7
+ import { IWebSocketWithEvents } from "../IWebSocket";
8
+ import BrowserWebSocket from "./BrowserWebSocket";
9
+
10
+ export default class BrowserPlatform implements IPlatform {
11
+ info: IInfo = new BrowserInfo();
12
+
13
+ requests: IRequests;
14
+ webSocket: IWebSocketWithEvents;
15
+
16
+ constructor(options: IOptions) {
17
+ this.requests = new BrowserRequests();
18
+ this.webSocket = new BrowserWebSocket();
19
+ }
20
+ }
@@ -0,0 +1,7 @@
1
+ import { IRequestOptions, IRequests } from "../requests";
2
+
3
+ export default class BrowserRequests implements IRequests {
4
+ fetch(url: string, options: IRequestOptions = {}): Promise<any> {
5
+ return fetch(url, options);
6
+ }
7
+ }
@@ -0,0 +1,143 @@
1
+ import { IWebSocket, IWebSocketConfig } from "../IWebSocket";
2
+ import { Emits } from "../../utils/Emits";
3
+ import { IEventEmitter } from "../../utils/IEventEmitter";
4
+ import { EventEmitter } from "../../utils/EventEmitter";
5
+ import { generateConnectionToken } from "../../data-sync/utils";
6
+ import { StreamResponseEventType } from "../../data-sync/types";
7
+ import { IUser } from "../../options/IUser";
8
+
9
+ const socketConnectionIntervals = [1000, 3000, 5000, 7000, 11000, 13000, 30000, 60000];
10
+
11
+ class BrowserWebSocket implements IWebSocket {
12
+ emitter: IEventEmitter;
13
+ private ws?: WebSocket;
14
+ private retryCounter = 0;
15
+ private closed: boolean = false;
16
+
17
+ private _config: IWebSocketConfig = {} as IWebSocketConfig;
18
+
19
+ constructor() {
20
+ this.emitter = new EventEmitter();
21
+ }
22
+
23
+ identify(user: IUser) {
24
+ this._config.user = user;
25
+ this.doDataSync();
26
+ }
27
+
28
+ connect() {
29
+ let that = this;
30
+ const startTime = Date.now();
31
+ const url = this._config.streamingUri.replace(/^http/, 'ws') + `?type=client&token=${ generateConnectionToken(this._config.sdkKey) }`;
32
+ this.ws = new WebSocket(url);
33
+
34
+ // Connection opened
35
+ that.ws?.addEventListener('open', function (this: WebSocket, event) {
36
+ // this is the websocket instance to which the current listener is binded to, it's different from that.socket
37
+ that._config.logger.info(`WebSocket connection succeeded, connection time: ${ Date.now() - startTime } ms`);
38
+ that.doDataSync();
39
+ that.sendPingMessage();
40
+ });
41
+
42
+ // Connection closed
43
+ that.ws?.addEventListener('close', function (event) {
44
+ that._config.logger.warn('WebSocket closed');
45
+ if (event.code === 4003) { // do not reconnect when 4003
46
+ return;
47
+ }
48
+
49
+ that.reconnect();
50
+ });
51
+
52
+ // Connection error
53
+ that.ws?.addEventListener('error', function (event) {
54
+ // reconnect
55
+ that._config.logger.debug('error');
56
+ });
57
+
58
+ // Listen for messages
59
+ that.ws?.addEventListener('message', function (event) {
60
+ const message = JSON.parse(event.data as string);
61
+ if (message.messageType === 'data-sync') {
62
+ switch (message.data.eventType) {
63
+ case StreamResponseEventType.patch:
64
+ that.emitter.emit('patch', message);
65
+ break;
66
+ case StreamResponseEventType.full:
67
+ that.emitter.emit('put', message);
68
+ break;
69
+ }
70
+ }
71
+ });
72
+ }
73
+
74
+ close() {
75
+ this.closed = true;
76
+ this.ws?.close(4003, 'The client is closed by user');
77
+ this.ws = undefined;
78
+ }
79
+
80
+ config(param: IWebSocketConfig) {
81
+ if (param.emitter) {
82
+ this.emitter = param.emitter;
83
+ }
84
+
85
+ this._config = {...param};
86
+ }
87
+
88
+ private sendPingMessage() {
89
+ const payload = {
90
+ messageType: 'ping',
91
+ data: null
92
+ };
93
+
94
+ setTimeout(() => {
95
+ try {
96
+ if (this.ws?.readyState === WebSocket.OPEN) {
97
+ this._config.logger.debug('sending ping')
98
+ this.ws.send(JSON.stringify(payload));
99
+ this.sendPingMessage();
100
+ } else {
101
+ this._config.logger.debug(`socket closed at ${ new Date() }`);
102
+ }
103
+ } catch (err) {
104
+ this._config.logger.debug(err);
105
+ }
106
+ }, this._config.pingInterval);
107
+ }
108
+
109
+ private doDataSync() {
110
+ const payload = {
111
+ messageType: 'data-sync',
112
+ data: {
113
+ timestamp: this._config.getStoreTimestamp(),
114
+ user: this._config.user
115
+ }
116
+ };
117
+
118
+ try {
119
+ if (this.ws?.readyState === WebSocket.OPEN) {
120
+ this._config.logger.debug('requesting data');
121
+ this.ws?.send(JSON.stringify(payload));
122
+ } else {
123
+ this._config.logger.error(`not requesting data because socket not open`);
124
+ }
125
+ } catch (err) {
126
+ this._config.logger.debug(err);
127
+ }
128
+ }
129
+
130
+ private reconnect() {
131
+ if (!this.closed) {
132
+ this.ws = undefined;
133
+ const waitTime = socketConnectionIntervals[Math.min(this.retryCounter++, socketConnectionIntervals.length - 1)];
134
+ this._config.logger.info(`The client will try to reconnect in ${ waitTime } milliseconds.`);
135
+ setTimeout(() => {
136
+ this._config.logger.info(`The client is trying to reconnect, flag evaluation results may be stale until reconnected, waited for: ${ waitTime } milliseconds`);
137
+ this.connect();
138
+ }, waitTime);
139
+ }
140
+ }
141
+ }
142
+
143
+ export default Emits(BrowserWebSocket);
@@ -0,0 +1,59 @@
1
+ import { FbClientCore } from "../../FbClientCore";
2
+ import { IOptions } from "../../options/IOptions";
3
+ import { BasicLogger } from "../../logging/BasicLogger";
4
+ import { EventEmitter } from "../../utils/EventEmitter";
5
+ import SafeLogger from "../../logging/SafeLogger";
6
+ import { Emits } from "../../utils/Emits";
7
+ import { IEventEmitter } from "../../utils/IEventEmitter";
8
+ import BrowserPlatform from "./BrowserPlatform";
9
+
10
+ /**
11
+ * @ignore
12
+ */
13
+ class FbClient extends FbClientCore {
14
+ emitter: IEventEmitter;
15
+
16
+ constructor(options: IOptions) {
17
+ const fallbackLogger = new BasicLogger({
18
+ level: 'none',
19
+ destination: console.log
20
+ });
21
+
22
+ const logger = options.logger ? new SafeLogger(options.logger, fallbackLogger) : fallbackLogger;
23
+
24
+ const emitter = new EventEmitter(logger);
25
+
26
+ super(
27
+ {...options, logger},
28
+ new BrowserPlatform({...options, logger}),
29
+ {
30
+ onError: (err: Error) => {
31
+ if (emitter.listenerCount('error')) {
32
+ emitter.emit('error', err);
33
+ }
34
+ },
35
+ onFailed: (err: Error) => {
36
+ emitter.emit('failed', err);
37
+ },
38
+ onReady: () => {
39
+ emitter.emit('ready');
40
+ },
41
+ onUpdate: (keys: string[]) => {
42
+ emitter.emit('update', [keys]);
43
+ keys.forEach((key) => emitter.emit(`update:${ key }`, key));
44
+ },
45
+ hasEventListeners: () =>
46
+ emitter
47
+ .eventNames()
48
+ .some(
49
+ (name) =>
50
+ name === 'update' || (typeof name === 'string' && name.startsWith('update:')),
51
+ ),
52
+ },
53
+ );
54
+
55
+ this.emitter = emitter;
56
+ }
57
+ }
58
+
59
+ export default Emits(FbClient);
@@ -0,0 +1,153 @@
1
+ import { IDataKind } from "../../IDataKind";
2
+ import {
3
+ StoreStorageKey,
4
+ IKeyedStoreItem,
5
+ IStoreDataStorage,
6
+ IStoreItem,
7
+ IStoreKindData,
8
+ CurrentUserStorageKey
9
+ } from "../../store/store";
10
+ import { IStore } from "../../platform/IStore";
11
+ import { IUser } from "../../options/IUser";
12
+ import { ILogger } from "../../logging/ILogger";
13
+ import { IOptions } from "../../options/IOptions";
14
+ import { serializeUser } from "../../utils/serializeUser";
15
+
16
+ export default class LocalStorageStore implements IStore {
17
+ private store: IStoreDataStorage = {} as IStoreDataStorage;
18
+
19
+ private initCalled = false;
20
+
21
+ private _user: IUser = {} as IUser;
22
+
23
+ private logger: ILogger;
24
+
25
+ constructor(options: IOptions) {
26
+ this.logger = options.logger!;
27
+ }
28
+
29
+ identify(user: IUser) {
30
+ this._user = {...user};
31
+
32
+ localStorage.setItem(CurrentUserStorageKey, serializeUser(this._user));
33
+ this.loadStoreFromStorage();
34
+ }
35
+
36
+ get user(): IUser {
37
+ return this._user;
38
+ }
39
+
40
+ private addItem(kind: IDataKind, key: string, item: IStoreItem) {
41
+ let items = this.store[kind.namespace];
42
+ if (!items) {
43
+ items = {};
44
+ this.store[kind.namespace] = items;
45
+ }
46
+ if (Object.hasOwnProperty.call(items, key)) {
47
+ const old = items[key];
48
+ if (!old || old.version < item.version) {
49
+ items[key] = item;
50
+ }
51
+ } else {
52
+ items[key] = item;
53
+ }
54
+
55
+ if (item.version > this.store.version) {
56
+ this.store.version = item.version;
57
+ }
58
+
59
+ this.dumpStoreToStorage();
60
+ }
61
+
62
+ get(kind: IDataKind, key: string): IStoreItem | null {
63
+ const items = this.store[kind.namespace];
64
+ if (items) {
65
+ if (Object.prototype.hasOwnProperty.call(items, key)) {
66
+ const item = items[key];
67
+ if (item) {
68
+ return item;
69
+ }
70
+ }
71
+ }
72
+ return null;
73
+ }
74
+
75
+ all(kind: IDataKind): [IStoreKindData, number] {
76
+ const result: IStoreKindData = {};
77
+ const items = this.store[kind.namespace] ?? {};
78
+ Object.entries(items).forEach(([key, item]) => {
79
+ if (item) {
80
+ result[key] = <IStoreItem>item;
81
+ }
82
+ });
83
+
84
+ return [result, this.store.version];
85
+ }
86
+
87
+ init(allData: IStoreDataStorage, callback: () => void): void {
88
+ this.store = allData as IStoreDataStorage;
89
+
90
+ Object.keys(allData).map(namespace => {
91
+ Object.entries(allData[namespace]).forEach(([_, item]) => {
92
+ const ele = item as IStoreItem;
93
+ if (ele.version > this.store.version) {
94
+ this.store.version = ele.version;
95
+ }
96
+ })
97
+ });
98
+
99
+ this.dumpStoreToStorage();
100
+ this.initCalled = true;
101
+ callback?.();
102
+ }
103
+
104
+ upsert(kind: IDataKind, data: IKeyedStoreItem, callback: () => void): void {
105
+ this.addItem(kind, data.key, data);
106
+ callback?.();
107
+ }
108
+
109
+ initialized(): boolean {
110
+ return this.initCalled;
111
+ }
112
+
113
+ /* eslint-disable class-methods-use-this */
114
+ close(): void {
115
+ // For the memory store this is a no-op.
116
+ }
117
+
118
+ getDescription(): string {
119
+ return 'local-storage-store'
120
+ }
121
+
122
+ get version(): number {
123
+ return this.store.version;
124
+ }
125
+
126
+ private dumpStoreToStorage(): void {
127
+ const storageKey = `${StoreStorageKey}-${this._user.keyId}`;
128
+ localStorage.setItem(storageKey, JSON.stringify(this.store));
129
+ }
130
+
131
+ private loadStoreFromStorage(): void {
132
+ const storageKey = `${StoreStorageKey}-${this._user.keyId}`;
133
+ const dataStoreStr = localStorage.getItem(storageKey);
134
+ let store: IStoreDataStorage | null = null;
135
+
136
+ try {
137
+ if (dataStoreStr && dataStoreStr.trim().length > 0) {
138
+ store = JSON.parse(dataStoreStr);
139
+ }
140
+ } catch (err) {
141
+ this.logger.error(`error while loading local data store: ${storageKey}`, err);
142
+ }
143
+
144
+ if (!!store) {
145
+ this.store = store;
146
+ } else {
147
+ this.store = {
148
+ flags: {},
149
+ version: 0
150
+ };
151
+ }
152
+ }
153
+ }
@@ -0,0 +1,4 @@
1
+ export * from './IInfo';
2
+ export * from './IPlatform';
3
+ export * from './IWebSocket';
4
+ export * from './requests';
@@ -0,0 +1,77 @@
1
+ // These are not full specifications of the interface, but instead subsets
2
+ // based on the functionality needed by the SDK. Exposure of the full standard
3
+ // would require much more per platform implementation for platforms that do not
4
+ // natively support fetch.
5
+
6
+ /**
7
+ * Interface for headers that are part of a fetch response.
8
+ */
9
+ export interface IHeaders {
10
+ /**
11
+ * Get a header by name.
12
+ *
13
+ * https://developer.mozilla.org/en-US/docs/Web/API/Headers/get
14
+ *
15
+ * @param name The name of the header to get.
16
+ */
17
+ get(name: string): string | null;
18
+
19
+ /**
20
+ * Returns an iterator allowing iteration of all the keys contained
21
+ * in this object.
22
+ *
23
+ * https://developer.mozilla.org/en-US/docs/Web/API/Headers/keys
24
+ *
25
+ */
26
+ keys(): Iterable<string>;
27
+
28
+ /**
29
+ * Returns an iterator allowing iteration of all the values contained
30
+ * in this object.
31
+ *
32
+ * https://developer.mozilla.org/en-US/docs/Web/API/Headers/values
33
+ */
34
+ values(): Iterable<string>;
35
+
36
+ /**
37
+ * Returns an iterator allowing iteration of all the key-value pairs in
38
+ * the object.
39
+ *
40
+ * https://developer.mozilla.org/en-US/docs/Web/API/Headers/entries
41
+ */
42
+ entries(): Iterable<[string, string]>;
43
+
44
+ /**
45
+ * Returns true if the header is present.
46
+ * @param name The name of the header to check.
47
+ */
48
+ has(name: string): boolean;
49
+ }
50
+
51
+ /**
52
+ * Interface for fetch responses.
53
+ */
54
+ export interface IResponse {
55
+ status: number;
56
+
57
+ /**
58
+ * Read the response and provide it as a string.
59
+ */
60
+ text(): Promise<string>;
61
+
62
+ /**
63
+ * Read the response and provide it as decoded json.
64
+ */
65
+ json(): Promise<any>;
66
+ }
67
+
68
+ export interface IRequestOptions {
69
+ headers?: Record<string, string>;
70
+ method?: string;
71
+ body?: string;
72
+ timeout?: number;
73
+ }
74
+
75
+ export interface IRequests {
76
+ fetch(url: string, options?: IRequestOptions): Promise<IResponse>;
77
+ }
@@ -0,0 +1,7 @@
1
+ import { IDataKind } from "../IDataKind";
2
+
3
+ export default class DataKinds {
4
+ static readonly Flags: IDataKind = {
5
+ namespace: 'flags'
6
+ };
7
+ }
@@ -0,0 +1,49 @@
1
+ import { IDataKind } from "../IDataKind";
2
+ import { IStoreDataStorage, IKeyedStoreItem } from "./store";
3
+
4
+ /**
5
+ * Interface that a data source implementation will use to push data into the SDK.
6
+ *
7
+ * The data source interacts with this object, rather than manipulating the data store directly, so
8
+ * that the SDK can perform any other necessary operations that must happen when data is updated.
9
+ */
10
+ export interface IDataSourceUpdates {
11
+ /**
12
+ * Completely overwrites the current contents of the data store with a set of items for each
13
+ * collection.
14
+ *
15
+ * @param userKeyId
16
+ * The key ID of the user whose data is being updated.
17
+ *
18
+ * @param allData
19
+ * An object in which each key is the "namespace" of a collection (e.g. `"features"`) and
20
+ * the value is an object that maps keys to entities. The actual type of this parameter is
21
+ * `interfaces.FullDataSet<VersionedData>`.
22
+ *
23
+ * @param callback
24
+ * Will be called when the store has been initialized.
25
+ */
26
+ init(userKeyId: string, allData: IStoreDataStorage, callback?: () => void): void;
27
+
28
+ /**
29
+ * Updates or inserts an item in the specified collection. For updates, the object will only be
30
+ * updated if the existing version is less than the new version.
31
+ *
32
+ * @param userKeyId
33
+ * The key ID of the user whose data is being updated.
34
+ *
35
+ * @param kind
36
+ * The type of data to be accessed. The actual type of this parameter is
37
+ * {@link IDataKind}.
38
+ *
39
+ * @param data
40
+ * The contents of the entity, as an object that can be converted to JSON. The store
41
+ * should check the `version` property of this object, and should *not* overwrite any
42
+ * existing data if the existing `version` is greater than or equal to that value.
43
+ * The actual type of this parameter is {@link IKeyedStoreItem}.
44
+ *
45
+ * @param callback
46
+ * Will be called after the upsert operation is complete.
47
+ */
48
+ upsert(userKeyId: string, kind: IDataKind, data: IKeyedStoreItem, callback: () => void): void;
49
+ }
@@ -0,0 +1,115 @@
1
+ import { IDataKind } from "../IDataKind";
2
+ import { StoreStorageKey, IKeyedStoreItem, IStoreDataStorage, IStoreItem, IStoreKindData } from "./store";
3
+ import { IStore } from "../platform/IStore";
4
+ import { IUser } from "../options/IUser";
5
+ import { IOptions } from "../options/IOptions";
6
+
7
+ export default class InMemoryStore implements IStore {
8
+
9
+ private allStores: { [DataStoreStorageKey: string]: IStoreDataStorage } = {};
10
+
11
+ private store: IStoreDataStorage = {} as IStoreDataStorage;
12
+
13
+ private initCalled = false;
14
+
15
+ private _user: IUser = {} as IUser;
16
+
17
+ constructor(options: IOptions) {}
18
+
19
+ identify(user: IUser) {
20
+ this._user = {...user};
21
+
22
+ this.store = this.allStores[`${StoreStorageKey}-${this._user.keyId}`] ?? { flags: {}, version: 0 };
23
+ }
24
+
25
+ get user(): IUser {
26
+ return this._user;
27
+ }
28
+
29
+ private addItem(kind: IDataKind, key: string, item: IStoreItem) {
30
+ let items = this.store[kind.namespace];
31
+ if (!items) {
32
+ items = {};
33
+ this.store[kind.namespace] = items;
34
+ }
35
+ if (Object.hasOwnProperty.call(items, key)) {
36
+ const old = items[key];
37
+ if (!old || old.version < item.version) {
38
+ items[key] = item;
39
+ }
40
+ } else {
41
+ items[key] = item;
42
+ }
43
+
44
+ if (item.version > this.store.version) {
45
+ this.store.version = item.version;
46
+ }
47
+
48
+ this.allStores[`${StoreStorageKey}-${this._user.keyId}`] = {...this.store};
49
+ }
50
+
51
+ get(kind: IDataKind, key: string): IStoreItem | null {
52
+ const items = this.store[kind.namespace];
53
+ if (items) {
54
+ if (Object.prototype.hasOwnProperty.call(items, key)) {
55
+ const item = items[key];
56
+ if (item) {
57
+ return item;
58
+ }
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+
64
+ all(kind: IDataKind): [IStoreKindData, number] {
65
+ const result: IStoreKindData = {};
66
+ const items = this.store[kind.namespace] ?? {};
67
+ Object.entries(items).forEach(([key, item]) => {
68
+ if (item) {
69
+ result[key] = <IStoreItem>item;
70
+ }
71
+ });
72
+
73
+ return [result, this.store.version];
74
+ }
75
+
76
+ init(allData: IStoreDataStorage, callback: () => void): void {
77
+ this.store = allData as IStoreDataStorage;
78
+
79
+ this.store.version = 0;
80
+ Object.keys(allData).map(namespace => {
81
+ Object.entries(allData[namespace]).forEach(([_, item]) => {
82
+ const ele = item as IStoreItem;
83
+ if (ele.version > this.store.version) {
84
+ this.store.version = ele.version;
85
+ }
86
+ })
87
+ });
88
+
89
+ this.allStores[`${StoreStorageKey}-${this._user.keyId}`] = {...this.store};
90
+ this.initCalled = true;
91
+ callback?.();
92
+ }
93
+
94
+ upsert(kind: IDataKind, data: IKeyedStoreItem, callback: () => void): void {
95
+ this.addItem(kind, data.key, data);
96
+ callback?.();
97
+ }
98
+
99
+ initialized(): boolean {
100
+ return this.initCalled;
101
+ }
102
+
103
+ /* eslint-disable class-methods-use-this */
104
+ close(): void {
105
+ // For the memory store this is a no-op.
106
+ }
107
+
108
+ getDescription(): string {
109
+ return 'in-memory-store';
110
+ }
111
+
112
+ get version(): number {
113
+ return this.store.version;
114
+ }
115
+ }
@@ -0,0 +1,5 @@
1
+ export * from './DataKinds';
2
+ export * from './IDataSourceUpdates';
3
+ export * from './InMemoryStore';
4
+ export * from './serialization';
5
+ export * from './store';
@@ -0,0 +1,52 @@
1
+ import { IFlag } from "../evaluation/data/IFlag";
2
+ import DataKinds from "./DataKinds";
3
+ import { IVersionedData } from "../IVersionedData";
4
+ import { IDataKind } from "../IDataKind";
5
+
6
+ export interface Flags {
7
+ flags: { [name: string]: IFlag };
8
+ }
9
+
10
+ type VersionedFlag = IVersionedData & IFlag;
11
+
12
+ export interface IPatchData {
13
+ data: VersionedFlag;
14
+ kind: IDataKind;
15
+ }
16
+
17
+ /**
18
+ * @internal
19
+ */
20
+ export function deserializeAll(flags: IFlag[]): Flags {
21
+ const result = {
22
+ [DataKinds.Flags.namespace]: {}
23
+ };
24
+
25
+ if (flags?.length) {
26
+ result[DataKinds.Flags.namespace] = flags.reduce((acc: any, cur: any) => {
27
+ acc[cur.id] = {...cur, version: cur.timestamp || 0, key: cur.id, variations: cur.variationOptions};
28
+ return acc;
29
+ }, {});
30
+ }
31
+
32
+ return result as any as Flags;
33
+ }
34
+
35
+ /**
36
+ * @internal
37
+ */
38
+ export function deserializePatch(flags: IFlag[]): IPatchData[] {
39
+ const result = [
40
+ ...flags?.map(item => ({
41
+ data: {
42
+ ...item,
43
+ version:item.timestamp,
44
+ key: item.id,
45
+ variations: item.variationOptions
46
+ },
47
+ kind: DataKinds.Flags
48
+ })) || []
49
+ ];
50
+
51
+ return result as any as IPatchData[];
52
+ }