Skip to content

Commit ad2b3d8

Browse files
committed
Fix garbled order of hourly forecast items.
1 parent fd966d4 commit ad2b3d8

10 files changed

Lines changed: 51 additions & 49 deletions

File tree

package-lock.json

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "aw-clock",
3-
"version": "2.3.2",
3+
"version": "2.3.3",
44
"license": "MIT",
55
"author": "Kerry Shetline <kerry@shetline.com>",
66
"scripts": {
@@ -21,8 +21,8 @@
2121
"js-cookie": "^2.2.1",
2222
"ks-astronomy": "^1.0.6",
2323
"ks-date-time-zone": "^1.6.6",
24-
"ks-math": "^1.1.6",
25-
"ks-util": "^1.8.0",
24+
"ks-math": "^1.2.0",
25+
"ks-util": "^1.9.0",
2626
"rxjs": "^6.5.4"
2727
},
2828
"devDependencies": {

server/package-lock.json

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "aw-clock-server",
3-
"version": "2.3.2",
3+
"version": "2.3.3",
44
"license": "MIT",
55
"author": "Kerry Shetline <kerry@shetline.com>",
66
"private": true,
@@ -21,8 +21,8 @@
2121
"express": "~4.17.1",
2222
"http-errors": "~1.7.3",
2323
"ks-date-time-zone": "^1.6.6",
24-
"ks-math": "^1.1.6",
25-
"ks-util": "^1.8.0",
24+
"ks-math": "^1.2.0",
25+
"ks-util": "^1.9.0",
2626
"morgan": "~1.9.1",
2727
"promise-ftp": "^1.3.5",
2828
"request": "^2.88.2"

server/src/tai-utc.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { requestText } from 'by-request';
22
import { getDateFromDayNumber_SGC, getDayNumber_SGC, getISOFormatDate, parseISODate } from 'ks-date-time-zone';
3-
import { interpolate } from 'ks-math';
3+
import { interpolate, irandom } from 'ks-math';
44
import PromiseFtp from 'promise-ftp';
55
import { CurrentDelta } from './time-types';
66
import { URL } from 'url';
7+
import { last } from 'ks-util';
78

89
export interface LeapSecond {
910
ntp: number;
@@ -79,7 +80,7 @@ export class TaiUtc {
7980
pendingLeapDate: getISOFormatDate(getDateFromDayNumber_SGC(Math.floor((this.leapSeconds[nextIndex].utc - 1) / 86400)))
8081
};
8182

82-
return { delta: this.leapSeconds[this.leapSeconds.length - 1].delta, dut1, pendingLeap: 0, pendingLeapDate: null };
83+
return { delta: last(this.leapSeconds).delta, dut1, pendingLeap: 0, pendingLeapDate: null };
8384
}
8485

8586
async getLeapSecondHistory(): Promise<LeapSecond[]> {
@@ -109,7 +110,7 @@ export class TaiUtc {
109110

110111
await new Promise<void>(resolve => {
111112
// Randomly delay polling so that multiple TaiUtc instances don't all poll at the same time every day.
112-
const delay = (this.firstLeapSecondPoll ? 0 : Math.floor(Math.random() * MAX_RANDOM_LEAP_SECOND_POLL_DELAY));
113+
const delay = (this.firstLeapSecondPoll ? 0 : irandom(MAX_RANDOM_LEAP_SECOND_POLL_DELAY));
113114
setTimeout(() => resolve(), delay);
114115
});
115116

src/clock.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import { AppService } from './app.service';
2323
import * as $ from 'jquery';
2424
import { DateAndTime, getDayOfWeek, getLastDateInMonthGregorian, KsDateTime, KsTimeZone } from 'ks-date-time-zone';
25-
import { cos_deg, floor, interpolate, max, min, sin_deg } from 'ks-math';
25+
import { cos_deg, floor, interpolate, irandom, max, min, sin_deg } from 'ks-math';
2626
import { getCssValue, isIE, isRaspbian, padLeft } from 'ks-util';
2727
import { CurrentDelta } from '../server/src/time-types';
2828

@@ -454,6 +454,6 @@ export class Clock {
454454
}, LEAP_SECOND_RETRY_DELAY)
455455
});
456456
// Randomly delay polling so that multiple clock instances don't all poll at the same time every day.
457-
}, this.firstLeapSecondPoll ? 0 : floor(Math.random() * MAX_RANDOM_LEAP_SECOND_POLL_DELAY));
457+
}, this.firstLeapSecondPoll ? 0 : irandom(MAX_RANDOM_LEAP_SECOND_POLL_DELAY));
458458
}
459459
}

