@gcorevideo/player 2.28.25 → 2.28.26

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 (143) hide show
  1. package/dist/core.js +38 -32
  2. package/dist/index.css +223 -223
  3. package/dist/index.embed.js +95 -38
  4. package/dist/index.js +227 -122
  5. package/lib/Player.d.ts.map +1 -1
  6. package/lib/index.core.d.ts +1 -1
  7. package/lib/index.core.d.ts.map +1 -1
  8. package/lib/index.core.js +1 -1
  9. package/lib/index.plugins.d.ts +34 -34
  10. package/lib/index.plugins.d.ts.map +1 -1
  11. package/lib/index.plugins.js +34 -34
  12. package/lib/playback/types.d.ts.map +1 -1
  13. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  14. package/lib/plugins/bottom-gear/BottomGear.js +3 -1
  15. package/lib/plugins/clappr-nerd-stats/speedtest/index.d.ts.map +1 -1
  16. package/lib/plugins/clappr-nerd-stats/speedtest/index.js +9 -5
  17. package/lib/plugins/clappr-nerd-stats/speedtest/types.d.ts.map +1 -1
  18. package/lib/plugins/clappr-nerd-stats/utils.d.ts +2 -2
  19. package/lib/plugins/clips/utils.d.ts.map +1 -1
  20. package/lib/plugins/cmcd-config/CmcdConfig.js +1 -1
  21. package/lib/plugins/favicon/Favicon.d.ts.map +1 -1
  22. package/lib/plugins/google-analytics/GoogleAnalytics.d.ts.map +1 -1
  23. package/lib/plugins/google-analytics/GoogleAnalytics.js +10 -3
  24. package/lib/plugins/kibo/index.d.ts.map +1 -1
  25. package/lib/plugins/kibo/index.js +69 -20
  26. package/lib/plugins/level-selector/QualityLevels.js +2 -2
  27. package/lib/plugins/logo/Logo.d.ts.map +1 -1
  28. package/lib/plugins/logo/Logo.js +19 -15
  29. package/lib/plugins/logo/utils/index.d.ts.map +1 -1
  30. package/lib/plugins/logo/utils/index.js +11 -7
  31. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  32. package/lib/plugins/multi-camera/MultiCamera.d.ts.map +1 -1
  33. package/lib/plugins/multi-camera/MultiCamera.js +42 -20
  34. package/lib/plugins/picture-in-picture/PictureInPicture.d.ts.map +1 -1
  35. package/lib/plugins/picture-in-picture/PictureInPicture.js +3 -2
  36. package/lib/plugins/share/Share.d.ts.map +1 -1
  37. package/lib/plugins/share/Share.js +17 -12
  38. package/lib/plugins/skip-time/SkipTime.d.ts.map +1 -1
  39. package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts.map +1 -1
  40. package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
  41. package/lib/plugins/subtitles/ClosedCaptions.js +4 -3
  42. package/lib/plugins/thumbnails/Thumbnails.js +2 -3
  43. package/lib/plugins/thumbnails/utils.d.ts.map +1 -1
  44. package/lib/plugins/utils/fullscreen.d.ts.map +1 -1
  45. package/lib/plugins/utils.d.ts.map +1 -1
  46. package/lib/plugins/utils.js +1 -1
  47. package/lib/plugins/vast-ads/VastAds.d.ts.map +1 -1
  48. package/lib/plugins/vast-ads/VastAds.js +2 -1
  49. package/lib/plugins/vast-ads/loaderxml.d.ts.map +1 -1
  50. package/lib/plugins/vast-ads/loaderxml.js +8 -5
  51. package/lib/plugins/vast-ads/roll.d.ts +2 -2
  52. package/lib/plugins/vast-ads/roll.d.ts.map +1 -1
  53. package/lib/plugins/vast-ads/roll.js +16 -10
  54. package/lib/plugins/vast-ads/rollmanager.d.ts.map +1 -1
  55. package/lib/plugins/vast-ads/rollmanager.js +17 -7
  56. package/lib/plugins/vast-ads/sctemanager.d.ts +1 -1
  57. package/lib/plugins/vast-ads/sctemanager.d.ts.map +1 -1
  58. package/lib/plugins/vast-ads/sctemanager.js +6 -5
  59. package/lib/plugins/vast-ads/types.d.ts.map +1 -1
  60. package/lib/plugins/vast-ads/urlhandler.d.ts.map +1 -1
  61. package/lib/plugins/vast-ads/xmlhttprequest.d.ts.map +1 -1
  62. package/lib/plugins/vast-ads/xmlhttprequest.js +3 -2
  63. package/lib/plugins/vast-ads/xmlmerge.d.ts.map +1 -1
  64. package/lib/plugins/vast-ads/xmlmerge.js +4 -3
  65. package/lib/types.d.ts +1 -1
  66. package/lib/types.d.ts.map +1 -1
  67. package/lib/utils/clickaway.d.ts.map +1 -1
  68. package/lib/utils/mediaSources.d.ts.map +1 -1
  69. package/lib/utils/mediaSources.js +1 -3
  70. package/lib/utils/types.d.ts.map +1 -1
  71. package/lib/version.js +2 -2
  72. package/package.json +2 -2
  73. package/src/Player.ts +10 -10
  74. package/src/__tests__/Player.test.ts +33 -10
  75. package/src/index.core.ts +9 -1
  76. package/src/index.plugins.ts +35 -35
  77. package/src/playback/BasePlayback.ts +1 -1
  78. package/src/playback/__tests__/HTML5Video.test.ts +10 -4
  79. package/src/playback/dash-playback/__tests__/DashPlayback.test.ts +10 -38
  80. package/src/playback/hls-playback/__tests__/HlsPlayback.test.ts +12 -45
  81. package/src/playback/types.ts +0 -1
  82. package/src/playback.types.ts +1 -2
  83. package/src/plugins/audio-selector/AudioTracks.ts +1 -1
  84. package/src/plugins/audio-selector/__tests__/AudioTracks.test.ts +30 -11
  85. package/src/plugins/bottom-gear/BottomGear.ts +3 -2
  86. package/src/plugins/clappr-nerd-stats/NerdStats.ts +1 -1
  87. package/src/plugins/clappr-nerd-stats/speedtest/index.ts +104 -82
  88. package/src/plugins/clappr-nerd-stats/speedtest/types.ts +3 -3
  89. package/src/plugins/clappr-nerd-stats/utils.ts +2 -2
  90. package/src/plugins/clappr-stats/__tests__/ClapprStats.test.ts +30 -18
  91. package/src/plugins/clips/utils.ts +5 -1
  92. package/src/plugins/cmcd-config/CmcdConfig.ts +1 -1
  93. package/src/plugins/error-screen/__tests__/ErrorScreen.test.ts +21 -15
  94. package/src/plugins/favicon/Favicon.ts +73 -49
  95. package/src/plugins/google-analytics/GoogleAnalytics.ts +93 -58
  96. package/src/plugins/kibo/index.ts +183 -109
  97. package/src/plugins/level-selector/QualityLevels.ts +2 -2
  98. package/src/plugins/logo/Logo.ts +134 -105
  99. package/src/plugins/logo/utils/index.ts +27 -20
  100. package/src/plugins/media-control/MediaControl.ts +12 -6
  101. package/src/plugins/multi-camera/MultiCamera.ts +218 -157
  102. package/src/plugins/picture-in-picture/PictureInPicture.ts +41 -37
  103. package/src/plugins/playback-rate/__tests__/PlaybackRate.test.ts +25 -11
  104. package/src/plugins/poster/__tests__/Poster.test.ts +8 -9
  105. package/src/plugins/share/Share.ts +85 -60
  106. package/src/plugins/skip-time/SkipTime.ts +5 -1
  107. package/src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts +8 -5
  108. package/src/plugins/subtitles/ClosedCaptions.ts +7 -5
  109. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +0 -1
  110. package/src/plugins/thumbnails/Thumbnails.ts +22 -21
  111. package/src/plugins/thumbnails/__tests__/Thumbnails.test.ts +14 -7
  112. package/src/plugins/thumbnails/utils.ts +3 -1
  113. package/src/plugins/typings/globals.d.ts +7 -7
  114. package/src/plugins/typings/workers.d.ts +3 -3
  115. package/src/plugins/utils/fullscreen.ts +2 -2
  116. package/src/plugins/utils.ts +17 -13
  117. package/src/plugins/vast-ads/VastAds.ts +4 -5
  118. package/src/plugins/vast-ads/loaderxml.ts +142 -101
  119. package/src/plugins/vast-ads/roll.ts +381 -284
  120. package/src/plugins/vast-ads/rollmanager.ts +214 -170
  121. package/src/plugins/vast-ads/sctemanager.ts +66 -48
  122. package/src/plugins/vast-ads/types.ts +15 -9
  123. package/src/plugins/vast-ads/urlhandler.ts +18 -13
  124. package/src/plugins/vast-ads/xmlhttprequest.ts +25 -20
  125. package/src/plugins/vast-ads/xmlmerge.ts +42 -32
  126. package/src/plugins/video360/VRControls.js +50 -42
  127. package/src/plugins/video360/VREffect.js +298 -206
  128. package/src/plugins/video360/Video360.js +553 -423
  129. package/src/plugins/video360/orbit-oriention-controls.js +526 -421
  130. package/src/plugins/video360/utils.js +18 -18
  131. package/src/types.ts +5 -3
  132. package/src/typings/@clappr/core/error_mixin.d.ts +9 -9
  133. package/src/typings/@clappr/core/index.d.ts +1 -3
  134. package/src/typings/@clappr/core/playback.d.ts +3 -3
  135. package/src/typings/@clappr/index.d.ts +1 -1
  136. package/src/typings/globals.d.ts +15 -15
  137. package/src/utils/__tests__/mediaSources.test.ts +42 -26
  138. package/src/utils/clickaway.ts +24 -24
  139. package/src/utils/errors.ts +2 -2
  140. package/src/utils/mediaSources.ts +5 -4
  141. package/src/utils/types.ts +1 -1
  142. package/src/version.ts +2 -2
  143. package/tsconfig.tsbuildinfo +1 -1
