ootk-core
Version:
Orbital Object Toolkit. A modern typed replacement for satellite.js including SGP4 propagation, TLE parsing, Sun and Moon calculations, and more.
114 lines (102 loc) • 3.61 kB
text/typescript
/**
* @author Theodore Kruczek.
* @license MIT
* @copyright (c) 2022-2025 Theodore Kruczek Permission is
* hereby granted, free of charge, to any person obtaining a copy of this
* software and associated documentation files (the "Software"), to deal in the
* Software without restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do
* so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
import { LeapSecond } from './LeapSecond.js';
// / Leap second value tuples.
const leapSeconds: Array<[number, number]> = [
[2441317.5, 10],
[2441499.5, 11],
[2441683.5, 12],
[2442048.5, 13],
[2442413.5, 14],
[2442778.5, 15],
[2443144.5, 16],
[2443509.5, 17],
[2443874.5, 18],
[2444239.5, 19],
[2444786.5, 20],
[2445151.5, 21],
[2445516.5, 22],
[2446247.5, 23],
[2447161.5, 24],
[2447892.5, 25],
[2448257.5, 26],
[2448804.5, 27],
[2449169.5, 28],
[2449534.5, 29],
[2450083.5, 30],
[2450630.5, 31],
[2451179.5, 32],
[2453736.5, 33],
[2454832.5, 34],
[2456109.5, 35],
[2457204.5, 36],
[2457754.5, 37],
] as const;
// / Leap second data container.
class LeapSecondData {
private readonly offsets_: LeapSecond[];
private readonly jdFirst_: number;
private readonly jdLast_: number;
private readonly offsetFirst_: number;
private readonly offsetLast_: number;
constructor(offsets: LeapSecond[]) {
this.offsets_ = offsets;
this.jdFirst_ = (this.offsets_[0] as LeapSecond).jd;
this.jdLast_ = (this.offsets_[this.offsets_.length - 1] as LeapSecond).jd;
this.offsetFirst_ = (this.offsets_[0] as LeapSecond).offset;
this.offsetLast_ = (this.offsets_[this.offsets_.length - 1] as LeapSecond).offset;
}
/**
* Create a new [LeapSecondData] container given a list of leap second
* value tuples [vals].
* @param vals Leap second value tuples.
* @returns A new [LeapSecondData] container.
*/
static fromVals(vals: [number, number][]): LeapSecondData {
const output: LeapSecond[] = [];
for (const v of vals) {
const [jd, offset] = v;
output.push(new LeapSecond(jd, offset));
}
return new LeapSecondData(output);
}
// / Return the number of leap seconds for a given Julian date [jd].
getLeapSeconds(jd: number): number {
if (jd >= this.jdLast_) {
return this.offsetLast_;
}
if (jd <= this.jdFirst_) {
return this.offsetFirst_;
}
for (let i = 0; i < this.offsets_.length - 2; i++) {
const currentLeapSecond = this.offsets_[i] as LeapSecond;
const nextLeapSecond = this.offsets_[i + 1] as LeapSecond;
if (jd >= currentLeapSecond.jd && jd < nextLeapSecond.jd) {
return currentLeapSecond.offset;
}
}
return 0;
}
}
// / Leap second data container.
export const leapSecondData: LeapSecondData = LeapSecondData.fromVals(leapSeconds);