|
8 | 8 | import { API_WS_URL } from '../../../stores'; |
9 | 9 | import NoSleep from 'nosleep.js'; |
10 | 10 | import { goto } from '$app/navigation'; |
11 | | - import type { Segment } from '../../../types/segment'; |
| 11 | + import { onDestroy, onMount } from 'svelte'; |
12 | 12 |
|
13 | 13 | export let data: PageData; |
14 | 14 |
|
15 | 15 | const noSleep = new NoSleep(); |
16 | 16 |
|
| 17 | + let currentOffset: number | undefined; |
| 18 | + let currentFluctuation: number | undefined; |
| 19 | + let latestOffsets: number[] = []; |
| 20 | + let latestFluctuations: number[] = []; |
| 21 | +
|
17 | 22 | let soundEnabled: boolean; |
18 | | - let timeOffset: number | undefined; |
19 | 23 | let timerData: TimerType | undefined; |
20 | 24 | let lastGetTimeSent = 0; |
21 | | - let latestOffsets: number[] = []; |
22 | 25 | let socket: WebSocket | undefined; |
23 | 26 |
|
24 | | - const isOffsetInMargin = (offset: number) => { |
25 | | - if (!timeOffset) { |
26 | | - return true; |
| 27 | + const pushValueAndCaluclateAverage = (values: number[], newValue: number) => { |
| 28 | + values.push(newValue); |
| 29 | + if (values.length > 10) { |
| 30 | + values.shift(); |
27 | 31 | } |
28 | 32 |
|
29 | | - let margin = timeOffset * 0.3; |
30 | | - return offset > timeOffset - margin && offset < timeOffset + margin; |
| 33 | + let sum = 0; |
| 34 | + for (let i = 0; i < values.length; i++) { |
| 35 | + sum += values[i]; |
| 36 | + } |
| 37 | +
|
| 38 | + return sum / values.length; |
31 | 39 | }; |
32 | 40 |
|
33 | | - const handleNewOffset = (offset: number) => { |
34 | | - // check if we are in a 30% margin |
35 | | - if (!isOffsetInMargin(offset)) { |
36 | | - return; |
| 41 | + const isOffsetInMargin = (newOffset: number) => { |
| 42 | + if (!currentOffset) { |
| 43 | + return true; |
| 44 | + } |
| 45 | +
|
| 46 | + const fluctuation = Math.abs(currentOffset - newOffset); |
| 47 | + console.log(fluctuation, currentFluctuation); |
| 48 | +
|
| 49 | + if ( |
| 50 | + currentFluctuation && |
| 51 | + latestFluctuations.length > 5 && |
| 52 | + fluctuation > currentFluctuation * 4 |
| 53 | + ) { |
| 54 | + return false; |
37 | 55 | } |
38 | 56 |
|
39 | | - latestOffsets.push(offset); |
40 | | - if (latestOffsets.length > 10) { |
41 | | - latestOffsets.shift(); |
| 57 | + currentFluctuation = pushValueAndCaluclateAverage(latestFluctuations, fluctuation); |
| 58 | +
|
| 59 | + if (latestFluctuations.length < 10) { |
| 60 | + return true; |
42 | 61 | } |
43 | 62 |
|
44 | | - let sum = 0; |
45 | | - for (let i = 0; i < latestOffsets.length; i++) { |
46 | | - sum += latestOffsets[i]; |
| 63 | + return fluctuation < currentFluctuation * 2; |
| 64 | + }; |
| 65 | +
|
| 66 | + const handleNewOffset = (newOffset: number) => { |
| 67 | + // check if we are in a 30% margin |
| 68 | + if (!isOffsetInMargin(newOffset)) { |
| 69 | + console.log('not in margin'); |
| 70 | + return; |
47 | 71 | } |
48 | 72 |
|
49 | | - timeOffset = sum / latestOffsets.length; |
| 73 | + currentOffset = pushValueAndCaluclateAverage(latestOffsets, newOffset); |
50 | 74 | }; |
51 | 75 |
|
52 | 76 | const enableSound = () => { |
|
88 | 112 | case 'Timestamp': |
89 | 113 | const now = performance.now(); |
90 | 114 | const getTimeRoundTrip = now - lastGetTimeSent; |
91 | | - timeOffset = data.data + getTimeRoundTrip / 2 - now; |
92 | | - handleNewOffset(timeOffset); |
| 115 | + let newOffset = data.data + getTimeRoundTrip / 2 - now; |
| 116 | + handleNewOffset(newOffset); |
93 | 117 | break; |
94 | 118 | case 'Error': |
95 | 119 | throwError(data.data[0], data.data[1]); |
|
134 | 158 | } |
135 | 159 | } |
136 | 160 |
|
| 161 | + onDestroy(() => { |
| 162 | + socket?.close(); |
| 163 | + }); |
| 164 | +
|
137 | 165 | $: { |
138 | 166 | if (timerData && !soundEnabled && get(modalStore).length == 0) { |
139 | 167 | const d: ModalSettings = { |
|
158 | 186 | } |
159 | 187 | </script> |
160 | 188 |
|
161 | | -{#if timerData && timeOffset} |
| 189 | +{#if timerData && currentOffset} |
162 | 190 | <Timer |
163 | 191 | {timerData} |
164 | 192 | {soundEnabled} |
165 | | - {timeOffset} |
166 | | - displayOptionsOverride={{ clock: data.url.searchParams.get('clock') != 'false' }} |
| 193 | + timeOffset={currentOffset} |
| 194 | + displayOptionsOverride={{ |
| 195 | + ...timerData.display_options, |
| 196 | + clock: data.url.searchParams.get('clock') != 'false' |
| 197 | + }} |
167 | 198 | /> |
168 | 199 | {:else} |
169 | 200 | <div |
|
0 commit comments