@@ -27,17 +27,9 @@ describe('DashPlayback', () => {
27
27
  globalThis.WebKitMediaSource = undefined
28
28
  })
29
29
  describe.each([
30
- [
31
- 'http://example.com/test.mpd',
32
- undefined,
33
- false
34
- ],
35
- [
36
- 'http://example.com/123123_1232',
37
- 'application/dash+xml',
38
- false
39
- ],
40
- ])("%s %s", (resource, mimeType, expected) => {
30
+ ['http://example.com/test.mpd', undefined, false],
31
+ ['http://example.com/123123_1232', 'application/dash+xml', false],
32
+ ])('%s %s', (resource, mimeType, expected) => {
41
33
  it('should return false', () => {
42
34
  expect(DashPlayback.canPlay(resource, mimeType)).toBe(expected)
43
35
  })
@@ -51,36 +43,16 @@ describe('DashPlayback', () => {
51
43
  }
52
44
  })
53
45
  describe.each([
54
- [
55
- 'http://example.com/test.mpd',
56
- undefined,
57
- true
58
- ],
59
- [
60
- 'http://example.com/123123_1232',
61
- 'application/dash+xml',
62
- true
63
- ],
64
- [
65
- 'http://example.com/123123_1232.mpd',
66
- 'video/mp4',
67
- false
68
- ],
69
- [
70
- 'http://example.com/123123_1232.m3u8',
71
- 'application/dash+xml',
72
- true
73
- ],
74
- [
75
- 'http://example.com/123123_1232',
76
- undefined,
77
- false
78
- ],
79
- ])("%s %s", (resource, mimeType, expected) => {
46
+ ['http://example.com/test.mpd', undefined, true],
47
+ ['http://example.com/123123_1232', 'application/dash+xml', true],
48
+ ['http://example.com/123123_1232.mpd', 'video/mp4', false],
49
+ ['http://example.com/123123_1232.m3u8', 'application/dash+xml', true],
50
+ ['http://example.com/123123_1232', undefined, false],
51
+ ])('%s %s', (resource, mimeType, expected) => {
80
52
  it('should respect the mime type if present and the file extention otherwise', () => {
81
53
  expect(DashPlayback.canPlay(resource, mimeType)).toBe(expected)
82
54
  })
83
55
  })
84
56
  })
