@neilberkman/sidereon 0.11.1 → 0.13.0

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.
@@ -884,6 +884,43 @@ class BroadcastEphemeris {
884
884
  const ret = wasm.broadcastephemeris_leapSeconds(this.__wbg_ptr);
885
885
  return ret[0] === 0 ? undefined : ret[1];
886
886
  }
887
+ /**
888
+ * Query ECEF position and clock for parallel satellite and epoch arrays
889
+ * against this parsed broadcast ephemeris store.
890
+ *
891
+ * `satellites[i]` is evaluated at `epochsJ2000S[i]`, where epochs are
892
+ * seconds since J2000 in GPST for GNSS broadcast records. The returned
893
+ * plain object has aligned `positionsEcefM`, `clocksS`, `statuses`, and
894
+ * `elementResults` arrays.
895
+ * @param {any} satellites
896
+ * @param {any} epochs_j2000_s
897
+ * @returns {any}
898
+ */
899
+ observableStatesAtJ2000S(satellites, epochs_j2000_s) {
900
+ const ret = wasm.broadcastephemeris_observableStatesAtJ2000S(this.__wbg_ptr, satellites, epochs_j2000_s);
901
+ if (ret[2]) {
902
+ throw takeFromExternrefTable0(ret[1]);
903
+ }
904
+ return takeFromExternrefTable0(ret[0]);
905
+ }
906
+ /**
907
+ * Query ECEF position and clock for many satellites at one epoch against
908
+ * this parsed broadcast ephemeris store.
909
+ *
910
+ * `epochJ2000S` is seconds since J2000 in GPST. The returned object follows
911
+ * the same contract as
912
+ * [`observableStatesAtJ2000S`](Self::observable_states_at_j2000_s).
913
+ * @param {any} satellites
914
+ * @param {number} epoch_j2000_s
915
+ * @returns {any}
916
+ */
917
+ observableStatesAtSharedJ2000S(satellites, epoch_j2000_s) {
918
+ const ret = wasm.broadcastephemeris_observableStatesAtSharedJ2000S(this.__wbg_ptr, satellites, epoch_j2000_s);
919
+ if (ret[2]) {
920
+ throw takeFromExternrefTable0(ret[1]);
921
+ }
922
+ return takeFromExternrefTable0(ret[0]);
923
+ }
887
924
  /**
888
925
  * Number of usable GPS, Galileo, and BeiDou records.
889
926
  * @returns {number}
@@ -3832,6 +3869,12 @@ class DragForce {
3832
3869
  if (Symbol.dispose) DragForce.prototype[Symbol.dispose] = DragForce.prototype.free;
3833
3870
  exports.DragForce = DragForce;
3834
3871
 
3872
+ /**
3873
+ * A DTED terrain tile cache rooted at a directory of DTED Level 2 files.
3874
+ *
3875
+ * Heights are ORTHOMETRIC terrain elevations in meters. Point order is always
3876
+ * longitude first, then latitude, both in degrees.
3877
+ */
3835
3878
  class DtedTerrain {
3836
3879
  __destroy_into_raw() {
3837
3880
  const ptr = this.__wbg_ptr;
@@ -3844,6 +3887,30 @@ class DtedTerrain {
3844
3887
  wasm.__wbg_dtedterrain_free(ptr, 0);
3845
3888
  }
3846
3889
  /**
3890
+ * Batch terrain heights in ORTHOMETRIC meters for longitude-first points.
3891
+ *
3892
+ * `points` is an array of `[longitudeDeg, latitudeDeg]` pairs or
3893
+ * `{ longitudeDeg, latitudeDeg }` objects. `options.interpolation` is
3894
+ * `"bilinear"`, `"nearest"`, or `"nearestPosting"`. The return value is
3895
+ * index-aligned to `points`; each entry is `{ ok: true, heightM }` or
3896
+ * `{ ok: false, error }`. Missing tiles evaluate to `0.0`.
3897
+ * @param {any} points
3898
+ * @param {any} options
3899
+ * @returns {any}
3900
+ */
3901
+ heightBatch(points, options) {
3902
+ const ret = wasm.dtedterrain_heightBatch(this.__wbg_ptr, points, options);
3903
+ if (ret[2]) {
3904
+ throw takeFromExternrefTable0(ret[1]);
3905
+ }
3906
+ return takeFromExternrefTable0(ret[0]);
3907
+ }
3908
+ /**
3909
+ * Terrain height in ORTHOMETRIC meters at `(longitudeDeg, latitudeDeg)`.
3910
+ *
3911
+ * Longitude and latitude are degrees. The lookup uses bilinear
3912
+ * interpolation. Missing tiles evaluate to `0.0`, matching the core DTED
3913
+ * fallback.
3847
3914
  * @param {number} longitude_deg
3848
3915
  * @param {number} latitude_deg
3849
3916
  * @returns {number}
@@ -3856,6 +3923,11 @@ class DtedTerrain {
3856
3923
  return ret[0];
3857
3924
  }
3858
3925
  /**
3926
+ * Terrain height in ORTHOMETRIC meters at `(longitudeDeg, latitudeDeg)`.
3927
+ *
3928
+ * Longitude and latitude are degrees. `options.interpolation` is
3929
+ * `"bilinear"`, `"nearest"`, or `"nearestPosting"`. Missing tiles evaluate
3930
+ * to `0.0`, matching the core DTED fallback.
3859
3931
  * @param {number} longitude_deg
3860
3932
  * @param {number} latitude_deg
3861
3933
  * @param {any} options
@@ -3869,6 +3941,10 @@ class DtedTerrain {
3869
3941
  return ret[0];
3870
3942
  }
3871
3943
  /**
3944
+ * Create a DTED terrain reader rooted at `root`.
3945
+ *
3946
+ * The root may contain tile files directly or the nested block layout the
3947
+ * core reader recognizes. Height results are ORTHOMETRIC meters.
3872
3948
  * @param {string} root
3873
3949
  */
3874
3950
  constructor(root) {
@@ -3883,6 +3959,101 @@ class DtedTerrain {
3883
3959
  if (Symbol.dispose) DtedTerrain.prototype[Symbol.dispose] = DtedTerrain.prototype.free;
3884
3960
  exports.DtedTerrain = DtedTerrain;
3885
3961
 
3962
+ /**
3963
+ * Loaded EGM96 15-arcminute geoid grid for explicit terrain datum conversion.
3964
+ */
3965
+ class Egm96FifteenMinuteGeoid {
3966
+ static __wrap(ptr) {
3967
+ const obj = Object.create(Egm96FifteenMinuteGeoid.prototype);
3968
+ obj.__wbg_ptr = ptr;
3969
+ Egm96FifteenMinuteGeoidFinalization.register(obj, obj.__wbg_ptr, obj);
3970
+ return obj;
3971
+ }
3972
+ __destroy_into_raw() {
3973
+ const ptr = this.__wbg_ptr;
3974
+ this.__wbg_ptr = 0;
3975
+ Egm96FifteenMinuteGeoidFinalization.unregister(this);
3976
+ return ptr;
3977
+ }
3978
+ free() {
3979
+ const ptr = this.__destroy_into_raw();
3980
+ wasm.__wbg_egm96fifteenminutegeoid_free(ptr, 0);
3981
+ }
3982
+ /**
3983
+ * Load `WW15MGH.DAC` bytes as an EGM96 15-arcminute geoid grid.
3984
+ * @param {Uint8Array} bytes
3985
+ * @returns {Egm96FifteenMinuteGeoid}
3986
+ */
3987
+ static fromWw15mghDacBytes(bytes) {
3988
+ const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc);
3989
+ const len0 = WASM_VECTOR_LEN;
3990
+ const ret = wasm.egm96fifteenminutegeoid_fromWw15mghDacBytes(ptr0, len0);
3991
+ if (ret[2]) {
3992
+ throw takeFromExternrefTable0(ret[1]);
3993
+ }
3994
+ return Egm96FifteenMinuteGeoid.__wrap(ret[0]);
3995
+ }
3996
+ /**
3997
+ * Read and load `WW15MGH.DAC` from disk. A missing file throws a typed
3998
+ * `MissingEgm96Dac` error with `path` and `remediation` fields.
3999
+ * @param {string} path
4000
+ * @returns {Egm96FifteenMinuteGeoid}
4001
+ */
4002
+ static fromWw15mghDacPath(path) {
4003
+ const ptr0 = passStringToWasm0(path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
4004
+ const len0 = WASM_VECTOR_LEN;
4005
+ const ret = wasm.egm96fifteenminutegeoid_fromWw15mghDacPath(ptr0, len0);
4006
+ if (ret[2]) {
4007
+ throw takeFromExternrefTable0(ret[1]);
4008
+ }
4009
+ return Egm96FifteenMinuteGeoid.__wrap(ret[0]);
4010
+ }
4011
+ }
4012
+ if (Symbol.dispose) Egm96FifteenMinuteGeoid.prototype[Symbol.dispose] = Egm96FifteenMinuteGeoid.prototype.free;
4013
+ exports.Egm96FifteenMinuteGeoid = Egm96FifteenMinuteGeoid;
4014
+
4015
+ /**
4016
+ * Ellipsoidal height `h` in metres above the WGS84 reference ellipsoid.
4017
+ */
4018
+ class EllipsoidalHeightM {
4019
+ static __wrap(ptr) {
4020
+ const obj = Object.create(EllipsoidalHeightM.prototype);
4021
+ obj.__wbg_ptr = ptr;
4022
+ EllipsoidalHeightMFinalization.register(obj, obj.__wbg_ptr, obj);
4023
+ return obj;
4024
+ }
4025
+ __destroy_into_raw() {
4026
+ const ptr = this.__wbg_ptr;
4027
+ this.__wbg_ptr = 0;
4028
+ EllipsoidalHeightMFinalization.unregister(this);
4029
+ return ptr;
4030
+ }
4031
+ free() {
4032
+ const ptr = this.__destroy_into_raw();
4033
+ wasm.__wbg_ellipsoidalheightm_free(ptr, 0);
4034
+ }
4035
+ /**
4036
+ * Build an ellipsoidal height `h` in metres.
4037
+ * @param {number} value_m
4038
+ */
4039
+ constructor(value_m) {
4040
+ const ret = wasm.ellipsoidalheightm_new(value_m);
4041
+ this.__wbg_ptr = ret;
4042
+ EllipsoidalHeightMFinalization.register(this, this.__wbg_ptr, this);
4043
+ return this;
4044
+ }
4045
+ /**
4046
+ * Ellipsoidal height `h`, metres above the WGS84 reference ellipsoid.
4047
+ * @returns {number}
4048
+ */
4049
+ get valueM() {
4050
+ const ret = wasm.ellipsoidalheightm_valueM(this.__wbg_ptr);
4051
+ return ret;
4052
+ }
4053
+ }
4054
+ if (Symbol.dispose) EllipsoidalHeightM.prototype[Symbol.dispose] = EllipsoidalHeightM.prototype.free;
4055
+ exports.EllipsoidalHeightM = EllipsoidalHeightM;
4056
+
3886
4057
  /**
3887
4058
  * Orthonormal encounter frame built from two relative states.
3888
4059
  */
@@ -5518,6 +5689,24 @@ class Ionex {
5518
5689
  const ret = wasm.ionex_baseRadiusKm(this.__wbg_ptr);
5519
5690
  return ret;
5520
5691
  }
5692
+ /**
5693
+ * Signed latitude grid step, degrees. Standard IONEX grids are
5694
+ * north-to-south, so this value is usually negative.
5695
+ * @returns {number}
5696
+ */
5697
+ get dlatDeg() {
5698
+ const ret = wasm.ionex_dlatDeg(this.__wbg_ptr);
5699
+ return ret;
5700
+ }
5701
+ /**
5702
+ * Signed longitude grid step, degrees. Standard IONEX grids are
5703
+ * west-to-east, so this value is usually positive.
5704
+ * @returns {number}
5705
+ */
5706
+ get dlonDeg() {
5707
+ const ret = wasm.ionex_dlonDeg(this.__wbg_ptr);
5708
+ return ret;
5709
+ }
5521
5710
  /**
5522
5711
  * The IONEX `EXPONENT` header field; the TEC scale is `10^exponent`.
5523
5712
  * @returns {number}
@@ -5591,6 +5780,36 @@ class Ionex {
5591
5780
  }
5592
5781
  return ret[0];
5593
5782
  }
5783
+ /**
5784
+ * Extract the full IONEX vertical-TEC grids as plain sample data.
5785
+ *
5786
+ * Epochs are integer seconds since J2000. Latitude and longitude nodes and
5787
+ * grid steps are degrees. TEC and RMS maps are TECU and indexed
5788
+ * `[map][iLat][iLon]`. The shell height and base radius are kilometers.
5789
+ * @returns {any}
5790
+ */
5791
+ tecGridSamples() {
5792
+ const ret = wasm.ionex_tecGridSamples(this.__wbg_ptr);
5793
+ if (ret[2]) {
5794
+ throw takeFromExternrefTable0(ret[1]);
5795
+ }
5796
+ return takeFromExternrefTable0(ret[0]);
5797
+ }
5798
+ /**
5799
+ * Extract one IONEX vertical-TEC sample per grid node.
5800
+ *
5801
+ * Each sample is `{ epochJ2000S, latDeg, lonDeg, vtecTecu, rmsTecu }`.
5802
+ * Epochs are integer seconds since J2000, coordinates are degrees, and TEC
5803
+ * and RMS values are TECU.
5804
+ * @returns {any}
5805
+ */
5806
+ tecSamples() {
5807
+ const ret = wasm.ionex_tecSamples(this.__wbg_ptr);
5808
+ if (ret[2]) {
5809
+ throw takeFromExternrefTable0(ret[1]);
5810
+ }
5811
+ return takeFromExternrefTable0(ret[0]);
5812
+ }
5594
5813
  /**
5595
5814
  * Serialize to standard IONEX text. Deterministic: the same product always
5596
5815
  * produces byte-identical text, and re-parsing the output yields an equal
@@ -6910,119 +7129,369 @@ if (Symbol.dispose) MappingFactors.prototype[Symbol.dispose] = MappingFactors.pr
6910
7129
  exports.MappingFactors = MappingFactors;
6911
7130
 
6912
7131
  /**
6913
- * One refined Moon elevation threshold crossing (moonrise / moonset).
7132
+ * In-memory reader for memory-mappable terrain store bytes.
7133
+ *
7134
+ * Query results are orthometric terrain heights `H` in metres. Use the
7135
+ * ellipsoidal methods only when a geoid model is deliberately selected.
6914
7136
  */
6915
- class MoonElevationCrossing {
7137
+ class MmapTerrain {
6916
7138
  static __wrap(ptr) {
6917
- const obj = Object.create(MoonElevationCrossing.prototype);
7139
+ const obj = Object.create(MmapTerrain.prototype);
6918
7140
  obj.__wbg_ptr = ptr;
6919
- MoonElevationCrossingFinalization.register(obj, obj.__wbg_ptr, obj);
7141
+ MmapTerrainFinalization.register(obj, obj.__wbg_ptr, obj);
6920
7142
  return obj;
6921
7143
  }
6922
7144
  __destroy_into_raw() {
6923
7145
  const ptr = this.__wbg_ptr;
6924
7146
  this.__wbg_ptr = 0;
6925
- MoonElevationCrossingFinalization.unregister(this);
7147
+ MmapTerrainFinalization.unregister(this);
6926
7148
  return ptr;
6927
7149
  }
6928
7150
  free() {
6929
7151
  const ptr = this.__destroy_into_raw();
6930
- wasm.__wbg_moonelevationcrossing_free(ptr, 0);
7152
+ wasm.__wbg_mmapterrain_free(ptr, 0);
6931
7153
  }
6932
7154
  /**
6933
- * Topocentric Moon elevation at the refined instant, degrees.
6934
- * @returns {number}
7155
+ * FNV-1a checksum of the full terrain store byte span.
7156
+ * @returns {bigint}
6935
7157
  */
6936
- get elevationDeg() {
6937
- const ret = wasm.moonelevationcrossing_elevationDeg(this.__wbg_ptr);
6938
- return ret;
7158
+ checksum64() {
7159
+ const ret = wasm.mmapterrain_checksum64(this.__wbg_ptr);
7160
+ return BigInt.asUintN(64, ret);
6939
7161
  }
6940
7162
  /**
6941
- * Crossing direction: `"rising"` (moonrise) or `"setting"` (moonset).
6942
- * @returns {string}
7163
+ * Ellipsoidal height `h = H + N` in metres at `(longitudeDeg, latitudeDeg)`
7164
+ * using the embedded EGM96 1-degree geoid grid.
7165
+ * @param {number} longitude_deg
7166
+ * @param {number} latitude_deg
7167
+ * @returns {EllipsoidalHeightM}
6943
7168
  */
6944
- get kind() {
6945
- let deferred1_0;
6946
- let deferred1_1;
6947
- try {
6948
- const ret = wasm.moonelevationcrossing_kind(this.__wbg_ptr);
6949
- deferred1_0 = ret[0];
6950
- deferred1_1 = ret[1];
6951
- return getStringFromWasm0(ret[0], ret[1]);
6952
- } finally {
6953
- wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
7169
+ ellipsoidalHeightM(longitude_deg, latitude_deg) {
7170
+ const ret = wasm.mmapterrain_ellipsoidalHeightM(this.__wbg_ptr, longitude_deg, latitude_deg);
7171
+ if (ret[2]) {
7172
+ throw takeFromExternrefTable0(ret[1]);
6954
7173
  }
7174
+ return EllipsoidalHeightM.__wrap(ret[0]);
6955
7175
  }
6956
7176
  /**
6957
- * Refined crossing instant, unix microseconds.
6958
- * @returns {bigint}
7177
+ * Ellipsoidal height `h = H + N` in metres using an explicit geoid model.
7178
+ *
7179
+ * The terrain lookup input order is `(longitudeDeg, latitudeDeg)`. Choosing
7180
+ * the EGM96 15-arcminute model requires a loaded `WW15MGH.DAC` grid and
7181
+ * does not fall back to the embedded 1-degree grid.
7182
+ * @param {number} longitude_deg
7183
+ * @param {number} latitude_deg
7184
+ * @param {any} options
7185
+ * @param {TerrainGeoidModel} geoid
7186
+ * @returns {EllipsoidalHeightM}
6959
7187
  */
6960
- get timeUnixUs() {
6961
- const ret = wasm.moonelevationcrossing_timeUnixUs(this.__wbg_ptr);
6962
- return ret;
7188
+ ellipsoidalHeightMWithModel(longitude_deg, latitude_deg, options, geoid) {
7189
+ _assertClass(geoid, TerrainGeoidModel);
7190
+ const ret = wasm.mmapterrain_ellipsoidalHeightMWithModel(this.__wbg_ptr, longitude_deg, latitude_deg, options, geoid.__wbg_ptr);
7191
+ if (ret[2]) {
7192
+ throw takeFromExternrefTable0(ret[1]);
7193
+ }
7194
+ return EllipsoidalHeightM.__wrap(ret[0]);
6963
7195
  }
6964
- }
6965
- if (Symbol.dispose) MoonElevationCrossing.prototype[Symbol.dispose] = MoonElevationCrossing.prototype.free;
6966
- exports.MoonElevationCrossing = MoonElevationCrossing;
6967
-
6968
- /**
6969
- * One refined Moon meridian transit (culmination).
6970
- */
6971
- class MoonTransit {
6972
- static __wrap(ptr) {
6973
- const obj = Object.create(MoonTransit.prototype);
6974
- obj.__wbg_ptr = ptr;
6975
- MoonTransitFinalization.register(obj, obj.__wbg_ptr, obj);
6976
- return obj;
7196
+ /**
7197
+ * Ellipsoidal height `h = H + N` in metres using embedded EGM96 1-degree
7198
+ * geoid conversion and explicit terrain lookup options.
7199
+ * @param {number} longitude_deg
7200
+ * @param {number} latitude_deg
7201
+ * @param {any} options
7202
+ * @returns {EllipsoidalHeightM}
7203
+ */
7204
+ ellipsoidalHeightMWithOptions(longitude_deg, latitude_deg, options) {
7205
+ const ret = wasm.mmapterrain_ellipsoidalHeightMWithOptions(this.__wbg_ptr, longitude_deg, latitude_deg, options);
7206
+ if (ret[2]) {
7207
+ throw takeFromExternrefTable0(ret[1]);
7208
+ }
7209
+ return EllipsoidalHeightM.__wrap(ret[0]);
6977
7210
  }
6978
- __destroy_into_raw() {
6979
- const ptr = this.__wbg_ptr;
6980
- this.__wbg_ptr = 0;
6981
- MoonTransitFinalization.unregister(this);
6982
- return ptr;
7211
+ /**
7212
+ * Parse terrain store bytes from a `Uint8Array`.
7213
+ * @param {Uint8Array} bytes
7214
+ * @returns {MmapTerrain}
7215
+ */
7216
+ static fromBytes(bytes) {
7217
+ const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc);
7218
+ const len0 = WASM_VECTOR_LEN;
7219
+ const ret = wasm.mmapterrain_fromBytes(ptr0, len0);
7220
+ if (ret[2]) {
7221
+ throw takeFromExternrefTable0(ret[1]);
7222
+ }
7223
+ return MmapTerrain.__wrap(ret[0]);
6983
7224
  }
6984
- free() {
6985
- const ptr = this.__destroy_into_raw();
6986
- wasm.__wbg_moontransit_free(ptr, 0);
7225
+ /**
7226
+ * Read a terrain store file from host I/O and parse it into memory.
7227
+ *
7228
+ * Browser runtimes should use [`MmapTerrain.fromBytes`] with fetched bytes.
7229
+ * @param {string} path
7230
+ * @returns {MmapTerrain}
7231
+ */
7232
+ static fromPath(path) {
7233
+ const ptr0 = passStringToWasm0(path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
7234
+ const len0 = WASM_VECTOR_LEN;
7235
+ const ret = wasm.mmapterrain_fromPath(ptr0, len0);
7236
+ if (ret[2]) {
7237
+ throw takeFromExternrefTable0(ret[1]);
7238
+ }
7239
+ return MmapTerrain.__wrap(ret[0]);
6987
7240
  }
6988
7241
  /**
6989
- * Topocentric Moon elevation at the refined instant, degrees.
6990
- * @returns {number}
7242
+ * Parse terrain store bytes from an owned `Uint8Array` copy.
7243
+ * @param {Uint8Array} bytes
7244
+ * @returns {MmapTerrain}
6991
7245
  */
6992
- get elevationDeg() {
6993
- const ret = wasm.moontransit_elevationDeg(this.__wbg_ptr);
6994
- return ret;
7246
+ static fromVec(bytes) {
7247
+ const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc);
7248
+ const len0 = WASM_VECTOR_LEN;
7249
+ const ret = wasm.mmapterrain_fromVec(ptr0, len0);
7250
+ if (ret[2]) {
7251
+ throw takeFromExternrefTable0(ret[1]);
7252
+ }
7253
+ return MmapTerrain.__wrap(ret[0]);
6995
7254
  }
6996
7255
  /**
6997
- * Culmination kind: `"upper"` (due south, highest) or `"lower"` (due north,
6998
- * lowest).
6999
- * @returns {string}
7256
+ * Batch ORTHOMETRIC terrain heights for longitude-first points.
7257
+ *
7258
+ * `points` is an array of `[longitudeDeg, latitudeDeg]` pairs or
7259
+ * `{ longitudeDeg, latitudeDeg }` objects. Each entry is
7260
+ * `{ ok: true, heightM }` or `{ ok: false, error }`.
7261
+ * @param {any} points
7262
+ * @param {any} options
7263
+ * @returns {any}
7000
7264
  */
7001
- get kind() {
7002
- let deferred1_0;
7003
- let deferred1_1;
7004
- try {
7005
- const ret = wasm.moontransit_kind(this.__wbg_ptr);
7006
- deferred1_0 = ret[0];
7007
- deferred1_1 = ret[1];
7008
- return getStringFromWasm0(ret[0], ret[1]);
7009
- } finally {
7010
- wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
7265
+ heightBatch(points, options) {
7266
+ const ret = wasm.mmapterrain_heightBatch(this.__wbg_ptr, points, options);
7267
+ if (ret[2]) {
7268
+ throw takeFromExternrefTable0(ret[1]);
7011
7269
  }
7270
+ return takeFromExternrefTable0(ret[0]);
7012
7271
  }
7013
7272
  /**
7014
- * Refined culmination instant, unix microseconds.
7015
- * @returns {bigint}
7273
+ * Terrain height in ORTHOMETRIC metres at `(longitudeDeg, latitudeDeg)`.
7274
+ *
7275
+ * Longitude and latitude are degrees. The lookup uses bilinear
7276
+ * interpolation. Missing tiles evaluate to `0.0`.
7277
+ * @param {number} longitude_deg
7278
+ * @param {number} latitude_deg
7279
+ * @returns {number}
7016
7280
  */
7017
- get timeUnixUs() {
7018
- const ret = wasm.moontransit_timeUnixUs(this.__wbg_ptr);
7019
- return ret;
7281
+ heightM(longitude_deg, latitude_deg) {
7282
+ const ret = wasm.mmapterrain_heightM(this.__wbg_ptr, longitude_deg, latitude_deg);
7283
+ if (ret[2]) {
7284
+ throw takeFromExternrefTable0(ret[1]);
7285
+ }
7286
+ return ret[0];
7020
7287
  }
7021
- }
7022
- if (Symbol.dispose) MoonTransit.prototype[Symbol.dispose] = MoonTransit.prototype.free;
7023
- exports.MoonTransit = MoonTransit;
7024
-
7025
- /**
7288
+ /**
7289
+ * Terrain height in ORTHOMETRIC metres at `(longitudeDeg, latitudeDeg)`.
7290
+ *
7291
+ * `options.interpolation` is `"bilinear"`, `"nearest"`, or
7292
+ * `"nearestPosting"`.
7293
+ * @param {number} longitude_deg
7294
+ * @param {number} latitude_deg
7295
+ * @param {any} options
7296
+ * @returns {number}
7297
+ */
7298
+ heightMWithOptions(longitude_deg, latitude_deg, options) {
7299
+ const ret = wasm.mmapterrain_heightMWithOptions(this.__wbg_ptr, longitude_deg, latitude_deg, options);
7300
+ if (ret[2]) {
7301
+ throw takeFromExternrefTable0(ret[1]);
7302
+ }
7303
+ return ret[0];
7304
+ }
7305
+ /**
7306
+ * Batch typed ORTHOMETRIC terrain heights for longitude-first points.
7307
+ *
7308
+ * Each entry is `{ ok: true, orthometricHeightM: { valueM } }` or
7309
+ * `{ ok: false, error }`.
7310
+ * @param {any} points
7311
+ * @param {any} options
7312
+ * @returns {any}
7313
+ */
7314
+ orthometricHeightBatch(points, options) {
7315
+ const ret = wasm.mmapterrain_orthometricHeightBatch(this.__wbg_ptr, points, options);
7316
+ if (ret[2]) {
7317
+ throw takeFromExternrefTable0(ret[1]);
7318
+ }
7319
+ return takeFromExternrefTable0(ret[0]);
7320
+ }
7321
+ /**
7322
+ * Typed ORTHOMETRIC terrain height `H` at `(longitudeDeg, latitudeDeg)`.
7323
+ * @param {number} longitude_deg
7324
+ * @param {number} latitude_deg
7325
+ * @returns {OrthometricHeightM}
7326
+ */
7327
+ orthometricHeightM(longitude_deg, latitude_deg) {
7328
+ const ret = wasm.mmapterrain_orthometricHeightM(this.__wbg_ptr, longitude_deg, latitude_deg);
7329
+ if (ret[2]) {
7330
+ throw takeFromExternrefTable0(ret[1]);
7331
+ }
7332
+ return OrthometricHeightM.__wrap(ret[0]);
7333
+ }
7334
+ /**
7335
+ * Typed ORTHOMETRIC terrain height `H` at `(longitudeDeg, latitudeDeg)`
7336
+ * with explicit lookup options.
7337
+ * @param {number} longitude_deg
7338
+ * @param {number} latitude_deg
7339
+ * @param {any} options
7340
+ * @returns {OrthometricHeightM}
7341
+ */
7342
+ orthometricHeightMWithOptions(longitude_deg, latitude_deg, options) {
7343
+ const ret = wasm.mmapterrain_orthometricHeightMWithOptions(this.__wbg_ptr, longitude_deg, latitude_deg, options);
7344
+ if (ret[2]) {
7345
+ throw takeFromExternrefTable0(ret[1]);
7346
+ }
7347
+ return OrthometricHeightM.__wrap(ret[0]);
7348
+ }
7349
+ /**
7350
+ * Parsed tile index records in store order.
7351
+ * @returns {TerrainStoreTileIndex[]}
7352
+ */
7353
+ tileIndex() {
7354
+ const ret = wasm.mmapterrain_tileIndex(this.__wbg_ptr);
7355
+ var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice();
7356
+ wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
7357
+ return v1;
7358
+ }
7359
+ /**
7360
+ * Canonical store bytes for this parsed terrain store.
7361
+ * @returns {Uint8Array}
7362
+ */
7363
+ toBytes() {
7364
+ const ret = wasm.mmapterrain_toBytes(this.__wbg_ptr);
7365
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
7366
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
7367
+ return v1;
7368
+ }
7369
+ /**
7370
+ * File-level vertical datum for the store's orthometric posting payloads.
7371
+ * @returns {VerticalDatum}
7372
+ */
7373
+ get verticalDatum() {
7374
+ const ret = wasm.mmapterrain_verticalDatum(this.__wbg_ptr);
7375
+ return ret;
7376
+ }
7377
+ }
7378
+ if (Symbol.dispose) MmapTerrain.prototype[Symbol.dispose] = MmapTerrain.prototype.free;
7379
+ exports.MmapTerrain = MmapTerrain;
7380
+
7381
+ /**
7382
+ * One refined Moon elevation threshold crossing (moonrise / moonset).
7383
+ */
7384
+ class MoonElevationCrossing {
7385
+ static __wrap(ptr) {
7386
+ const obj = Object.create(MoonElevationCrossing.prototype);
7387
+ obj.__wbg_ptr = ptr;
7388
+ MoonElevationCrossingFinalization.register(obj, obj.__wbg_ptr, obj);
7389
+ return obj;
7390
+ }
7391
+ __destroy_into_raw() {
7392
+ const ptr = this.__wbg_ptr;
7393
+ this.__wbg_ptr = 0;
7394
+ MoonElevationCrossingFinalization.unregister(this);
7395
+ return ptr;
7396
+ }
7397
+ free() {
7398
+ const ptr = this.__destroy_into_raw();
7399
+ wasm.__wbg_moonelevationcrossing_free(ptr, 0);
7400
+ }
7401
+ /**
7402
+ * Topocentric Moon elevation at the refined instant, degrees.
7403
+ * @returns {number}
7404
+ */
7405
+ get elevationDeg() {
7406
+ const ret = wasm.moonelevationcrossing_elevationDeg(this.__wbg_ptr);
7407
+ return ret;
7408
+ }
7409
+ /**
7410
+ * Crossing direction: `"rising"` (moonrise) or `"setting"` (moonset).
7411
+ * @returns {string}
7412
+ */
7413
+ get kind() {
7414
+ let deferred1_0;
7415
+ let deferred1_1;
7416
+ try {
7417
+ const ret = wasm.moonelevationcrossing_kind(this.__wbg_ptr);
7418
+ deferred1_0 = ret[0];
7419
+ deferred1_1 = ret[1];
7420
+ return getStringFromWasm0(ret[0], ret[1]);
7421
+ } finally {
7422
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
7423
+ }
7424
+ }
7425
+ /**
7426
+ * Refined crossing instant, unix microseconds.
7427
+ * @returns {bigint}
7428
+ */
7429
+ get timeUnixUs() {
7430
+ const ret = wasm.moonelevationcrossing_timeUnixUs(this.__wbg_ptr);
7431
+ return ret;
7432
+ }
7433
+ }
7434
+ if (Symbol.dispose) MoonElevationCrossing.prototype[Symbol.dispose] = MoonElevationCrossing.prototype.free;
7435
+ exports.MoonElevationCrossing = MoonElevationCrossing;
7436
+
7437
+ /**
7438
+ * One refined Moon meridian transit (culmination).
7439
+ */
7440
+ class MoonTransit {
7441
+ static __wrap(ptr) {
7442
+ const obj = Object.create(MoonTransit.prototype);
7443
+ obj.__wbg_ptr = ptr;
7444
+ MoonTransitFinalization.register(obj, obj.__wbg_ptr, obj);
7445
+ return obj;
7446
+ }
7447
+ __destroy_into_raw() {
7448
+ const ptr = this.__wbg_ptr;
7449
+ this.__wbg_ptr = 0;
7450
+ MoonTransitFinalization.unregister(this);
7451
+ return ptr;
7452
+ }
7453
+ free() {
7454
+ const ptr = this.__destroy_into_raw();
7455
+ wasm.__wbg_moontransit_free(ptr, 0);
7456
+ }
7457
+ /**
7458
+ * Topocentric Moon elevation at the refined instant, degrees.
7459
+ * @returns {number}
7460
+ */
7461
+ get elevationDeg() {
7462
+ const ret = wasm.moontransit_elevationDeg(this.__wbg_ptr);
7463
+ return ret;
7464
+ }
7465
+ /**
7466
+ * Culmination kind: `"upper"` (due south, highest) or `"lower"` (due north,
7467
+ * lowest).
7468
+ * @returns {string}
7469
+ */
7470
+ get kind() {
7471
+ let deferred1_0;
7472
+ let deferred1_1;
7473
+ try {
7474
+ const ret = wasm.moontransit_kind(this.__wbg_ptr);
7475
+ deferred1_0 = ret[0];
7476
+ deferred1_1 = ret[1];
7477
+ return getStringFromWasm0(ret[0], ret[1]);
7478
+ } finally {
7479
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
7480
+ }
7481
+ }
7482
+ /**
7483
+ * Refined culmination instant, unix microseconds.
7484
+ * @returns {bigint}
7485
+ */
7486
+ get timeUnixUs() {
7487
+ const ret = wasm.moontransit_timeUnixUs(this.__wbg_ptr);
7488
+ return ret;
7489
+ }
7490
+ }
7491
+ if (Symbol.dispose) MoonTransit.prototype[Symbol.dispose] = MoonTransit.prototype.free;
7492
+ exports.MoonTransit = MoonTransit;
7493
+
7494
+ /**
7026
7495
  * One solved moving-baseline epoch.
7027
7496
  */
7028
7497
  class MovingBaselineSolution {
@@ -10049,6 +10518,81 @@ class OpmState {
10049
10518
  if (Symbol.dispose) OpmState.prototype[Symbol.dispose] = OpmState.prototype.free;
10050
10519
  exports.OpmState = OpmState;
10051
10520
 
10521
+ /**
10522
+ * Orthometric terrain height `H` in metres above the EGM96 mean sea level
10523
+ * geoid.
10524
+ */
10525
+ class OrthometricHeightM {
10526
+ static __wrap(ptr) {
10527
+ const obj = Object.create(OrthometricHeightM.prototype);
10528
+ obj.__wbg_ptr = ptr;
10529
+ OrthometricHeightMFinalization.register(obj, obj.__wbg_ptr, obj);
10530
+ return obj;
10531
+ }
10532
+ __destroy_into_raw() {
10533
+ const ptr = this.__wbg_ptr;
10534
+ this.__wbg_ptr = 0;
10535
+ OrthometricHeightMFinalization.unregister(this);
10536
+ return ptr;
10537
+ }
10538
+ free() {
10539
+ const ptr = this.__destroy_into_raw();
10540
+ wasm.__wbg_orthometricheightm_free(ptr, 0);
10541
+ }
10542
+ /**
10543
+ * Build an orthometric height `H` in metres.
10544
+ * @param {number} value_m
10545
+ */
10546
+ constructor(value_m) {
10547
+ const ret = wasm.orthometricheightm_new(value_m);
10548
+ this.__wbg_ptr = ret;
10549
+ OrthometricHeightMFinalization.register(this, this.__wbg_ptr, this);
10550
+ return this;
10551
+ }
10552
+ /**
10553
+ * Convert to ellipsoidal height `h = H + N` using degree inputs in geoid
10554
+ * order `(latitudeDeg, longitudeDeg)` and an explicit geoid model.
10555
+ * @param {number} latitude_deg
10556
+ * @param {number} longitude_deg
10557
+ * @param {TerrainGeoidModel} geoid
10558
+ * @returns {EllipsoidalHeightM}
10559
+ */
10560
+ toEllipsoidalHeightDeg(latitude_deg, longitude_deg, geoid) {
10561
+ _assertClass(geoid, TerrainGeoidModel);
10562
+ const ret = wasm.orthometricheightm_toEllipsoidalHeightDeg(this.__wbg_ptr, latitude_deg, longitude_deg, geoid.__wbg_ptr);
10563
+ if (ret[2]) {
10564
+ throw takeFromExternrefTable0(ret[1]);
10565
+ }
10566
+ return EllipsoidalHeightM.__wrap(ret[0]);
10567
+ }
10568
+ /**
10569
+ * Convert to ellipsoidal height `h = H + N` using radian inputs in geoid
10570
+ * order `(latitudeRad, longitudeRad)` and an explicit geoid model.
10571
+ * @param {number} latitude_rad
10572
+ * @param {number} longitude_rad
10573
+ * @param {TerrainGeoidModel} geoid
10574
+ * @returns {EllipsoidalHeightM}
10575
+ */
10576
+ toEllipsoidalHeightRad(latitude_rad, longitude_rad, geoid) {
10577
+ _assertClass(geoid, TerrainGeoidModel);
10578
+ const ret = wasm.orthometricheightm_toEllipsoidalHeightRad(this.__wbg_ptr, latitude_rad, longitude_rad, geoid.__wbg_ptr);
10579
+ if (ret[2]) {
10580
+ throw takeFromExternrefTable0(ret[1]);
10581
+ }
10582
+ return EllipsoidalHeightM.__wrap(ret[0]);
10583
+ }
10584
+ /**
10585
+ * Orthometric height `H`, metres above the EGM96 mean sea level geoid.
10586
+ * @returns {number}
10587
+ */
10588
+ get valueM() {
10589
+ const ret = wasm.orthometricheightm_valueM(this.__wbg_ptr);
10590
+ return ret;
10591
+ }
10592
+ }
10593
+ if (Symbol.dispose) OrthometricHeightM.prototype[Symbol.dispose] = OrthometricHeightM.prototype.free;
10594
+ exports.OrthometricHeightM = OrthometricHeightM;
10595
+
10052
10596
  /**
10053
10597
  * The result of [`parseTleFile`]: the satellites that parsed, plus a count of
10054
10598
  * complete records that were skipped because SGP4 initialization failed.
@@ -10543,52 +11087,244 @@ if (Symbol.dispose) PppFloatSolution.prototype[Symbol.dispose] = PppFloatSolutio
10543
11087
  exports.PppFloatSolution = PppFloatSolution;
10544
11088
 
10545
11089
  /**
10546
- * A precise-ephemeris source built from samples rather than parsed SP3 text.
11090
+ * A reusable precise-ephemeris interpolant with cached per-satellite nodes.
10547
11091
  *
10548
- * Implements the same `ObservableEphemerisSource` contract as a parsed [`Sp3`]
10549
- * product and shares its interpolation substrate, so [`predictRanges`] accepts
10550
- * either handle. Build one with [`preciseEphemerisSamplesFromSamples`].
10551
- */
10552
- class PreciseEphemerisSampleSource {
11092
+ * Build this handle once from a parsed [`Sp3`] product, raw precise samples, or
11093
+ * a [`PreciseEphemerisSampleSource`], then reuse it for many state or range
11094
+ * queries. The handle delegates to
11095
+ * `sidereon_core::ephemeris::PreciseEphemerisInterpolant`; ECEF positions are
11096
+ * metres, clocks are seconds, and query epochs are seconds since J2000 in the
11097
+ * source time scale.
11098
+ */
11099
+ class PreciseEphemerisInterpolant {
10553
11100
  static __wrap(ptr) {
10554
- const obj = Object.create(PreciseEphemerisSampleSource.prototype);
11101
+ const obj = Object.create(PreciseEphemerisInterpolant.prototype);
10555
11102
  obj.__wbg_ptr = ptr;
10556
- PreciseEphemerisSampleSourceFinalization.register(obj, obj.__wbg_ptr, obj);
11103
+ PreciseEphemerisInterpolantFinalization.register(obj, obj.__wbg_ptr, obj);
10557
11104
  return obj;
10558
11105
  }
10559
11106
  __destroy_into_raw() {
10560
11107
  const ptr = this.__wbg_ptr;
10561
11108
  this.__wbg_ptr = 0;
10562
- PreciseEphemerisSampleSourceFinalization.unregister(this);
11109
+ PreciseEphemerisInterpolantFinalization.unregister(this);
10563
11110
  return ptr;
10564
11111
  }
10565
11112
  free() {
10566
11113
  const ptr = this.__destroy_into_raw();
10567
- wasm.__wbg_preciseephemerissamplesource_free(ptr, 0);
11114
+ wasm.__wbg_preciseephemerisinterpolant_free(ptr, 0);
10568
11115
  }
10569
11116
  /**
10570
- * Predict geometric ranges for many requests in one call. See the shared
10571
- * [`predictRanges`](crate::precise_samples::predict_ranges_over) contract;
10572
- * this is the sample-source entry point.
10573
- * @param {any} requests
10574
- * @param {any} options
11117
+ * Build a cached interpolant from an existing sample-backed precise source.
11118
+ * @param {PreciseEphemerisSampleSource} source
11119
+ * @returns {PreciseEphemerisInterpolant}
11120
+ */
11121
+ static fromPreciseEphemerisSamples(source) {
11122
+ _assertClass(source, PreciseEphemerisSampleSource);
11123
+ const ret = wasm.preciseephemerisinterpolant_fromPreciseEphemerisSamples(source.__wbg_ptr);
11124
+ return PreciseEphemerisInterpolant.__wrap(ret);
11125
+ }
11126
+ /**
11127
+ * Build a cached interpolant directly from precise samples.
11128
+ *
11129
+ * `samples` is the same array accepted by
11130
+ * [`preciseEphemerisSamplesFromSamples`]: each item has `{ sat, epoch,
11131
+ * positionEcefM, clockS?, clockEvent? }`, with epochs in seconds since
11132
+ * J2000 and positions in ECEF metres. Throws a `TypeError` for malformed
11133
+ * JS input and a `RangeError` for sample validation failures.
11134
+ * @param {any} samples
11135
+ * @returns {PreciseEphemerisInterpolant}
11136
+ */
11137
+ static fromSamples(samples) {
11138
+ const ret = wasm.preciseephemerisinterpolant_fromSamples(samples);
11139
+ if (ret[2]) {
11140
+ throw takeFromExternrefTable0(ret[1]);
11141
+ }
11142
+ return PreciseEphemerisInterpolant.__wrap(ret[0]);
11143
+ }
11144
+ /**
11145
+ * Build a cached interpolant from a parsed SP3 precise product.
11146
+ *
11147
+ * Nodes are copied from the product's native SP3 records. Query epochs are
11148
+ * seconds since J2000 in the SP3 product time scale.
11149
+ * @param {Sp3} sp3
11150
+ * @returns {PreciseEphemerisInterpolant}
11151
+ */
11152
+ static fromSp3(sp3) {
11153
+ _assertClass(sp3, Sp3);
11154
+ const ret = wasm.preciseephemerisinterpolant_fromSp3(sp3.__wbg_ptr);
11155
+ return PreciseEphemerisInterpolant.__wrap(ret);
11156
+ }
11157
+ /**
11158
+ * Query ECEF position and optional clock for parallel satellite and epoch
11159
+ * arrays using this cached interpolant.
11160
+ *
11161
+ * `satellites[i]` is evaluated at `epochsJ2000S[i]`, where epochs are
11162
+ * seconds since J2000 on this handle's time scale. The returned plain
11163
+ * object has aligned `positionsEcefM`, `clocksS`, `statuses`, and
11164
+ * `elementResults` arrays.
11165
+ * @param {any} satellites
11166
+ * @param {any} epochs_j2000_s
10575
11167
  * @returns {any}
10576
11168
  */
10577
- predictRanges(requests, options) {
10578
- const ret = wasm.preciseephemerissamplesource_predictRanges(this.__wbg_ptr, requests, options);
11169
+ observableStatesAtJ2000S(satellites, epochs_j2000_s) {
11170
+ const ret = wasm.preciseephemerisinterpolant_observableStatesAtJ2000S(this.__wbg_ptr, satellites, epochs_j2000_s);
10579
11171
  if (ret[2]) {
10580
11172
  throw takeFromExternrefTable0(ret[1]);
10581
11173
  }
10582
11174
  return takeFromExternrefTable0(ret[0]);
10583
11175
  }
10584
11176
  /**
10585
- * The satellites this source can interpolate (e.g. `"G01"`), ascending.
10586
- * @returns {string[]}
11177
+ * Query ECEF position and optional clock for many satellites at one epoch
11178
+ * using this cached interpolant.
11179
+ *
11180
+ * `epochJ2000S` is seconds since J2000 on this handle's time scale. The
11181
+ * returned object follows the same contract as
11182
+ * [`observableStatesAtJ2000S`](Self::observable_states_at_j2000_s).
11183
+ * @param {any} satellites
11184
+ * @param {number} epoch_j2000_s
11185
+ * @returns {any}
10587
11186
  */
10588
- get satellites() {
10589
- const ret = wasm.preciseephemerissamplesource_satellites(this.__wbg_ptr);
10590
- var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice();
10591
- wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
11187
+ observableStatesAtSharedJ2000S(satellites, epoch_j2000_s) {
11188
+ const ret = wasm.preciseephemerisinterpolant_observableStatesAtSharedJ2000S(this.__wbg_ptr, satellites, epoch_j2000_s);
11189
+ if (ret[2]) {
11190
+ throw takeFromExternrefTable0(ret[1]);
11191
+ }
11192
+ return takeFromExternrefTable0(ret[0]);
11193
+ }
11194
+ /**
11195
+ * Predict geometric ranges for many `(satellite, receiver, epoch)`
11196
+ * requests using this cached interpolant.
11197
+ *
11198
+ * `requests` is an array of `{ sat, receiverEcefM, tRxJ2000S }` objects.
11199
+ * Positions are ECEF metres and epochs are seconds since J2000 on this
11200
+ * handle's time scale. The output matches [`Sp3.predictRanges`].
11201
+ * @param {any} requests
11202
+ * @param {any} options
11203
+ * @returns {any}
11204
+ */
11205
+ predictRanges(requests, options) {
11206
+ const ret = wasm.preciseephemerisinterpolant_predictRanges(this.__wbg_ptr, requests, options);
11207
+ if (ret[2]) {
11208
+ throw takeFromExternrefTable0(ret[1]);
11209
+ }
11210
+ return takeFromExternrefTable0(ret[0]);
11211
+ }
11212
+ /**
11213
+ * Satellite tokens this handle can interpolate, ascending.
11214
+ * @returns {string[]}
11215
+ */
11216
+ get satellites() {
11217
+ const ret = wasm.preciseephemerisinterpolant_satellites(this.__wbg_ptr);
11218
+ var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice();
11219
+ wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
11220
+ return v1;
11221
+ }
11222
+ /**
11223
+ * Source time-scale abbreviation used by this handle's J2000-second axis,
11224
+ * such as `"GPST"`.
11225
+ * @returns {string}
11226
+ */
11227
+ get timeScale() {
11228
+ let deferred1_0;
11229
+ let deferred1_1;
11230
+ try {
11231
+ const ret = wasm.preciseephemerisinterpolant_timeScale(this.__wbg_ptr);
11232
+ deferred1_0 = ret[0];
11233
+ deferred1_1 = ret[1];
11234
+ return getStringFromWasm0(ret[0], ret[1]);
11235
+ } finally {
11236
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
11237
+ }
11238
+ }
11239
+ }
11240
+ if (Symbol.dispose) PreciseEphemerisInterpolant.prototype[Symbol.dispose] = PreciseEphemerisInterpolant.prototype.free;
11241
+ exports.PreciseEphemerisInterpolant = PreciseEphemerisInterpolant;
11242
+
11243
+ /**
11244
+ * A precise-ephemeris source built from samples rather than parsed SP3 text.
11245
+ *
11246
+ * Implements the same `ObservableEphemerisSource` contract as a parsed [`Sp3`]
11247
+ * product and shares its interpolation substrate, so [`predictRanges`] accepts
11248
+ * either handle. Build one with [`preciseEphemerisSamplesFromSamples`].
11249
+ */
11250
+ class PreciseEphemerisSampleSource {
11251
+ static __wrap(ptr) {
11252
+ const obj = Object.create(PreciseEphemerisSampleSource.prototype);
11253
+ obj.__wbg_ptr = ptr;
11254
+ PreciseEphemerisSampleSourceFinalization.register(obj, obj.__wbg_ptr, obj);
11255
+ return obj;
11256
+ }
11257
+ __destroy_into_raw() {
11258
+ const ptr = this.__wbg_ptr;
11259
+ this.__wbg_ptr = 0;
11260
+ PreciseEphemerisSampleSourceFinalization.unregister(this);
11261
+ return ptr;
11262
+ }
11263
+ free() {
11264
+ const ptr = this.__destroy_into_raw();
11265
+ wasm.__wbg_preciseephemerissamplesource_free(ptr, 0);
11266
+ }
11267
+ /**
11268
+ * Query ECEF position and optional clock for parallel satellite and epoch
11269
+ * arrays against this sample-backed precise source.
11270
+ *
11271
+ * `satellites[i]` is evaluated at `epochsJ2000S[i]`, where epochs are
11272
+ * seconds since J2000 on the source time scale. The returned plain object
11273
+ * has aligned `positionsEcefM`, `clocksS`, `statuses`, and
11274
+ * `elementResults` arrays. Failed elements use the core missing-position
11275
+ * sentinel and carry the scalar engine error in `elementResults[i].error`.
11276
+ * @param {any} satellites
11277
+ * @param {any} epochs_j2000_s
11278
+ * @returns {any}
11279
+ */
11280
+ observableStatesAtJ2000S(satellites, epochs_j2000_s) {
11281
+ const ret = wasm.preciseephemerissamplesource_observableStatesAtJ2000S(this.__wbg_ptr, satellites, epochs_j2000_s);
11282
+ if (ret[2]) {
11283
+ throw takeFromExternrefTable0(ret[1]);
11284
+ }
11285
+ return takeFromExternrefTable0(ret[0]);
11286
+ }
11287
+ /**
11288
+ * Query ECEF position and optional clock for many satellites at one epoch
11289
+ * against this sample-backed precise source.
11290
+ *
11291
+ * `epochJ2000S` is seconds since J2000 on the source time scale. The
11292
+ * returned plain object follows the same contract as
11293
+ * [`observableStatesAtJ2000S`](Self::observable_states_at_j2000_s).
11294
+ * @param {any} satellites
11295
+ * @param {number} epoch_j2000_s
11296
+ * @returns {any}
11297
+ */
11298
+ observableStatesAtSharedJ2000S(satellites, epoch_j2000_s) {
11299
+ const ret = wasm.preciseephemerissamplesource_observableStatesAtSharedJ2000S(this.__wbg_ptr, satellites, epoch_j2000_s);
11300
+ if (ret[2]) {
11301
+ throw takeFromExternrefTable0(ret[1]);
11302
+ }
11303
+ return takeFromExternrefTable0(ret[0]);
11304
+ }
11305
+ /**
11306
+ * Predict geometric ranges for many requests in one call. See the shared
11307
+ * [`predictRanges`](crate::precise_samples::predict_ranges_over) contract;
11308
+ * this is the sample-source entry point.
11309
+ * @param {any} requests
11310
+ * @param {any} options
11311
+ * @returns {any}
11312
+ */
11313
+ predictRanges(requests, options) {
11314
+ const ret = wasm.preciseephemerissamplesource_predictRanges(this.__wbg_ptr, requests, options);
11315
+ if (ret[2]) {
11316
+ throw takeFromExternrefTable0(ret[1]);
11317
+ }
11318
+ return takeFromExternrefTable0(ret[0]);
11319
+ }
11320
+ /**
11321
+ * The satellites this source can interpolate (e.g. `"G01"`), ascending.
11322
+ * @returns {string[]}
11323
+ */
11324
+ get satellites() {
11325
+ const ret = wasm.preciseephemerissamplesource_satellites(this.__wbg_ptr);
11326
+ var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice();
11327
+ wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
10592
11328
  return v1;
10593
11329
  }
10594
11330
  }
@@ -12050,6 +12786,12 @@ class SatelliteVector {
12050
12786
  if (Symbol.dispose) SatelliteVector.prototype[Symbol.dispose] = SatelliteVector.prototype.free;
12051
12787
  exports.SatelliteVector = SatelliteVector;
12052
12788
 
12789
+ /**
12790
+ * Mutable SBAS correction store.
12791
+ *
12792
+ * Ingest raw SBAS messages with a source GEO and GNSS time, then query decoded
12793
+ * fast, long-term, ionospheric, and GEO navigation correction records.
12794
+ */
12053
12795
  class SbasCorrectionStore {
12054
12796
  __destroy_into_raw() {
12055
12797
  const ptr = this.__wbg_ptr;
@@ -12062,6 +12804,49 @@ class SbasCorrectionStore {
12062
12804
  wasm.__wbg_sbascorrectionstore_free(ptr, 0);
12063
12805
  }
12064
12806
  /**
12807
+ * Fast pseudorange correction for `(geo, sat)`, or `null`.
12808
+ *
12809
+ * `prcM` is meters, `rrcMS` is meters per second, and `tOfJ2000S` is
12810
+ * seconds since J2000.
12811
+ * @param {string} geo
12812
+ * @param {string} sat
12813
+ * @returns {any}
12814
+ */
12815
+ fastCorrection(geo, sat) {
12816
+ const ptr0 = passStringToWasm0(geo, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
12817
+ const len0 = WASM_VECTOR_LEN;
12818
+ const ptr1 = passStringToWasm0(sat, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
12819
+ const len1 = WASM_VECTOR_LEN;
12820
+ const ret = wasm.sbascorrectionstore_fastCorrection(this.__wbg_ptr, ptr0, len0, ptr1, len1);
12821
+ if (ret[2]) {
12822
+ throw takeFromExternrefTable0(ret[1]);
12823
+ }
12824
+ return takeFromExternrefTable0(ret[0]);
12825
+ }
12826
+ /**
12827
+ * SBAS GEO navigation state for `geo`, or `null`.
12828
+ *
12829
+ * Positions are ECEF meters, velocities are ECEF meters per second,
12830
+ * accelerations are ECEF meters per second squared, clock fields are
12831
+ * seconds and seconds per second, and `t0J2000S` is seconds since J2000.
12832
+ * @param {string} geo
12833
+ * @returns {any}
12834
+ */
12835
+ geoNavState(geo) {
12836
+ const ptr0 = passStringToWasm0(geo, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
12837
+ const len0 = WASM_VECTOR_LEN;
12838
+ const ret = wasm.sbascorrectionstore_geoNavState(this.__wbg_ptr, ptr0, len0);
12839
+ if (ret[2]) {
12840
+ throw takeFromExternrefTable0(ret[1]);
12841
+ }
12842
+ return takeFromExternrefTable0(ret[0]);
12843
+ }
12844
+ /**
12845
+ * Ingest one decoded SBAS message into the correction store.
12846
+ *
12847
+ * `geo` is the SBAS source satellite token such as `"S29"`. `week` and
12848
+ * `towS` are in the selected GNSS time scale. `form` is `"framed250"` or
12849
+ * `"body226"`.
12065
12850
  * @param {Uint8Array} bytes
12066
12851
  * @param {string | null | undefined} form
12067
12852
  * @param {string} geo
@@ -12084,6 +12869,27 @@ class SbasCorrectionStore {
12084
12869
  }
12085
12870
  }
12086
12871
  /**
12872
+ * SBAS ionospheric grid for `geo`, or `null`.
12873
+ *
12874
+ * Grid point latitudes and longitudes are degrees, vertical delays are
12875
+ * meters, and GIVE variances are square meters when present.
12876
+ * @param {string} geo
12877
+ * @returns {any}
12878
+ */
12879
+ ionoGrid(geo) {
12880
+ const ptr0 = passStringToWasm0(geo, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
12881
+ const len0 = WASM_VECTOR_LEN;
12882
+ const ret = wasm.sbascorrectionstore_ionoGrid(this.__wbg_ptr, ptr0, len0);
12883
+ if (ret[2]) {
12884
+ throw takeFromExternrefTable0(ret[1]);
12885
+ }
12886
+ return takeFromExternrefTable0(ret[0]);
12887
+ }
12888
+ /**
12889
+ * SBAS ionospheric slant delay in meters, or `null`.
12890
+ *
12891
+ * Receiver latitude, longitude, elevation, and azimuth are radians.
12892
+ * `frequencyHz` is the carrier frequency for the reported group delay.
12087
12893
  * @param {string} geo
12088
12894
  * @param {number} receiver_lat_rad
12089
12895
  * @param {number} receiver_lon_rad
@@ -12102,6 +12908,30 @@ class SbasCorrectionStore {
12102
12908
  }
12103
12909
  return ret[0] === 0 ? undefined : ret[1];
12104
12910
  }
12911
+ /**
12912
+ * Long-term orbit and clock correction for `(geo, sat)`, or `null`.
12913
+ *
12914
+ * Position deltas are ECEF meters, rates are ECEF meters per second, clock
12915
+ * deltas are seconds and seconds per second, and `t0J2000S` is seconds
12916
+ * since J2000.
12917
+ * @param {string} geo
12918
+ * @param {string} sat
12919
+ * @returns {any}
12920
+ */
12921
+ longTermCorrection(geo, sat) {
12922
+ const ptr0 = passStringToWasm0(geo, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
12923
+ const len0 = WASM_VECTOR_LEN;
12924
+ const ptr1 = passStringToWasm0(sat, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
12925
+ const len1 = WASM_VECTOR_LEN;
12926
+ const ret = wasm.sbascorrectionstore_longTermCorrection(this.__wbg_ptr, ptr0, len0, ptr1, len1);
12927
+ if (ret[2]) {
12928
+ throw takeFromExternrefTable0(ret[1]);
12929
+ }
12930
+ return takeFromExternrefTable0(ret[0]);
12931
+ }
12932
+ /**
12933
+ * Create an empty SBAS correction store.
12934
+ */
12105
12935
  constructor() {
12106
12936
  const ret = wasm.sbascorrectionstore_new();
12107
12937
  this.__wbg_ptr = ret;
@@ -12109,6 +12939,10 @@ class SbasCorrectionStore {
12109
12939
  return this;
12110
12940
  }
12111
12941
  /**
12942
+ * Ready SBAS GEO source satellites at `tJ2000S`.
12943
+ *
12944
+ * The time is seconds since J2000. Returned tokens are strings such as
12945
+ * `"S29"`, sorted by most recent update first.
12112
12946
  * @param {number} t_j2000_s
12113
12947
  * @returns {string[]}
12114
12948
  */
@@ -12118,6 +12952,24 @@ class SbasCorrectionStore {
12118
12952
  wasm.__wbindgen_free(ret[0], ret[1] * 4, 4);
12119
12953
  return v1;
12120
12954
  }
12955
+ /**
12956
+ * Allow or disallow partial SBAS corrections when building corrected
12957
+ * ephemeris states.
12958
+ * @param {boolean} yes
12959
+ */
12960
+ setAllowPartial(yes) {
12961
+ wasm.sbascorrectionstore_setAllowPartial(this.__wbg_ptr, yes);
12962
+ }
12963
+ /**
12964
+ * Set the maximum staleness for fresh SBAS corrections, in seconds.
12965
+ * @param {number} seconds
12966
+ */
12967
+ setStalenessSeconds(seconds) {
12968
+ const ret = wasm.sbascorrectionstore_setStalenessSeconds(this.__wbg_ptr, seconds);
12969
+ if (ret[1]) {
12970
+ throw takeFromExternrefTable0(ret[0]);
12971
+ }
12972
+ }
12121
12973
  }
12122
12974
  if (Symbol.dispose) SbasCorrectionStore.prototype[Symbol.dispose] = SbasCorrectionStore.prototype.free;
12123
12975
  exports.SbasCorrectionStore = SbasCorrectionStore;
@@ -12519,6 +13371,44 @@ class Sp3 {
12519
13371
  }
12520
13372
  return Sp3Interpolation.__wrap(ret[0]);
12521
13373
  }
13374
+ /**
13375
+ * Query ECEF position and optional clock for parallel satellite and epoch
13376
+ * arrays against this parsed SP3 product.
13377
+ *
13378
+ * `satellites[i]` is evaluated at `epochsJ2000S[i]`, where epochs are
13379
+ * seconds since J2000 in the product time scale. The returned plain object
13380
+ * has aligned `positionsEcefM`, `clocksS`, `statuses`, and
13381
+ * `elementResults` arrays. Failed elements use the core missing-position
13382
+ * sentinel and carry the scalar engine error in `elementResults[i].error`.
13383
+ * @param {any} satellites
13384
+ * @param {any} epochs_j2000_s
13385
+ * @returns {any}
13386
+ */
13387
+ observableStatesAtJ2000S(satellites, epochs_j2000_s) {
13388
+ const ret = wasm.sp3_observableStatesAtJ2000S(this.__wbg_ptr, satellites, epochs_j2000_s);
13389
+ if (ret[2]) {
13390
+ throw takeFromExternrefTable0(ret[1]);
13391
+ }
13392
+ return takeFromExternrefTable0(ret[0]);
13393
+ }
13394
+ /**
13395
+ * Query ECEF position and optional clock for many satellites at one epoch
13396
+ * against this parsed SP3 product.
13397
+ *
13398
+ * `epochJ2000S` is seconds since J2000 in the product time scale. The
13399
+ * returned object follows the same contract as
13400
+ * [`observableStatesAtJ2000S`](Self::observable_states_at_j2000_s).
13401
+ * @param {any} satellites
13402
+ * @param {number} epoch_j2000_s
13403
+ * @returns {any}
13404
+ */
13405
+ observableStatesAtSharedJ2000S(satellites, epoch_j2000_s) {
13406
+ const ret = wasm.sp3_observableStatesAtSharedJ2000S(this.__wbg_ptr, satellites, epoch_j2000_s);
13407
+ if (ret[2]) {
13408
+ throw takeFromExternrefTable0(ret[1]);
13409
+ }
13410
+ return takeFromExternrefTable0(ret[0]);
13411
+ }
12522
13412
  /**
12523
13413
  * Predict geometric ranges for many `(satellite, receiver, epoch)` requests
12524
13414
  * against this ephemeris in one call. `requests` is an array of
@@ -14073,100 +14963,77 @@ if (Symbol.dispose) SunMoon.prototype[Symbol.dispose] = SunMoon.prototype.free;
14073
14963
  exports.SunMoon = SunMoon;
14074
14964
 
14075
14965
  /**
14076
- * A named time scale. The JS value matches the variant order below.
14077
- * @enum {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8}
14966
+ * Terrain datum conversion and optional geoid-grid loading error variants.
14967
+ * @enum {0 | 1 | 2 | 3}
14078
14968
  */
14079
- const TimeScale = Object.freeze({
14080
- /**
14081
- * Coordinated Universal Time.
14082
- */
14083
- Utc: 0, "0": "Utc",
14084
- /**
14085
- * International Atomic Time.
14086
- */
14087
- Tai: 1, "1": "Tai",
14088
- /**
14089
- * Terrestrial Time.
14090
- */
14091
- Tt: 2, "2": "Tt",
14092
- /**
14093
- * Barycentric Dynamical Time.
14094
- */
14095
- Tdb: 3, "3": "Tdb",
14096
- /**
14097
- * GPS time.
14098
- */
14099
- Gpst: 4, "4": "Gpst",
14969
+ const TerrainDatumError = Object.freeze({
14100
14970
  /**
14101
- * Galileo System Time.
14971
+ * Terrain lookup failed before datum conversion.
14102
14972
  */
14103
- Gst: 5, "5": "Gst",
14973
+ Terrain: 0, "0": "Terrain",
14104
14974
  /**
14105
- * BeiDou Time.
14975
+ * A geoid grid could not be parsed.
14106
14976
  */
14107
- Bdt: 6, "6": "Bdt",
14977
+ Geoid: 1, "1": "Geoid",
14108
14978
  /**
14109
- * GLONASS system time (UTC(SU)-based, leap-second carrying).
14979
+ * Reading a geoid grid failed for a reason other than absence.
14110
14980
  */
14111
- Glonasst: 7, "7": "Glonasst",
14981
+ Io: 2, "2": "Io",
14112
14982
  /**
14113
- * QZSS system time (steered to GPST).
14983
+ * The EGM96 15-arcminute `WW15MGH.DAC` grid was requested but is absent.
14114
14984
  */
14115
- Qzsst: 8, "8": "Qzsst",
14985
+ MissingEgm96Dac: 3, "3": "MissingEgm96Dac",
14116
14986
  });
14117
- exports.TimeScale = TimeScale;
14987
+ exports.TerrainDatumError = TerrainDatumError;
14118
14988
 
14119
14989
  /**
14120
- * A parsed two-line element set with an initialized SGP4 satellite.
14990
+ * Geoid model used to convert terrain orthometric height `H` to ellipsoidal
14991
+ * height `h`.
14121
14992
  */
14122
- class Tle {
14993
+ class TerrainGeoidModel {
14123
14994
  static __wrap(ptr) {
14124
- const obj = Object.create(Tle.prototype);
14995
+ const obj = Object.create(TerrainGeoidModel.prototype);
14125
14996
  obj.__wbg_ptr = ptr;
14126
- TleFinalization.register(obj, obj.__wbg_ptr, obj);
14997
+ TerrainGeoidModelFinalization.register(obj, obj.__wbg_ptr, obj);
14127
14998
  return obj;
14128
14999
  }
14129
- static __unwrap(jsValue) {
14130
- if (!(jsValue instanceof Tle)) {
14131
- return 0;
14132
- }
14133
- return jsValue.__destroy_into_raw();
14134
- }
14135
15000
  __destroy_into_raw() {
14136
15001
  const ptr = this.__wbg_ptr;
14137
15002
  this.__wbg_ptr = 0;
14138
- TleFinalization.unregister(this);
15003
+ TerrainGeoidModelFinalization.unregister(this);
14139
15004
  return ptr;
14140
15005
  }
14141
15006
  free() {
14142
15007
  const ptr = this.__destroy_into_raw();
14143
- wasm.__wbg_tle_free(ptr, 0);
15008
+ wasm.__wbg_terraingeoidmodel_free(ptr, 0);
14144
15009
  }
14145
15010
  /**
14146
- * Argument of perigee, degrees.
14147
- * @returns {number}
15011
+ * Use a caller-supplied EGM96 15-arcminute geoid grid for `h = H + N`.
15012
+ * @param {Egm96FifteenMinuteGeoid} geoid
15013
+ * @returns {TerrainGeoidModel}
14148
15014
  */
14149
- get argPerigeeDeg() {
14150
- const ret = wasm.tle_argPerigeeDeg(this.__wbg_ptr);
14151
- return ret;
15015
+ static egm96FifteenMinute(geoid) {
15016
+ _assertClass(geoid, Egm96FifteenMinuteGeoid);
15017
+ const ret = wasm.terraingeoidmodel_egm96FifteenMinute(geoid.__wbg_ptr);
15018
+ return TerrainGeoidModel.__wrap(ret);
14152
15019
  }
14153
15020
  /**
14154
- * B* drag term (TLE dimensionless convention).
14155
- * @returns {number}
15021
+ * Use the embedded EGM96 1-degree geoid grid for `h = H + N`.
15022
+ * @returns {TerrainGeoidModel}
14156
15023
  */
14157
- get bstar() {
14158
- const ret = wasm.tle_bstar(this.__wbg_ptr);
14159
- return ret;
15024
+ static egm96OneDegree() {
15025
+ const ret = wasm.terraingeoidmodel_egm96OneDegree();
15026
+ return TerrainGeoidModel.__wrap(ret);
14160
15027
  }
14161
15028
  /**
14162
- * NORAD catalog number (as recorded in the TLE).
15029
+ * Model discriminator: `"egm96OneDegree"` or `"egm96FifteenMinute"`.
14163
15030
  * @returns {string}
14164
15031
  */
14165
- get catalogNumber() {
15032
+ get kind() {
14166
15033
  let deferred1_0;
14167
15034
  let deferred1_1;
14168
15035
  try {
14169
- const ret = wasm.tle_catalogNumber(this.__wbg_ptr);
15036
+ const ret = wasm.terraingeoidmodel_kind(this.__wbg_ptr);
14170
15037
  deferred1_0 = ret[0];
14171
15038
  deferred1_1 = ret[1];
14172
15039
  return getStringFromWasm0(ret[0], ret[1]);
@@ -14174,9 +15041,269 @@ class Tle {
14174
15041
  wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
14175
15042
  }
14176
15043
  }
14177
- /**
14178
- * Advisory checksum discrepancies found while parsing. Empty when both
14179
- * lines' checksums are valid.
15044
+ }
15045
+ if (Symbol.dispose) TerrainGeoidModel.prototype[Symbol.dispose] = TerrainGeoidModel.prototype.free;
15046
+ exports.TerrainGeoidModel = TerrainGeoidModel;
15047
+
15048
+ /**
15049
+ * Terrain store conversion, serialization, and parsing error variants.
15050
+ * @enum {0 | 1 | 2 | 3 | 4 | 5}
15051
+ */
15052
+ const TerrainStoreError = Object.freeze({
15053
+ /**
15054
+ * File or directory I/O failed.
15055
+ */
15056
+ Io: 0, "0": "Io",
15057
+ /**
15058
+ * DTED or terrain store bytes could not be parsed.
15059
+ */
15060
+ Parse: 1, "1": "Parse",
15061
+ /**
15062
+ * The terrain store version is not supported.
15063
+ */
15064
+ UnsupportedVersion: 2, "2": "UnsupportedVersion",
15065
+ /**
15066
+ * The terrain store datum tag is not supported.
15067
+ */
15068
+ UnsupportedDatum: 3, "3": "UnsupportedDatum",
15069
+ /**
15070
+ * Two input DTED files resolved to the same integer tile id.
15071
+ */
15072
+ DuplicateTile: 4, "4": "DuplicateTile",
15073
+ /**
15074
+ * A tile payload checksum did not match its index record.
15075
+ */
15076
+ Checksum: 5, "5": "Checksum",
15077
+ });
15078
+ exports.TerrainStoreError = TerrainStoreError;
15079
+
15080
+ /**
15081
+ * Metadata for one tile index record in a memory-mappable terrain store.
15082
+ */
15083
+ class TerrainStoreTileIndex {
15084
+ static __wrap(ptr) {
15085
+ const obj = Object.create(TerrainStoreTileIndex.prototype);
15086
+ obj.__wbg_ptr = ptr;
15087
+ TerrainStoreTileIndexFinalization.register(obj, obj.__wbg_ptr, obj);
15088
+ return obj;
15089
+ }
15090
+ __destroy_into_raw() {
15091
+ const ptr = this.__wbg_ptr;
15092
+ this.__wbg_ptr = 0;
15093
+ TerrainStoreTileIndexFinalization.unregister(this);
15094
+ return ptr;
15095
+ }
15096
+ free() {
15097
+ const ptr = this.__destroy_into_raw();
15098
+ wasm.__wbg_terrainstoretileindex_free(ptr, 0);
15099
+ }
15100
+ /**
15101
+ * FNV-1a checksum of this tile's posting payload bytes.
15102
+ * @returns {bigint}
15103
+ */
15104
+ get checksum64() {
15105
+ const ret = wasm.terrainstoretileindex_checksum64(this.__wbg_ptr);
15106
+ return BigInt.asUintN(64, ret);
15107
+ }
15108
+ /**
15109
+ * Byte length of this tile's posting payload in the store.
15110
+ * @returns {bigint}
15111
+ */
15112
+ get dataLen() {
15113
+ const ret = wasm.terrainstoretileindex_dataLen(this.__wbg_ptr);
15114
+ return BigInt.asUintN(64, ret);
15115
+ }
15116
+ /**
15117
+ * Byte offset of this tile's posting payload in the store.
15118
+ * @returns {bigint}
15119
+ */
15120
+ get dataOffset() {
15121
+ const ret = wasm.terrainstoretileindex_dataOffset(this.__wbg_ptr);
15122
+ return BigInt.asUintN(64, ret);
15123
+ }
15124
+ /**
15125
+ * Number of latitude postings.
15126
+ * @returns {number}
15127
+ */
15128
+ get latCount() {
15129
+ const ret = wasm.terrainstoretileindex_latCount(this.__wbg_ptr);
15130
+ return ret >>> 0;
15131
+ }
15132
+ /**
15133
+ * Integer latitude tile id, for example `36` for a tile covering
15134
+ * `36..37` degrees.
15135
+ * @returns {number}
15136
+ */
15137
+ get latIndex() {
15138
+ const ret = wasm.terrainstoretileindex_latIndex(this.__wbg_ptr);
15139
+ return ret;
15140
+ }
15141
+ /**
15142
+ * Number of longitude postings.
15143
+ * @returns {number}
15144
+ */
15145
+ get lonCount() {
15146
+ const ret = wasm.terrainstoretileindex_lonCount(this.__wbg_ptr);
15147
+ return ret >>> 0;
15148
+ }
15149
+ /**
15150
+ * Integer longitude tile id, for example `-107` for a tile covering
15151
+ * `-107..-106` degrees.
15152
+ * @returns {number}
15153
+ */
15154
+ get lonIndex() {
15155
+ const ret = wasm.terrainstoretileindex_lonIndex(this.__wbg_ptr);
15156
+ return ret;
15157
+ }
15158
+ /**
15159
+ * Northern edge latitude, degrees.
15160
+ * @returns {number}
15161
+ */
15162
+ get maxLatitudeDeg() {
15163
+ const ret = wasm.terrainstoretileindex_maxLatitudeDeg(this.__wbg_ptr);
15164
+ return ret;
15165
+ }
15166
+ /**
15167
+ * Eastern edge longitude, degrees.
15168
+ * @returns {number}
15169
+ */
15170
+ get maxLongitudeDeg() {
15171
+ const ret = wasm.terrainstoretileindex_maxLongitudeDeg(this.__wbg_ptr);
15172
+ return ret;
15173
+ }
15174
+ /**
15175
+ * Southern edge latitude, degrees.
15176
+ * @returns {number}
15177
+ */
15178
+ get minLatitudeDeg() {
15179
+ const ret = wasm.terrainstoretileindex_minLatitudeDeg(this.__wbg_ptr);
15180
+ return ret;
15181
+ }
15182
+ /**
15183
+ * Western edge longitude, degrees.
15184
+ * @returns {number}
15185
+ */
15186
+ get minLongitudeDeg() {
15187
+ const ret = wasm.terrainstoretileindex_minLongitudeDeg(this.__wbg_ptr);
15188
+ return ret;
15189
+ }
15190
+ /**
15191
+ * Vertical datum for this tile's orthometric posting payload.
15192
+ * @returns {VerticalDatum}
15193
+ */
15194
+ get verticalDatum() {
15195
+ const ret = wasm.terrainstoretileindex_verticalDatum(this.__wbg_ptr);
15196
+ return ret;
15197
+ }
15198
+ }
15199
+ if (Symbol.dispose) TerrainStoreTileIndex.prototype[Symbol.dispose] = TerrainStoreTileIndex.prototype.free;
15200
+ exports.TerrainStoreTileIndex = TerrainStoreTileIndex;
15201
+
15202
+ /**
15203
+ * A named time scale. The JS value matches the variant order below.
15204
+ * @enum {0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8}
15205
+ */
15206
+ const TimeScale = Object.freeze({
15207
+ /**
15208
+ * Coordinated Universal Time.
15209
+ */
15210
+ Utc: 0, "0": "Utc",
15211
+ /**
15212
+ * International Atomic Time.
15213
+ */
15214
+ Tai: 1, "1": "Tai",
15215
+ /**
15216
+ * Terrestrial Time.
15217
+ */
15218
+ Tt: 2, "2": "Tt",
15219
+ /**
15220
+ * Barycentric Dynamical Time.
15221
+ */
15222
+ Tdb: 3, "3": "Tdb",
15223
+ /**
15224
+ * GPS time.
15225
+ */
15226
+ Gpst: 4, "4": "Gpst",
15227
+ /**
15228
+ * Galileo System Time.
15229
+ */
15230
+ Gst: 5, "5": "Gst",
15231
+ /**
15232
+ * BeiDou Time.
15233
+ */
15234
+ Bdt: 6, "6": "Bdt",
15235
+ /**
15236
+ * GLONASS system time (UTC(SU)-based, leap-second carrying).
15237
+ */
15238
+ Glonasst: 7, "7": "Glonasst",
15239
+ /**
15240
+ * QZSS system time (steered to GPST).
15241
+ */
15242
+ Qzsst: 8, "8": "Qzsst",
15243
+ });
15244
+ exports.TimeScale = TimeScale;
15245
+
15246
+ /**
15247
+ * A parsed two-line element set with an initialized SGP4 satellite.
15248
+ */
15249
+ class Tle {
15250
+ static __wrap(ptr) {
15251
+ const obj = Object.create(Tle.prototype);
15252
+ obj.__wbg_ptr = ptr;
15253
+ TleFinalization.register(obj, obj.__wbg_ptr, obj);
15254
+ return obj;
15255
+ }
15256
+ static __unwrap(jsValue) {
15257
+ if (!(jsValue instanceof Tle)) {
15258
+ return 0;
15259
+ }
15260
+ return jsValue.__destroy_into_raw();
15261
+ }
15262
+ __destroy_into_raw() {
15263
+ const ptr = this.__wbg_ptr;
15264
+ this.__wbg_ptr = 0;
15265
+ TleFinalization.unregister(this);
15266
+ return ptr;
15267
+ }
15268
+ free() {
15269
+ const ptr = this.__destroy_into_raw();
15270
+ wasm.__wbg_tle_free(ptr, 0);
15271
+ }
15272
+ /**
15273
+ * Argument of perigee, degrees.
15274
+ * @returns {number}
15275
+ */
15276
+ get argPerigeeDeg() {
15277
+ const ret = wasm.tle_argPerigeeDeg(this.__wbg_ptr);
15278
+ return ret;
15279
+ }
15280
+ /**
15281
+ * B* drag term (TLE dimensionless convention).
15282
+ * @returns {number}
15283
+ */
15284
+ get bstar() {
15285
+ const ret = wasm.tle_bstar(this.__wbg_ptr);
15286
+ return ret;
15287
+ }
15288
+ /**
15289
+ * NORAD catalog number (as recorded in the TLE).
15290
+ * @returns {string}
15291
+ */
15292
+ get catalogNumber() {
15293
+ let deferred1_0;
15294
+ let deferred1_1;
15295
+ try {
15296
+ const ret = wasm.tle_catalogNumber(this.__wbg_ptr);
15297
+ deferred1_0 = ret[0];
15298
+ deferred1_1 = ret[1];
15299
+ return getStringFromWasm0(ret[0], ret[1]);
15300
+ } finally {
15301
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
15302
+ }
15303
+ }
15304
+ /**
15305
+ * Advisory checksum discrepancies found while parsing. Empty when both
15306
+ * lines' checksums are valid.
14180
15307
  * @returns {ChecksumWarning[]}
14181
15308
  */
14182
15309
  get checksumWarnings() {
@@ -14725,6 +15852,18 @@ class VelocitySolution {
14725
15852
  if (Symbol.dispose) VelocitySolution.prototype[Symbol.dispose] = VelocitySolution.prototype.free;
14726
15853
  exports.VelocitySolution = VelocitySolution;
14727
15854
 
15855
+ /**
15856
+ * Vertical datum carried by a terrain store.
15857
+ * @enum {0}
15858
+ */
15859
+ const VerticalDatum = Object.freeze({
15860
+ /**
15861
+ * Orthometric height `H` in metres above the EGM96 mean sea level geoid.
15862
+ */
15863
+ Egm96MslOrthometric: 0, "0": "Egm96MslOrthometric",
15864
+ });
15865
+ exports.VerticalDatum = VerticalDatum;
15866
+
14728
15867
  /**
14729
15868
  * Per-epoch topocentric visibility plus the dense pass list over the grid
14730
15869
  * window.
@@ -15021,6 +16160,104 @@ function acquire(samples, prn, options) {
15021
16160
  }
15022
16161
  exports.acquire = acquire;
15023
16162
 
16163
+ /**
16164
+ * Plain non-overlapping Allan deviation for explicit averaging factors.
16165
+ *
16166
+ * `series` is `{ kind, values }`, where `kind` is `"phaseSeconds"` or
16167
+ * `"fractionalFrequency"` and `values` are phase seconds or dimensionless
16168
+ * fractional-frequency samples. `tau0S` is the sample interval in seconds.
16169
+ * `averagingFactors` is an array of positive integer `m` values. Returns
16170
+ * `{ tauS, deviation, n }`.
16171
+ * @param {any} series
16172
+ * @param {number} tau0_s
16173
+ * @param {any} averaging_factors
16174
+ * @returns {any}
16175
+ */
16176
+ function allanDeviation(series, tau0_s, averaging_factors) {
16177
+ const ret = wasm.allanDeviation(series, tau0_s, averaging_factors);
16178
+ if (ret[2]) {
16179
+ throw takeFromExternrefTable0(ret[1]);
16180
+ }
16181
+ return takeFromExternrefTable0(ret[0]);
16182
+ }
16183
+ exports.allanDeviation = allanDeviation;
16184
+
16185
+ /**
16186
+ * Alpha-beta measurement update applied to a predicted scalar state.
16187
+ *
16188
+ * `predicted` is `{ level, rate }`, `measurement` has the same unit as
16189
+ * `level`, `dt` is seconds, and `gains` is `{ alpha, beta }`.
16190
+ * @param {any} predicted
16191
+ * @param {number} measurement
16192
+ * @param {number} dt
16193
+ * @param {any} gains
16194
+ * @returns {any}
16195
+ */
16196
+ function alphaBetaApplyMeasurement(predicted, measurement, dt, gains) {
16197
+ const ret = wasm.alphaBetaApplyMeasurement(predicted, measurement, dt, gains);
16198
+ if (ret[2]) {
16199
+ throw takeFromExternrefTable0(ret[1]);
16200
+ }
16201
+ return takeFromExternrefTable0(ret[0]);
16202
+ }
16203
+ exports.alphaBetaApplyMeasurement = alphaBetaApplyMeasurement;
16204
+
16205
+ /**
16206
+ * Run one alpha-beta predict and measurement update.
16207
+ *
16208
+ * `state` is `{ level, rate }`, `measurement` has the same unit as `level`,
16209
+ * `dt` is seconds, and `gains` is `{ alpha, beta }`. Returns `{ predicted,
16210
+ * updated, innovation }`.
16211
+ * @param {any} state
16212
+ * @param {number} measurement
16213
+ * @param {number} dt
16214
+ * @param {any} gains
16215
+ * @returns {any}
16216
+ */
16217
+ function alphaBetaFilterStep(state, measurement, dt, gains) {
16218
+ const ret = wasm.alphaBetaFilterStep(state, measurement, dt, gains);
16219
+ if (ret[2]) {
16220
+ throw takeFromExternrefTable0(ret[1]);
16221
+ }
16222
+ return takeFromExternrefTable0(ret[0]);
16223
+ }
16224
+ exports.alphaBetaFilterStep = alphaBetaFilterStep;
16225
+
16226
+ /**
16227
+ * Alpha-beta constant-rate prediction.
16228
+ *
16229
+ * `state` is `{ level, rate }` and `dt` is the positive propagation interval in
16230
+ * seconds. Returns the predicted `{ level, rate }`.
16231
+ * @param {any} state
16232
+ * @param {number} dt
16233
+ * @returns {any}
16234
+ */
16235
+ function alphaBetaPredict(state, dt) {
16236
+ const ret = wasm.alphaBetaPredict(state, dt);
16237
+ if (ret[2]) {
16238
+ throw takeFromExternrefTable0(ret[1]);
16239
+ }
16240
+ return takeFromExternrefTable0(ret[0]);
16241
+ }
16242
+ exports.alphaBetaPredict = alphaBetaPredict;
16243
+
16244
+ /**
16245
+ * Steady-state alpha-beta gains from a positive tracking index.
16246
+ *
16247
+ * Returns `{ alpha, beta }`, where `alpha` is the level gain and `beta` maps
16248
+ * innovation to rate through `beta * innovation / dt`.
16249
+ * @param {number} tracking_index
16250
+ * @returns {any}
16251
+ */
16252
+ function alphaBetaSteadyStateGains(tracking_index) {
16253
+ const ret = wasm.alphaBetaSteadyStateGains(tracking_index);
16254
+ if (ret[2]) {
16255
+ throw takeFromExternrefTable0(ret[1]);
16256
+ }
16257
+ return takeFromExternrefTable0(ret[0]);
16258
+ }
16259
+ exports.alphaBetaSteadyStateGains = alphaBetaSteadyStateGains;
16260
+
15024
16261
  /**
15025
16262
  * On-sky angle in degrees between two direction vectors.
15026
16263
  * @param {Float64Array} a
@@ -15057,6 +16294,68 @@ function angularSeparationCoords(a_lon_deg, a_lat_deg, b_lon_deg, b_lat_deg) {
15057
16294
  }
15058
16295
  exports.angularSeparationCoords = angularSeparationCoords;
15059
16296
 
16297
+ /**
16298
+ * Run ARAIM MHSS protection-level computation.
16299
+ *
16300
+ * `geometry.rows` contains satellite IDs, ECEF line-of-sight unit vectors,
16301
+ * optional constellation labels, and elevations in radians. `receiver` is WGS84
16302
+ * geodetic radians plus ellipsoidal height meters. `ism` contains
16303
+ * constellation defaults and optional satellite overrides. Satellite models may
16304
+ * provide paired `effectiveSigmaIntM` and `effectiveSigmaAccM` fields; omit both
16305
+ * to let the core derive them from elevation. `allocation` may be omitted to use
16306
+ * `araimLpv200Allocation()`. Returned `hplM`, `vplM`, `sigmaAccHM`,
16307
+ * `sigmaAccVM`, `emtM`, and per-mode ENU arrays are meters.
16308
+ * @param {any} geometry
16309
+ * @param {any} ism
16310
+ * @param {any} allocation
16311
+ * @returns {any}
16312
+ */
16313
+ function araim(geometry, ism, allocation) {
16314
+ const ret = wasm.araim(geometry, ism, allocation);
16315
+ if (ret[2]) {
16316
+ throw takeFromExternrefTable0(ret[1]);
16317
+ }
16318
+ return takeFromExternrefTable0(ret[0]);
16319
+ }
16320
+ exports.araim = araim;
16321
+
16322
+ /**
16323
+ * Enumerate ARAIM fault hypotheses for the given geometry, ISM, and allocation.
16324
+ *
16325
+ * Inputs mirror `araim`. The returned priors are probabilities. Excluded
16326
+ * satellites are string tokens such as `"G01"`, and excluded constellations are
16327
+ * labels such as `"GPS"`.
16328
+ * @param {any} geometry
16329
+ * @param {any} ism
16330
+ * @param {any} allocation
16331
+ * @returns {any}
16332
+ */
16333
+ function araimFaultModes(geometry, ism, allocation) {
16334
+ const ret = wasm.araimFaultModes(geometry, ism, allocation);
16335
+ if (ret[2]) {
16336
+ throw takeFromExternrefTable0(ret[1]);
16337
+ }
16338
+ return takeFromExternrefTable0(ret[0]);
16339
+ }
16340
+ exports.araimFaultModes = araimFaultModes;
16341
+
16342
+ /**
16343
+ * LPV-200 ARAIM integrity and continuity allocation.
16344
+ *
16345
+ * The returned object can be passed to `araim`. Probability fields are
16346
+ * dimensionless, `pEmt` defaults to `1e-5`, and `maxFaultOrder` is an integer
16347
+ * fault order.
16348
+ * @returns {any}
16349
+ */
16350
+ function araimLpv200Allocation() {
16351
+ const ret = wasm.araimLpv200Allocation();
16352
+ if (ret[2]) {
16353
+ throw takeFromExternrefTable0(ret[1]);
16354
+ }
16355
+ return takeFromExternrefTable0(ret[0]);
16356
+ }
16357
+ exports.araimLpv200Allocation = araimLpv200Allocation;
16358
+
15060
16359
  /**
15061
16360
  * Evaluate NRLMSISE-00 neutral-atmosphere density and temperature.
15062
16361
  *
@@ -15231,6 +16530,92 @@ function carrierFrequencyHz(system, band) {
15231
16530
  }
15232
16531
  exports.carrierFrequencyHz = carrierFrequencyHz;
15233
16532
 
16533
+ /**
16534
+ * CA-CFAR false alarm probability from searched-cell count, absolute
16535
+ * threshold, and mean noise level.
16536
+ * @param {number} searched_cells
16537
+ * @param {number} threshold
16538
+ * @param {number} noise_level
16539
+ * @returns {number}
16540
+ */
16541
+ function cfarCaFalseAlarmProbability(searched_cells, threshold, noise_level) {
16542
+ const ret = wasm.cfarCaFalseAlarmProbability(searched_cells, threshold, noise_level);
16543
+ if (ret[2]) {
16544
+ throw takeFromExternrefTable0(ret[1]);
16545
+ }
16546
+ return ret[0];
16547
+ }
16548
+ exports.cfarCaFalseAlarmProbability = cfarCaFalseAlarmProbability;
16549
+
16550
+ /**
16551
+ * CA-CFAR threshold multiplier from searched-cell count and target false alarm
16552
+ * probability.
16553
+ * @param {number} searched_cells
16554
+ * @param {number} false_alarm_probability
16555
+ * @returns {number}
16556
+ */
16557
+ function cfarCaMultiplierFromPfa(searched_cells, false_alarm_probability) {
16558
+ const ret = wasm.cfarCaMultiplierFromPfa(searched_cells, false_alarm_probability);
16559
+ if (ret[2]) {
16560
+ throw takeFromExternrefTable0(ret[1]);
16561
+ }
16562
+ return ret[0];
16563
+ }
16564
+ exports.cfarCaMultiplierFromPfa = cfarCaMultiplierFromPfa;
16565
+
16566
+ /**
16567
+ * CA-CFAR false alarm probability from searched-cell count and multiplier.
16568
+ * @param {number} searched_cells
16569
+ * @param {number} multiplier
16570
+ * @returns {number}
16571
+ */
16572
+ function cfarCaPfaFromMultiplier(searched_cells, multiplier) {
16573
+ const ret = wasm.cfarCaPfaFromMultiplier(searched_cells, multiplier);
16574
+ if (ret[2]) {
16575
+ throw takeFromExternrefTable0(ret[1]);
16576
+ }
16577
+ return ret[0];
16578
+ }
16579
+ exports.cfarCaPfaFromMultiplier = cfarCaPfaFromMultiplier;
16580
+
16581
+ /**
16582
+ * CA-CFAR absolute threshold from searched-cell count, target false alarm
16583
+ * probability, and mean noise level.
16584
+ * @param {number} searched_cells
16585
+ * @param {number} false_alarm_probability
16586
+ * @param {number} noise_level
16587
+ * @returns {number}
16588
+ */
16589
+ function cfarCaThreshold(searched_cells, false_alarm_probability, noise_level) {
16590
+ const ret = wasm.cfarCaThreshold(searched_cells, false_alarm_probability, noise_level);
16591
+ if (ret[2]) {
16592
+ throw takeFromExternrefTable0(ret[1]);
16593
+ }
16594
+ return ret[0];
16595
+ }
16596
+ exports.cfarCaThreshold = cfarCaThreshold;
16597
+
16598
+ /**
16599
+ * Compute the closed-form Chan-Ho seed used by [`locateSource`].
16600
+ *
16601
+ * `mode` is `"toa"`, `"tdoa"`, or `{ mode: "tdoa", referenceSensor }`.
16602
+ * Per-sensor speed overrides are not used by the closed-form equations, but
16603
+ * they are used by [`locateSource`] during iterative refinement.
16604
+ * @param {any} sensors
16605
+ * @param {any} arrival_times_s
16606
+ * @param {number} propagation_speed_m_s
16607
+ * @param {any} mode
16608
+ * @returns {any}
16609
+ */
16610
+ function chanHoInitialGuess(sensors, arrival_times_s, propagation_speed_m_s, mode) {
16611
+ const ret = wasm.chanHoInitialGuess(sensors, arrival_times_s, propagation_speed_m_s, mode);
16612
+ if (ret[2]) {
16613
+ throw takeFromExternrefTable0(ret[1]);
16614
+ }
16615
+ return takeFromExternrefTable0(ret[0]);
16616
+ }
16617
+ exports.chanHoInitialGuess = chanHoInitialGuess;
16618
+
15234
16619
  /**
15235
16620
  * Returns `true` when a diff has any findings.
15236
16621
  * @param {any} diff
@@ -15392,6 +16777,29 @@ function collisionProbability(object1, object2, hard_body_radius_km, method) {
15392
16777
  }
15393
16778
  exports.collisionProbability = collisionProbability;
15394
16779
 
16780
+ /**
16781
+ * Compute one or more Allan-family curves with a selected tau grid and gap
16782
+ * policy.
16783
+ *
16784
+ * `input` is `{ series, tau0S, options? }`. `series.kind` may be
16785
+ * `"phaseSeconds"`, `"fractionalFrequency"`, `"phaseSecondsWithGaps"`, or
16786
+ * `"fractionalFrequencyWithGaps"`; gap series use `null` for missing samples.
16787
+ * `options.estimators` is `"standard"`, `"all"`, `"none"`, or a boolean flag
16788
+ * object. `options.tauGrid` is `"octave"`, `"all"`, or
16789
+ * `{ kind: "explicit", averagingFactors }`. `tau0S` and all returned `tauS`
16790
+ * values are seconds.
16791
+ * @param {any} input
16792
+ * @returns {any}
16793
+ */
16794
+ function computeAllanDeviations(input) {
16795
+ const ret = wasm.computeAllanDeviations(input);
16796
+ if (ret[2]) {
16797
+ throw takeFromExternrefTable0(ret[1]);
16798
+ }
16799
+ return takeFromExternrefTable0(ret[0]);
16800
+ }
16801
+ exports.computeAllanDeviations = computeAllanDeviations;
16802
+
15395
16803
  /**
15396
16804
  * Coherently correlate interleaved IQ samples against a GPS C/A PRN replica.
15397
16805
  * `iq` is `[i0, q0, i1, q1, ...]`.
@@ -15662,6 +17070,12 @@ function decodeRtcmStream(bytes) {
15662
17070
  exports.decodeRtcmStream = decodeRtcmStream;
15663
17071
 
15664
17072
  /**
17073
+ * Decode a raw SBAS message.
17074
+ *
17075
+ * `form` is `"framed250"` for a 32-byte message with CRC or `"body226"` for a
17076
+ * 29-byte body. The result contains `messageType`, `form`, legacy debug
17077
+ * `kind`, and `message`, a structured decoded payload. Parse failures are
17078
+ * thrown as `Error`.
15665
17079
  * @param {Uint8Array} bytes
15666
17080
  * @param {string | null} [form]
15667
17081
  * @returns {any}
@@ -15907,6 +17321,27 @@ function dopplerToRangeRate(doppler_hz, carrier_hz) {
15907
17321
  }
15908
17322
  exports.dopplerToRangeRate = dopplerToRangeRate;
15909
17323
 
17324
+ /**
17325
+ * Convert a DTED tile tree into canonical memory-mappable terrain store bytes.
17326
+ *
17327
+ * The returned `Uint8Array` can be passed to [`MmapTerrain.fromBytes`] or
17328
+ * [`MmapTerrain.fromVec`]. Posting payloads are decoded orthometric metres.
17329
+ * @param {string} root
17330
+ * @returns {Uint8Array}
17331
+ */
17332
+ function dtedTreeToMmapStore(root) {
17333
+ const ptr0 = passStringToWasm0(root, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
17334
+ const len0 = WASM_VECTOR_LEN;
17335
+ const ret = wasm.dtedTreeToMmapStore(ptr0, len0);
17336
+ if (ret[3]) {
17337
+ throw takeFromExternrefTable0(ret[2]);
17338
+ }
17339
+ var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
17340
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
17341
+ return v2;
17342
+ }
17343
+ exports.dtedTreeToMmapStore = dtedTreeToMmapStore;
17344
+
15910
17345
  /**
15911
17346
  * Angular radius in degrees of Earth as seen from each satellite position.
15912
17347
  * @param {Float64Array} satellite_position_km
@@ -16307,22 +17742,57 @@ function estimateDecay(drag, request) {
16307
17742
  exports.estimateDecay = estimateDecay;
16308
17743
 
16309
17744
  /**
16310
- * Estimate decay using per-epoch values from a parsed space-weather table.
16311
- * @param {DragForce} drag
16312
- * @param {SpaceWeatherTable} table
16313
- * @param {any} request
16314
- * @returns {any}
17745
+ * Estimate decay using per-epoch values from a parsed space-weather table.
17746
+ * @param {DragForce} drag
17747
+ * @param {SpaceWeatherTable} table
17748
+ * @param {any} request
17749
+ * @returns {any}
17750
+ */
17751
+ function estimateDecayWithSpaceWeather(drag, table, request) {
17752
+ _assertClass(drag, DragForce);
17753
+ _assertClass(table, SpaceWeatherTable);
17754
+ const ret = wasm.estimateDecayWithSpaceWeather(drag.__wbg_ptr, table.__wbg_ptr, request);
17755
+ if (ret[2]) {
17756
+ throw takeFromExternrefTable0(ret[1]);
17757
+ }
17758
+ return takeFromExternrefTable0(ret[0]);
17759
+ }
17760
+ exports.estimateDecayWithSpaceWeather = estimateDecayWithSpaceWeather;
17761
+
17762
+ /**
17763
+ * Exponentially weighted moving-average update.
17764
+ *
17765
+ * `alpha` must be in `[0, 1]`; the returned value is
17766
+ * `previous + alpha * (sample - previous)`.
17767
+ * @param {number} previous
17768
+ * @param {number} sample
17769
+ * @param {number} alpha
17770
+ * @returns {number}
17771
+ */
17772
+ function ewmaUpdate(previous, sample, alpha) {
17773
+ const ret = wasm.ewmaUpdate(previous, sample, alpha);
17774
+ if (ret[2]) {
17775
+ throw takeFromExternrefTable0(ret[1]);
17776
+ }
17777
+ return ret[0];
17778
+ }
17779
+ exports.ewmaUpdate = ewmaUpdate;
17780
+
17781
+ /**
17782
+ * EWMA update with `alpha = 1 / 2^shift`.
17783
+ * @param {number} previous
17784
+ * @param {number} sample
17785
+ * @param {number} shift
17786
+ * @returns {number}
16315
17787
  */
16316
- function estimateDecayWithSpaceWeather(drag, table, request) {
16317
- _assertClass(drag, DragForce);
16318
- _assertClass(table, SpaceWeatherTable);
16319
- const ret = wasm.estimateDecayWithSpaceWeather(drag.__wbg_ptr, table.__wbg_ptr, request);
17788
+ function ewmaUpdatePowerOfTwo(previous, sample, shift) {
17789
+ const ret = wasm.ewmaUpdatePowerOfTwo(previous, sample, shift);
16320
17790
  if (ret[2]) {
16321
17791
  throw takeFromExternrefTable0(ret[1]);
16322
17792
  }
16323
- return takeFromExternrefTable0(ret[0]);
17793
+ return ret[0];
16324
17794
  }
16325
- exports.estimateDecayWithSpaceWeather = estimateDecayWithSpaceWeather;
17795
+ exports.ewmaUpdatePowerOfTwo = ewmaUpdatePowerOfTwo;
16326
17796
 
16327
17797
  /**
16328
17798
  * Find Moon elevation threshold crossings (moonrise / moonset) over a UTC
@@ -17192,6 +18662,26 @@ function gpsUtcOffsetS(year, month, day) {
17192
18662
  }
17193
18663
  exports.gpsUtcOffsetS = gpsUtcOffsetS;
17194
18664
 
18665
+ /**
18666
+ * Overlapping Hadamard deviation for explicit averaging factors.
18667
+ *
18668
+ * `series` is `{ kind, values }`, `tau0S` is seconds, and
18669
+ * `averagingFactors` contains positive integer `m` values. Returns
18670
+ * `{ tauS, deviation, n }`.
18671
+ * @param {any} series
18672
+ * @param {number} tau0_s
18673
+ * @param {any} averaging_factors
18674
+ * @returns {any}
18675
+ */
18676
+ function hadamardDeviation(series, tau0_s, averaging_factors) {
18677
+ const ret = wasm.hadamardDeviation(series, tau0_s, averaging_factors);
18678
+ if (ret[2]) {
18679
+ throw takeFromExternrefTable0(ret[1]);
18680
+ }
18681
+ return takeFromExternrefTable0(ret[0]);
18682
+ }
18683
+ exports.hadamardDeviation = hadamardDeviation;
18684
+
17195
18685
  /**
17196
18686
  * Trace of the Gauss-Newton Hessian approximation `J^T J`: the sum of the
17197
18687
  * squared column norms of the Jacobian, with no inverse formed.
@@ -17305,6 +18795,49 @@ function iodHerrickGibbs(r1, r2, r3, jd1, jd2, jd3) {
17305
18795
  }
17306
18796
  exports.iodHerrickGibbs = iodHerrickGibbs;
17307
18797
 
18798
+ /**
18799
+ * Build an IONEX vertical-TEC product from flat node samples.
18800
+ *
18801
+ * `samples` is an array of `{ epochJ2000S, latDeg, lonDeg, vtecTecu,
18802
+ * rmsTecu? }` objects. Epochs are integer seconds since J2000, coordinates are
18803
+ * degrees, and TEC/RMS values are TECU. `shellHeightKm` and `baseRadiusKm` are
18804
+ * kilometers. Validation errors from the core sample builder are thrown as
18805
+ * `RangeError`.
18806
+ * @param {any} samples
18807
+ * @param {number} shell_height_km
18808
+ * @param {number} base_radius_km
18809
+ * @param {number} exponent
18810
+ * @returns {Ionex}
18811
+ */
18812
+ function ionexFromNodeSamples(samples, shell_height_km, base_radius_km, exponent) {
18813
+ const ret = wasm.ionexFromNodeSamples(samples, shell_height_km, base_radius_km, exponent);
18814
+ if (ret[2]) {
18815
+ throw takeFromExternrefTable0(ret[1]);
18816
+ }
18817
+ return Ionex.__wrap(ret[0]);
18818
+ }
18819
+ exports.ionexFromNodeSamples = ionexFromNodeSamples;
18820
+
18821
+ /**
18822
+ * Build an IONEX vertical-TEC product from full-grid samples.
18823
+ *
18824
+ * `samples.mapEpochsJ2000S` are integer seconds since J2000. Latitude and
18825
+ * longitude nodes and `dlatDeg` / `dlonDeg` are degrees. `tecMaps` and
18826
+ * `rmsMaps` are TECU and indexed `[map][iLat][iLon]`. The shell height and
18827
+ * base radius are kilometers. Validation errors from the core sample builder
18828
+ * are thrown as `RangeError`.
18829
+ * @param {any} samples
18830
+ * @returns {Ionex}
18831
+ */
18832
+ function ionexFromSamples(samples) {
18833
+ const ret = wasm.ionexFromSamples(samples);
18834
+ if (ret[2]) {
18835
+ throw takeFromExternrefTable0(ret[1]);
18836
+ }
18837
+ return Ionex.__wrap(ret[0]);
18838
+ }
18839
+ exports.ionexFromSamples = ionexFromSamples;
18840
+
17308
18841
  /**
17309
18842
  * Ionosphere-free code or meter-valued phase combination, metres.
17310
18843
  * @param {number} obs1_m
@@ -17443,6 +18976,26 @@ function jarqueBera(x) {
17443
18976
  }
17444
18977
  exports.jarqueBera = jarqueBera;
17445
18978
 
18979
+ /**
18980
+ * Steady-state gains for a scalar constant-velocity Kalman filter.
18981
+ *
18982
+ * `trackingIndex`, `dt`, and `measurementVariance` must be positive. Returns
18983
+ * `{ positionGain, rateGain }`; `rateGain * dt` equals the alpha-beta `beta`
18984
+ * gain for the same tracking index.
18985
+ * @param {number} tracking_index
18986
+ * @param {number} dt
18987
+ * @param {number} measurement_variance
18988
+ * @returns {any}
18989
+ */
18990
+ function kalmanCvSteadyStateGains(tracking_index, dt, measurement_variance) {
18991
+ const ret = wasm.kalmanCvSteadyStateGains(tracking_index, dt, measurement_variance);
18992
+ if (ret[2]) {
18993
+ throw takeFromExternrefTable0(ret[1]);
18994
+ }
18995
+ return takeFromExternrefTable0(ret[0]);
18996
+ }
18997
+ exports.kalmanCvSteadyStateGains = kalmanCvSteadyStateGains;
18998
+
17446
18999
  /**
17447
19000
  * GPS broadcast Klobuchar ionospheric group delay in the model's native units
17448
19001
  * (positive metres).
@@ -18013,6 +19566,30 @@ function loadSp3(bytes) {
18013
19566
  }
18014
19567
  exports.loadSp3 = loadSp3;
18015
19568
 
19569
+ /**
19570
+ * Locate a source from sensor arrival times.
19571
+ *
19572
+ * `sensors` is an array of `{ positionM, propagationSpeedMS? }`; each
19573
+ * `positionM` is a 2D or 3D Cartesian metre vector and all sensors must share
19574
+ * the same dimension. `arrivalTimesS` is an aligned seconds array,
19575
+ * `propagationSpeedMS` is the call-level speed in metres per second, and
19576
+ * `options` may include `mode`, `referenceSensor`, `timingSigmaS`, `loss`,
19577
+ * `fScaleS`, `ftol`, `xtol`, `gtol`, and `maxNfev`.
19578
+ * @param {any} sensors
19579
+ * @param {any} arrival_times_s
19580
+ * @param {number} propagation_speed_m_s
19581
+ * @param {any} options
19582
+ * @returns {any}
19583
+ */
19584
+ function locateSource(sensors, arrival_times_s, propagation_speed_m_s, options) {
19585
+ const ret = wasm.locateSource(sensors, arrival_times_s, propagation_speed_m_s, options);
19586
+ if (ret[2]) {
19587
+ throw takeFromExternrefTable0(ret[1]);
19588
+ }
19589
+ return takeFromExternrefTable0(ret[0]);
19590
+ }
19591
+ exports.locateSource = locateSource;
19592
+
18016
19593
  /**
18017
19594
  * @param {bigint} start_unix_us
18018
19595
  * @param {bigint} end_unix_us
@@ -18067,6 +19644,35 @@ function lvlhRotation(position_km, velocity_km_s) {
18067
19644
  }
18068
19645
  exports.lvlhRotation = lvlhRotation;
18069
19646
 
19647
+ /**
19648
+ * Gaussian consistency factor applied by [`madSpread`].
19649
+ * @returns {number}
19650
+ */
19651
+ function madGaussianConsistency() {
19652
+ const ret = wasm.madGaussianConsistency();
19653
+ return ret;
19654
+ }
19655
+ exports.madGaussianConsistency = madGaussianConsistency;
19656
+
19657
+ /**
19658
+ * Median absolute deviation spread estimate.
19659
+ *
19660
+ * `values` is a JS number array. The returned spread is
19661
+ * `MAD_GAUSSIAN_CONSISTENCY * median(abs(value - median(values)))`, floored by
19662
+ * `scaleFloor`.
19663
+ * @param {any} values
19664
+ * @param {number} scale_floor
19665
+ * @returns {number}
19666
+ */
19667
+ function madSpread(values, scale_floor) {
19668
+ const ret = wasm.madSpread(values, scale_floor);
19669
+ if (ret[2]) {
19670
+ throw takeFromExternrefTable0(ret[1]);
19671
+ }
19672
+ return ret[0];
19673
+ }
19674
+ exports.madSpread = madSpread;
19675
+
18070
19676
  /**
18071
19677
  * @param {number} radius_km
18072
19678
  * @returns {number}
@@ -18257,6 +19863,26 @@ function meridianTransitsSpk(spk, body, station, start_unix_us, end_unix_us, ste
18257
19863
  }
18258
19864
  exports.meridianTransitsSpk = meridianTransitsSpk;
18259
19865
 
19866
+ /**
19867
+ * Modified Allan deviation for explicit averaging factors.
19868
+ *
19869
+ * `series` is `{ kind, values }`, `tau0S` is seconds, and
19870
+ * `averagingFactors` contains positive integer `m` values. Returns
19871
+ * `{ tauS, deviation, n }`.
19872
+ * @param {any} series
19873
+ * @param {number} tau0_s
19874
+ * @param {any} averaging_factors
19875
+ * @returns {any}
19876
+ */
19877
+ function modifiedAdev(series, tau0_s, averaging_factors) {
19878
+ const ret = wasm.modifiedAdev(series, tau0_s, averaging_factors);
19879
+ if (ret[2]) {
19880
+ throw takeFromExternrefTable0(ret[1]);
19881
+ }
19882
+ return takeFromExternrefTable0(ret[0]);
19883
+ }
19884
+ exports.modifiedAdev = modifiedAdev;
19885
+
18260
19886
  /**
18261
19887
  * Mean, variance, skewness, and excess kurtosis of a residual set in one pass.
18262
19888
  *
@@ -18479,6 +20105,69 @@ function nequickGStecTecu(_eval) {
18479
20105
  }
18480
20106
  exports.nequickGStecTecu = nequickGStecTecu;
18481
20107
 
20108
+ /**
20109
+ * Scalar normalized innovation squared statistic.
20110
+ * @param {number} innovation
20111
+ * @param {number} innovation_variance
20112
+ * @returns {number}
20113
+ */
20114
+ function nis(innovation, innovation_variance) {
20115
+ const ret = wasm.nis(innovation, innovation_variance);
20116
+ if (ret[2]) {
20117
+ throw takeFromExternrefTable0(ret[1]);
20118
+ }
20119
+ return ret[0];
20120
+ }
20121
+ exports.nis = nis;
20122
+
20123
+ /**
20124
+ * Bar-Shalom expected NIS value for `dof` measurement degrees of freedom.
20125
+ * @param {number} dof
20126
+ * @returns {number}
20127
+ */
20128
+ function nisExpectedValue(dof) {
20129
+ const ret = wasm.nisExpectedValue(dof);
20130
+ if (ret[2]) {
20131
+ throw takeFromExternrefTable0(ret[1]);
20132
+ }
20133
+ return ret[0];
20134
+ }
20135
+ exports.nisExpectedValue = nisExpectedValue;
20136
+
20137
+ /**
20138
+ * Test a scalar innovation against a chi-square NIS gate.
20139
+ *
20140
+ * Returns `{ nis, threshold, inGate, dof }`, with `confidence` in `(0, 1)`.
20141
+ * @param {number} innovation
20142
+ * @param {number} innovation_variance
20143
+ * @param {number} dof
20144
+ * @param {number} confidence
20145
+ * @returns {any}
20146
+ */
20147
+ function nisGate(innovation, innovation_variance, dof, confidence) {
20148
+ const ret = wasm.nisGate(innovation, innovation_variance, dof, confidence);
20149
+ if (ret[2]) {
20150
+ throw takeFromExternrefTable0(ret[1]);
20151
+ }
20152
+ return takeFromExternrefTable0(ret[0]);
20153
+ }
20154
+ exports.nisGate = nisGate;
20155
+
20156
+ /**
20157
+ * Chi-square NIS gate threshold for `dof` and confidence probability.
20158
+ * @param {number} dof
20159
+ * @param {number} confidence
20160
+ * @returns {number}
20161
+ */
20162
+ function nisGateThreshold(dof, confidence) {
20163
+ const ret = wasm.nisGateThreshold(dof, confidence);
20164
+ if (ret[2]) {
20165
+ throw takeFromExternrefTable0(ret[1]);
20166
+ }
20167
+ return ret[0];
20168
+ }
20169
+ exports.nisGateThreshold = nisGateThreshold;
20170
+
18482
20171
  /**
18483
20172
  * Parse bytes and return grouped epoch snapshots directly.
18484
20173
  * @param {Uint8Array} bytes
@@ -18566,6 +20255,21 @@ function normalCovariance(jacobian, m, n, variance_scale) {
18566
20255
  }
18567
20256
  exports.normalCovariance = normalCovariance;
18568
20257
 
20258
+ /**
20259
+ * Scalar normalized innovation `innovation / sqrt(innovationVariance)`.
20260
+ * @param {number} innovation
20261
+ * @param {number} innovation_variance
20262
+ * @returns {number}
20263
+ */
20264
+ function normalizedInnovation(innovation, innovation_variance) {
20265
+ const ret = wasm.normalizedInnovation(innovation, innovation_variance);
20266
+ if (ret[2]) {
20267
+ throw takeFromExternrefTable0(ret[1]);
20268
+ }
20269
+ return ret[0];
20270
+ }
20271
+ exports.normalizedInnovation = normalizedInnovation;
20272
+
18569
20273
  /**
18570
20274
  * Build the NTRIP connection request bytes for a config object.
18571
20275
  * @param {any} config
@@ -18582,6 +20286,24 @@ function ntripRequestBytes(config) {
18582
20286
  }
18583
20287
  exports.ntripRequestBytes = ntripRequestBytes;
18584
20288
 
20289
+ /**
20290
+ * Missing-position sentinel used in failed observable-state batch elements.
20291
+ *
20292
+ * The returned JS value is `[NaN, NaN, NaN]`, matching
20293
+ * `sidereon_core::ephemeris::OBSERVABLE_STATE_MISSING_POSITION_ECEF_M`. Always
20294
+ * check `elementResults[i].ok` or `statuses[i]` before using
20295
+ * `positionsEcefM[i]`.
20296
+ * @returns {any}
20297
+ */
20298
+ function observableStateMissingPositionEcefM() {
20299
+ const ret = wasm.observableStateMissingPositionEcefM();
20300
+ if (ret[2]) {
20301
+ throw takeFromExternrefTable0(ret[1]);
20302
+ }
20303
+ return takeFromExternrefTable0(ret[0]);
20304
+ }
20305
+ exports.observableStateMissingPositionEcefM = observableStateMissingPositionEcefM;
20306
+
18585
20307
  /**
18586
20308
  * Predict observables for one satellite from a broadcast ephemeris store.
18587
20309
  * Delegates to `sidereon_core::observables::predict`.
@@ -18778,6 +20500,26 @@ function orthometricHeightM(ellipsoidal_height_m, lat_rad, lon_rad) {
18778
20500
  }
18779
20501
  exports.orthometricHeightM = orthometricHeightM;
18780
20502
 
20503
+ /**
20504
+ * Fully overlapping Allan deviation for explicit averaging factors.
20505
+ *
20506
+ * `series` is `{ kind, values }`, `tau0S` is seconds, and
20507
+ * `averagingFactors` contains positive integer `m` values. Returns
20508
+ * `{ tauS, deviation, n }`.
20509
+ * @param {any} series
20510
+ * @param {number} tau0_s
20511
+ * @param {any} averaging_factors
20512
+ * @returns {any}
20513
+ */
20514
+ function overlappingAdev(series, tau0_s, averaging_factors) {
20515
+ const ret = wasm.overlappingAdev(series, tau0_s, averaging_factors);
20516
+ if (ret[2]) {
20517
+ throw takeFromExternrefTable0(ret[1]);
20518
+ }
20519
+ return takeFromExternrefTable0(ret[0]);
20520
+ }
20521
+ exports.overlappingAdev = overlappingAdev;
20522
+
18781
20523
  /**
18782
20524
  * Parallactic angle (degrees) of a target at a station.
18783
20525
  *
@@ -19996,6 +21738,23 @@ function sampleSp3Ephemeris(sp3, satellites, start_j2000_s, stop_j2000_s, step_s
19996
21738
  }
19997
21739
  exports.sampleSp3Ephemeris = sampleSp3Ephemeris;
19998
21740
 
21741
+ /**
21742
+ * Convert an SBAS satellite token such as `"S29"` to broadcast PRN number
21743
+ * such as `129`. Returns `null` for non-SBAS satellites.
21744
+ * @param {string} sat
21745
+ * @returns {any}
21746
+ */
21747
+ function satToSbasPrn(sat) {
21748
+ const ptr0 = passStringToWasm0(sat, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
21749
+ const len0 = WASM_VECTOR_LEN;
21750
+ const ret = wasm.satToSbasPrn(ptr0, len0);
21751
+ if (ret[2]) {
21752
+ throw takeFromExternrefTable0(ret[1]);
21753
+ }
21754
+ return takeFromExternrefTable0(ret[0]);
21755
+ }
21756
+ exports.satToSbasPrn = satToSbasPrn;
21757
+
19999
21758
  /**
20000
21759
  * Apparent visual magnitude of a sunlit body from a diffuse-sphere phase law.
20001
21760
  *
@@ -20020,6 +21779,10 @@ function satelliteVisualMagnitude(range_km, phase_angle_deg, standard_magnitude,
20020
21779
  exports.satelliteVisualMagnitude = satelliteVisualMagnitude;
20021
21780
 
20022
21781
  /**
21782
+ * SBAS-corrected broadcast satellite position and clock.
21783
+ *
21784
+ * Position is ECEF meters and clock is seconds at `tJ2000S`, seconds since
21785
+ * J2000. Returns `null` when the selected SBAS mode cannot provide a state.
20023
21786
  * @param {BroadcastEphemeris} broadcast
20024
21787
  * @param {SbasCorrectionStore} store
20025
21788
  * @param {string} geo
@@ -20045,6 +21808,18 @@ function sbasCorrectedState(broadcast, store, geo, sat, t_j2000_s, mode) {
20045
21808
  }
20046
21809
  exports.sbasCorrectedState = sbasCorrectedState;
20047
21810
 
21811
+ /**
21812
+ * Convert an SBAS broadcast PRN number such as `129` to an SBAS satellite
21813
+ * token such as `"S29"`. Returns `null` when the PRN is outside the SBAS range.
21814
+ * @param {number} broadcast_prn
21815
+ * @returns {any}
21816
+ */
21817
+ function sbasPrnToSat(broadcast_prn) {
21818
+ const ret = wasm.sbasPrnToSat(broadcast_prn);
21819
+ return ret;
21820
+ }
21821
+ exports.sbasPrnToSat = sbasPrnToSat;
21822
+
20048
21823
  /**
20049
21824
  * Screen a primary satellite against a secondary TLE catalog for threshold TCAs.
20050
21825
  *
@@ -20629,6 +22404,11 @@ function solveRtkFloat(config) {
20629
22404
  exports.solveRtkFloat = solveRtkFloat;
20630
22405
 
20631
22406
  /**
22407
+ * Solve SPP using an SBAS-corrected broadcast source and optional SBAS iono.
22408
+ *
22409
+ * The returned solution uses the same units as `solveSpp`: ECEF meters,
22410
+ * receiver clock seconds, residual meters, and optional geodetic radians plus
22411
+ * ellipsoidal height meters.
20632
22412
  * @param {BroadcastEphemeris} broadcast
20633
22413
  * @param {SbasCorrectionStore} store
20634
22414
  * @param {string} geo
@@ -20745,6 +22525,78 @@ function solveWithFallback(precise, broadcast, request, policy) {
20745
22525
  }
20746
22526
  exports.solveWithFallback = solveWithFallback;
20747
22527
 
22528
+ /**
22529
+ * Compute the timing Cramer-Rao lower bound for a proposed source position.
22530
+ *
22531
+ * The covariance is `(H^T H)^-1 * timingSigmaS^2`; position blocks are square
22532
+ * metres and origin-time variance is square seconds.
22533
+ * @param {any} sensors
22534
+ * @param {any} source_position_m
22535
+ * @param {number} propagation_speed_m_s
22536
+ * @param {number} timing_sigma_s
22537
+ * @returns {any}
22538
+ */
22539
+ function sourceCrlb(sensors, source_position_m, propagation_speed_m_s, timing_sigma_s) {
22540
+ const ret = wasm.sourceCrlb(sensors, source_position_m, propagation_speed_m_s, timing_sigma_s);
22541
+ if (ret[2]) {
22542
+ throw takeFromExternrefTable0(ret[1]);
22543
+ }
22544
+ return takeFromExternrefTable0(ret[0]);
22545
+ }
22546
+ exports.sourceCrlb = sourceCrlb;
22547
+
22548
+ /**
22549
+ * Compute timing DOP for a proposed source position.
22550
+ *
22551
+ * `sourcePositionM` is a 2D or 3D Cartesian metre vector in the same frame as
22552
+ * the sensors. The returned DOP values multiply timing sigma in seconds to
22553
+ * produce metres in the caller's Cartesian axes.
22554
+ * @param {any} sensors
22555
+ * @param {any} source_position_m
22556
+ * @param {number} propagation_speed_m_s
22557
+ * @returns {any}
22558
+ */
22559
+ function sourceDop(sensors, source_position_m, propagation_speed_m_s) {
22560
+ const ret = wasm.sourceDop(sensors, source_position_m, propagation_speed_m_s);
22561
+ if (ret[2]) {
22562
+ throw takeFromExternrefTable0(ret[1]);
22563
+ }
22564
+ return takeFromExternrefTable0(ret[0]);
22565
+ }
22566
+ exports.sourceDop = sourceDop;
22567
+
22568
+ /**
22569
+ * Return the plain mode object for TDOA solves against `referenceSensor`.
22570
+ * @param {number} reference_sensor
22571
+ * @returns {any}
22572
+ */
22573
+ function sourceSolveModeTdoa(reference_sensor) {
22574
+ const ret = wasm.sourceSolveModeTdoa(reference_sensor);
22575
+ if (ret[2]) {
22576
+ throw takeFromExternrefTable0(ret[1]);
22577
+ }
22578
+ return takeFromExternrefTable0(ret[0]);
22579
+ }
22580
+ exports.sourceSolveModeTdoa = sourceSolveModeTdoa;
22581
+
22582
+ /**
22583
+ * Return the plain mode value for absolute time-of-arrival solves.
22584
+ * @returns {string}
22585
+ */
22586
+ function sourceSolveModeToa() {
22587
+ let deferred1_0;
22588
+ let deferred1_1;
22589
+ try {
22590
+ const ret = wasm.sourceSolveModeToa();
22591
+ deferred1_0 = ret[0];
22592
+ deferred1_1 = ret[1];
22593
+ return getStringFromWasm0(ret[0], ret[1]);
22594
+ } finally {
22595
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
22596
+ }
22597
+ }
22598
+ exports.sourceSolveModeToa = sourceSolveModeToa;
22599
+
20748
22600
  /**
20749
22601
  * Extract a parsed SP3 product as the canonical precise-ephemeris samples, one
20750
22602
  * per real position record in ascending epoch order.
@@ -21031,6 +22883,39 @@ function terminatorLatitudeDeg(sub_solar_latitude_deg, sub_solar_longitude_deg,
21031
22883
  }
21032
22884
  exports.terminatorLatitudeDeg = terminatorLatitudeDeg;
21033
22885
 
22886
+ /**
22887
+ * Return an FNV-1a checksum for terrain store bytes.
22888
+ * @param {Uint8Array} bytes
22889
+ * @returns {bigint}
22890
+ */
22891
+ function terrainStoreChecksum64(bytes) {
22892
+ const ptr0 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc);
22893
+ const len0 = WASM_VECTOR_LEN;
22894
+ const ret = wasm.terrainStoreChecksum64(ptr0, len0);
22895
+ return BigInt.asUintN(64, ret);
22896
+ }
22897
+ exports.terrainStoreChecksum64 = terrainStoreChecksum64;
22898
+
22899
+ /**
22900
+ * Time deviation for explicit averaging factors.
22901
+ *
22902
+ * `series` is `{ kind, values }`, `tau0S` is seconds, and
22903
+ * `averagingFactors` contains positive integer `m` values. Returns
22904
+ * `{ tauS, deviation, n }`.
22905
+ * @param {any} series
22906
+ * @param {number} tau0_s
22907
+ * @param {any} averaging_factors
22908
+ * @returns {any}
22909
+ */
22910
+ function timeDeviation(series, tau0_s, averaging_factors) {
22911
+ const ret = wasm.timeDeviation(series, tau0_s, averaging_factors);
22912
+ if (ret[2]) {
22913
+ throw takeFromExternrefTable0(ret[1]);
22914
+ }
22915
+ return takeFromExternrefTable0(ret[0]);
22916
+ }
22917
+ exports.timeDeviation = timeDeviation;
22918
+
21034
22919
  /**
21035
22920
  * Short uppercase identifier for a time scale, e.g. `"GPST"`.
21036
22921
  * @param {TimeScale} scale
@@ -21400,6 +23285,23 @@ function wideLaneWavelength(f1_hz, f2_hz) {
21400
23285
  return ret[0];
21401
23286
  }
21402
23287
  exports.wideLaneWavelength = wideLaneWavelength;
23288
+
23289
+ /**
23290
+ * Convert a DTED tile tree and write canonical terrain store bytes to a path.
23291
+ * @param {string} root
23292
+ * @param {string} out_path
23293
+ */
23294
+ function writeDtedTreeToMmapStore(root, out_path) {
23295
+ const ptr0 = passStringToWasm0(root, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
23296
+ const len0 = WASM_VECTOR_LEN;
23297
+ const ptr1 = passStringToWasm0(out_path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
23298
+ const len1 = WASM_VECTOR_LEN;
23299
+ const ret = wasm.writeDtedTreeToMmapStore(ptr0, len0, ptr1, len1);
23300
+ if (ret[1]) {
23301
+ throw takeFromExternrefTable0(ret[0]);
23302
+ }
23303
+ }
23304
+ exports.writeDtedTreeToMmapStore = writeDtedTreeToMmapStore;
21403
23305
  function __wbg_get_imports() {
21404
23306
  const import0 = {
21405
23307
  __proto__: null,
@@ -21780,6 +23682,10 @@ function __wbg_get_imports() {
21780
23682
  const ret = SpkSegment.__wrap(arg0);
21781
23683
  return ret;
21782
23684
  },
23685
+ __wbg_terrainstoretileindex_new: function(arg0) {
23686
+ const ret = TerrainStoreTileIndex.__wrap(arg0);
23687
+ return ret;
23688
+ },
21783
23689
  __wbg_tle_unwrap: function(arg0) {
21784
23690
  const ret = Tle.__unwrap(arg0);
21785
23691
  return ret;
@@ -21942,6 +23848,12 @@ const DragForceFinalization = (typeof FinalizationRegistry === 'undefined')
21942
23848
  const DtedTerrainFinalization = (typeof FinalizationRegistry === 'undefined')
21943
23849
  ? { register: () => {}, unregister: () => {} }
21944
23850
  : new FinalizationRegistry(ptr => wasm.__wbg_dtedterrain_free(ptr, 1));
23851
+ const Egm96FifteenMinuteGeoidFinalization = (typeof FinalizationRegistry === 'undefined')
23852
+ ? { register: () => {}, unregister: () => {} }
23853
+ : new FinalizationRegistry(ptr => wasm.__wbg_egm96fifteenminutegeoid_free(ptr, 1));
23854
+ const EllipsoidalHeightMFinalization = (typeof FinalizationRegistry === 'undefined')
23855
+ ? { register: () => {}, unregister: () => {} }
23856
+ : new FinalizationRegistry(ptr => wasm.__wbg_ellipsoidalheightm_free(ptr, 1));
21945
23857
  const EncounterFrameFinalization = (typeof FinalizationRegistry === 'undefined')
21946
23858
  ? { register: () => {}, unregister: () => {} }
21947
23859
  : new FinalizationRegistry(ptr => wasm.__wbg_encounterframe_free(ptr, 1));
@@ -22050,6 +23962,9 @@ const LookAnglesFinalization = (typeof FinalizationRegistry === 'undefined')
22050
23962
  const MappingFactorsFinalization = (typeof FinalizationRegistry === 'undefined')
22051
23963
  ? { register: () => {}, unregister: () => {} }
22052
23964
  : new FinalizationRegistry(ptr => wasm.__wbg_mappingfactors_free(ptr, 1));
23965
+ const MmapTerrainFinalization = (typeof FinalizationRegistry === 'undefined')
23966
+ ? { register: () => {}, unregister: () => {} }
23967
+ : new FinalizationRegistry(ptr => wasm.__wbg_mmapterrain_free(ptr, 1));
22053
23968
  const MoonElevationCrossingFinalization = (typeof FinalizationRegistry === 'undefined')
22054
23969
  ? { register: () => {}, unregister: () => {} }
22055
23970
  : new FinalizationRegistry(ptr => wasm.__wbg_moonelevationcrossing_free(ptr, 1));
@@ -22134,6 +24049,9 @@ const OpmSpacecraftFinalization = (typeof FinalizationRegistry === 'undefined')
22134
24049
  const OpmStateFinalization = (typeof FinalizationRegistry === 'undefined')
22135
24050
  ? { register: () => {}, unregister: () => {} }
22136
24051
  : new FinalizationRegistry(ptr => wasm.__wbg_opmstate_free(ptr, 1));
24052
+ const OrthometricHeightMFinalization = (typeof FinalizationRegistry === 'undefined')
24053
+ ? { register: () => {}, unregister: () => {} }
24054
+ : new FinalizationRegistry(ptr => wasm.__wbg_orthometricheightm_free(ptr, 1));
22137
24055
  const ParsedTleFileFinalization = (typeof FinalizationRegistry === 'undefined')
22138
24056
  ? { register: () => {}, unregister: () => {} }
22139
24057
  : new FinalizationRegistry(ptr => wasm.__wbg_parsedtlefile_free(ptr, 1));
@@ -22149,6 +24067,9 @@ const PppFixedSolutionFinalization = (typeof FinalizationRegistry === 'undefined
22149
24067
  const PppFloatSolutionFinalization = (typeof FinalizationRegistry === 'undefined')
22150
24068
  ? { register: () => {}, unregister: () => {} }
22151
24069
  : new FinalizationRegistry(ptr => wasm.__wbg_pppfloatsolution_free(ptr, 1));
24070
+ const PreciseEphemerisInterpolantFinalization = (typeof FinalizationRegistry === 'undefined')
24071
+ ? { register: () => {}, unregister: () => {} }
24072
+ : new FinalizationRegistry(ptr => wasm.__wbg_preciseephemerisinterpolant_free(ptr, 1));
22152
24073
  const PreciseEphemerisSampleSourceFinalization = (typeof FinalizationRegistry === 'undefined')
22153
24074
  ? { register: () => {}, unregister: () => {} }
22154
24075
  : new FinalizationRegistry(ptr => wasm.__wbg_preciseephemerissamplesource_free(ptr, 1));
@@ -22275,6 +24196,12 @@ const SsrCorrectionStoreFinalization = (typeof FinalizationRegistry === 'undefin
22275
24196
  const SunMoonFinalization = (typeof FinalizationRegistry === 'undefined')
22276
24197
  ? { register: () => {}, unregister: () => {} }
22277
24198
  : new FinalizationRegistry(ptr => wasm.__wbg_sunmoon_free(ptr, 1));
24199
+ const TerrainGeoidModelFinalization = (typeof FinalizationRegistry === 'undefined')
24200
+ ? { register: () => {}, unregister: () => {} }
24201
+ : new FinalizationRegistry(ptr => wasm.__wbg_terraingeoidmodel_free(ptr, 1));
24202
+ const TerrainStoreTileIndexFinalization = (typeof FinalizationRegistry === 'undefined')
24203
+ ? { register: () => {}, unregister: () => {} }
24204
+ : new FinalizationRegistry(ptr => wasm.__wbg_terrainstoretileindex_free(ptr, 1));
22278
24205
  const TleFinalization = (typeof FinalizationRegistry === 'undefined')
22279
24206
  ? { register: () => {}, unregister: () => {} }
22280
24207
  : new FinalizationRegistry(ptr => wasm.__wbg_tle_free(ptr, 1));