@24i/bigscreen-sdk 1.0.4 → 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.
- package/README.md +2 -3
- package/ci/is_ci_job_skippable.sh +153 -0
- package/package.json +55 -34
- package/packages/adobe-heartbeat/src/AdobeHeartbeat.ts +9 -9
- package/packages/analytics/README.md +8 -0
- package/packages/analytics/src/A.ts +1 -0
- package/packages/analytics/src/Analytics.ts +1 -0
- package/packages/analytics/src/analyticsOnScroll.ts +1 -0
- package/packages/analytics/src/clients/ConsoleAnalytics/ConsoleAnalytics.ts +1 -0
- package/packages/analytics/src/clients/ConsoleAnalytics/index.ts +1 -0
- package/packages/analytics/src/clients/GoogleAnalytics/GoogleAnalytics.ts +196 -0
- package/packages/analytics/src/clients/GoogleAnalytics/constants.ts +126 -0
- package/packages/analytics/src/clients/GoogleAnalytics/getUrl.ts +17 -0
- package/packages/analytics/src/clients/GoogleAnalytics/index.ts +2 -0
- package/packages/analytics/src/clients/GoogleAnalytics/interface.ts +82 -0
- package/packages/analytics/src/clients/GoogleAnalytics/mapPayload.ts +51 -0
- package/packages/analytics/src/clients/GoogleAnalytics/prepareBody.ts +14 -0
- package/packages/analytics/src/clients/TealiumAnalytics/TealiumAnalytics.ts +181 -0
- package/packages/analytics/src/clients/TealiumAnalytics/constants.ts +106 -0
- package/packages/analytics/src/clients/TealiumAnalytics/findForLanguage.ts +9 -0
- package/packages/analytics/src/clients/TealiumAnalytics/index.ts +4 -0
- package/packages/analytics/src/clients/TealiumAnalytics/interface.ts +35 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/__mocks__/mediaPayload.ts +72 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/helper.ts +36 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppError.ts +13 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppOpen.ts +13 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteAdd.ts +11 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapFavoriteRemove.ts +11 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerClose.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapPlayerOpen.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSceneView.ts +18 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearch.ts +18 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchFailed.ts +8 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSearchSuccess.ts +8 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoPause.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoProgress.ts +18 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoResume.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStart.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapVideoStop.ts +15 -0
- package/packages/analytics/src/clients/TealiumAnalytics/types.ts +161 -0
- package/packages/analytics/src/clients/TwentyFourIQ/TwentyFourIQClient.ts +107 -0
- package/packages/analytics/src/clients/TwentyFourIQ/constants.ts +111 -0
- package/packages/analytics/src/clients/TwentyFourIQ/helper.ts +34 -0
- package/packages/analytics/src/clients/TwentyFourIQ/index.ts +2 -0
- package/packages/analytics/src/clients/TwentyFourIQ/interface.ts +34 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdEvent.ts +20 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBase.ts +24 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBuffering.ts +15 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerClose.ts +25 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerOpen.ts +17 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapSceneView.ts +15 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapScroll.ts +17 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoComplete.ts +22 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoPause.ts +25 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoProgress.ts +25 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStart.ts +34 -0
- package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStop.ts +32 -0
- package/packages/analytics/src/clients/TwentyFourIQ/types.ts +132 -0
- package/packages/analytics/src/constants.ts +1 -0
- package/packages/analytics/src/index.ts +3 -0
- package/packages/analytics/src/interface.ts +1 -0
- package/packages/analytics/src/utils/generateSessionId.ts +8 -0
- package/packages/async-image/src/AsyncImage.tsx +15 -10
- package/packages/developer-tools/PlayerDebugWindow/README.md +1 -1
- package/packages/developer-tools/src/DeveloperConsole/DeveloperConsole.tsx +1 -0
- package/packages/developer-tools/src/DeveloperToolsService/DeveloperToolsList.tsx +11 -0
- package/packages/developer-tools/src/PlayerDebugWindow/PlayerDebugWindow.tsx +5 -5
- package/packages/developer-tools/src/PlayerDebugWindow/constants.ts +15 -0
- package/packages/developer-tools/src/TechnicalInfo/TechnicalInfo.tsx +2 -0
- package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoDetail.tsx +2 -1
- package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoProvider.ts +57 -5
- package/packages/developer-tools/src/TechnicalInfo/__mocks__/Device.ts +12 -0
- package/packages/developer-tools/src/TechnicalInfo/translations.ts +8 -0
- package/packages/device/src/driver/index.android.tv.ts +1 -0
- package/packages/device/src/driver/index.firetv.ts +1 -0
- package/packages/device/src/driver/index.smartcast.tv.ts +1 -0
- package/packages/device/src/getKeyDigit.ts +2 -2
- package/packages/device/src/resolver/resolver.ts +19 -0
- package/packages/digital-clock/src/DigitalClock.tsx +15 -4
- package/packages/driver-androidtv/src/DeviceAndroidTV.ts +262 -0
- package/packages/driver-androidtv/src/__mocks__/javaScriptBridge.ts +45 -0
- package/packages/driver-androidtv/src/formatUserAgent.ts +11 -0
- package/packages/driver-androidtv/src/index.ts +2 -0
- package/packages/driver-androidtv/src/keymap.ts +27 -0
- package/packages/driver-androidtv/src/types.ts +155 -0
- package/packages/driver-base/src/DeviceBase.ts +73 -2
- package/packages/driver-base/src/KeyMap/Key.ts +8 -1
- package/packages/driver-base/src/KeyMap/KeyMap.ts +4 -0
- package/packages/driver-base/src/KeyMap/interface.ts +1 -0
- package/packages/driver-base/src/KeyMap/overrideValues.ts +2 -1
- package/packages/driver-base/src/__mocks__/DeviceBase.ts +24 -0
- package/packages/driver-base/src/__mocks__/keyMap.ts +1 -0
- package/packages/driver-base/src/index.ts +3 -0
- package/packages/driver-base/src/types/AdInfo.ts +5 -0
- package/packages/driver-base/src/types/DeviceEvent.ts +2 -0
- package/packages/driver-base/src/types/InAppPurchase.ts +20 -0
- package/packages/driver-base/src/types/KeycodeKeyMap.ts +1 -0
- package/packages/driver-browser/src/DeviceBrowser.ts +26 -0
- package/packages/driver-browser/src/keymap.ts +8 -0
- package/packages/driver-entone/src/DeviceEntone.ts +31 -1
- package/packages/driver-entone/src/keymap.ts +1 -0
- package/packages/driver-firetv/src/DeviceFireTV.ts +86 -0
- package/packages/driver-firetv/src/__mocks__/javaScriptBridge.ts +45 -0
- package/packages/driver-firetv/src/index.ts +1 -0
- package/packages/driver-firetv/src/types.ts +1 -0
- package/packages/driver-hbbtv/src/DeviceHbbTV.ts +26 -0
- package/packages/driver-kreatv/src/DeviceKreaTV.ts +26 -0
- package/packages/driver-saphi/src/DeviceSaphi.ts +26 -0
- package/packages/driver-smartcast/src/DeviceSmartCast.ts +380 -0
- package/packages/driver-smartcast/src/__mocks__/api.ts +69 -0
- package/packages/driver-smartcast/src/index.ts +1 -0
- package/packages/driver-smartcast/src/keymap.ts +9 -0
- package/packages/driver-smartcast/src/types.ts +102 -0
- package/packages/driver-tizen/src/DeviceTizen.ts +121 -7
- package/packages/driver-tizen/src/ITizen.ts +15116 -202
- package/packages/driver-tizen/src/IWebapis.ts +8643 -87
- package/packages/driver-tizen/src/TizenKeys.ts +4 -2
- package/packages/driver-tizen/src/__mocks__/tizen.ts +7 -8
- package/packages/driver-tizen/src/constants.ts +1 -195
- package/packages/driver-vidaa/src/DeviceVidaa.ts +29 -2
- package/packages/driver-vidaa/src/__mocks__/vidaa.ts +1 -1
- package/packages/driver-vidaa/src/keymap.ts +2 -0
- package/packages/driver-webos/src/DeviceWebos.ts +55 -0
- package/packages/driver-webos/src/__mocks__/webos.ts +33 -0
- package/packages/driver-webos/src/constants.ts +1 -0
- package/packages/driver-webos/src/keymap.ts +2 -1
- package/packages/driver-webos/src/types.ts +30 -0
- package/packages/driver-xbox/src/DeviceXbox.ts +30 -1
- package/packages/driver-xbox/src/keymap.ts +1 -1
- package/packages/epg/README.md +3 -1
- package/packages/epg/src/v2/Cell.tsx +16 -2
- package/packages/epg/src/v2/DataManager.ts +112 -41
- package/packages/epg/src/v2/DatePicker.tsx +9 -3
- package/packages/epg/src/v2/DateToast/DateToast.tsx +12 -9
- package/packages/epg/src/v2/Day.tsx +6 -3
- package/packages/epg/src/v2/Epg.tsx +5 -5
- package/packages/epg/src/v2/MockGenerator/generator.ts +3 -2
- package/packages/epg/src/v2/ProgramInfo/utils.ts +4 -3
- package/packages/epg/src/v2/Row.tsx +3 -1
- package/packages/epg/src/v2/TimelineSection.tsx +4 -1
- package/packages/epg/src/v2/basic/CellsManager.tsx +7 -2
- package/packages/epg/src/v2/basic/RowsManager.tsx +3 -1
- package/packages/epg/src/v2/interface.ts +13 -0
- package/packages/events-manager/src/EventsManager.ts +1 -56
- package/packages/focus/README.md +33 -0
- package/packages/focus/src/IFocusable.ts +1 -0
- package/packages/focus/src/Layout/Base.tsx +41 -6
- package/packages/focus/src/Layout/Matrix.tsx +51 -19
- package/packages/focus/src/focusFirstExisting.ts +7 -1
- package/packages/focus/src/hasFocus.ts +36 -0
- package/packages/focus/src/index.ts +2 -1
- package/packages/gallup/src/Gallup.ts +3 -3
- package/packages/grid/src/Base/Base.tsx +15 -10
- package/packages/grid/src/FirstOnlyGrid/FirstOnlyGrid.tsx +4 -2
- package/packages/grid/src/UnifiedGridController/UnifiedGridController.ts +6 -6
- package/packages/icon/src/Icon.tsx +27 -5
- package/packages/input/README.md +1 -1
- package/packages/input/src/Input.tsx +10 -10
- package/packages/interactable/README.md +2 -1
- package/packages/interactable/src/Interactable.tsx +9 -3
- package/packages/interactable/src/interface.ts +1 -0
- package/packages/jsx/src/index.ts +1 -1
- package/packages/jsx/src/test-utils/index.ts +1 -0
- package/packages/jsx/src/test-utils/keyup.ts +27 -0
- package/packages/keyboard/README.md +2 -0
- package/packages/keyboard/src/Backdrop/Backdrop.scss +2 -0
- package/packages/keyboard/src/KeyboardBase.tsx +16 -4
- package/packages/keyboard/src/WhitelabelKeyboard/Keyboard.scss +10 -0
- package/packages/keyboard/src/WhitelabelKeyboard/Keyboard.tsx +128 -142
- package/packages/keyboard/src/WhitelabelKeyboard/WhitelabelStyles/whitelabel.scss +4 -0
- package/packages/keyboard/src/WhitelabelKeyboard/_sizes.1080.scss +1 -0
- package/packages/keyboard/src/WhitelabelKeyboard/_sizes.scss +1 -0
- package/packages/keyboard/src/WhitelabelKeyboard/icons/key_language.svg +20 -0
- package/packages/keyboard/src/WhitelabelKeyboard/index.ts +1 -1
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/arabic.ts +27 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/burmese.ts +27 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/dari.ts +28 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/hebrew.ts +28 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/index.ts +15 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/korean.ts +26 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/latin.ts +26 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/pashto.ts +27 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/persian.ts +27 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/russian.ts +27 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/spanish.ts +26 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/special.ts +28 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/tibetan.ts +26 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/turkish.ts +26 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/ukrainian.ts +27 -0
- package/packages/keyboard/src/WhitelabelKeyboard/layouts/urdu.ts +26 -0
- package/packages/keyboard/src/WhitelabelKeyboard/types.ts +22 -2
- package/packages/keyboard/src/types/index.ts +1 -1
- package/packages/keyboard/src/utils/caret.ts +5 -8
- package/packages/keyboard/src/utils/input.ts +5 -6
- package/packages/keyboard/src/utils/setInputSelectionRange.ts +10 -0
- package/packages/l10n/README.md +18 -0
- package/packages/l10n/src/date/common.ts +18 -6
- package/packages/l10n/src/date/cs.ts +2 -8
- package/packages/l10n/src/date/de.ts +97 -0
- package/packages/l10n/src/date/en-001.ts +3 -3
- package/packages/l10n/src/date/en-common.ts +5 -4
- package/packages/l10n/src/date/en-us.ts +3 -3
- package/packages/l10n/src/date/es.ts +71 -0
- package/packages/l10n/src/date/fr.ts +94 -0
- package/packages/l10n/src/date/he.ts +101 -0
- package/packages/l10n/src/date/iso.ts +12 -13
- package/packages/l10n/src/date/types.ts +9 -0
- package/packages/l10n/src/l10n.ts +61 -3
- package/packages/list/src/Base/Base.tsx +19 -9
- package/packages/list/src/Base/interface.ts +2 -2
- package/packages/list/src/BasicList/BasicList.tsx +7 -7
- package/packages/list/src/CenteredList/CenteredList.tsx +2 -2
- package/packages/list/src/CenteredList/controller.ts +0 -1
- package/packages/list/src/EdgeOffsetList/EdgeOffsetList.tsx +10 -10
- package/packages/list/src/FirstOnlyList/FirstOnlyList.tsx +2 -2
- package/packages/list/src/FirstOnlyVariedList/FirstOnlyVariedList.tsx +2 -2
- package/packages/list/src/FixedToEndList/FixedToEndList.tsx +2 -2
- package/packages/list/src/UnifiedListController/UnifiedListController.ts +6 -2
- package/packages/list/src/interface.ts +2 -2
- package/packages/logger/src/loggers/ConsoleLogger/ConsoleLogger.ts +7 -1
- package/packages/logger/src/loggers/SentryLogger/Sentry.ts +1 -0
- package/packages/logger/src/loggers/SentryLogger/SentryLogger.ts +5 -3
- package/packages/menu/src/MenuAndContentContainer/MenuAndContentContainer.tsx +31 -3
- package/packages/menu/src/MenuAndContentContainer/interface.ts +8 -0
- package/packages/modal-service/README.md +4 -1
- package/packages/modal-service/src/ModalService.tsx +29 -5
- package/packages/perf-utils/README.md +1 -120
- package/packages/perf-utils/src/array/filter.ts +1 -54
- package/packages/perf-utils/src/array/find.ts +1 -43
- package/packages/perf-utils/src/array/findIndex.ts +1 -43
- package/packages/perf-utils/src/array/forEach.ts +1 -48
- package/packages/perf-utils/src/array/includes.ts +1 -41
- package/packages/perf-utils/src/array/includesNaN.ts +1 -32
- package/packages/perf-utils/src/array/index.ts +1 -7
- package/packages/perf-utils/src/array/map.ts +1 -52
- package/packages/player-ui/README.md +1 -1
- package/packages/player-ui/src/CurrentTime.tsx +2 -2
- package/packages/player-ui/src/Duration.tsx +2 -2
- package/packages/player-ui/src/PauseButton.tsx +8 -0
- package/packages/player-ui/src/PlayerInteractable.tsx +1 -0
- package/packages/player-ui/src/PlayerTime.tsx +3 -1
- package/packages/player-ui/src/PlayerUI.tsx +68 -35
- package/packages/player-ui/src/RemainingTime.tsx +2 -2
- package/packages/player-ui/src/Seekbar.tsx +110 -18
- package/packages/player-ui/src/Seeking.ts +57 -16
- package/packages/player-ui/src/Subtitles.tsx +2 -2
- package/packages/player-ui/src/index.ts +1 -0
- package/packages/player-ui/src/mocks.ts +32 -8
- package/packages/player-ui/src/timeUtils.ts +3 -3
- package/packages/player-ui/src/types.ts +9 -3
- package/packages/router/README.md +1 -0
- package/packages/router/src/Route.tsx +61 -27
- package/packages/router/src/Router.tsx +63 -14
- package/packages/router/src/history.ts +8 -1
- package/packages/router/src/index.ts +1 -1
- package/packages/router/src/utils.ts +9 -4
- package/packages/sass-utils/src/linear-gradient.scss +9 -4
- package/packages/sass-utils/src/scale.1080.scss +3 -1
- package/packages/sass-utils/src/scale.720.scss +1 -1
- package/packages/time/README.md +4 -1
- package/packages/time/src/Time.ts +35 -13
- package/packages/time/src/adapters/24iMediaTimeApi.ts +47 -0
- package/packages/time/src/constants.ts +1 -0
- package/packages/time/src/services/24iMediaTimeApi/24iMediaTimeApi.ts +43 -0
- package/packages/time/src/services/24iMediaTimeApi/index.ts +6 -0
- package/packages/toast/src/ToastService.scss +1 -0
- package/packages/toast/src/ToastService.tsx +16 -5
- package/packages/types-bigscreen-jsx/README.md +5 -4
- package/packages/types-bigscreen-jsx/index.d.ts +72 -67
- package/packages/utils/README.md +27 -0
- package/packages/utils/src/elementUtils.ts +25 -0
- package/packages/utils/src/forceReflow.ts +14 -0
- package/packages/utils/src/index.ts +8 -0
- package/packages/utils/src/keyPress/index.ts +6 -0
- package/packages/utils/src/keyPress/keyPressSimulator.ts +74 -0
- package/packages/utils/src/keyPress/simulateKeyPress.ts +25 -0
- package/packages/utils/src/scaledImage.ts +6 -3
- package/packages/utils/src/textUtils.ts +46 -14
- package/packages/utils/src/wait.ts +3 -1
- package/packages/utils/src/xhr/xhrSend.ts +3 -1
- package/packages/utils/src/xhr/xhrSendRetry.ts +3 -1
- package/packages/zapping/src/ChannelZapping.ts +9 -0
- package/packages/zapping/src/Zapping.tsx +10 -0
- package/utils/release/release.ts +156 -0
- package/packages/driver-tizen/src/types.ts +0 -14
- package/packages/focus/src/Layout/__test__/Base.spec.ts +0 -180
- package/packages/focus/src/Layout/__test__/Horizontal.spec.ts +0 -94
- package/packages/focus/src/Layout/__test__/Matrix.spec.ts +0 -261
- package/packages/focus/src/Layout/__test__/Vertical.spec.ts +0 -46
- package/packages/focus/src/Layout/__test__/isRtl.spec.ts +0 -23
- package/packages/focus/src/Layout/__test__/shared.ts +0 -19
- 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
|
-
[](https://coveralls.io/github/24i/smartapps-bigscreen-sdk?branch=development)
|
|
9
|
+
[](https://github.com/24i/smartapps-bigscreen-sdk/actions/workflows/pull-request.yml)
|
|
10
|
+
[](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.
|
|
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
|
|
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
|
|
21
|
-
"test:cached": "npm run jest
|
|
22
|
-
"coverage": "npm run jest -- --runInBand --coverage
|
|
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/
|
|
41
|
-
"@24i/
|
|
42
|
-
"@
|
|
43
|
-
"@
|
|
44
|
-
"@
|
|
45
|
-
"
|
|
46
|
-
"
|
|
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.
|
|
54
|
-
"@babel/preset-env": "^7.
|
|
55
|
-
"@types/fs-extra": "^
|
|
56
|
-
"@types/
|
|
57
|
-
"@types/
|
|
58
|
-
"@types/
|
|
59
|
-
"@types/
|
|
60
|
-
"@types/
|
|
61
|
-
"
|
|
62
|
-
"
|
|
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",
|
|
63
70
|
"coveralls": "^3.1.1",
|
|
64
71
|
"cross-env": "^7.0.3",
|
|
65
|
-
"fs-extra": "^
|
|
72
|
+
"fs-extra": "^11.2.0",
|
|
66
73
|
"full-icu": "^1.5.0",
|
|
67
74
|
"identity-obj-proxy": "^3.0.0",
|
|
68
|
-
"inquirer": "^9.
|
|
69
|
-
"jest": "^29.0
|
|
70
|
-
"jest-canvas-mock": "^2.
|
|
71
|
-
"jest-environment-jsdom": "^29.0
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"sass
|
|
76
|
-
"
|
|
77
|
-
"ts-
|
|
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.
|
|
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/
|
|
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
|
|
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
|
|
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.
|
|
70
|
+
const { currentTime } = this.player.mediaInfo || {};
|
|
71
71
|
if (this.player.live) {
|
|
72
72
|
try {
|
|
73
|
-
const { programEnd = NaN } = this.player.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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 @@
|
|
|
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
|
+
}
|