85
57
  })
86
- })
58
+ })
@@ -6,7 +6,7 @@ import HlsPlayback from '../HlsPlayback'
6
6
  vi.mock('hls.js', () => ({
7
7
  default: {
8
8
  isSupported: vi.fn(),
9
- }
9
+ },
10
10
  }))
11
11
 
12
12
  describe('HlsPlayback', () => {
@@ -16,19 +16,10 @@ describe('HlsPlayback', () => {
16
16
  vi.mocked(HLSJS.isSupported).mockReturnValue(false)
17
17
  })
18
18
  describe.each([
19
- [
20
- '/123123_1232',
21
- 'application/x-mpegurl',
22
- ],
23
- [
24
- '/123123_1232',
25
- 'application/vnd.apple.mpegurl',
26
- ],
27
- [
28
- '/123123_1232.m3u8',
29
- undefined
30
- ]
31
- ])("%s %s", (resource, mimeType) => {
19
+ ['/123123_1232', 'application/x-mpegurl'],
20
+ ['/123123_1232', 'application/vnd.apple.mpegurl'],
21
+ ['/123123_1232.m3u8', undefined],
22
+ ])('%s %s', (resource, mimeType) => {
32
23
  it('should return false', () => {
33
24
  expect(HlsPlayback.canPlay(resource, mimeType)).toBe(false)
34
25
  })
@@ -39,37 +30,13 @@ describe('HlsPlayback', () => {
39
30
  vi.mocked(HLSJS.isSupported).mockReturnValue(true)
40
31
  })
41
32
  describe.each([
42
- [
43
- '/123123_1232',
44
- 'application/x-mpegurl',
45
- true,
46
- ],
47
- [
48
- '/123123_1232',
49
- 'application/vnd.apple.mpegurl',
50
- true,
51
- ],
52
- [
53
- '/123123_1232.m3u8',
54
- undefined,
55
- true,
56
- ],
57
- [
58
- '/123123_1232.mpd',
59
- undefined,
60
- false
61
- ],
62
- [
63
- '/123123_1232.m3u8',
64
- 'video/mp4',
65
- false
66
- ],
67
- [
68
- '/123123_1232',
69
- 'video/mp4',
70
- false
71
- ],
72
- ])("%s %s", (resource, mimeType, expected) => {
33
+ ['/123123_1232', 'application/x-mpegurl', true],
34
+ ['/123123_1232', 'application/vnd.apple.mpegurl', true],
35
+ ['/123123_1232.m3u8', undefined, true],
36
+ ['/123123_1232.mpd', undefined, false],
37
+ ['/123123_1232.m3u8', 'video/mp4', false],
38
+ ['/123123_1232', 'video/mp4', false],
39
+ ])('%s %s', (resource, mimeType, expected) => {
73
40
  it('should respect the mime type if present and file extention otherwise', () => {
74
41
  expect(HlsPlayback.canPlay(resource, mimeType)).toBe(expected)
75
42
  })
@@ -1,4 +1,3 @@
1
-
2
1
  export enum PlaybackEvents {
3
2
  /**
4
3
  * Emitted when the playback rate changes.
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Playback time position in seconds since the beginning of the stream.
3
- * For the live streams this is limited to the length of a segment. When DVR is enabled, this refers to the
3
+ * For the live streams this is limited to the length of a segment. When DVR is enabled, this refers to the
4
4
  * @public
5
5
  */
6
6
  export type TimeValue = number
@@ -144,4 +144,3 @@ export interface PlaybackError {
144
144
  icon?: string
145
145
  }
146
146
  }
147
-
@@ -221,7 +221,7 @@ export class AudioTracks extends UICorePlugin {
221
221
  return (
222
222
  this.$(
223
223
  '#gplayer-audiotracks-menu a' +
224
- (id !== undefined ? `[data-item="${id}"]` : ''),
224
+ (id !== undefined ? `[data-item="${id}"]` : ''),
225
225
  ) as ZeptoResult
226
226
  ).parent()
227
227
  }
@@ -35,7 +35,9 @@ describe('AudioTracks', () => {
35
35
  expect(audioTracks.$el.find('#gplayer-audiotracks-button').length).toBe(1)
36
36
  })
37
37
  it('should render menu hidden', () => {
38
- expect(audioTracks.$el.find('#gplayer-audiotracks-menu').css('display')).toBe('none')
38
+ expect(
39
+ audioTracks.$el.find('#gplayer-audiotracks-menu').css('display'),
40
+ ).toBe('none')
39
41
  })
40
42
  })
41
43
  describe('until audio tracks are available', () => {
@@ -98,11 +100,17 @@ describe('AudioTracks', () => {
98
100
  expect(
99
101
  audioTracks.$el.find('#gplayer-audiotracks-menu').css('display'),
100
102
  ).toBe('none')
101
- expect(audioTracks.$el.find('#gplayer-audiotracks-button').attr('aria-expanded')).toBe('false')
103
+ expect(
104
+ audioTracks.$el
105
+ .find('#gplayer-audiotracks-button')
106
+ .attr('aria-expanded'),
107
+ ).toBe('false')
102
108
  })
103
109
  it('should add changing class to the button', () => {
104
110
  expect(
105
- audioTracks.$el.find('#gplayer-audiotracks-button').hasClass('changing'),
111
+ audioTracks.$el
112
+ .find('#gplayer-audiotracks-button')
113
+ .hasClass('changing'),
106
114
  ).toBe(true)
107
115
  })
108
116
  describe('when current audio track changes', () => {
@@ -140,14 +148,13 @@ describe('AudioTracks', () => {
140
148
  )
141
149
  expect(selectedItem.text().trim()).toBe('Spanish')
142
150
  expect(
143
- selectedItem
144
- .find('a[data-item]')
145
- .hasClass('gcore-skin-active'),
151
+ selectedItem.find('a[data-item]').hasClass('gcore-skin-active'),
146
152
  ).toBe(true)
147
153
  })
148
154
  it('should unhighlight any previously highlighted menu item', () => {
149
155
  expect(
150
- audioTracks.$el.find('#gplayer-audiotracks-menu li.current').length,
156
+ audioTracks.$el.find('#gplayer-audiotracks-menu li.current')
157
+ .length,
151
158
  ).toBe(1)
152
159
  expect(
153
160
  audioTracks.$el.find(
@@ -164,8 +171,14 @@ describe('AudioTracks', () => {
164
171
  audioTracks.$el.find('#gplayer-audiotracks-button').click()
165
172
  })
166
173
  it('should collapse the menu', () => {
167
- expect(audioTracks.$el.find('#gplayer-audiotracks-menu').css('display')).toBe('none')
168
- expect(audioTracks.$el.find('#gplayer-audiotracks-button').attr('aria-expanded')).toBe('false')
174
+ expect(
175
+ audioTracks.$el.find('#gplayer-audiotracks-menu').css('display'),
176
+ ).toBe('none')
177
+ expect(
178
+ audioTracks.$el
179
+ .find('#gplayer-audiotracks-button')
180
+ .attr('aria-expanded'),
181
+ ).toBe('false')
169
182
  })
170
183
  })
171
184
  describe('when media control is rendered', () => {
@@ -188,8 +201,14 @@ describe('AudioTracks', () => {
188
201
  core.activeContainer.emit(Events.CONTAINER_CLICK)
189
202
  })
190
203
  it('should hide the menu', () => {
191
- expect(audioTracks.$el.find('#gplayer-audiotracks-menu').css('display')).toBe('none')
192
- expect(audioTracks.$el.find('#gplayer-audiotracks-button').attr('aria-expanded')).toBe('false')
204
+ expect(
205
+ audioTracks.$el.find('#gplayer-audiotracks-menu').css('display'),
206
+ ).toBe('none')
207
+ expect(
208
+ audioTracks.$el
209
+ .find('#gplayer-audiotracks-button')
210
+ .attr('aria-expanded'),
211
+ ).toBe('false')
193
212
  })
194
213
  })
195
214
  })
@@ -332,8 +332,9 @@ export class BottomGear extends UICorePlugin {
332
332
  }
333
333
 
334
334
  private clampPopup($subMenu: ZeptoResult) {
335
- const availableHeight =
336
- this.core.getPlugin('media_control').getAvailablePopupHeight()
335
+ const availableHeight = this.core
336
+ .getPlugin('media_control')
337
+ .getAvailablePopupHeight()
337
338
  $subMenu.css('max-height', `${availableHeight}px`)
338
339
  $subMenu
339
340
  .find('.gear-sub-menu')
@@ -6,7 +6,7 @@ import {
6
6
  Container,
7
7
  Playback,
8
8
  } from '@clappr/core'
9
- import { reportError/* , trace */ } from '@gcorevideo/utils'
9
+ import { reportError /* , trace */ } from '@gcorevideo/utils'
10
10
  import Mousetrap from 'mousetrap'
11
11
  import assert from 'assert'
12
12
 
@@ -1,67 +1,80 @@
1
- import { type Server, type TestStatusInfo, Speedtest } from './Speedtest.js';
2
- import { SpeedtestMetrics } from './types.js';
1
+ import { type Server, type TestStatusInfo, Speedtest } from './Speedtest.js'
2
+ import { SpeedtestMetrics } from './types.js'
3
3
 
4
- const DIGITS_THRESHOLD = 99999;
5
- const DEFAULT_DOWNLOAD_SPEED = '0.00';
4
+ const DIGITS_THRESHOLD = 99999
5
+ const DEFAULT_DOWNLOAD_SPEED = '0.00'
6
6
 
7
- const DRAW_SIZE = 5;
7
+ const DRAW_SIZE = 5
8
8
 
9
9
  // const T = 'plugins.clappr_nerd_stats.speedtest';
10
10
 
11
11
  function limitDigits(value: number): string {
12
- return value > DIGITS_THRESHOLD ? '> ' + DIGITS_THRESHOLD : value.toFixed(2);
12
+ return value > DIGITS_THRESHOLD ? '> ' + DIGITS_THRESHOLD : value.toFixed(2)
13
13
  }
14
14
 
15
15
  function getElementById(id: string): Element | null {
16
- return document.getElementById(id);
16
+ return document.getElementById(id)
17
17
  }
18
18
 
19
- const speedTest = new Speedtest();
19
+ const speedTest = new Speedtest()
20
20
 
21
- const speedtestResults: number[] = [];
21
+ const speedtestResults: number[] = []
22
22
 
23
- const serversList: Server[] = [];
23
+ const serversList: Server[] = []
24
24
 
25
25
  const getColor = (speedValue: number): string => {
26
26
  if (speedValue < 3) {
27
- return '#df564d';
27
+ return '#df564d'
28
28
  } else if (speedValue < 7) {
29
- return '#df934d';
29
+ return '#df934d'
30
30
  } else if (speedValue < 13) {
31
- return '#dfd04d';
31
+ return '#dfd04d'
32
32
  } else if (speedValue < 25) {
33
- return '#c2df4d';
33
+ return '#c2df4d'
34
34
  } else {
35
- return '#73df4d';
35
+ return '#73df4d'
36
36
  }
37
- };
37
+ }
38
38
 
39
39
  export function drawSpeedTestResults() {
40
- const canvas = document.getElementById('nerd-stats-speed-test-canvas');
40
+ const canvas = document.getElementById('nerd-stats-speed-test-canvas')
41
41
  if (!canvas) {
42
- return;
42
+ return
43
43
  }
44
- const ctx = (canvas as HTMLCanvasElement).getContext('2d');
44
+ const ctx = (canvas as HTMLCanvasElement).getContext('2d')
45
45
  if (!ctx) {
46
- return;
46
+ return
47
47
  }
48
- ctx.clearRect(0, 0, (canvas as HTMLCanvasElement).width, (canvas as HTMLCanvasElement).height);
48
+ ctx.clearRect(
49
+ 0,
50
+ 0,
51
+ (canvas as HTMLCanvasElement).width,
52
+ (canvas as HTMLCanvasElement).height,
53
+ )
49
54
 
50
- const barWidth = (canvas as HTMLCanvasElement).width / DRAW_SIZE;
55
+ const barWidth = (canvas as HTMLCanvasElement).width / DRAW_SIZE
51
56
 
52
57
  for (let i = 0; i < speedtestResults.length; i++) {
53
- const height = (speedtestResults[i] / 100) * (canvas as HTMLCanvasElement).height; // assuming max speed is 100 for 100% height
54
-
55
- ctx.fillStyle = getColor(speedtestResults[i]);
56
- ctx.fillRect(i * barWidth, (canvas as HTMLCanvasElement).height - height, barWidth, height);
58
+ const height =
59
+ (speedtestResults[i] / 100) * (canvas as HTMLCanvasElement).height // assuming max speed is 100 for 100% height
60
+
61
+ ctx.fillStyle = getColor(speedtestResults[i])
62
+ ctx.fillRect(
63
+ i * barWidth,
64
+ (canvas as HTMLCanvasElement).height - height,
65
+ barWidth,
66
+ height,
67
+ )
57
68
  }
58
69
  }
59
70
 
60
- let inited: Promise<void> | null = null;
71
+ let inited: Promise<void> | null = null
61
72
 
62
- export const initSpeedTest = (customMetrics: SpeedtestMetrics): Promise<void> => {
73
+ export const initSpeedTest = (
74
+ customMetrics: SpeedtestMetrics,
75
+ ): Promise<void> => {
63
76
  if (inited !== null) {
64
- return inited;
77
+ return inited
65
78
  }
66
79
  inited = (async () => {
67
80
  // TODO: fix server selection
@@ -70,126 +83,135 @@ export const initSpeedTest = (customMetrics: SpeedtestMetrics): Promise<void> =>
70
83
 
71
84
  // SPEEDTEST_SERVERS[0].server = `http://${data.Server}.fe.gc.onl/speedtest/`;
72
85
 
73
- speedTest.onupdate = function (data: TestStatusInfo) { //callback to update data in UI
74
- if (![0, 1].includes(data.testState) && typeof data.dlStatus === 'number') {
75
- const dlSpeed = limitDigits(data.dlStatus);
76
- const el = getElementById('dlText');
86
+ speedTest.onupdate = function (data: TestStatusInfo) {
87
+ //callback to update data in UI
88
+ if (
89
+ ![0, 1].includes(data.testState) &&
90
+ typeof data.dlStatus === 'number'
91
+ ) {
92
+ const dlSpeed = limitDigits(data.dlStatus)
93
+ const el = getElementById('dlText')
77
94
  if (el) {
78
- el.textContent = dlSpeed;
95
+ el.textContent = dlSpeed
79
96
  }
80
- customMetrics.connectionSpeed = rankConnectionSpeed(data.dlStatus);
97
+ customMetrics.connectionSpeed = rankConnectionSpeed(data.dlStatus)
81
98
  }
82
99
 
83
- const pingStatus = parseFloat(data.pingStatus);
100
+ const pingStatus = parseFloat(data.pingStatus)
84
101
  if (pingStatus > 0) {
85
- const el = getElementById('pingText');
102
+ const el = getElementById('pingText')
86
103
  if (el) {
87
- el.textContent = data.pingStatus;
104
+ el.textContent = data.pingStatus
88
105
  }
89
- customMetrics.ping = pingStatus;
106
+ customMetrics.ping = pingStatus
90
107
  }
91
108
 
92
- const jitterStatus = parseFloat(data.jitterStatus);
109
+ const jitterStatus = parseFloat(data.jitterStatus)
93
110
  if (jitterStatus > 0) {
94
- const el = getElementById('jitterText');
111
+ const el = getElementById('jitterText')
95
112
  if (el) {
96
- el.textContent = data.jitterStatus;
113
+ el.textContent = data.jitterStatus
97
114
  }
98
- customMetrics.jitter = jitterStatus;
115
+ customMetrics.jitter = jitterStatus
99
116
  }
100
117
 
101
118
  if (data.dlStatus === 0) {
102
- return;
119
+ return
103
120
  }
104
121
  if (typeof data.dlStatus === 'number') {
105
- speedtestResults.push(data.dlStatus);
122
+ speedtestResults.push(data.dlStatus)
106
123
  }
107
124
 
108
125
  // Keep only the last 10 results
109
126
  if (speedtestResults.length > DRAW_SIZE) {
110
- speedtestResults.shift();
127
+ speedtestResults.shift()
111
128
  }
112
129
 
113
- drawSpeedTestResults();
114
- };
130
+ drawSpeedTestResults()
131
+ }
115
132
 
116
- speedTest.onend = function (aborted: boolean) { //callback for test ended/aborted
117
- if (aborted) { //if the test was aborted, clear the UI and prepare for new test
133
+ speedTest.onend = function (aborted: boolean) {
134
+ //callback for test ended/aborted
135
+ if (aborted) {
136
+ //if the test was aborted, clear the UI and prepare for new test
118
137
  // TODO: fix
119
- const el = getElementById('dlText');
138
+ const el = getElementById('dlText')
120
139
  if (el) {
121
- el.textContent = DEFAULT_DOWNLOAD_SPEED;
140
+ el.textContent = DEFAULT_DOWNLOAD_SPEED
122
141
  }
123
142
  }
124
- };
143
+ }
125
144
 
126
145
  const myinfoUrl = 'https://gcore.com/.well-known/cdn-debug/json'
127
146
  // await fetch('https://iam.gcdn.co/info/json')
128
147
  await fetch(myinfoUrl)
129
- .then(r => r.json())
130
- .then(data => {
148
+ .then((r) => r.json())
149
+ .then((data) => {
131
150
  // const country = data['Server Country code'].toLowerCase();
132
151
  const country = getCountryCodeFromClientHeaders(data.client_headers)
133
- const server = serversList.find(s => s.country === country) || serversList[0];
152
+ const server =
153
+ serversList.find((s) => s.country === country) || serversList[0]
134
154
  if (!server) {
135
- throw new Error('Failed to select a server');
155
+ throw new Error('Failed to select a server')
136
156
  }
137
- speedTest.addTestPoint(server);
138
- speedTest.setSelectedServer(server);
139
- });
140
- })();
157
+ speedTest.addTestPoint(server)
158
+ speedTest.setSelectedServer(server)
159
+ })
160
+ })()
141
161
 
142
- return inited;
143
- };
162
+ return inited
163
+ }
144
164
 
145
165
  export const stopSpeedtest = () => {
146
166
  if (speedTest.getState() === 3) {
147
- speedTest.abort();
167
+ speedTest.abort()
148
168
  }
149
- };
169
+ }
150
170
 
151
- export const startSpeedtest = () => {
171
+ export const startSpeedtest = () => {
152
172
  if (speedTest.getState() !== 3) {
153
- speedTest.start();
173
+ speedTest.start()
154
174
  }
155
- };
175
+ }
156
176
 
157
177
  export const clearSpeedTestResults = () => {
158
- speedtestResults.splice(0, speedtestResults.length);
159
- };
178
+ speedtestResults.splice(0, speedtestResults.length)
179
+ }
160
180
 
161
181
  export function configureSpeedTest(servers: Server[]) {
162
182
  // speedTest.addTestPoints(servers);
163
- serversList.push(...servers);
183
+ serversList.push(...servers)
164
184
  }
165
185
 
166
- type ConnectionSpeed = 0 | 1 | 2 | 3 | 4 | 5;
186
+ type ConnectionSpeed = 0 | 1 | 2 | 3 | 4 | 5
167
187
 
168
188
  function rankConnectionSpeed(dlSpeed: number): ConnectionSpeed {
169
189
  if (dlSpeed >= 100) {
170
- return 5;
190
+ return 5
171
191
  }
172
192
  if (dlSpeed >= 25) {
173
- return 4;
193
+ return 4
174
194
  }
175
195
  if (dlSpeed >= 10) {
176
- return 3;
196
+ return 3
177
197
  }
178
198
  if (dlSpeed >= 2) {
179
- return 2;
199
+ return 2
180
200
  }
181
201
  if (dlSpeed >= 0.5) {
182
- return 1;
202
+ return 1
183
203
  }
184
- return 0;
204
+ return 0
185
205
  }
186
206
 
187
- function getCountryCodeFromClientHeaders(clientHeaders: Record<string, string>): string {
207
+ function getCountryCodeFromClientHeaders(
208
+ clientHeaders: Record<string, string>,
209
+ ): string {
188
210
  if (clientHeaders && clientHeaders['country']) {
189
- const m = clientHeaders['country'].match(/'code':\s*'([A-Za-z]{2})'/);
211
+ const m = clientHeaders['country'].match(/'code':\s*'([A-Za-z]{2})'/)
190
212
  if (m) {
191
- return m[1].toLowerCase();
213
+ return m[1].toLowerCase()
192
214
  }
193
215
  }
194
- return 'lu';
216
+ return 'lu'
195
217
  }
@@ -1,5 +1,5 @@
1
1
  export type SpeedtestMetrics = {
2
- ping: number;
3
- jitter: number;
4
- connectionSpeed: number;
2
+ ping: number
3
+ jitter: number
4
+ connectionSpeed: number
5
5
  }
@@ -1,5 +1,5 @@
1
- import { ZeptoResult } from "../../types"
2
- import { SpeedtestMetrics } from "./speedtest/types"
1
+ import { ZeptoResult } from '../../types'
2
+ import { SpeedtestMetrics } from './speedtest/types'
3
3
 
4
4
  const qualityClasses = [
5
5
  'speedtest-quality-value-1',
@@ -4,7 +4,11 @@ import FakeTimers from '@sinonjs/fake-timers'
4
4
 
5
5
  import { ClapprStats } from '../ClapprStats'
6
6
  import { createMockCore } from '../../../testUtils'
7
- import { ClapprStatsChronograph, ClapprStatsCounter, ClapprStatsEvents } from '../types'
7
+ import {
8
+ ClapprStatsChronograph,
9
+ ClapprStatsCounter,
10
+ ClapprStatsEvents,
11
+ } from '../types'
8
12
 
9
13
  describe('ClapprStats', () => {
10
14
  let core: any
@@ -86,13 +90,15 @@ describe('ClapprStats', () => {
86
90
  core.activeContainer.trigger(CoreEvents.CONTAINER_STOP)
87
91
  })
88
92
  it('should measure', () => {
89
- expect(onReport).toHaveBeenCalledWith(expect.objectContaining({
90
- chrono: expect.objectContaining({
91
- [ClapprStatsChronograph.Session]: 60200,
93
+ expect(onReport).toHaveBeenCalledWith(
94
+ expect.objectContaining({
95
+ chrono: expect.objectContaining({
96
+ [ClapprStatsChronograph.Session]: 60200,
97
+ }),
92
98
  }),
93
- }))
99
+ )
94
100
  })
95
- })
101
+ })
96
102
  })
97
103
  describe('fps measurements', () => {
98
104
  beforeEach(async () => {
@@ -114,20 +120,26 @@ describe('ClapprStats', () => {
114
120
  core.activeContainer.trigger(CoreEvents.CONTAINER_STOP)
115
121
  })
116
122
  it('should measure fps', () => {
117
- expect(onReport).toHaveBeenNthCalledWith(1, expect.objectContaining({
118
- counters: expect.objectContaining({
119
- [ClapprStatsCounter.DecodedFrames]: 126,
120
- [ClapprStatsCounter.DroppedFrames]: 3,
121
- [ClapprStatsCounter.Fps]: expect.closeTo(25, 0),
123
+ expect(onReport).toHaveBeenNthCalledWith(
124
+ 1,
125
+ expect.objectContaining({
126
+ counters: expect.objectContaining({
127
+ [ClapprStatsCounter.DecodedFrames]: 126,
128
+ [ClapprStatsCounter.DroppedFrames]: 3,
129
+ [ClapprStatsCounter.Fps]: expect.closeTo(25, 0),
130
+ }),
122
131
  }),
123
- }))
124
- expect(onReport).toHaveBeenNthCalledWith(2, expect.objectContaining({
125
- counters: expect.objectContaining({
126
- [ClapprStatsCounter.DecodedFrames]: 275,
127
- [ClapprStatsCounter.DroppedFrames]: 4,
128
- [ClapprStatsCounter.Fps]: expect.closeTo(30, 0),
132
+ )
133
+ expect(onReport).toHaveBeenNthCalledWith(
134
+ 2,
135
+ expect.objectContaining({
136
+ counters: expect.objectContaining({
137
+ [ClapprStatsCounter.DecodedFrames]: 275,
138
+ [ClapprStatsCounter.DroppedFrames]: 4,
139
+ [ClapprStatsCounter.Fps]: expect.closeTo(30, 0),
140
+ }),
129
141
  }),
130
- }))
142
+ )
131
143
  })
132
144
  })
133
145
  })