@24i/bigscreen-sdk 1.0.4-alpha.2120 → 1.0.5-4.alpha-2832

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 (297) hide show
  1. package/README.md +2 -3
  2. package/ci/is_ci_job_skippable.sh +153 -0
  3. package/package.json +57 -36
  4. package/packages/adobe-heartbeat/src/AdobeHeartbeat.ts +9 -9
  5. package/packages/analytics/README.md +8 -0
  6. package/packages/analytics/src/A.ts +1 -0
  7. package/packages/analytics/src/Analytics.ts +1 -0
  8. package/packages/analytics/src/analyticsOnScroll.ts +1 -0
  9. package/packages/analytics/src/clients/ConsoleAnalytics/ConsoleAnalytics.ts +1 -0
  10. package/packages/analytics/src/clients/ConsoleAnalytics/index.ts +1 -0
  11. package/packages/analytics/src/clients/GoogleAnalytics/GoogleAnalytics.ts +196 -0
  12. package/packages/analytics/src/clients/GoogleAnalytics/constants.ts +126 -0
  13. package/packages/analytics/src/clients/GoogleAnalytics/getUrl.ts +17 -0
  14. package/packages/analytics/src/clients/GoogleAnalytics/index.ts +2 -0
  15. package/packages/analytics/src/clients/GoogleAnalytics/interface.ts +82 -0
  16. package/packages/analytics/src/clients/GoogleAnalytics/mapPayload.ts +51 -0
  17. package/packages/analytics/src/clients/GoogleAnalytics/prepareBody.ts +14 -0
  18. package/packages/analytics/src/clients/TealiumAnalytics/TealiumAnalytics.ts +181 -0
  19. package/packages/analytics/src/clients/TealiumAnalytics/constants.ts +106 -0
  20. package/packages/analytics/src/clients/TealiumAnalytics/findForLanguage.ts +9 -0
  21. package/packages/analytics/src/clients/TealiumAnalytics/index.ts +4 -0
  22. package/packages/analytics/src/clients/TealiumAnalytics/interface.ts +35 -0
  23. package/packages/analytics/src/clients/TealiumAnalytics/mappers/__mocks__/mediaPayload.ts +72 -0
  24. package/packages/analytics/src/clients/TealiumAnalytics/mappers/helper.ts +36 -0
  25. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppError.ts +13 -0
  26. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppOpen.ts +13 -0
  27. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteAdd.ts +11 -0
  28. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteRemove.ts +11 -0
  29. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerClose.ts +15 -0
  30. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerOpen.ts +15 -0
  31. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSceneView.ts +18 -0
  32. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearch.ts +18 -0
  33. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchFailed.ts +8 -0
  34. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchSuccess.ts +8 -0
  35. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoPause.ts +15 -0
  36. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoProgress.ts +18 -0
  37. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoResume.ts +15 -0
  38. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStart.ts +15 -0
  39. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStop.ts +15 -0
  40. package/packages/analytics/src/clients/TealiumAnalytics/types.ts +161 -0
  41. package/packages/analytics/src/clients/TwentyFourIQ/TwentyFourIQClient.ts +107 -0
  42. package/packages/analytics/src/clients/TwentyFourIQ/constants.ts +111 -0
  43. package/packages/analytics/src/clients/TwentyFourIQ/helper.ts +34 -0
  44. package/packages/analytics/src/clients/TwentyFourIQ/index.ts +2 -0
  45. package/packages/analytics/src/clients/TwentyFourIQ/interface.ts +34 -0
  46. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdEvent.ts +20 -0
  47. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBase.ts +24 -0
  48. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBuffering.ts +15 -0
  49. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerClose.ts +25 -0
  50. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerOpen.ts +17 -0
  51. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapSceneView.ts +15 -0
  52. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapScroll.ts +17 -0
  53. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoComplete.ts +22 -0
  54. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoPause.ts +25 -0
  55. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoProgress.ts +25 -0
  56. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStart.ts +34 -0
  57. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStop.ts +32 -0
  58. package/packages/analytics/src/clients/TwentyFourIQ/types.ts +132 -0
  59. package/packages/analytics/src/constants.ts +1 -0
  60. package/packages/analytics/src/index.ts +3 -0
  61. package/packages/analytics/src/interface.ts +1 -0
  62. package/packages/analytics/src/utils/generateSessionId.ts +8 -0
  63. package/packages/async-image/src/AsyncImage.tsx +15 -10
  64. package/packages/developer-tools/PlayerDebugWindow/README.md +1 -1
  65. package/packages/developer-tools/src/DeveloperConsole/DeveloperConsole.tsx +1 -0
  66. package/packages/developer-tools/src/DeveloperToolsService/DeveloperToolsList.tsx +11 -0
  67. package/packages/developer-tools/src/EnvironmentSelection/EnvironmentListItem.tsx +1 -1
  68. package/packages/developer-tools/src/PlayerDebugWindow/PlayerDebugWindow.tsx +5 -5
  69. package/packages/developer-tools/src/PlayerDebugWindow/constants.ts +15 -0
  70. package/packages/developer-tools/src/TechnicalInfo/TechnicalInfo.tsx +2 -0
  71. package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoDetail.tsx +2 -1
  72. package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoProvider.ts +57 -5
  73. package/packages/developer-tools/src/TechnicalInfo/__mocks__/Device.ts +12 -0
  74. package/packages/developer-tools/src/TechnicalInfo/translations.ts +8 -0
  75. package/packages/device/src/driver/index.android.tv.ts +1 -0
  76. package/packages/device/src/driver/index.firetv.ts +1 -0
  77. package/packages/device/src/driver/index.smartcast.tv.ts +1 -0
  78. package/packages/device/src/getKeyDigit.ts +2 -2
  79. package/packages/device/src/resolver/resolver.ts +19 -0
  80. package/packages/digital-clock/src/DigitalClock.tsx +15 -4
  81. package/packages/driver-androidtv/src/DeviceAndroidTV.ts +262 -0
  82. package/packages/driver-androidtv/src/__mocks__/javaScriptBridge.ts +45 -0
  83. package/packages/driver-androidtv/src/formatUserAgent.ts +11 -0
  84. package/packages/driver-androidtv/src/index.ts +2 -0
  85. package/packages/driver-androidtv/src/keymap.ts +27 -0
  86. package/packages/driver-androidtv/src/types.ts +155 -0
  87. package/packages/driver-base/src/DeviceBase.ts +73 -2
  88. package/packages/driver-base/src/KeyMap/Key.ts +8 -1
  89. package/packages/driver-base/src/KeyMap/KeyMap.ts +4 -0
  90. package/packages/driver-base/src/KeyMap/interface.ts +1 -0
  91. package/packages/driver-base/src/KeyMap/overrideValues.ts +2 -1
  92. package/packages/driver-base/src/__mocks__/DeviceBase.ts +24 -0
  93. package/packages/driver-base/src/__mocks__/keyMap.ts +1 -0
  94. package/packages/driver-base/src/index.ts +3 -0
  95. package/packages/driver-base/src/types/AdInfo.ts +5 -0
  96. package/packages/driver-base/src/types/DeviceEvent.ts +2 -0
  97. package/packages/driver-base/src/types/InAppPurchase.ts +20 -0
  98. package/packages/driver-base/src/types/KeycodeKeyMap.ts +1 -0
  99. package/packages/driver-browser/src/DeviceBrowser.ts +26 -0
  100. package/packages/driver-browser/src/keymap.ts +8 -0
  101. package/packages/driver-entone/src/DeviceEntone.ts +31 -1
  102. package/packages/driver-entone/src/keymap.ts +1 -0
  103. package/packages/driver-firetv/src/DeviceFireTV.ts +86 -0
  104. package/packages/driver-firetv/src/__mocks__/javaScriptBridge.ts +45 -0
  105. package/packages/driver-firetv/src/index.ts +1 -0
  106. package/packages/driver-firetv/src/types.ts +1 -0
  107. package/packages/driver-hbbtv/src/DeviceHbbTV.ts +26 -0
  108. package/packages/driver-kreatv/src/DeviceKreaTV.ts +26 -0
  109. package/packages/driver-saphi/src/DeviceSaphi.ts +26 -0
  110. package/packages/driver-smartcast/src/DeviceSmartCast.ts +380 -0
  111. package/packages/driver-smartcast/src/__mocks__/api.ts +69 -0
  112. package/packages/driver-smartcast/src/index.ts +1 -0
  113. package/packages/driver-smartcast/src/keymap.ts +9 -0
  114. package/packages/driver-smartcast/src/types.ts +102 -0
  115. package/packages/driver-tizen/src/DeviceTizen.ts +121 -7
  116. package/packages/driver-tizen/src/ITizen.ts +15116 -202
  117. package/packages/driver-tizen/src/IWebapis.ts +8643 -87
  118. package/packages/driver-tizen/src/TizenKeys.ts +4 -2
  119. package/packages/driver-tizen/src/__mocks__/tizen.ts +7 -8
  120. package/packages/driver-tizen/src/constants.ts +1 -195
  121. package/packages/driver-vidaa/src/DeviceVidaa.ts +29 -2
  122. package/packages/driver-vidaa/src/__mocks__/vidaa.ts +1 -1
  123. package/packages/driver-vidaa/src/keymap.ts +2 -0
  124. package/packages/driver-webos/src/DeviceWebos.ts +55 -0
  125. package/packages/driver-webos/src/__mocks__/webos.ts +33 -0
  126. package/packages/driver-webos/src/constants.ts +1 -0
  127. package/packages/driver-webos/src/keymap.ts +2 -1
  128. package/packages/driver-webos/src/types.ts +30 -0
  129. package/packages/driver-xbox/src/DeviceXbox.ts +30 -1
  130. package/packages/driver-xbox/src/keymap.ts +1 -1
  131. package/packages/epg/README.md +3 -1
  132. package/packages/epg/src/v2/Cell.tsx +16 -2
  133. package/packages/epg/src/v2/DataManager.ts +112 -41
  134. package/packages/epg/src/v2/DatePicker.tsx +9 -3
  135. package/packages/epg/src/v2/DateToast/DateToast.tsx +12 -9
  136. package/packages/epg/src/v2/Day.tsx +6 -3
  137. package/packages/epg/src/v2/Epg.tsx +5 -5
  138. package/packages/epg/src/v2/MockGenerator/generator.ts +3 -2
  139. package/packages/epg/src/v2/ProgramInfo/utils.ts +4 -3
  140. package/packages/epg/src/v2/Row.tsx +3 -1
  141. package/packages/epg/src/v2/TimelineSection.tsx +4 -1
  142. package/packages/epg/src/v2/basic/CellsManager.tsx +7 -2
  143. package/packages/epg/src/v2/basic/RowsManager.tsx +3 -1
  144. package/packages/epg/src/v2/interface.ts +13 -0
  145. package/packages/events-manager/src/EventsManager.ts +1 -56
  146. package/packages/focus/README.md +33 -0
  147. package/packages/focus/src/IFocusable.ts +1 -0
  148. package/packages/focus/src/Layout/Base.tsx +41 -6
  149. package/packages/focus/src/Layout/Matrix.tsx +51 -19
  150. package/packages/focus/src/focusFirstExisting.ts +7 -1
  151. package/packages/focus/src/hasFocus.ts +36 -0
  152. package/packages/focus/src/index.ts +2 -1
  153. package/packages/gallup/src/Gallup.ts +3 -3
  154. package/packages/grid/README.md +21 -2
  155. package/packages/grid/src/Base/Base.tsx +24 -1
  156. package/packages/grid/src/FirstOnlyGrid/FirstOnlyGrid.tsx +4 -2
  157. package/packages/grid/src/UnifiedGridController/UnifiedGridController.ts +6 -6
  158. package/packages/grid/src/types.ts +6 -0
  159. package/packages/icon/src/Icon.tsx +27 -5
  160. package/packages/input/README.md +1 -1
  161. package/packages/input/src/Input.tsx +10 -10
  162. package/packages/interactable/README.md +2 -1
  163. package/packages/interactable/src/Interactable.tsx +9 -3
  164. package/packages/interactable/src/interface.ts +1 -0
  165. package/packages/jsx/src/index.ts +1 -1
  166. package/packages/jsx/src/test-utils/index.ts +1 -0
  167. package/packages/jsx/src/test-utils/keyup.ts +27 -0
  168. package/packages/keyboard/README.md +2 -0
  169. package/packages/keyboard/src/Backdrop/Backdrop.scss +2 -0
  170. package/packages/keyboard/src/KeyboardBase.tsx +16 -4
  171. package/packages/keyboard/src/WhitelabelKeyboard/Keyboard.scss +10 -0
  172. package/packages/keyboard/src/WhitelabelKeyboard/Keyboard.tsx +128 -142
  173. package/packages/keyboard/src/WhitelabelKeyboard/WhitelabelStyles/whitelabel.scss +4 -0
  174. package/packages/keyboard/src/WhitelabelKeyboard/_sizes.1080.scss +1 -0
  175. package/packages/keyboard/src/WhitelabelKeyboard/_sizes.scss +1 -0
  176. package/packages/keyboard/src/WhitelabelKeyboard/icons/key_language.svg +20 -0
  177. package/packages/keyboard/src/WhitelabelKeyboard/index.ts +1 -1
  178. package/packages/keyboard/src/WhitelabelKeyboard/layouts/arabic.ts +27 -0
  179. package/packages/keyboard/src/WhitelabelKeyboard/layouts/burmese.ts +27 -0
  180. package/packages/keyboard/src/WhitelabelKeyboard/layouts/dari.ts +28 -0
  181. package/packages/keyboard/src/WhitelabelKeyboard/layouts/hebrew.ts +28 -0
  182. package/packages/keyboard/src/WhitelabelKeyboard/layouts/index.ts +15 -0
  183. package/packages/keyboard/src/WhitelabelKeyboard/layouts/korean.ts +26 -0
  184. package/packages/keyboard/src/WhitelabelKeyboard/layouts/latin.ts +26 -0
  185. package/packages/keyboard/src/WhitelabelKeyboard/layouts/pashto.ts +27 -0
  186. package/packages/keyboard/src/WhitelabelKeyboard/layouts/persian.ts +27 -0
  187. package/packages/keyboard/src/WhitelabelKeyboard/layouts/russian.ts +27 -0
  188. package/packages/keyboard/src/WhitelabelKeyboard/layouts/spanish.ts +26 -0
  189. package/packages/keyboard/src/WhitelabelKeyboard/layouts/special.ts +28 -0
  190. package/packages/keyboard/src/WhitelabelKeyboard/layouts/tibetan.ts +26 -0
  191. package/packages/keyboard/src/WhitelabelKeyboard/layouts/turkish.ts +26 -0
  192. package/packages/keyboard/src/WhitelabelKeyboard/layouts/ukrainian.ts +27 -0
  193. package/packages/keyboard/src/WhitelabelKeyboard/layouts/urdu.ts +26 -0
  194. package/packages/keyboard/src/WhitelabelKeyboard/types.ts +22 -2
  195. package/packages/keyboard/src/types/index.ts +1 -1
  196. package/packages/keyboard/src/utils/caret.ts +5 -8
  197. package/packages/keyboard/src/utils/input.ts +5 -6
  198. package/packages/keyboard/src/utils/setInputSelectionRange.ts +10 -0
  199. package/packages/l10n/README.md +18 -0
  200. package/packages/l10n/src/date/common.ts +18 -6
  201. package/packages/l10n/src/date/cs.ts +2 -8
  202. package/packages/l10n/src/date/de.ts +97 -0
  203. package/packages/l10n/src/date/en-001.ts +3 -3
  204. package/packages/l10n/src/date/en-common.ts +5 -4
  205. package/packages/l10n/src/date/en-us.ts +3 -3
  206. package/packages/l10n/src/date/es.ts +71 -0
  207. package/packages/l10n/src/date/fr.ts +94 -0
  208. package/packages/l10n/src/date/he.ts +101 -0
  209. package/packages/l10n/src/date/iso.ts +12 -13
  210. package/packages/l10n/src/date/types.ts +9 -0
  211. package/packages/l10n/src/l10n.ts +61 -3
  212. package/packages/list/README.md +17 -0
  213. package/packages/list/src/Base/Base.tsx +29 -3
  214. package/packages/list/src/Base/interface.ts +2 -2
  215. package/packages/list/src/BasicList/BasicList.tsx +7 -7
  216. package/packages/list/src/CenteredList/CenteredList.tsx +2 -2
  217. package/packages/list/src/CenteredList/controller.ts +0 -1
  218. package/packages/list/src/EdgeOffsetList/EdgeOffsetList.tsx +10 -10
  219. package/packages/list/src/FirstOnlyList/FirstOnlyList.tsx +2 -2
  220. package/packages/list/src/FirstOnlyVariedList/FirstOnlyVariedList.tsx +2 -2
  221. package/packages/list/src/FixedToEndList/FixedToEndList.tsx +2 -2
  222. package/packages/list/src/UnifiedListController/UnifiedListController.ts +6 -2
  223. package/packages/list/src/interface.ts +2 -2
  224. package/packages/list/src/types.ts +11 -4
  225. package/packages/logger/src/loggers/ConsoleLogger/ConsoleLogger.ts +7 -1
  226. package/packages/logger/src/loggers/SentryLogger/Sentry.ts +1 -0
  227. package/packages/logger/src/loggers/SentryLogger/SentryLogger.ts +5 -3
  228. package/packages/menu/src/MenuAndContentContainer/MenuAndContentContainer.tsx +31 -3
  229. package/packages/menu/src/MenuAndContentContainer/interface.ts +8 -0
  230. package/packages/modal-service/README.md +4 -1
  231. package/packages/modal-service/src/ModalService.tsx +29 -5
  232. package/packages/perf-utils/README.md +1 -120
  233. package/packages/perf-utils/src/array/filter.ts +1 -54
  234. package/packages/perf-utils/src/array/find.ts +1 -43
  235. package/packages/perf-utils/src/array/findIndex.ts +1 -43
  236. package/packages/perf-utils/src/array/forEach.ts +1 -48
  237. package/packages/perf-utils/src/array/includes.ts +1 -41
  238. package/packages/perf-utils/src/array/includesNaN.ts +1 -32
  239. package/packages/perf-utils/src/array/index.ts +1 -7
  240. package/packages/perf-utils/src/array/map.ts +1 -52
  241. package/packages/player-ui/README.md +1 -1
  242. package/packages/player-ui/src/CurrentTime.tsx +2 -2
  243. package/packages/player-ui/src/Duration.tsx +2 -2
  244. package/packages/player-ui/src/PauseButton.tsx +8 -0
  245. package/packages/player-ui/src/PlayerInteractable.tsx +1 -0
  246. package/packages/player-ui/src/PlayerTime.tsx +3 -1
  247. package/packages/player-ui/src/PlayerUI.tsx +68 -35
  248. package/packages/player-ui/src/RemainingTime.tsx +2 -2
  249. package/packages/player-ui/src/Seekbar.tsx +110 -18
  250. package/packages/player-ui/src/Seeking.ts +57 -16
  251. package/packages/player-ui/src/Subtitles.tsx +2 -2
  252. package/packages/player-ui/src/index.ts +1 -0
  253. package/packages/player-ui/src/mocks.ts +32 -8
  254. package/packages/player-ui/src/timeUtils.ts +3 -3
  255. package/packages/player-ui/src/types.ts +9 -3
  256. package/packages/router/README.md +1 -0
  257. package/packages/router/src/Route.tsx +61 -27
  258. package/packages/router/src/Router.tsx +63 -14
  259. package/packages/router/src/history.ts +8 -1
  260. package/packages/router/src/index.ts +1 -1
  261. package/packages/router/src/utils.ts +9 -4
  262. package/packages/sass-utils/src/linear-gradient.scss +9 -4
  263. package/packages/sass-utils/src/scale.1080.scss +3 -1
  264. package/packages/sass-utils/src/scale.720.scss +1 -1
  265. package/packages/time/README.md +4 -1
  266. package/packages/time/src/Time.ts +35 -13
  267. package/packages/time/src/adapters/24iMediaTimeApi.ts +47 -0
  268. package/packages/time/src/constants.ts +1 -0
  269. package/packages/time/src/services/24iMediaTimeApi/24iMediaTimeApi.ts +43 -0
  270. package/packages/time/src/services/24iMediaTimeApi/index.ts +6 -0
  271. package/packages/toast/src/ToastService.scss +1 -0
  272. package/packages/toast/src/ToastService.tsx +16 -5
  273. package/packages/types-bigscreen-jsx/README.md +5 -4
  274. package/packages/types-bigscreen-jsx/index.d.ts +73 -68
  275. package/packages/utils/README.md +27 -0
  276. package/packages/utils/src/elementUtils.ts +25 -0
  277. package/packages/utils/src/forceReflow.ts +14 -0
  278. package/packages/utils/src/index.ts +8 -0
  279. package/packages/utils/src/keyPress/index.ts +6 -0
  280. package/packages/utils/src/keyPress/keyPressSimulator.ts +74 -0
  281. package/packages/utils/src/keyPress/simulateKeyPress.ts +25 -0
  282. package/packages/utils/src/scaledImage.ts +6 -3
  283. package/packages/utils/src/textUtils.ts +46 -14
  284. package/packages/utils/src/wait.ts +3 -1
  285. package/packages/utils/src/xhr/xhrSend.ts +3 -1
  286. package/packages/utils/src/xhr/xhrSendRetry.ts +3 -1
  287. package/packages/zapping/src/ChannelZapping.ts +9 -0
  288. package/packages/zapping/src/Zapping.tsx +10 -0
  289. package/utils/release/release.ts +156 -0
  290. package/packages/driver-tizen/src/types.ts +0 -14
  291. package/packages/focus/src/Layout/__test__/Base.spec.ts +0 -180
  292. package/packages/focus/src/Layout/__test__/Horizontal.spec.ts +0 -94
  293. package/packages/focus/src/Layout/__test__/Matrix.spec.ts +0 -261
  294. package/packages/focus/src/Layout/__test__/Vertical.spec.ts +0 -46
  295. package/packages/focus/src/Layout/__test__/isRtl.spec.ts +0 -23
  296. package/packages/focus/src/Layout/__test__/shared.ts +0 -19
  297. package/packages/keyboard/src/WhitelabelKeyboard/focusMatrix.ts +0 -19