src/forecast.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { AppService } from './app.service';
2121
import { CurrentTemperatureHumidity } from './current-temp-manager';
2222
import * as $ from 'jquery';
2323
import { KsDateTime, KsTimeZone } from 'ks-date-time-zone';
24-
import { doesCharacterGlyphExist, getTextWidth, isEdge, isIE } from 'ks-util';
24+
import { doesCharacterGlyphExist, getTextWidth, isEdge, isIE, last } from 'ks-util';
2525
import { reflow } from './svg-flow';
2626
import { convertTemp, formatHour, htmlEncode, setSvgHref } from './util';
2727
import { ForecastData, HourlyConditions } from '../server/src/weather-types';
@@ -288,21 +288,19 @@ export class Forecast {
288288

289289
private updateHourlyCache(forecastData: ForecastData): void {
290290
const now = this.appService.getCurrentTime() / 1000;
291-
let earliestNew = forecastData.hourly[0]?.time ?? 0;
291+
let earliestNew = forecastData.hourly[0]?.time ?? Number.MAX_SAFE_INTEGER;
292292
let inserted = 0;
293293

294-
this.cachedHourly = this.cachedHourly.filter(hour => hour.time > now - 7200 && hour.time < now);
294+
this.cachedHourly = this.cachedHourly.filter(hour => hour.time >= now - 7200 && hour.time <= now);
295295

296296
if (now < earliestNew) {
297297
this.cachedHourly.forEach(hour => {
298-
if (hour.time < earliestNew) {
299-
forecastData.hourly.splice(0, 0, hour);
300-
++inserted;
301-
}
298+
if (hour.time < earliestNew)
299+
forecastData.hourly.splice(inserted++, 0, hour);
302300
});
303301
}
304302

305-
earliestNew = forecastData.hourly[0]?.time ?? 0;
303+
earliestNew = forecastData.hourly[0]?.time ?? Number.MAX_SAFE_INTEGER;
306304

307305
// Still nothing to cover the current hour? Fake it from current conditions.
308306
if (now < earliestNew && forecastData?.currently)
@@ -314,7 +312,9 @@ export class Forecast {
314312
});
315313

316314
for (let i = inserted; i < forecastData.hourly.length; ++i) {
317-
if (forecastData.hourly[i].time < now + 7200)
315+
const t = forecastData.hourly[i].time;
316+
317+
if (t <= now + 7200 && (this.cachedHourly.length === 0 || t > last(this.cachedHourly).time))
318318
this.cachedHourly.push(forecastData.hourly[i]);
319319
else
320320
break;

src/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@
266266
</div>
267267
</div>
268268
<div class="dialog-buttons">
269-
<span class="version-number">2.3.2</span>
269+
<span class="version-number">2.3.3</span>
270270
<button id="settings-reload">Reload</button>
271271
<span>&bull;</span>
272272
<button id="settings-cancel">Cancel</button>

src/main.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { AppService, DEV_URL } from './app.service';
2424
import { CurrentTemperatureHumidity, CurrentTempManager } from './current-temp-manager';
2525
import { Forecast } from './forecast';
2626
import { KsDateTime, KsTimeZone } from 'ks-date-time-zone';
27+
import { irandom } from 'ks-math';
2728
import { setFullScreen } from 'ks-util';
2829
import { runningDev, Settings } from './settings';
2930
import { SettingsDialog } from './settings-dialog';
@@ -69,8 +70,8 @@ class AwClockApp implements AppService {
6970

7071
// Make sure most clients stagger their polling so that the weather server isn't likely
7172
// to get lots of simultaneous requests.
72-
private readonly pollingMinute = Math.floor(Math.random() * 15);
73-
private readonly pollingMillis = Math.floor(Math.random() * 60_000);
73+
private readonly pollingMinute = irandom(0, 14);
74+
private readonly pollingMillis = irandom(0, 59_999);
7475

7576
private lastCursorMove = 0;
7677
private lastForecast = 0;

src/util.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import * as $ from 'jquery';
2121
import { KsDateTime } from 'ks-date-time-zone';
2222
import { cos_deg, Point, sin_deg } from 'ks-math';
23-
import { isEdge, isSafari, padLeft } from 'ks-util';
23+
import { isEdge, isSafari, last, padLeft } from 'ks-util';
2424

2525
export type KeyListener = (event: KeyboardEvent) => void;
2626

@@ -36,7 +36,7 @@ export function popKeydownListener(): void {
3636

3737
window.addEventListener('keydown', (event: KeyboardEvent) => {
3838
if (keydownListeners.length > 0)
39-
keydownListeners[keydownListeners.length - 1](event);
39+
last(keydownListeners)(event);
4040
});
4141

4242
$.fn.extend({

0 commit comments

Comments
 (0)