@gcorevideo/player 2.20.8 → 2.20.9
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/dist/core.js +18 -13
- package/dist/index.css +1541 -1541
- package/dist/index.js +59 -52
- package/dist/player.d.ts +178 -126
- package/dist/plugins/index.css +665 -665
- package/dist/plugins/index.js +42 -40
- package/docs/api/player.bottomgear.md +14 -0
- package/docs/api/player.bottomgear.refresh.md +20 -0
- package/docs/api/player.clapprnerdstats.md +1 -1
- package/docs/api/player.clapprstats.exportmetrics.md +1 -1
- package/docs/api/player.clapprstats.md +1 -15
- package/docs/api/player.clapprstats.setupdatemetrics.md +2 -0
- package/docs/api/player.clipsplugin.md +1 -1
- package/docs/api/player.clipspluginsettings.md +5 -2
- package/docs/api/player.clipspluginsettings.text.md +3 -0
- package/docs/api/player.containerpluginconstructor.md +19 -0
- package/docs/api/{player.errorscreen.render.md → player.corepluginconstructor.md} +7 -6
- package/docs/api/player.errordesc.md +28 -0
- package/docs/api/player.errorscreen.md +1 -220
- package/docs/api/{player.errorscreen.bindevents.md → player.errorscreenpluginsettings.md} +7 -7
- package/docs/api/player.levelselector.md +3 -9
- package/docs/api/player.levelselectorpluginsettings.labels.md +24 -0
- package/docs/api/player.levelselectorpluginsettings.md +79 -0
- package/docs/api/player.levelselectorpluginsettings.restrictresolution.md +16 -0
- package/docs/api/player.md +93 -16
- package/docs/api/{player.errorscreen.hide.md → player.mediacontrol.currentseekpos.md} +3 -7
- package/docs/api/player.mediacontrol.disable.md +1 -1
- package/docs/api/player.mediacontrol.md +23 -2
- package/docs/api/{player.gearevents.md → player.mediacontrolevents.md} +4 -4
- package/docs/api/player.multicamera.md +1 -29
- package/docs/api/player.playbackerror.md +19 -0
- package/docs/api/{player.errorscreen.supportedversion.md → player.playbackerror.ui.md} +7 -4
- package/docs/api/player.playbackerrorcode.md +3 -3
- package/docs/api/{player.errorscreen.show.md → player.playbackrate._constructor_.md} +7 -11
- package/docs/api/player.playbackrate.md +35 -2
- package/docs/api/player.player.registerplugin.md +2 -2
- package/docs/api/player.player.unregisterplugin.md +2 -2
- package/docs/api/player.playerpluginconstructor.md +17 -0
- package/docs/api/player.share.attributes.md +3 -0
- package/docs/api/player.share.bindevents.md +3 -0
- package/docs/api/player.share.canshowshare.md +3 -0
- package/docs/api/player.share.events.md +3 -0
- package/docs/api/player.share.hideshare.md +3 -0
- package/docs/api/player.share.initializeicons.md +3 -0
- package/docs/api/player.share.md +40 -1
- package/docs/api/player.share.name.md +3 -0
- package/docs/api/player.share.onshareembedclick.md +3 -0
- package/docs/api/player.share.onsharefb.md +3 -0
- package/docs/api/player.share.onsharehide.md +3 -0
- package/docs/api/player.share.onsharelinkclick.md +3 -0
- package/docs/api/player.share.onshareshow.md +3 -0
- package/docs/api/player.share.onsharetw.md +3 -0
- package/docs/api/player.share.render.md +3 -0
- package/docs/api/player.share.showshare.md +3 -0
- package/docs/api/player.share.supportedversion.md +3 -0
- package/docs/api/player.share.template.md +3 -0
- package/docs/api/player.share.unbindevents.md +3 -0
- package/docs/api/player.skiptime.attributes.md +3 -0
- package/docs/api/player.skiptime.bindevents.md +3 -0
- package/docs/api/player.skiptime.container.md +3 -0
- package/docs/api/player.skiptime.events.md +3 -0
- package/docs/api/player.skiptime.handlerewindclicks.md +3 -0
- package/docs/api/player.skiptime.md +30 -1
- package/docs/api/player.skiptime.name.md +3 -0
- package/docs/api/player.skiptime.render.md +3 -0
- package/docs/api/player.skiptime.setback.md +3 -0
- package/docs/api/player.skiptime.setforward.md +3 -0
- package/docs/api/player.skiptime.setmidclick.md +3 -0
- package/docs/api/player.skiptime.supportedversion.md +3 -0
- package/docs/api/player.skiptime.template.md +3 -0
- package/docs/api/player.skiptime.togglefullscreen.md +3 -0
- package/docs/api/player.spinnerevents.md +4 -1
- package/docs/api/player.spinnerthreebounce.hide.md +1 -1
- package/docs/api/player.spinnerthreebounce.md +7 -5
- package/docs/api/player.spinnerthreebounce.show.md +40 -2
- package/docs/api/player.telemetry.md +1 -1
- package/docs/api/player.telemetrypluginsettings.md +1 -1
- package/docs/api/{player.errorscreen.unbindevents.md → player.telemetrysendfn.md} +6 -6
- package/lib/Player.d.ts +13 -4
- package/lib/Player.d.ts.map +1 -1
- package/lib/Player.js +17 -12
- package/lib/index.core.d.ts +0 -1
- package/lib/index.core.d.ts.map +1 -1
- package/lib/index.core.js +0 -1
- package/lib/index.plugins.d.ts +0 -1
- package/lib/index.plugins.d.ts.map +1 -1
- package/lib/index.plugins.js +0 -1
- package/lib/playback/hls-playback/HlsPlayback.d.ts.map +1 -1
- package/lib/playback/hls-playback/HlsPlayback.js +1 -1
- package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -1
- package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.d.ts +1 -1
- package/lib/plugins/clappr-nerd-stats/ClapprNerdStats.js +1 -1
- package/lib/plugins/clappr-nerd-stats/speedtest/Speedtest.d.ts.map +1 -1
- package/lib/plugins/clappr-nerd-stats/speedtest/Speedtest.js +8 -8
- package/lib/plugins/clappr-stats/ClapprStats.d.ts +4 -5
- package/lib/plugins/clappr-stats/ClapprStats.d.ts.map +1 -1
- package/lib/plugins/clappr-stats/ClapprStats.js +4 -3
- package/lib/plugins/clips/Clips.d.ts +3 -2
- package/lib/plugins/clips/Clips.d.ts.map +1 -1
- package/lib/plugins/clips/Clips.js +1 -1
- package/lib/plugins/context-menu/ContextMenu.d.ts.map +1 -1
- package/lib/plugins/dvr-controls/DvrControls.d.ts +3 -2
- package/lib/plugins/dvr-controls/DvrControls.d.ts.map +1 -1
- package/lib/plugins/dvr-controls/DvrControls.js +3 -2
- package/lib/plugins/error-screen/ErrorScreen.d.ts +12 -1
- package/lib/plugins/error-screen/ErrorScreen.d.ts.map +1 -1
- package/lib/plugins/error-screen/ErrorScreen.js +1 -1
- package/lib/plugins/index.d.ts +0 -1
- package/lib/plugins/index.d.ts.map +1 -1
- package/lib/plugins/index.js +0 -1
- package/lib/plugins/kibo/index.d.ts +0 -3
- package/lib/plugins/kibo/index.d.ts.map +1 -1
- package/lib/plugins/kibo/index.js +0 -3
- package/lib/plugins/level-selector/LevelSelector.d.ts +6 -4
- package/lib/plugins/level-selector/LevelSelector.d.ts.map +1 -1
- package/lib/plugins/level-selector/LevelSelector.js +2 -4
- package/lib/plugins/media-control/MediaControl.d.ts +4 -4
- package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
- package/lib/plugins/media-control/MediaControl.js +3 -3
- package/lib/plugins/multi-camera/MultiCamera.d.ts +3 -11
- package/lib/plugins/multi-camera/MultiCamera.d.ts.map +1 -1
- package/lib/plugins/multi-camera/MultiCamera.js +1 -1
- package/lib/plugins/poster/Poster.js +2 -2
- package/lib/plugins/share/Share.d.ts +2 -1
- package/lib/plugins/share/Share.d.ts.map +1 -1
- package/lib/plugins/share/Share.js +2 -1
- package/lib/plugins/skip-time/SkipTime.d.ts +2 -1
- package/lib/plugins/skip-time/SkipTime.d.ts.map +1 -1
- package/lib/plugins/skip-time/SkipTime.js +2 -1
- package/lib/plugins/source-controller/SourceController.js +3 -3
- package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts +6 -3
- package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.d.ts.map +1 -1
- package/lib/plugins/spinner-three-bounce/SpinnerThreeBounce.js +6 -3
- package/lib/plugins/telemetry/Telemetry.d.ts +2 -3
- package/lib/plugins/telemetry/Telemetry.d.ts.map +1 -1
- package/lib/plugins/telemetry/Telemetry.js +1 -1
- package/lib/plugins/vast-ads/VastAds.d.ts.map +1 -1
- package/lib/plugins/vast-ads/VastAds.js +3 -3
- package/lib/plugins/vast-ads/roll.d.ts +1 -1
- package/lib/plugins/vast-ads/roll.d.ts.map +1 -1
- package/lib/plugins/vast-ads/rollmanager.d.ts +1 -1
- package/lib/plugins/vast-ads/rollmanager.d.ts.map +1 -1
- package/lib/plugins/vast-ads/rollmanager.js +2 -2
- package/lib/types.d.ts +21 -5
- package/lib/types.d.ts.map +1 -1
- package/lib/utils/types.d.ts +0 -6
- package/lib/utils/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Player.ts +18 -16
- package/src/index.core.ts +0 -1
- package/src/index.plugins.ts +0 -1
- package/src/playback/hls-playback/HlsPlayback.ts +7 -11
- package/src/plugins/audio-selector/AudioSelector.ts +1 -1
- package/src/plugins/big-mute-button/BigMuteButton.ts +1 -1
- package/src/plugins/bottom-gear/BottomGear.ts +1 -1
- package/src/plugins/clappr-nerd-stats/ClapprNerdStats.ts +2 -2
- package/src/plugins/clappr-nerd-stats/speedtest/Speedtest.ts +184 -187
- package/src/plugins/clappr-stats/ClapprStats.ts +5 -4
- package/src/plugins/clips/Clips.ts +4 -3
- package/src/plugins/context-menu/ContextMenu.ts +0 -2
- package/src/plugins/dvr-controls/DvrControls.ts +3 -2
- package/src/plugins/error-screen/ErrorScreen.ts +12 -1
- package/src/plugins/favicon/Favicon.ts +1 -1
- package/src/plugins/index.ts +0 -1
- package/src/plugins/kibo/index.ts +0 -3
- package/src/plugins/level-selector/LevelSelector.ts +7 -5
- package/src/plugins/logo/Logo.ts +1 -1
- package/src/plugins/media-control/MediaControl.ts +4 -4
- package/src/plugins/multi-camera/MultiCamera.ts +4 -4
- package/src/plugins/playback-rate/PlaybackRate.ts +1 -1
- package/src/plugins/poster/Poster.ts +3 -3
- package/src/plugins/seek-time/SeekTime.ts +1 -1
- package/src/plugins/share/Share.ts +2 -1
- package/src/plugins/skip-time/SkipTime.ts +2 -1
- package/src/plugins/source-controller/SourceController.ts +3 -3
- package/src/plugins/source-controller/__tests__/SourceController.test.ts +2 -2
- package/src/plugins/spinner-three-bounce/SpinnerThreeBounce.ts +6 -3
- package/src/plugins/subtitles/Subtitles.ts +1 -1
- package/src/plugins/telemetry/Telemetry.ts +2 -2
- package/src/plugins/thumbnails/Thumbnails.ts +1 -1
- package/src/plugins/vast-ads/VastAds.ts +5 -4
- package/src/plugins/vast-ads/roll.ts +2 -1
- package/src/plugins/vast-ads/rollmanager.ts +3 -3
- package/src/types.ts +24 -5
- package/src/utils/types.ts +0 -8
- package/temp/player.api.json +540 -576
- package/tsconfig.tsbuildinfo +1 -1
- package/docs/api/player.clapprstats.onbitrate.md +0 -52
- package/docs/api/player.errorscreen.attributes.md +0 -17
- package/docs/api/player.errorscreen.container.md +0 -14
- package/docs/api/player.errorscreen.name.md +0 -14
- package/docs/api/player.errorscreen.template.md +0 -14
- package/docs/api/player.multicamera.getcameraslist.md +0 -18
- package/docs/api/player.multicamera.getcurrentcamera.md +0 -18
|
@@ -1,414 +1,411 @@
|
|
|
1
|
-
import { reportError } from '@gcorevideo/utils'
|
|
1
|
+
import { reportError } from '@gcorevideo/utils'
|
|
2
2
|
|
|
3
|
-
import SpeedtestWorkerModule from '../../../../assets/clappr-nerd-stats/speedtest/speedtest.worker.js'
|
|
3
|
+
import SpeedtestWorkerModule from '../../../../assets/clappr-nerd-stats/speedtest/speedtest.worker.js'
|
|
4
4
|
|
|
5
|
-
import { TimerId } from '../../../utils/types.js'
|
|
5
|
+
import { TimerId } from '../../../utils/types.js'
|
|
6
6
|
|
|
7
7
|
export type Server = {
|
|
8
|
-
id: number
|
|
9
|
-
country: string
|
|
10
|
-
name: string
|
|
11
|
-
server: string
|
|
12
|
-
dlURL: string
|
|
13
|
-
ulURL: string
|
|
14
|
-
pingT: number
|
|
15
|
-
pingURL: string
|
|
16
|
-
getIpURL: string
|
|
8
|
+
id: number
|
|
9
|
+
country: string
|
|
10
|
+
name: string
|
|
11
|
+
server: string
|
|
12
|
+
dlURL: string
|
|
13
|
+
ulURL: string
|
|
14
|
+
pingT: number
|
|
15
|
+
pingURL: string
|
|
16
|
+
getIpURL: string
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
type PerformanceCallback = (t: number) => void
|
|
19
|
+
type PerformanceCallback = (t: number) => void
|
|
20
20
|
|
|
21
|
-
type EndHandler = (success: boolean) => void
|
|
21
|
+
type EndHandler = (success: boolean) => void
|
|
22
22
|
|
|
23
23
|
export type TestStatusInfo = {
|
|
24
|
-
testState: -1 | 0 | 1 | 2 | 3 | 4 | 5
|
|
25
|
-
dlStatus: number | 'Fail'
|
|
26
|
-
ulStatus: number
|
|
27
|
-
pingStatus: string
|
|
28
|
-
clientIp: string
|
|
29
|
-
serverHostName: string
|
|
30
|
-
jitterStatus: string
|
|
31
|
-
dlProgress: 0 | 1
|
|
32
|
-
ulProgress: 0 | 1
|
|
33
|
-
pingProgress: 0 | 1
|
|
34
|
-
testId: string | null
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
type UpdateHandler = (data: TestStatusInfo) => void
|
|
38
|
-
|
|
39
|
-
type SelectCallback = (server: Server | null) => void
|
|
24
|
+
testState: -1 | 0 | 1 | 2 | 3 | 4 | 5
|
|
25
|
+
dlStatus: number | 'Fail' // Mbps/Mibps
|
|
26
|
+
ulStatus: number
|
|
27
|
+
pingStatus: string
|
|
28
|
+
clientIp: string
|
|
29
|
+
serverHostName: string
|
|
30
|
+
jitterStatus: string
|
|
31
|
+
dlProgress: 0 | 1
|
|
32
|
+
ulProgress: 0 | 1
|
|
33
|
+
pingProgress: 0 | 1
|
|
34
|
+
testId: string | null
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
type UpdateHandler = (data: TestStatusInfo) => void
|
|
38
|
+
|
|
39
|
+
type SelectCallback = (server: Server | null) => void
|
|
40
40
|
|
|
41
41
|
// const T = 'plugins.clappr_nerd_stats.speedtest.Speedtest';
|
|
42
42
|
|
|
43
43
|
export class Speedtest {
|
|
44
|
-
private worker: Worker | null = null
|
|
44
|
+
private worker: Worker | null = null
|
|
45
45
|
|
|
46
|
-
private workerUrl: string | null = null
|
|
46
|
+
private workerUrl: string | null = null
|
|
47
47
|
|
|
48
|
-
private _selectServerCalled = false
|
|
48
|
+
private _selectServerCalled = false
|
|
49
49
|
|
|
50
|
-
private _selectedServer: Server | null = null
|
|
50
|
+
private _selectedServer: Server | null = null
|
|
51
51
|
|
|
52
|
-
private _serverList: Server[] = []
|
|
52
|
+
private _serverList: Server[] = []
|
|
53
53
|
|
|
54
|
-
private _settings: any = {}
|
|
54
|
+
private _settings: any = {}
|
|
55
55
|
|
|
56
|
-
private _state = 0
|
|
56
|
+
private _state = 0
|
|
57
57
|
|
|
58
|
-
private updater: TimerId | null = null
|
|
58
|
+
private updater: TimerId | null = null
|
|
59
59
|
|
|
60
|
-
private _prevData: TestStatusInfo | null = null
|
|
60
|
+
private _prevData: TestStatusInfo | null = null
|
|
61
61
|
|
|
62
|
-
private _originalExtra: any
|
|
62
|
+
private _originalExtra: any // TODO
|
|
63
63
|
|
|
64
|
-
onend: EndHandler | null = null
|
|
64
|
+
onend: EndHandler | null = null
|
|
65
65
|
|
|
66
|
-
onupdate: UpdateHandler | null = null
|
|
66
|
+
onupdate: UpdateHandler | null = null
|
|
67
67
|
|
|
68
68
|
getState() {
|
|
69
|
-
return this._state
|
|
69
|
+
return this._state
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
setParameter(parameter: string, value: unknown) {
|
|
73
73
|
if (this._state !== 0) {
|
|
74
|
-
throw new Error(
|
|
74
|
+
throw new Error(
|
|
75
|
+
'You cannot change the test settings after adding server or starting the test',
|
|
76
|
+
)
|
|
75
77
|
}
|
|
76
|
-
this._settings[parameter] = value
|
|
78
|
+
this._settings[parameter] = value
|
|
77
79
|
if (parameter === 'temeletry_extra') {
|
|
78
|
-
this._originalExtra = this._settings.telemetry_extra
|
|
80
|
+
this._originalExtra = this._settings.telemetry_extra
|
|
79
81
|
}
|
|
80
82
|
}
|
|
81
83
|
|
|
82
84
|
_checkServerDefinition(server: Server) {
|
|
83
85
|
try {
|
|
84
86
|
if (typeof server.name !== 'string') {
|
|
85
|
-
throw 'Name string missing from server definition (name)'
|
|
87
|
+
throw 'Name string missing from server definition (name)'
|
|
86
88
|
}
|
|
87
89
|
if (typeof server.server !== 'string') {
|
|
88
|
-
throw 'Server address string missing from server definition (server)'
|
|
90
|
+
throw 'Server address string missing from server definition (server)'
|
|
89
91
|
}
|
|
90
92
|
if (server.server.charAt(server.server.length - 1) !== '/') {
|
|
91
|
-
server.server += '/'
|
|
93
|
+
server.server += '/'
|
|
92
94
|
}
|
|
93
95
|
if (server.server.indexOf('//') === 0) {
|
|
94
|
-
server.server = location.protocol + server.server
|
|
96
|
+
server.server = location.protocol + server.server
|
|
95
97
|
}
|
|
96
98
|
if (typeof server.dlURL !== 'string') {
|
|
97
|
-
throw 'Download URL string missing from server definition (dlURL)'
|
|
99
|
+
throw 'Download URL string missing from server definition (dlURL)'
|
|
98
100
|
}
|
|
99
101
|
if (typeof server.ulURL !== 'string') {
|
|
100
|
-
throw 'Upload URL string missing from server definition (ulURL)'
|
|
102
|
+
throw 'Upload URL string missing from server definition (ulURL)'
|
|
101
103
|
}
|
|
102
104
|
if (typeof server.pingURL !== 'string') {
|
|
103
|
-
throw 'Ping URL string missing from server definition (pingURL)'
|
|
105
|
+
throw 'Ping URL string missing from server definition (pingURL)'
|
|
104
106
|
}
|
|
105
107
|
if (typeof server.getIpURL !== 'string') {
|
|
106
|
-
throw 'GetIP URL string missing from server definition (getIpURL)'
|
|
108
|
+
throw 'GetIP URL string missing from server definition (getIpURL)'
|
|
107
109
|
}
|
|
108
110
|
} catch (error) {
|
|
109
111
|
// LogManager.exception(error);
|
|
110
|
-
reportError(error)
|
|
111
|
-
throw 'Invalid server definition'
|
|
112
|
+
reportError(error)
|
|
113
|
+
throw 'Invalid server definition'
|
|
112
114
|
}
|
|
113
115
|
}
|
|
114
116
|
|
|
115
117
|
addTestPoint(server: Server) {
|
|
116
|
-
this._checkServerDefinition(server)
|
|
118
|
+
this._checkServerDefinition(server)
|
|
117
119
|
if (this._state === 0) {
|
|
118
|
-
this._state = 1
|
|
120
|
+
this._state = 1
|
|
119
121
|
}
|
|
120
122
|
if (this._state !== 1) {
|
|
121
|
-
throw
|
|
123
|
+
throw "You can't add a server after server selection"
|
|
122
124
|
}
|
|
123
|
-
this._settings.mpot = true
|
|
124
|
-
this._serverList.push(server)
|
|
125
|
+
this._settings.mpot = true
|
|
126
|
+
this._serverList.push(server)
|
|
125
127
|
}
|
|
126
128
|
|
|
127
129
|
addTestPoints(list: Server[]) {
|
|
128
130
|
for (const server of list) {
|
|
129
|
-
this.addTestPoint(server)
|
|
131
|
+
this.addTestPoint(server)
|
|
130
132
|
}
|
|
131
133
|
}
|
|
132
134
|
|
|
133
135
|
getSelectedServer() {
|
|
134
136
|
if (this._state < 2 || this._selectedServer === null) {
|
|
135
|
-
throw 'No server is selected'
|
|
137
|
+
throw 'No server is selected'
|
|
136
138
|
}
|
|
137
139
|
|
|
138
|
-
return this._selectedServer
|
|
140
|
+
return this._selectedServer
|
|
139
141
|
}
|
|
140
142
|
|
|
141
143
|
setSelectedServer(server: Server) {
|
|
142
|
-
this._checkServerDefinition(server)
|
|
144
|
+
this._checkServerDefinition(server)
|
|
143
145
|
if (this._state === 3) {
|
|
144
|
-
throw
|
|
146
|
+
throw "You can't select a server while the test is running"
|
|
145
147
|
}
|
|
146
|
-
this._selectedServer = server
|
|
147
|
-
this._state = 2
|
|
148
|
+
this._selectedServer = server
|
|
149
|
+
this._state = 2
|
|
148
150
|
}
|
|
149
151
|
|
|
150
152
|
selectServer(result: SelectCallback) {
|
|
151
153
|
if (this._state !== 1) {
|
|
152
154
|
if (this._state === 0) {
|
|
153
|
-
throw 'No test points added'
|
|
155
|
+
throw 'No test points added'
|
|
154
156
|
}
|
|
155
157
|
if (this._state === 2) {
|
|
156
|
-
throw 'Server already selected'
|
|
158
|
+
throw 'Server already selected'
|
|
157
159
|
}
|
|
158
160
|
if (this._state >= 3) {
|
|
159
|
-
throw
|
|
161
|
+
throw "You can't select a server while the test is running"
|
|
160
162
|
}
|
|
161
163
|
}
|
|
162
164
|
if (this._selectServerCalled) {
|
|
163
|
-
throw 'selectServer already called'
|
|
165
|
+
throw 'selectServer already called'
|
|
164
166
|
} else {
|
|
165
|
-
this._selectServerCalled = true
|
|
167
|
+
this._selectServerCalled = true
|
|
166
168
|
}
|
|
167
169
|
/*this function goes through a list of servers. For each server, the ping is measured, then the server with the function result is called with the best server, or null if all the servers were down.
|
|
168
|
-
|
|
170
|
+
*/
|
|
169
171
|
const select = (serverList: Server[], result: SelectCallback) => {
|
|
170
172
|
//pings the specified URL, then calls the function result. Result will receive a parameter which is either the time it took to ping the URL, or -1 if something went wrong.
|
|
171
|
-
const PING_TIMEOUT = 2000
|
|
172
|
-
let USE_PING_TIMEOUT = true
|
|
173
|
+
const PING_TIMEOUT = 2000
|
|
174
|
+
let USE_PING_TIMEOUT = true //will be disabled on unsupported browsers
|
|
173
175
|
|
|
174
176
|
if (/MSIE.(\d+\.\d+)/i.test(navigator.userAgent)) {
|
|
175
177
|
//IE11 doesn't support XHR timeout
|
|
176
|
-
USE_PING_TIMEOUT = false
|
|
178
|
+
USE_PING_TIMEOUT = false
|
|
177
179
|
}
|
|
178
180
|
const ping = function (url: string, result: PerformanceCallback) {
|
|
179
|
-
url += (url.match(/\?/) ? '&' : '?') + 'cors=true'
|
|
180
|
-
const xhr = new XMLHttpRequest()
|
|
181
|
-
const t = new Date().getTime()
|
|
181
|
+
url += (url.match(/\?/) ? '&' : '?') + 'cors=true'
|
|
182
|
+
const xhr = new XMLHttpRequest()
|
|
183
|
+
const t = new Date().getTime()
|
|
182
184
|
|
|
183
185
|
xhr.onload = function () {
|
|
184
186
|
if (xhr.responseText.length === 0) {
|
|
185
187
|
//we expect an empty response
|
|
186
|
-
let instspd = new Date().getTime() - t
|
|
188
|
+
let instspd = new Date().getTime() - t //rough timing estimate
|
|
187
189
|
|
|
188
190
|
try {
|
|
189
191
|
//try to get more accurate timing using performance API
|
|
190
|
-
const pl: PerformanceEntryList = performance.getEntriesByName(url)
|
|
192
|
+
const pl: PerformanceEntryList = performance.getEntriesByName(url)
|
|
191
193
|
|
|
192
|
-
const pe: PerformanceResourceTiming = pl[
|
|
193
|
-
|
|
194
|
+
const pe: PerformanceResourceTiming = pl[
|
|
195
|
+
pl.length - 1
|
|
196
|
+
] as PerformanceResourceTiming
|
|
197
|
+
let d = pe.responseStart - pe.requestStart
|
|
194
198
|
|
|
195
199
|
if (d <= 0) {
|
|
196
|
-
d = pe.duration
|
|
200
|
+
d = pe.duration
|
|
197
201
|
}
|
|
198
202
|
if (d > 0 && d < instspd) {
|
|
199
|
-
instspd = d
|
|
203
|
+
instspd = d
|
|
200
204
|
}
|
|
201
205
|
} catch (error) {
|
|
202
206
|
// LogManager.exception(error);
|
|
203
|
-
reportError(error)
|
|
207
|
+
reportError(error)
|
|
204
208
|
}
|
|
205
|
-
result(instspd)
|
|
209
|
+
result(instspd)
|
|
206
210
|
} else {
|
|
207
|
-
result(-1)
|
|
211
|
+
result(-1)
|
|
208
212
|
}
|
|
209
|
-
}
|
|
213
|
+
}
|
|
210
214
|
xhr.onerror = function () {
|
|
211
|
-
result(-1)
|
|
212
|
-
}
|
|
213
|
-
xhr.open('GET', url)
|
|
215
|
+
result(-1)
|
|
216
|
+
}
|
|
217
|
+
xhr.open('GET', url)
|
|
214
218
|
if (USE_PING_TIMEOUT) {
|
|
215
219
|
try {
|
|
216
|
-
xhr.timeout = PING_TIMEOUT
|
|
217
|
-
xhr.ontimeout = xhr.onerror
|
|
220
|
+
xhr.timeout = PING_TIMEOUT
|
|
221
|
+
xhr.ontimeout = xhr.onerror
|
|
218
222
|
} catch (error) {
|
|
219
223
|
// LogManager.exception(error);
|
|
220
|
-
reportError(error)
|
|
224
|
+
reportError(error)
|
|
221
225
|
}
|
|
222
226
|
}
|
|
223
|
-
xhr.send()
|
|
224
|
-
}
|
|
227
|
+
xhr.send()
|
|
228
|
+
}
|
|
225
229
|
|
|
226
230
|
//this function repeatedly pings a server to get a good estimate of the ping. When it's done, it calls the done function without parameters. At the end of the execution, the server will have a new parameter called pingT, which is either the best ping we got from the server or -1 if something went wrong.
|
|
227
231
|
const PINGS = 3, //up to 3 pings are performed, unless the server is down...
|
|
228
|
-
SLOW_THRESHOLD = 500
|
|
232
|
+
SLOW_THRESHOLD = 500 //...or one of the pings is above this threshold
|
|
229
233
|
const checkServer = function (server: Server, done: () => void) {
|
|
230
|
-
let i = 0
|
|
234
|
+
let i = 0
|
|
231
235
|
|
|
232
|
-
server.pingT = -1
|
|
236
|
+
server.pingT = -1
|
|
233
237
|
if (server.server.indexOf(location.protocol) === -1) {
|
|
234
|
-
done()
|
|
238
|
+
done()
|
|
235
239
|
} else {
|
|
236
240
|
const nextPing = function () {
|
|
237
241
|
if (i++ === PINGS) {
|
|
238
|
-
done()
|
|
242
|
+
done()
|
|
239
243
|
|
|
240
|
-
return
|
|
244
|
+
return
|
|
241
245
|
}
|
|
242
|
-
ping(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
if (t < SLOW_THRESHOLD) {
|
|
250
|
-
nextPing();
|
|
251
|
-
} else {
|
|
252
|
-
done();
|
|
253
|
-
}
|
|
246
|
+
ping(server.server + server.pingURL, function (t) {
|
|
247
|
+
if (t >= 0) {
|
|
248
|
+
if (t < server.pingT || server.pingT === -1) {
|
|
249
|
+
server.pingT = t
|
|
250
|
+
}
|
|
251
|
+
if (t < SLOW_THRESHOLD) {
|
|
252
|
+
nextPing()
|
|
254
253
|
} else {
|
|
255
|
-
done()
|
|
254
|
+
done()
|
|
256
255
|
}
|
|
256
|
+
} else {
|
|
257
|
+
done()
|
|
257
258
|
}
|
|
258
|
-
)
|
|
259
|
-
}
|
|
259
|
+
})
|
|
260
|
+
}
|
|
260
261
|
|
|
261
|
-
nextPing()
|
|
262
|
+
nextPing()
|
|
262
263
|
}
|
|
263
|
-
}
|
|
264
|
+
}
|
|
264
265
|
//check servers in list, one by one
|
|
265
|
-
const i = 0
|
|
266
|
+
const i = 0
|
|
266
267
|
const done = function () {
|
|
267
|
-
let bestServer = null
|
|
268
|
+
let bestServer = null
|
|
268
269
|
|
|
269
270
|
for (let i = 0; i < serverList.length; i++) {
|
|
270
271
|
if (
|
|
271
272
|
serverList[i].pingT !== -1 &&
|
|
272
273
|
(bestServer === null || serverList[i].pingT < bestServer.pingT)
|
|
273
274
|
) {
|
|
274
|
-
bestServer = serverList[i]
|
|
275
|
+
bestServer = serverList[i]
|
|
275
276
|
}
|
|
276
277
|
}
|
|
277
|
-
result(bestServer)
|
|
278
|
-
}
|
|
278
|
+
result(bestServer)
|
|
279
|
+
}
|
|
279
280
|
|
|
280
|
-
serverList.forEach(server => {
|
|
281
|
-
checkServer(server, done)
|
|
282
|
-
})
|
|
281
|
+
serverList.forEach((server) => {
|
|
282
|
+
checkServer(server, done)
|
|
283
|
+
})
|
|
283
284
|
|
|
284
285
|
if (i === serverList.length) {
|
|
285
|
-
done()
|
|
286
|
+
done()
|
|
286
287
|
}
|
|
287
|
-
}
|
|
288
|
+
}
|
|
288
289
|
|
|
289
290
|
//parallel server selection
|
|
290
|
-
const CONCURRENCY = 6
|
|
291
|
-
const serverLists: Array<Server[]> = []
|
|
291
|
+
const CONCURRENCY = 6
|
|
292
|
+
const serverLists: Array<Server[]> = []
|
|
292
293
|
|
|
293
294
|
for (let i = 0; i < CONCURRENCY; i++) {
|
|
294
|
-
serverLists[i] = []
|
|
295
|
+
serverLists[i] = []
|
|
295
296
|
}
|
|
296
297
|
for (let i = 0; i < this._serverList.length; i++) {
|
|
297
|
-
serverLists[i % CONCURRENCY].push(this._serverList[i])
|
|
298
|
+
serverLists[i % CONCURRENCY].push(this._serverList[i])
|
|
298
299
|
}
|
|
299
|
-
let completed = 0
|
|
300
|
-
let bestServer: Server | null = null
|
|
300
|
+
let completed = 0
|
|
301
|
+
let bestServer: Server | null = null
|
|
301
302
|
|
|
302
303
|
for (let i = 0; i < CONCURRENCY; i++) {
|
|
303
|
-
select(
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
if (bestServer === null || server.pingT < bestServer.pingT) {
|
|
308
|
-
bestServer = server;
|
|
309
|
-
}
|
|
304
|
+
select(serverLists[i], (server: Server | null) => {
|
|
305
|
+
if (server !== null) {
|
|
306
|
+
if (bestServer === null || server.pingT < bestServer.pingT) {
|
|
307
|
+
bestServer = server
|
|
310
308
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
309
|
+
}
|
|
310
|
+
completed++
|
|
311
|
+
if (completed === CONCURRENCY) {
|
|
312
|
+
this._selectedServer = bestServer
|
|
313
|
+
this._state = 2
|
|
314
|
+
if (result) {
|
|
315
|
+
result(bestServer)
|
|
318
316
|
}
|
|
319
317
|
}
|
|
320
|
-
)
|
|
318
|
+
})
|
|
321
319
|
}
|
|
322
320
|
}
|
|
323
321
|
|
|
324
322
|
start() {
|
|
325
323
|
if (this._state === 3) {
|
|
326
|
-
throw 'Test already running'
|
|
324
|
+
throw 'Test already running'
|
|
327
325
|
}
|
|
328
|
-
this.worker = this.initWorker()
|
|
326
|
+
this.worker = this.initWorker()
|
|
329
327
|
|
|
330
328
|
this.worker.onmessage = (e: MessageEvent) => {
|
|
331
329
|
if (e.data === this._prevData) {
|
|
332
|
-
return
|
|
330
|
+
return
|
|
333
331
|
} else {
|
|
334
|
-
this._prevData = e.data
|
|
332
|
+
this._prevData = e.data
|
|
335
333
|
}
|
|
336
|
-
const data = e.data
|
|
334
|
+
const data = e.data
|
|
337
335
|
|
|
338
336
|
try {
|
|
339
337
|
if (this.onupdate) {
|
|
340
|
-
this.onupdate(data)
|
|
338
|
+
this.onupdate(data)
|
|
341
339
|
}
|
|
342
340
|
} catch (error) {
|
|
343
341
|
// LogManager.message('Speedtest onupdate event threw exception: ' + error, SentryLogLevel.ERROR);
|
|
344
|
-
reportError(error)
|
|
342
|
+
reportError(error)
|
|
345
343
|
}
|
|
346
344
|
if (data.testState >= 4) {
|
|
347
345
|
try {
|
|
348
346
|
if (this.onend) {
|
|
349
|
-
this.onend(data.testState === 5)
|
|
347
|
+
this.onend(data.testState === 5)
|
|
350
348
|
}
|
|
351
349
|
} catch (error) {
|
|
352
350
|
// LogManager.message('Speedtest onend event threw exception: ' + error, SentryLogLevel.ERROR);
|
|
353
|
-
reportError(error)
|
|
351
|
+
reportError(error)
|
|
354
352
|
}
|
|
355
353
|
if (this.updater !== null) {
|
|
356
|
-
clearInterval(this.updater)
|
|
357
|
-
this.updater = null
|
|
354
|
+
clearInterval(this.updater)
|
|
355
|
+
this.updater = null
|
|
358
356
|
}
|
|
359
|
-
this._state = 4
|
|
357
|
+
this._state = 4
|
|
360
358
|
}
|
|
361
|
-
}
|
|
362
|
-
this.updater = setInterval(
|
|
363
|
-
()
|
|
364
|
-
|
|
365
|
-
},
|
|
366
|
-
300
|
|
367
|
-
);
|
|
359
|
+
}
|
|
360
|
+
this.updater = setInterval(() => {
|
|
361
|
+
this.worker?.postMessage('status')
|
|
362
|
+
}, 300)
|
|
368
363
|
if (this._state === 1) {
|
|
369
|
-
throw 'When using multiple points of test, you must call selectServer before starting the test'
|
|
364
|
+
throw 'When using multiple points of test, you must call selectServer before starting the test'
|
|
370
365
|
}
|
|
371
366
|
if (this._state === 2 && this._selectedServer) {
|
|
372
367
|
this._settings.url_dl =
|
|
373
|
-
this._selectedServer.server + this._selectedServer.dlURL
|
|
368
|
+
this._selectedServer.server + this._selectedServer.dlURL
|
|
374
369
|
this._settings.url_ul =
|
|
375
|
-
this._selectedServer.server + this._selectedServer.ulURL
|
|
370
|
+
this._selectedServer.server + this._selectedServer.ulURL
|
|
376
371
|
this._settings.url_ping =
|
|
377
|
-
this._selectedServer.server + this._selectedServer.pingURL
|
|
372
|
+
this._selectedServer.server + this._selectedServer.pingURL
|
|
378
373
|
this._settings.url_getIp =
|
|
379
|
-
this._selectedServer.server + this._selectedServer.getIpURL
|
|
374
|
+
this._selectedServer.server + this._selectedServer.getIpURL
|
|
380
375
|
if (typeof this._originalExtra !== 'undefined') {
|
|
381
376
|
this._settings.telemetry_extra = JSON.stringify({
|
|
382
377
|
server: this._selectedServer.name,
|
|
383
|
-
extra: this._originalExtra
|
|
384
|
-
})
|
|
378
|
+
extra: this._originalExtra,
|
|
379
|
+
})
|
|
385
380
|
} else {
|
|
386
381
|
this._settings.telemetry_extra = JSON.stringify({
|
|
387
|
-
server: this._selectedServer.name
|
|
388
|
-
})
|
|
382
|
+
server: this._selectedServer.name,
|
|
383
|
+
})
|
|
389
384
|
}
|
|
390
385
|
}
|
|
391
|
-
this._state = 3
|
|
392
|
-
this.worker.postMessage('start ' + JSON.stringify(this._settings))
|
|
386
|
+
this._state = 3
|
|
387
|
+
this.worker.postMessage('start ' + JSON.stringify(this._settings))
|
|
393
388
|
|
|
394
389
|
// ... [rest of the logic remains unchanged] ...
|
|
395
390
|
}
|
|
396
391
|
|
|
397
392
|
abort() {
|
|
398
393
|
if (this._state < 3) {
|
|
399
|
-
throw new Error(
|
|
394
|
+
throw new Error("You cannot abort a test that's not started yet")
|
|
400
395
|
}
|
|
401
396
|
if (this._state < 4) {
|
|
402
|
-
this.worker?.postMessage('abort')
|
|
397
|
+
this.worker?.postMessage('abort')
|
|
403
398
|
}
|
|
404
399
|
}
|
|
405
400
|
|
|
406
401
|
private initWorker(): Worker {
|
|
407
402
|
if (this.workerUrl) {
|
|
408
403
|
// TODO in destructor as well
|
|
409
|
-
URL.revokeObjectURL(this.workerUrl)
|
|
404
|
+
URL.revokeObjectURL(this.workerUrl)
|
|
410
405
|
}
|
|
411
|
-
this.workerUrl = URL.createObjectURL(
|
|
412
|
-
|
|
406
|
+
this.workerUrl = URL.createObjectURL(
|
|
407
|
+
new Blob([SpeedtestWorkerModule], { type: 'application/javascript' }),
|
|
408
|
+
)
|
|
409
|
+
return new Worker(this.workerUrl)
|
|
413
410
|
}
|
|
414
411
|
}
|
|
@@ -23,7 +23,7 @@ type UriToMeasureBandwidth = {
|
|
|
23
23
|
const updateMetrics = () => {};
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
26
|
+
* PLIGIN that collects useful statistics about playback performance.
|
|
27
27
|
* @beta
|
|
28
28
|
* @remarks
|
|
29
29
|
* This plugin does not render anything and is supposed to be extended or used together with other plugins that actually render something.
|
|
@@ -111,9 +111,10 @@ export class ClapprStats extends ContainerPlugin {
|
|
|
111
111
|
|
|
112
112
|
/**
|
|
113
113
|
* Registers a callback to receive the metrics.
|
|
114
|
-
* @param updateMetricsFn
|
|
114
|
+
* @param updateMetricsFn - The callback to receive the metrics
|
|
115
115
|
*/
|
|
116
116
|
setUpdateMetrics(updateMetricsFn: MetricsUpdateFn) {
|
|
117
|
+
// TODO use events instead
|
|
117
118
|
this.updateFn = updateMetricsFn;
|
|
118
119
|
}
|
|
119
120
|
|
|
@@ -167,13 +168,13 @@ export class ClapprStats extends ContainerPlugin {
|
|
|
167
168
|
|
|
168
169
|
/**
|
|
169
170
|
* Returns the collected metrics.
|
|
170
|
-
* @returns
|
|
171
|
+
* @returns Currently collected metrics
|
|
171
172
|
*/
|
|
172
173
|
exportMetrics() {
|
|
173
174
|
return structuredClone(this.metrics);
|
|
174
175
|
}
|
|
175
176
|
|
|
176
|
-
onBitrate(newBitrate: QualityLevel) {
|
|
177
|
+
private onBitrate(newBitrate: QualityLevel) {
|
|
177
178
|
const bitrate = newBitrate.bitrate;
|
|
178
179
|
const now = this._now();
|
|
179
180
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Container, Events, UICorePlugin, $ } from '@clappr/core'
|
|
2
2
|
|
|
3
3
|
import { TimeProgress } from '../../playback.types.js'
|
|
4
|
-
import type { ZeptoResult } from '../../
|
|
4
|
+
import type { ZeptoResult } from '../../types.js'
|
|
5
5
|
import { strtimeToMiliseconds } from '../utils.js'
|
|
6
6
|
import '../../../assets/clips/clips.scss'
|
|
7
7
|
import assert from 'assert'
|
|
@@ -19,7 +19,8 @@ type ClipItem = {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
|
-
* Configuration options
|
|
22
|
+
* Configuration options for the {@link ClipsPlugin | clips} plugin.
|
|
23
|
+
* @beta
|
|
23
24
|
*/
|
|
24
25
|
export interface ClipsPluginSettings {
|
|
25
26
|
/**
|
|
@@ -29,7 +30,7 @@ export interface ClipsPluginSettings {
|
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
/**
|
|
32
|
-
*
|
|
33
|
+
* PLUGIN that shows text over the seekbar to indicate the current clip.
|
|
33
34
|
* @beta
|
|
34
35
|
* @remarks
|
|
35
36
|
* Depends on:
|