package/README.md CHANGED
@@ -6,9 +6,8 @@ sidebar_label: README
6
6
  ---
7
7
 
8
8
  # SmartApps BIGscreen SDK
9
-
10
- [![Build Status](https://travis-ci.com/24i/smartapps-bigscreen-sdk.svg?token=TvpGGSB2Z1L12QwPagEp&branch=development)](https://travis-ci.com/24i/smartapps-bigscreen-sdk)
11
- [![Coverage Status](https://coveralls.io/repos/github/24i/smartapps-bigscreen-sdk/badge.svg?branch=development&t=dGc701&kill_cache=1)](https://coveralls.io/github/24i/smartapps-bigscreen-sdk?branch=development)
9
+ [![Build Status](https://github.com/24i/smartapps-bigscreen-sdk/actions/workflows/pull-request.yml/badge.svg)](https://github.com/24i/smartapps-bigscreen-sdk/actions/workflows/pull-request.yml)
10
+ [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=24i_smartapps-bigscreen-sdk&metric=coverage&token=3d35c42d12a876ed9fde3dd5adba282b14656069)](https://sonarcloud.io/summary/new_code?id=24i_smartapps-bigscreen-sdk)
12
11
 
13
12
  * [GitHub](https://github.com/24i/smartapps-bigscreen-sdk)
14
13
  * [Confluence](https://24imedia.atlassian.net/wiki/spaces/PRDNGBIGSCR/overview)
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env bash
2
+
3
+ : '
4
+ Resolves whether CI job can be skipped or not.
5
+
6
+ It requires to be executed with "source", as the script exports result as a variable
7
+ which needs to be processed outside the script.
8
+
9
+ - EXPORTS:
10
+ Exports numeric variable IS_CI_JOB_SKIPPABLE,
11
+ where 0 represents not skippable build and 1 represent skippable build.
12
+
13
+ - PARAMETERS:
14
+ File paths or glob patterns with paths to files which are not relevant for the CI job.
15
+ Each glob pattern has to be wrapped into double quotes.
16
+
17
+ - USAGE:
18
+ source <path/to/script.sh> "filePathOrGlob1" "filePathOrGlob2" ... "filePathOrGlobN"
19
+
20
+ - EXAMPLE:
21
+ source path/to/script.sh "docs/**/*" ".eslintrc.json"
22
+ if [[ "$IS_CI_JOB_SKIPPABLE" -eq 1 ]]; then
23
+ # job is skippable, do something here
24
+ fi
25
+ '
26
+
27
+ # Includes filenames beginning with a ‘.’ in the results of filename expansion.
28
+ # The filenames ‘.’ and ‘..’ must always be matched explicitly, even if dotglob is set.
29
+ shopt -s dotglob
30
+
31
+ # Patterns which fail to match filenames during filename expansion will not result in an expansion error.
32
+ shopt -u failglob
33
+
34
+ # The pattern ‘**’ used in a filename expansion context will match all files and zero or more directories and subdirectories.
35
+ shopt -s globstar
36
+
37
+ # Bash allows filename patterns which match no files to expand to a null string, rather than themselves.
38
+ shopt -s nullglob
39
+
40
+ function printFormattedArrayItems () {
41
+ FUNCTION_INPUT_ARRAY=("$@")
42
+ for i in "${FUNCTION_INPUT_ARRAY[@]}"; do
43
+ echo " - $i"
44
+ done
45
+ }
46
+
47
+ # Exported numeric variable with the result.
48
+ # 0 represents not skippable build, 1 represent skippable build.
49
+ IS_CI_JOB_SKIPPABLE=0
50
+
51
+ # Printed when build is skippable.
52
+ RESULT_TRUE_STRING="It's possible to skip the CI job!"
53
+
54
+ # Printed when build is not skippable.
55
+ RESULT_FALSE_STRING="It's NOT possible to skip the CI job!"
56
+
57
+ # Variable for providing details about the result.
58
+ RESULT_REASON_STRING="N/A"
59
+
60
+ # The range of commits that were included in the push or pull request.
61
+ # Example "SHA1...SHA2".
62
+ COMMIT_RANGE=""
63
+
64
+ echo ""
65
+ echo "==========================================================================================="
66
+ echo "RESOLVING THE POSSIBILITY TO SKIP THE CI JOB..."
67
+
68
+ # GitHub Actions CI
69
+ if [[ "$GITHUB_EVENT_NAME" == "pull_request" ]]; then
70
+ # This is a Pull Request event
71
+ if [[ -z "$GITHUB_BASE_REF" ]]; then
72
+ RESULT_REASON_STRING="GITHUB_BASE_REF is empty for this CI build."
73
+ elif [[ -z "$GITHUB_HEAD_REF" ]]; then
74
+ RESULT_REASON_STRING="GITHUB_HEAD_REF is empty for this CI build."
75
+ else
76
+ COMMIT_RANGE="origin/${GITHUB_BASE_REF}...origin/${GITHUB_HEAD_REF}"
77
+ echo "set COMMIT_RANGE for PR (GA) to \"${COMMIT_RANGE}\""
78
+ fi
79
+ else
80
+ # This is not Pull Request event (it is for example push)
81
+ if [[ "$GA_EVENT_BEFORE" == "0000000000000000000000000000000000000000" ]]; then
82
+ # variable it is set to zeros for the initial commit of a new branch
83
+ RESULT_REASON_STRING="GA_EVENT_BEFORE is zeros for this CI build."
84
+ elif [[ -z "$GA_EVENT_BEFORE" ]]; then
85
+ RESULT_REASON_STRING="GA_EVENT_BEFORE is empty for this CI build."
86
+ elif [[ -z "$GA_EVENT_AFTER" ]]; then
87
+ RESULT_REASON_STRING="GA_EVENT_AFTER is empty for this CI build."
88
+ else
89
+ COMMIT_RANGE="${GA_EVENT_BEFORE}...${GA_EVENT_AFTER}"
90
+ echo "set COMMIT_RANGE for \"${GITHUB_EVENT_NAME}\" (GA) to \"${COMMIT_RANGE}\""
91
+ fi
92
+ fi
93
+
94
+ if [[ ! -z "$COMMIT_RANGE" ]]; then
95
+ CHANGED_FILES_ARRAY=()
96
+ while IFS= read -r line; do
97
+ CHANGED_FILES_ARRAY+=("${line}")
98
+ done < <(git diff --name-only "$COMMIT_RANGE")
99
+
100
+ IRRELEVANT_FILES_INPUT_ARRAY=($@) # array with all params
101
+
102
+ RESOLVED_RELEVANT_FILES=()
103
+ RESOLVED_IRRELEVANT_FILES=()
104
+ for i in "${CHANGED_FILES_ARRAY[@]}"; do
105
+ if [[ "${IRRELEVANT_FILES_INPUT_ARRAY[*]}" =~ $i ]]; then
106
+ RESOLVED_IRRELEVANT_FILES+=("$i")
107
+ else
108
+ RESOLVED_RELEVANT_FILES+=("$i")
109
+ fi
110
+ done
111
+
112
+ echo ""
113
+ echo "Provided filter for irrelevant files ($#):"
114
+ printFormattedArrayItems "$@"
115
+
116
+ echo ""
117
+ echo "Resolved provided filter for irrelevant files (${#IRRELEVANT_FILES_INPUT_ARRAY[@]}):"
118
+ printFormattedArrayItems "${IRRELEVANT_FILES_INPUT_ARRAY[@]}"
119
+
120
+ echo ""
121
+ echo "Detected changed files from GIT (${#CHANGED_FILES_ARRAY[@]}):"
122
+ printFormattedArrayItems "${CHANGED_FILES_ARRAY[@]}"
123
+
124
+ echo ""
125
+ echo "Changed files resolved as relevant for the CI job (${#RESOLVED_RELEVANT_FILES[@]}):"
126
+ printFormattedArrayItems "${RESOLVED_RELEVANT_FILES[@]}"
127
+
128
+ echo ""
129
+ echo "Changed files resolved as irrelevant for the CI job: (${#RESOLVED_IRRELEVANT_FILES[@]}):"
130
+ printFormattedArrayItems "${RESOLVED_IRRELEVANT_FILES[@]}"
131
+
132
+ if [[ ${#RESOLVED_RELEVANT_FILES[@]} -eq 0 ]]; then
133
+ IS_CI_JOB_SKIPPABLE=1
134
+ RESULT_REASON_STRING="With given filter, all changed files are irrelevant for this CI job."
135
+ else
136
+ RESULT_REASON_STRING="With given filter, there are changes which have to be processed in this CI job."
137
+ fi
138
+ fi
139
+
140
+ echo ""
141
+ echo "The result:"
142
+ if [[ "$IS_CI_JOB_SKIPPABLE" -eq 1 ]]; then
143
+ echo " $RESULT_TRUE_STRING"
144
+ else
145
+ echo " $RESULT_FALSE_STRING"
146
+ fi
147
+ echo ""
148
+ echo "The reason of the result:"
149
+ echo " $RESULT_REASON_STRING"
150
+ echo "==========================================================================================="
151
+ echo ""
152
+
153
+ export IS_CI_JOB_SKIPPABLE
package/package.json CHANGED
@@ -1,15 +1,16 @@
1
1
  {
2
2
  "name": "@24i/bigscreen-sdk",
3
- "version": "1.0.4-alpha.2120",
3
+ "version": "1.0.54.alpha-2832",
4
4
  "description": "SmartApps BIGscreen SDK monorepo",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
- "prepare": "husky install && npm run patch-types && npm run scripts:prepare",
7
+ "prepare": "husky && npm run patch-types && npm run scripts:prepare",
8
8
  "prepublishOnly": "npm run scripts:prepare",
9
9
  "scripts:prepare": "ts-node ./utils/run-scripts/index.ts \"prepare:.+\"",
10
10
  "scripts:prepare:create-export-maps": "ts-node ./utils/create-export-maps/index.ts --project ./tsconfig.utils.json",
11
11
  "scripts:prepare:webos": "cd packages/driver-webos && ts-node ./scripts/exportWebOSTVjs.ts --project ../../tsconfig.utils.json",
12
12
  "scripts:create-package": "ts-node ./utils/create-package/src/index.ts --project ./tsconfig.utils.json",
13
+ "release": "ts-node --project ./tsconfig.utils.json ./utils/release/release.ts",
13
14
  "jest": "cross-env NODE_ICU_DATA=node_modules/full-icu jest",
14
15
  "eslint": "eslint \"./packages/**/src/**/*.{ts,tsx}\"",
15
16
  "stylelint": "stylelint \"./packages/**/src/**/*.scss\"",
@@ -17,9 +18,9 @@
17
18
  "lintcheck:cached": "npm run eslint -- --cache && npm run stylelint -- --cache",
18
19
  "typecheck": "tsc --noEmit",
19
20
  "typecheck:cached": "npm run typecheck -- --incremental",
20
- "test": "npm run jest -- --no-cache && npm run lintcheck",
21
- "test:cached": "npm run jest && npm run lintcheck:cached",
22
- "coverage": "npm run jest -- --runInBand --coverage && coveralls < coverage/lcov.info",
21
+ "test": "npm run jest -- --no-cache",
22
+ "test:cached": "npm run jest",
23
+ "coverage": "npm run jest -- --runInBand --coverage",
23
24
  "branchlint": "branchlint",
24
25
  "generate-changelog": "smartapps-bigscreen-changelog-generator",
25
26
  "deploy-docs": "cd website && npm run build && vercel ./build/prd-nxg-bigscreen --token=$VERCEL_TOKEN_24I --local-config=./vercel.json --scope=24i -f -c --prod",
@@ -37,49 +38,62 @@
37
38
  },
38
39
  "homepage": "https://github.com/24i/smartapps-bigscreen-sdk#readme",
39
40
  "dependencies": {
40
- "@24i/player-base": "6.10.0",
41
- "@24i/smartapps-datalayer": "2.3.4-beta.2",
42
- "@sentry/browser": "^7.8.0",
43
- "@types/prop-types": "^15.7.5",
44
- "@types/scheduler": "^0.16.1",
45
- "csstype": "^3.1.0",
46
- "lottie-web": "5.9.6",
41
+ "@24i/appstage-shared-analytics": "1.0.24",
42
+ "@24i/appstage-shared-events-manager": "1.0.11",
43
+ "@24i/appstage-shared-perf-utils": "1.0.11",
44
+ "@24i/bigscreen-players-engine-base": "4.1.0",
45
+ "@24i/smartapps-datalayer": "3.0.24",
46
+ "@sentry/browser": "7.35.0",
47
+ "@sentry/types": "7.35.0",
48
+ "csstype": "^3.1.3",
49
+ "date-fns": "2.29.3",
50
+ "lottie-web": "5.12.2",
47
51
  "prop-types": "^15.8.1"
48
52
  },
49
53
  "devDependencies": {
50
54
  "@24i/bigscreen-sdk": "file:.",
51
55
  "@24i/eslint-config-smartapps-bigscreen-linters": "file:./libs/linters",
52
56
  "@24i/smartapps-bigscreen-changelog-generator": "0.17.0",
53
- "@babel/core": "^7.18.9",
54
- "@babel/preset-env": "^7.18.9",
55
- "@types/fs-extra": "^9.0.13",
56
- "@types/inquirer": "^8.2.1",
57
- "@types/jest": "^28.1.6",
58
- "@types/minimist": "^1.2.2",
59
- "@types/node": "^18.6.3",
60
- "@types/react": "^18.0.18",
61
- "babel-jest": "^28.1.2",
62
- "chalk": "^4.1.2",
63
- "coveralls": "^3.1.0",
57
+ "@babel/core": "^7.24.6",
58
+ "@babel/preset-env": "^7.24.6",
59
+ "@types/fs-extra": "^11.0.4",
60
+ "@types/gtag.js": "^0.0.19",
61
+ "@types/inquirer": "^9.0.7",
62
+ "@types/jest": "^29.5.12",
63
+ "@types/minimist": "^1.2.5",
64
+ "@types/node": "^20.13.0",
65
+ "@types/prop-types": "^15.7.12",
66
+ "@types/react": "18.0.33",
67
+ "@types/scheduler": "^0.23.0",
68
+ "babel-jest": "^29.7.0",
69
+ "chalk": "^5.3.0",
70
+ "coveralls": "^3.1.1",
64
71
  "cross-env": "^7.0.3",
65
- "fs-extra": "^10.1.0",
66
- "full-icu": "^1.4.0",
72
+ "fs-extra": "^11.2.0",
73
+ "full-icu": "^1.5.0",
67
74
  "identity-obj-proxy": "^3.0.0",
68
- "inquirer": "^9.0.2",
69
- "jest": "^28.1.2",
70
- "jest-canvas-mock": "^2.4.0",
71
- "jest-environment-jsdom": "^28.1.2",
72
- "minimist": "^1.2.6",
73
- "patch-package": "^6.2.1",
74
- "sass": "^1.54.8",
75
- "sass-true": "^6.1.0",
76
- "ts-jest": "^28.0.8",
77
- "ts-node": "^10.8.2",
75
+ "inquirer": "^9.2.23",
76
+ "jest": "^29.7.0",
77
+ "jest-canvas-mock": "^2.5.2",
78
+ "jest-environment-jsdom": "^29.7.0",
79
+ "jest-sonar": "^0.2.15",
80
+ "minimist": "^1.2.8",
81
+ "patch-package": "^8.0.0",
82
+ "sass": "^1.77.4",
83
+ "sass-true": "^8.0.0",
84
+ "ts-jest": "^29.1.4",
85
+ "ts-node": "^10.9.2",
78
86
  "tsconfig-paths-jest": "0.0.1",
79
- "typescript": "^4.8.2"
87
+ "typescript": "^5.4.5"
80
88
  },
81
89
  "exports": {
82
90
  "./adobe-heartbeat": "./packages/adobe-heartbeat/src/index.ts",
91
+ "./analytics/interface": "./packages/analytics/src/interface.ts",
92
+ "./analytics/ConsoleAnalytics": "./packages/analytics/src/clients/ConsoleAnalytics/index.ts",
93
+ "./analytics/GoogleAnalytics": "./packages/analytics/src/clients/GoogleAnalytics/index.ts",
94
+ "./analytics/TealiumAnalytics": "./packages/analytics/src/clients/TealiumAnalytics/index.ts",
95
+ "./analytics/TwentyFourIQ": "./packages/analytics/src/clients/TwentyFourIQ/index.ts",
96
+ "./analytics": "./packages/analytics/src/index.ts",
83
97
  "./animations/mock": "./packages/animations/src/__mocks__/JSAnimations.ts",
84
98
  "./animations": "./packages/animations/src/index.ts",
85
99
  "./announcement-banner": "./packages/announcement-banner/src/index.ts",
@@ -103,13 +117,16 @@
103
117
  "./device/resolver/keymap": "./packages/device/resolver/keymap.ts",
104
118
  "./device": "./packages/device/src/index.ts",
105
119
  "./digital-clock": "./packages/digital-clock/src/index.ts",
120
+ "./driver-androidtv": "./packages/driver-androidtv/src/index.ts",
106
121
  "./driver-base/keymap": "./packages/driver-base/src/KeyMap/index.ts",
107
122
  "./driver-base": "./packages/driver-base/src/index.ts",
108
123
  "./driver-browser": "./packages/driver-browser/src/index.ts",
109
124
  "./driver-entone": "./packages/driver-entone/src/index.ts",
125
+ "./driver-firetv": "./packages/driver-firetv/src/index.ts",
110
126
  "./driver-hbbtv": "./packages/driver-hbbtv/src/index.ts",
111
127
  "./driver-kreatv": "./packages/driver-kreatv/src/index.ts",
112
128
  "./driver-saphi": "./packages/driver-saphi/src/index.ts",
129
+ "./driver-smartcast": "./packages/driver-smartcast/src/index.ts",
113
130
  "./driver-tizen": "./packages/driver-tizen/src/index.ts",
114
131
  "./driver-vidaa": "./packages/driver-vidaa/src/index.ts",
115
132
  "./driver-webos/scripts/template": "./packages/driver-webos/scripts/template.ts",
@@ -165,6 +182,7 @@
165
182
  "./keyboard/Default": "./packages/keyboard/src/DefaultKeyboard/index.ts",
166
183
  "./keyboard/Mobi": "./packages/keyboard/src/MobiKeyboard/index.ts",
167
184
  "./keyboard/Whitelabel": "./packages/keyboard/src/WhitelabelKeyboard/index.ts",
185
+ "./keyboard/Whitelabel/layouts": "./packages/keyboard/src/WhitelabelKeyboard/layouts/index.ts",
168
186
  "./keyboard/Whitelabel/styles": "./packages/keyboard/src/WhitelabelKeyboard/WhitelabelStyles/index.ts",
169
187
  "./keyboard/WhitelabelNumeric": "./packages/keyboard/src/WhitelabelNumericKeyboard/index.ts",
170
188
  "./keyboard/WhitelabelNumeric/styles": "./packages/keyboard/src/WhitelabelNumericKeyboard/WhitelabelStyles/index.ts",
@@ -243,6 +261,7 @@
243
261
  "./storage": "./packages/storage/src/index.ts",
244
262
  "./throbber": "./packages/throbber/src/index.ts",
245
263
  "./time/adapters/worldTimeApi": "./packages/time/src/adapters/worldTimeApi.ts",
264
+ "./time/adapters/24iMediaTimeApi": "./packages/time/src/adapters/24iMediaTimeApi.ts",
246
265
  "./time": "./packages/time/src/index.ts",
247
266
  "./toast/styles": "./packages/toast/src/Toast/styles.ts",
248
267
  "./toast": "./packages/toast/src/index.ts",
@@ -252,6 +271,7 @@
252
271
  "./utils/debounce": "./packages/utils/src/debounce.ts",
253
272
  "./utils/displayToggler": "./packages/utils/src/displayToggler.ts",
254
273
  "./utils/elementUtils": "./packages/utils/src/elementUtils.ts",
274
+ "./utils/forceReflow": "./packages/utils/src/forceReflow.ts",
255
275
  "./utils/generateUuid": "./packages/utils/src/generateUuid.ts",
256
276
  "./utils/memoryInfo": "./packages/utils/src/memoryInfo.ts",
257
277
  "./utils/nTimes": "./packages/utils/src/nTimes.ts",
@@ -265,6 +285,7 @@
265
285
  "./utils/timers": "./packages/utils/src/timers/index.ts",
266
286
  "./utils/wait": "./packages/utils/src/wait.ts",
267
287
  "./utils/xhr": "./packages/utils/src/xhr/index.ts",
288
+ "./utils/keyPress": "./packages/utils/src/keyPress/index.ts",
268
289
  "./utils": "./packages/utils/src/index.ts",
269
290
  "./volume-control/interface": "./packages/volume-control/src/IVolumeControlUI.ts",
270
291
  "./volume-control": "./packages/volume-control/src/index.ts",
@@ -1,5 +1,5 @@
1
1
  /// <reference path='./__external__/Adobe/Adobe.d.ts' />
2
- import { IErrorEvent, PlayerBase } from '@24i/player-base';
2
+ import { IErrorEvent, PlayerBase } from '@24i/bigscreen-players-engine-base';
3
3
  import { time } from '@24i/bigscreen-sdk/time';
4
4
  import { SECOND_IN_MS } from '@24i/bigscreen-sdk/utils';
5
5
  import { va as Adobe } from './__external__/Adobe/MediaSDK.min';
@@ -15,7 +15,7 @@ import {
15
15
  export class AdobeHeartbeat<CustomMetadata extends CustomerMetadata | void = void> {
16
16
  static StreamType = Adobe.MediaHeartbeat.StreamType;
17
17
 
18
- private player?: PlayerBase<any>;
18
+ private player?: PlayerBase;
19
19
 
20
20
  /**
21
21
  * Heartbeat configuration object
@@ -32,7 +32,7 @@ export class AdobeHeartbeat<CustomMetadata extends CustomerMetadata | void = voi
32
32
  * @param config - Heartbeat configuration object
33
33
  * @param player - 24i universal player instance
34
34
  */
35
- constructor(config: HeartbeatConfig, player?: PlayerBase<any>) {
35
+ constructor(config: HeartbeatConfig, player?: PlayerBase) {
36
36
  if (!window.s || !AppMeasurement) throw new Error('Missing Adobe Launch library!');
37
37
  this.config = config;
38
38
  this.player = player;
@@ -67,10 +67,10 @@ export class AdobeHeartbeat<CustomMetadata extends CustomerMetadata | void = voi
67
67
  return {
68
68
  getCurrentPlaybackTime: () => {
69
69
  if (!this.player) return 0;
70
- const { currentTime } = this.player.getMediaInfo() || {};
70
+ const { currentTime } = this.player.mediaInfo || {};
71
71
  if (this.player.live) {
72
72
  try {
73
- const { programEnd = NaN } = this.player.getMetadata();
73
+ const { programEnd = NaN } = this.player.metadata;
74
74
  return Math.floor((programEnd - currentTime) / SECOND_IN_MS)
75
75
  || time.getCurrentUnixTime();
76
76
  } catch (e) {
@@ -81,7 +81,7 @@ export class AdobeHeartbeat<CustomMetadata extends CustomerMetadata | void = voi
81
81
  },
82
82
  getQoSObject: () => {
83
83
  if (!this.player) return Adobe.MediaHeartbeat.createQoSObject();
84
- const { bitrate, droppedVideoFrames } = this.player.getMediaInfo() || {};
84
+ const { bitrate, droppedVideoFrames } = this.player.mediaInfo || {};
85
85
  return Adobe.MediaHeartbeat.createQoSObject(
86
86
  bitrate, undefined, undefined, droppedVideoFrames,
87
87
  );
@@ -89,7 +89,7 @@ export class AdobeHeartbeat<CustomMetadata extends CustomerMetadata | void = voi
89
89
  };
90
90
  }
91
91
 
92
- private attachPlayerListeners(player: PlayerBase<any>) {
92
+ private attachPlayerListeners(player: PlayerBase) {
93
93
  player.addEventListener('play', this.onPlay);
94
94
  player.addEventListener('pause', this.onPause);
95
95
  player.addEventListener('ended', this.onEnded);
@@ -98,7 +98,7 @@ export class AdobeHeartbeat<CustomMetadata extends CustomerMetadata | void = voi
98
98
  player.addEventListener('error', this.onError);
99
99
  }
100
100
 
101
- private dettachPlayerListeners(player: PlayerBase<any>) {
101
+ private dettachPlayerListeners(player: PlayerBase) {
102
102
  player.removeEventListener('play', this.onPlay);
103
103
  player.removeEventListener('pause', this.onPause);
104
104
  player.removeEventListener('ended', this.onEnded);
@@ -143,7 +143,7 @@ export class AdobeHeartbeat<CustomMetadata extends CustomerMetadata | void = voi
143
143
  * this will replace the old one.
144
144
  * @param player - 24i universal player instance
145
145
  */
146
- attachPlayer(player: PlayerBase<any>) {
146
+ attachPlayer(player: PlayerBase) {
147
147
  if (this.player) this.dettachPlayerListeners(this.player);
148
148
  this.player = player;
149
149
  if (this.player) this.attachPlayerListeners(this.player);
@@ -0,0 +1,8 @@
1
+ ---
2
+ id: README
3
+ title: Analytics
4
+ hide_title: true
5
+ sidebar_label: Analytics
6
+ ---
7
+
8
+ https://github.com/24i/appstage-shared-packages/blob/main/packages/analytics/README.md
@@ -0,0 +1 @@
1
+ export { A } from '@24i/appstage-shared-analytics';
@@ -0,0 +1 @@
1
+ export { analytics } from '@24i/appstage-shared-analytics';
@@ -0,0 +1 @@
1
+ export { analyticsOnScroll } from '@24i/appstage-shared-analytics';
@@ -0,0 +1 @@
1
+ export { ConsoleAnalytics } from '@24i/appstage-shared-analytics/dist/clients/ConsoleAnalytics';
@@ -0,0 +1 @@
1
+ export { ConsoleAnalytics } from './ConsoleAnalytics';
@@ -0,0 +1,196 @@
1
+ import { Storage } from '@24i/bigscreen-sdk/storage';
2
+ import { device } from '@24i/bigscreen-sdk/device';
3
+ import { debounce } from '@24i/bigscreen-sdk/utils/debounce';
4
+ import { createTimeout } from '@24i/bigscreen-sdk/utils/timers';
5
+ import { MINUTE_IN_MS } from '@24i/bigscreen-sdk/utils/timeConstants';
6
+ import { generateUuid } from '@24i/bigscreen-sdk/utils/generateUuid';
7
+ import { i18n } from '@24i/bigscreen-sdk/i18n';
8
+ import type { AnalyticsClient, AnalyticsEventsMap, AnyPayload } from '../../interface';
9
+ import { mapEventParamsToUrlParams, mapPayload } from './mapPayload';
10
+ import { prepareBody } from './prepareBody';
11
+ import { getUrl } from './getUrl';
12
+ import { generateSessionId } from '../../utils/generateSessionId';
13
+ import { GOOGLE_ANALYTICS_TRIGGERS, TRIGGER_NAME_TO_GA_EVENTS } from './constants';
14
+ import {
15
+ GAEventsNames,
16
+ QueuedEvent,
17
+ ConstantUrlParams,
18
+ SessionInfo,
19
+ EventUrlParams,
20
+ } from './interface';
21
+
22
+ const SEND_DEBOUNCE_MS = 5000;
23
+ const MAX_QUEUE_LENGTH = 10;
24
+ // eslint-disable-next-line no-magic-numbers
25
+ const SESSION_TIMEOUT = 30 * MINUTE_IN_MS;
26
+
27
+ const GA_CLIENT_ID = 'GA_client_id';
28
+ const GA_SESSION_COUNTER = 'GA_session_counter';
29
+ const GA_FIRST_VISIT = 'GA_first_visit';
30
+
31
+ export class GoogleAnalytics implements AnalyticsClient {
32
+ name = 'GoogleAnalytics';
33
+
34
+ constantUrlParams: ConstantUrlParams = {
35
+ cid: '',
36
+ sid: 0,
37
+ seg: 0,
38
+ sct: 0,
39
+ _p: generateUuid(),
40
+ 'up.device_manufacturer': '',
41
+ 'up.device_platform': '',
42
+ 'up.device_platform_version': '',
43
+ 'up.app_version': '',
44
+ };
45
+
46
+ manufacturer = '';
47
+
48
+ platform = '';
49
+
50
+ platformVersion = '';
51
+
52
+ lastOnEvent: number | undefined = undefined;
53
+
54
+ eventsQueue: QueuedEvent[] = [];
55
+
56
+ sessionTimeout = createTimeout();
57
+
58
+ isSessionActive = false;
59
+
60
+ sessionStartSent = false;
61
+
62
+ firstEvent = true;
63
+
64
+ firstVisit: boolean | undefined = undefined;
65
+
66
+ constructor(private id: string, private appVersion: string = '') {
67
+ this.init();
68
+ }
69
+
70
+ async init() {
71
+ const params = this.constantUrlParams;
72
+ params.cid = await Storage.getItem(GA_CLIENT_ID) ?? '';
73
+ if (!params.cid) {
74
+ params.cid = generateUuid();
75
+ await Storage.setItem(GA_CLIENT_ID, params.cid);
76
+ }
77
+ this.firstVisit = !(await Storage.getItem(GA_FIRST_VISIT));
78
+ if (this.firstVisit) {
79
+ await Storage.setItem(GA_FIRST_VISIT, '0');
80
+ }
81
+ this.manufacturer = await device.getManufacturerName();
82
+ this.platform = await device.getPlatformName();
83
+ this.platformVersion = await device.getPlatformVersion();
84
+ await this.startSession();
85
+ }
86
+
87
+ async startSession() {
88
+ const sessionNumber = parseInt(await Storage.getItem(GA_SESSION_COUNTER) ?? '0', 10) + 1;
89
+ this.constantUrlParams.sct = sessionNumber;
90
+ this.constantUrlParams.sid = generateSessionId();
91
+ this.constantUrlParams['up.device_manufacturer'] = this.manufacturer;
92
+ this.constantUrlParams['up.device_platform'] = this.platform;
93
+ this.constantUrlParams['up.device_platform_version'] = this.platformVersion;
94
+ this.constantUrlParams['up.app_version'] = this.appVersion;
95
+ await Storage.setItem(GA_SESSION_COUNTER, sessionNumber.toString());
96
+ this.isSessionActive = true;
97
+ this.setSessionTimeout();
98
+ }
99
+
100
+ setSessionTimeout() {
101
+ this.sessionTimeout.set(() => {
102
+ this.isSessionActive = false;
103
+ this.sessionStartSent = false;
104
+ this.constantUrlParams.seg = 0;
105
+ }, SESSION_TIMEOUT);
106
+ }
107
+
108
+ // @ts-ignore - cross event typing
109
+ async onEvent<Event extends keyof AnalyticsEventsMap>(
110
+ triggerName: Event,
111
+ payload: Parameters<AnalyticsEventsMap[Event]>[0],
112
+ ) {
113
+ if (this.isSessionActive) {
114
+ this.setSessionTimeout();
115
+ } else {
116
+ await this.startSession();
117
+ }
118
+ const events = TRIGGER_NAME_TO_GA_EVENTS[
119
+ triggerName as typeof GOOGLE_ANALYTICS_TRIGGERS[number]
120
+ ];
121
+ const now = Date.now();
122
+ const engagementTime = this.lastOnEvent ? now - this.lastOnEvent : undefined;
123
+ this.lastOnEvent = now;
124
+ await Promise.all(events.map(async (event, index) => {
125
+ const sessionInfo = await this.getSessionInfo(
126
+ payload!, index === 0 ? engagementTime : undefined,
127
+ );
128
+ const gtagPayload = mapPayload(event, triggerName, { ...payload, ...sessionInfo });
129
+ const urlParams = mapEventParamsToUrlParams({ ...sessionInfo, ...payload });
130
+ this.send(event, gtagPayload, urlParams);
131
+ }));
132
+ }
133
+
134
+ private send(name: GAEventsNames, params: Record<string, any>, urlParams: EventUrlParams) {
135
+ const lastUrlParams = JSON.stringify(
136
+ this.eventsQueue[this.eventsQueue.length - 1]?.urlParams ?? {},
137
+ );
138
+ if (lastUrlParams !== '{}' && lastUrlParams !== JSON.stringify(urlParams)) {
139
+ this.sendQueue();
140
+ }
141
+ if (this.constantUrlParams.seg === 0) {
142
+ this.eventsQueue.push({ name, params, urlParams });
143
+ this.sendQueue();
144
+ this.constantUrlParams.seg = 1;
145
+ return;
146
+ }
147
+ this.eventsQueue.push({ name, params, urlParams });
148
+ if (this.eventsQueue.length >= MAX_QUEUE_LENGTH) {
149
+ this.sendQueue();
150
+ } else {
151
+ this.sendQueueWithDelay();
152
+ }
153
+ }
154
+
155
+ private sendQueue = () => {
156
+ if (this.eventsQueue.length === 0) return;
157
+ const body = prepareBody(this.eventsQueue);
158
+ const { urlParams } = this.eventsQueue[0];
159
+ this.eventsQueue.length = 0;
160
+ try {
161
+ fetch(getUrl(this.id, {
162
+ ...this.constantUrlParams,
163
+ ...urlParams,
164
+ }), { method: 'POST', body });
165
+ } catch (e) {
166
+ // Effort to send was made.
167
+ }
168
+ };
169
+
170
+ private sendQueueWithDelay = debounce(this.sendQueue, SEND_DEBOUNCE_MS);
171
+
172
+ private async getSessionInfo(
173
+ payload: AnyPayload,
174
+ engagementTime: number | undefined,
175
+ ): Promise<SessionInfo> {
176
+ const sessionStarted = !this.sessionStartSent;
177
+ this.sessionStartSent = true;
178
+ const { firstEvent } = this;
179
+ this.firstEvent = false;
180
+ const { firstVisit } = this;
181
+ this.firstVisit = false;
182
+ return {
183
+ appVersion: this.appVersion,
184
+ manufacturer: this.manufacturer,
185
+ language: i18n.getLanguage(),
186
+ resolution: `${window.screen.width}x${window.screen.height}`,
187
+ referrer: document.referrer,
188
+ platform: this.platform,
189
+ sessionStarted,
190
+ engagementTime,
191
+ firstEvent,
192
+ isAuthenticated: payload?.userId ? '1' : '0',
193
+ firstVisit: firstVisit as boolean,
194
+ };
195
+ }
196
+ }