@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,111 @@
1
+ import { isHttpRecoverable, PollingError } from "../errors";
2
+ import { IDataSynchronizer } from "./IDataSynchronizer";
3
+ import { ILogger } from "../logging/ILogger";
4
+ import Configuration from "../Configuration";
5
+ import { EventName, PollingErrorHandler, ProcessStreamResponse, StreamResponseEventType } from "./types";
6
+ import Requestor from "./Requestor";
7
+ import { httpErrorMessage } from "../utils/http";
8
+ import { IUser } from "../options/IUser";
9
+
10
+ export default class PollingDataSynchronizer implements IDataSynchronizer {
11
+ private stopped = false;
12
+
13
+ private logger?: ILogger;
14
+
15
+ private pollingInterval: number;
16
+
17
+ private user: IUser | undefined;
18
+
19
+ private timeoutHandle: any;
20
+
21
+ constructor(
22
+ config: Configuration,
23
+ private readonly requestor: Requestor,
24
+ private readonly getStoreTimestamp: () => number,
25
+ private readonly listeners: Map<EventName, ProcessStreamResponse>,
26
+ private readonly errorHandler?: PollingErrorHandler,
27
+ ) {
28
+ this.logger = config.logger;
29
+ this.pollingInterval = config.pollingInterval;
30
+ this.user = config.user;
31
+ }
32
+
33
+ private poll() {
34
+ if (this.stopped) {
35
+ return;
36
+ }
37
+
38
+ const startTime = Date.now();
39
+ this.logger?.debug('Polling for feature flag and segments updates');
40
+ this.requestor.requestData(this.getStoreTimestamp(), this.user, (err, body) => {
41
+ const elapsed = Date.now() - startTime;
42
+ const sleepFor = Math.max(this.pollingInterval - elapsed, 0);
43
+
44
+ this.logger?.debug('Elapsed: %d ms, sleeping for %d ms', elapsed, sleepFor);
45
+ if (err) {
46
+ const {status} = err;
47
+ if (status && !isHttpRecoverable(status)) {
48
+ const message = httpErrorMessage(err, 'polling request');
49
+ this.logger?.error(message);
50
+ this.errorHandler?.(new PollingError(message, status));
51
+ // It is not recoverable, return and do not trigger another
52
+ // poll.
53
+ return;
54
+ }
55
+ this.logger?.warn(httpErrorMessage(err, 'polling request', 'will retry'));
56
+ } else {
57
+ let featureFlags = [];
58
+ let userKeyId = this.user?.keyId!;
59
+ let processStreamResponse: ProcessStreamResponse | undefined = this.listeners.get('patch');
60
+
61
+ if (body) {
62
+ const message = JSON.parse(body);
63
+ if (message.messageType === 'data-sync') {
64
+ switch (message.data.eventType) {
65
+ case StreamResponseEventType.patch:
66
+ processStreamResponse = this.listeners.get('patch');
67
+ break;
68
+ case StreamResponseEventType.full:
69
+ processStreamResponse = this.listeners.get('put');
70
+ break;
71
+ }
72
+
73
+ ({featureFlags, userKeyId} = message.data);
74
+ }
75
+ }
76
+
77
+ const data = processStreamResponse?.deserializeData?.(featureFlags);
78
+ processStreamResponse?.processJson?.(userKeyId, data);
79
+ }
80
+
81
+ // Falling through, there was some type of error and we need to trigger
82
+ // a new poll.
83
+ this.timeoutHandle = setTimeout(() => {
84
+ this.poll();
85
+ }, sleepFor);
86
+ });
87
+ }
88
+
89
+ identify(user: IUser) {
90
+ this.user = {...user};
91
+ }
92
+
93
+ close(): void {
94
+ this.stop();
95
+ }
96
+
97
+ start(): void {
98
+ this.poll();
99
+ }
100
+
101
+ stop(): void {
102
+ if (this.timeoutHandle) {
103
+ clearTimeout(this.timeoutHandle);
104
+ this.timeoutHandle = undefined;
105
+ }
106
+ this.stopped = true;
107
+ }
108
+ }
109
+
110
+
111
+
@@ -0,0 +1,61 @@
1
+ import { IRequestor } from "./IRequestor";
2
+ import Configuration from "../Configuration";
3
+ import { IInfo } from "../platform/IInfo";
4
+ import { IRequestOptions, IRequests, IResponse } from "../platform/requests";
5
+ import { StreamingError } from "../errors";
6
+ import { defaultHeaders } from "../utils/http";
7
+
8
+ /**
9
+ * @internal
10
+ */
11
+ export default class Requestor implements IRequestor {
12
+ private readonly headers: Record<string, string>;
13
+
14
+ private readonly uri: string;
15
+
16
+ constructor(
17
+ sdkKey: string,
18
+ config: Configuration,
19
+ info: IInfo,
20
+ private readonly requests: IRequests,
21
+ ) {
22
+ this.headers = defaultHeaders(sdkKey, info);
23
+ this.uri = config.pollingUri;
24
+ }
25
+
26
+ /**
27
+ * Perform a request and utilize the ETag cache. The ETags are cached in the
28
+ * requestor instance.
29
+ */
30
+ private async request(
31
+ requestUrl: string,
32
+ options: IRequestOptions,
33
+ ): Promise<{
34
+ res: IResponse;
35
+ body: string;
36
+ }> {
37
+ const res = await this.requests.fetch(requestUrl, options);
38
+
39
+ const body = await res.text();
40
+
41
+ return {res, body};
42
+ }
43
+
44
+ async requestData(timestamp: number, payload: any, cb: (err: any, body: any) => void) {
45
+ const options: IRequestOptions = {
46
+ method: 'POST',
47
+ headers: this.headers,
48
+ body: JSON.stringify(payload)
49
+ };
50
+ try {
51
+ const {res, body} = await this.request(`${ this.uri }?timestamp=${ timestamp ?? 0 }`, options);
52
+ if (res.status !== 200 && res.status !== 304) {
53
+ const err = new StreamingError(`Unexpected status code: ${ res.status }`, res.status);
54
+ return cb(err, undefined);
55
+ }
56
+ return cb(undefined, res.status === 304 ? null : body);
57
+ } catch (err) {
58
+ return cb(err, undefined);
59
+ }
60
+ }
61
+ }
@@ -0,0 +1,74 @@
1
+ import { IDataSynchronizer } from "./IDataSynchronizer";
2
+ import ClientContext from "../options/ClientContext";
3
+ import { EventName, ProcessStreamResponse } from "./types";
4
+ import { ILogger } from "../logging/ILogger";
5
+ import { IWebSocketWithEvents } from "../platform/IWebSocket";
6
+ import { IUser } from "../options/IUser";
7
+
8
+ class WebSocketDataSynchronizer implements IDataSynchronizer {
9
+ private socket?: IWebSocketWithEvents;
10
+ private readonly logger?: ILogger;
11
+
12
+ private connectionAttemptStartTime?: number;
13
+
14
+ constructor(
15
+ sdkKey: string,
16
+ user: IUser,
17
+ clientContext: ClientContext,
18
+ socket: IWebSocketWithEvents,
19
+ private readonly getStoreTimestamp: () => number,
20
+ private readonly listeners: Map<EventName, ProcessStreamResponse>,
21
+ webSocketPingInterval: number
22
+ ) {
23
+ const {logger, streamingUri} = clientContext;
24
+
25
+ this.logger = logger;
26
+ this.socket = socket;
27
+ this.socket.config({
28
+ sdkKey,
29
+ streamingUri,
30
+ pingInterval: webSocketPingInterval,
31
+ user,
32
+ logger,
33
+ getStoreTimestamp
34
+ });
35
+
36
+ this.listeners.forEach(({deserializeData, processJson}, eventName) => {
37
+ this.socket?.addListener(eventName, (event) => {
38
+ this.logger?.debug(`Received ${ eventName } event`);
39
+
40
+ if (event?.data) {
41
+ const {featureFlags, userKeyId} = event.data;
42
+ const data = deserializeData(featureFlags);
43
+ processJson(userKeyId, data);
44
+ }
45
+ });
46
+ })
47
+ }
48
+
49
+ identify(user: IUser): void {
50
+ this.socket?.identify(user);
51
+ }
52
+
53
+ start(): void {
54
+ this.logConnectionStarted();
55
+
56
+ this.socket?.connect();
57
+ }
58
+
59
+ private logConnectionStarted() {
60
+ this.connectionAttemptStartTime = Date.now();
61
+ this.logger?.info(`Stream connection attempt StartTime ${ this.connectionAttemptStartTime }`);
62
+ }
63
+
64
+ close(): void {
65
+ this.stop();
66
+ }
67
+
68
+ stop(): void {
69
+ this.socket?.close();
70
+ this.socket = undefined;
71
+ }
72
+ }
73
+
74
+ export default WebSocketDataSynchronizer;
@@ -0,0 +1,9 @@
1
+ export * from './DataSyncMode';
2
+ export * from './IDataSynchronizer';
3
+ export * from './IRequestor';
4
+ export * from './NullDataSynchronizer';
5
+ export * from './PollingDataSynchronizer';
6
+ export * from './Requestor';
7
+ export * from './types';
8
+ export * from './utils';
9
+ export * from './WebSocketDataSynchronizer';
@@ -0,0 +1,20 @@
1
+ import { PollingError } from "../errors";
2
+ import { IFlag } from "../evaluation/data/IFlag";
3
+
4
+ export type PollingErrorHandler = (err: PollingError) => void;
5
+
6
+ export enum StreamResponseEventType {
7
+ full = 'full',
8
+ patch = 'patch'
9
+ }
10
+
11
+ export interface IStreamResponse {
12
+ eventType: StreamResponseEventType,
13
+ featureFlags: IFlag[]
14
+ }
15
+
16
+ export type EventName = 'delete' | 'patch' | 'ping' | 'put';
17
+ export type ProcessStreamResponse = {
18
+ deserializeData: (flags: IFlag[]) => any;
19
+ processJson: (userKeyId: string, json: any) => void;
20
+ };
@@ -0,0 +1,32 @@
1
+ /********************** encode text begin *****************************/
2
+ const alphabet: Record<string, string> = {
3
+ "0": "Q",
4
+ "1": "B",
5
+ "2": "W",
6
+ "3": "S",
7
+ "4": "P",
8
+ "5": "H",
9
+ "6": "D",
10
+ "7": "X",
11
+ "8": "Z",
12
+ "9": "U",
13
+ }
14
+
15
+ function encodeNumber(param: number, length: number): string {
16
+ var s = "000000000000" + param;
17
+ const numberWithLeadingZeros = s.slice(s.length - length);
18
+ return numberWithLeadingZeros.split('').map(n => alphabet[n]).join('');
19
+ }
20
+
21
+ // generate connection token
22
+ export function generateConnectionToken(text: string): string {
23
+ text = text.replace(/=*$/, '');
24
+ const timestamp = Date.now();
25
+ const timestampCode = encodeNumber(timestamp, timestamp.toString().length);
26
+ // get random number less than the length of the text as the start point, and it must be greater or equal to 2
27
+ const start = Math.max(Math.floor(Math.random() * text.length), 2);
28
+
29
+ return `${ encodeNumber(start, 3) }${ encodeNumber(timestampCode.length, 2) }${ text.slice(0, start) }${ timestampCode }${ text.slice(start) }`;
30
+ }
31
+
32
+ /********************** encode text end *****************************/
package/src/errors.ts ADDED
@@ -0,0 +1,41 @@
1
+ export class PollingError extends Error {
2
+ public readonly status?: number;
3
+
4
+ constructor(message: string, status?: number) {
5
+ super(message);
6
+ this.status = status;
7
+ this.name = 'FbPollingError';
8
+ }
9
+ }
10
+
11
+ export class StreamingError extends Error {
12
+ public readonly code?: number;
13
+
14
+ constructor(message: string, code?: number) {
15
+ super(message);
16
+ this.code = code;
17
+ this.name = 'FbStreamingError';
18
+ }
19
+ }
20
+
21
+ export class UnexpectedResponseError extends Error {
22
+ constructor(message: string) {
23
+ super(message);
24
+ this.name = 'FbUnexpectedResponseError';
25
+ }
26
+ }
27
+
28
+
29
+ export class ClientError extends Error {
30
+ constructor(message: string) {
31
+ super(message);
32
+ this.name = 'FbClientError';
33
+ }
34
+ }
35
+
36
+ export function isHttpRecoverable(status: number) {
37
+ if (status >= 400 && status < 500) {
38
+ return status === 400 || status === 408 || status === 429;
39
+ }
40
+ return true;
41
+ }
@@ -0,0 +1,36 @@
1
+ import { ReasonKinds } from "./ReasonKinds";
2
+ import { IFlag } from "./data/IFlag";
3
+ import { EvalEvent } from "../events/event";
4
+ import { IUser } from "../options/IUser";
5
+
6
+ /**
7
+ * A class which encapsulates the result of an evaluation. It allows for differentiating between
8
+ * successful and error result types.
9
+ *
10
+ * @internal
11
+ */
12
+ export default class EvalResult {
13
+ protected constructor(
14
+ public kind: ReasonKinds,
15
+ public value: IFlag | null,
16
+ public reason?: string,
17
+ ) {
18
+ }
19
+
20
+ static flagNotFound(flagKey: string) {
21
+ return new EvalResult(ReasonKinds.FlagNotFound, null, `flag not found: ${ flagKey }`);
22
+ }
23
+
24
+ static matched(val: IFlag) {
25
+ return new EvalResult(ReasonKinds.Match, val, 'target match');
26
+ }
27
+
28
+ toEvalEvent(user: IUser): EvalEvent | null {
29
+ if (this.kind !== ReasonKinds.Match) {
30
+ return null;
31
+ }
32
+
33
+ const targetedVariation = this.value?.variations.find(v => v.value === this.value?.variation);
34
+ return new EvalEvent(user, this.value?.id!, targetedVariation!, this.value?.sendToExperiment!);
35
+ }
36
+ }
@@ -0,0 +1,27 @@
1
+ import { IFlag } from "./data/IFlag";
2
+ import EvalResult from "./EvalResult";
3
+ import { IStore } from "../platform/IStore";
4
+ import DataKinds from "../store/DataKinds";
5
+
6
+ /**
7
+ * @internal
8
+ */
9
+ export default class Evaluator {
10
+ constructor(private store: IStore) {
11
+ }
12
+
13
+ /**
14
+ * Evaluate the given flag against the given context.
15
+ * @param flagKey The key of the feature flag.
16
+ */
17
+ evaluate(
18
+ flagKey: string,
19
+ ): EvalResult {
20
+ const flag = this.store.get(DataKinds.Flags, flagKey) as unknown as IFlag;
21
+ if (!flag) {
22
+ return EvalResult.flagNotFound(flagKey);
23
+ }
24
+
25
+ return EvalResult.matched(flag);
26
+ }
27
+ }
@@ -0,0 +1,24 @@
1
+ import { ReasonKinds } from "./ReasonKinds";
2
+
3
+ export interface IEvalDetail<TValue> {
4
+ /**
5
+ * The unique key of the feature flag.
6
+ */
7
+ flagKey: string;
8
+
9
+ /**
10
+ * An enum indicating the category of the reason. See {@link ReasonKinds}
11
+ */
12
+ kind: ReasonKinds;
13
+
14
+ /**
15
+ * The result of the flag evaluation. This will be either one of the flag's variations or
16
+ * the default value that was passed to `FbClient.variationDetail`.
17
+ */
18
+ value?: TValue;
19
+
20
+ /**
21
+ * A string describing the main factor that influenced the flag evaluation value.
22
+ */
23
+ reason?: string;
24
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Different kinds of error which may be encountered during evaluation.
3
+ */
4
+ export enum ReasonKinds {
5
+ ClientNotReady = 'ClientNotReady',
6
+ Match = 'Match',
7
+ WrongType = 'WrongType',
8
+ FlagNotFound = 'FlagNotFound',
9
+ Error = 'Error'
10
+ }
@@ -0,0 +1,29 @@
1
+ export type FlagValue = any;
2
+
3
+ export enum VariationDataType {
4
+ string = 'string',
5
+ boolean = 'boolean',
6
+ number = 'number',
7
+ json = 'json',
8
+ empty = ''
9
+ }
10
+
11
+ export interface IVariation {
12
+ id: number,
13
+ value: FlagValue
14
+ }
15
+
16
+ export interface IFlagBase {
17
+ id: string, // the key
18
+ variation: FlagValue,
19
+ variationType: VariationDataType,
20
+ sendToExperiment?: boolean,
21
+ timestamp?: number,
22
+ variationOptions?: IVariation[],
23
+ }
24
+
25
+ export interface IFlag extends IFlagBase {
26
+ key: string, // the same value to id
27
+ variations: IVariation[],// the same value to variationOptions
28
+ version: number
29
+ }
@@ -0,0 +1 @@
1
+ export * from './IFlag';
@@ -0,0 +1,5 @@
1
+ export * from './data';
2
+ export * from './EvalResult';
3
+ export * from './Evaluator';
4
+ export * from './IEvalDetail';
5
+ export * from './ReasonKinds';
@@ -0,0 +1,84 @@
1
+ import { IEventProcessor } from "./IEventProcessor";
2
+ import { EventDispatcher } from "./EventDispatcher";
3
+ import ClientContext from "../options/ClientContext";
4
+ import { FlushEvent, IEvent, ShutdownEvent } from "./event";
5
+ import { isNullOrUndefined } from "../utils/isNullOrUndefined";
6
+ import { IEventQueue } from "./IEventQueue";
7
+ import { DefaultEventQueue } from "./DefaultEventQueue";
8
+ import { ILogger } from "../logging/ILogger";
9
+
10
+ export class DefaultEventProcessor implements IEventProcessor {
11
+ private readonly logger: ILogger;
12
+ private readonly flushInterval: number;
13
+ private readonly eventDispatcher: EventDispatcher;
14
+ private readonly eventQueue: IEventQueue;
15
+ private closed: boolean = false;
16
+
17
+ constructor(clientContext: ClientContext) {
18
+ const {logger, flushInterval, maxEventsInQueue} = clientContext;
19
+ this.logger = logger!;
20
+ this.flushInterval = flushInterval;
21
+ this.eventQueue = new DefaultEventQueue(maxEventsInQueue, this.logger);
22
+ this.eventDispatcher = new EventDispatcher(clientContext, this.eventQueue);
23
+
24
+ this.flushLoop();
25
+ }
26
+
27
+ private flushLoop() {
28
+ if (this.closed) {
29
+ return;
30
+ }
31
+
32
+ setTimeout(async () => {
33
+ try {
34
+ await this.flush();
35
+ } catch (err) {
36
+ this.logger.error('Unexpected error while flushing events in event processor.', err);
37
+ }
38
+
39
+ this.flushLoop();
40
+ }, this.flushInterval);
41
+ }
42
+
43
+ flush(): Promise<any> {
44
+ const flushEvent = new FlushEvent();
45
+ this.record(flushEvent);
46
+ return flushEvent.waitForCompletion();
47
+ }
48
+
49
+ async close(): Promise<void> {
50
+ if (this.closed) {
51
+ return;
52
+ }
53
+
54
+ // send a shutdown event to dispatcher
55
+ const shutdown = new ShutdownEvent();
56
+ this.record(shutdown);
57
+
58
+ try {
59
+ await shutdown.waitForCompletion();
60
+ } catch (err) {
61
+ this.logger.error('Event processor shutdown but not complete.');
62
+ }
63
+
64
+ // mark the event queue as complete for adding
65
+ this.eventQueue.close();
66
+ this.closed = true;
67
+ }
68
+
69
+ record(event: IEvent | null): boolean {
70
+ if (isNullOrUndefined(event)) {
71
+ return false;
72
+ }
73
+
74
+ if (!this.eventQueue.addEvent(event!)) {
75
+ if (event instanceof FlushEvent) {
76
+ event.complete();
77
+ }
78
+
79
+ return false;
80
+ }
81
+
82
+ return true;
83
+ }
84
+ }
@@ -0,0 +1,50 @@
1
+ import { IEventQueue } from "./IEventQueue";
2
+ import { IEvent } from "./event";
3
+ import { ILogger } from "../logging/ILogger";
4
+
5
+ export class DefaultEventQueue implements IEventQueue {
6
+ private events: IEvent[];
7
+ private closed: boolean = false;
8
+
9
+ constructor(private readonly capacity: number, private readonly logger: ILogger) {
10
+ this.events = [];
11
+ }
12
+
13
+ addEvent(event: IEvent): boolean {
14
+ if (this.closed) {
15
+ return false;
16
+ }
17
+
18
+ if (this.events.length >= this.capacity) {
19
+ this.logger.warn("Events are being produced faster than they can be processed. We shouldn't see this.");
20
+ return false;
21
+ }
22
+
23
+ this.events.push(event);
24
+ return true;
25
+ }
26
+
27
+ clear(): void {
28
+ this.events = [];
29
+ }
30
+
31
+ shift(): IEvent | undefined {
32
+ return this.events.shift();
33
+ }
34
+
35
+ close(): void {
36
+ this.closed = true;
37
+ }
38
+
39
+ get eventsSnapshot(): IEvent[] {
40
+ return [...this.events];
41
+ }
42
+
43
+ get length(): number {
44
+ return this.events.length;
45
+ }
46
+
47
+ get isEmpty(): boolean {
48
+ return this.length === 0;
49
+ }
50
+ }