@aguacerowx/mapsgl 0.0.32 → 0.0.42

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.
Files changed (35) hide show
  1. package/index.js +34 -2
  2. package/package.json +14 -3
  3. package/src/GridRenderLayer.js +105 -86
  4. package/src/MapManager.js +47 -15
  5. package/src/NexradSitesOverlay.js +148 -0
  6. package/src/NexradWeatherController.js +491 -0
  7. package/src/NwsWatchesWarningsOverlay.js +768 -0
  8. package/src/SatelliteShaderManager.js +999 -0
  9. package/src/WeatherLayerManager.js +866 -139
  10. package/src/WorkerPool.js +340 -0
  11. package/src/nexrad/MapboxRadarLayer.bundled.js +810 -0
  12. package/src/nexrad/MapboxRadarLayer.ts +784 -0
  13. package/src/nexrad/PreprocessedSweepParser.ts +226 -0
  14. package/src/nexrad/buildRadarRayGeometry.ts +97 -0
  15. package/src/nexrad/level3StormRelative.ts +116 -0
  16. package/src/nexrad/loadNexradSites.ts +41 -0
  17. package/src/nexrad/nexradArchiveCache.ts +64 -0
  18. package/src/nexrad/nexradCrossSectionSampleAtLatLon.bundled.js +91 -0
  19. package/src/nexrad/nexradCrossSectionSampleAtLatLon.ts +121 -0
  20. package/src/nexrad/nexradLevel3Products.ts +549 -0
  21. package/src/nexrad/nexradMapboxFrameOpts.js +106 -0
  22. package/src/nexrad/radarArchiveCore.bundled.js +4206 -0
  23. package/src/nexrad/radarArchiveCore.bundled.js.map +7 -0
  24. package/src/nexrad/radarArchiveCore.ts +1737 -0
  25. package/src/nexrad/radarDecode.worker.bundled.js +809 -0
  26. package/src/nexrad/radarDecode.worker.ts +227 -0
  27. package/src/nexrad/radarFrameGpuMatch.bundled.js +79 -0
  28. package/src/nexrad/radarFrameGpuMatch.ts +111 -0
  29. package/src/nwsAlertsSupport.js +860 -0
  30. package/src/nwsEventColorsDefaults.js +133 -0
  31. package/src/nwsSdkConstants.js +360 -0
  32. package/src/nwsWarningCustomizationKey.gen.js +496 -0
  33. package/src/satelliteDefaultColormaps.js +37 -0
  34. package/src/satelliteKtxWorker.js +225 -0
  35. package/src/satelliteShader.js +17 -0
@@ -0,0 +1,809 @@
1
+ // ../../node_modules/fzstd/esm/index.mjs
2
+ var ab = ArrayBuffer;
3
+ var u8 = Uint8Array;
4
+ var u16 = Uint16Array;
5
+ var i16 = Int16Array;
6
+ var i32 = Int32Array;
7
+ var slc = function(v, s, e) {
8
+ if (u8.prototype.slice)
9
+ return u8.prototype.slice.call(v, s, e);
10
+ if (s == null || s < 0)
11
+ s = 0;
12
+ if (e == null || e > v.length)
13
+ e = v.length;
14
+ var n = new u8(e - s);
15
+ n.set(v.subarray(s, e));
16
+ return n;
17
+ };
18
+ var fill = function(v, n, s, e) {
19
+ if (u8.prototype.fill)
20
+ return u8.prototype.fill.call(v, n, s, e);
21
+ if (s == null || s < 0)
22
+ s = 0;
23
+ if (e == null || e > v.length)
24
+ e = v.length;
25
+ for (; s < e; ++s)
26
+ v[s] = n;
27
+ return v;
28
+ };
29
+ var cpw = function(v, t, s, e) {
30
+ if (u8.prototype.copyWithin)
31
+ return u8.prototype.copyWithin.call(v, t, s, e);
32
+ if (s == null || s < 0)
33
+ s = 0;
34
+ if (e == null || e > v.length)
35
+ e = v.length;
36
+ while (s < e) {
37
+ v[t++] = v[s++];
38
+ }
39
+ };
40
+ var ec = [
41
+ "invalid zstd data",
42
+ "window size too large (>2046MB)",
43
+ "invalid block type",
44
+ "FSE accuracy too high",
45
+ "match distance too far back",
46
+ "unexpected EOF"
47
+ ];
48
+ var err = function(ind, msg, nt) {
49
+ var e = new Error(msg || ec[ind]);
50
+ e.code = ind;
51
+ if (Error.captureStackTrace)
52
+ Error.captureStackTrace(e, err);
53
+ if (!nt)
54
+ throw e;
55
+ return e;
56
+ };
57
+ var rb = function(d, b, n) {
58
+ var i = 0, o = 0;
59
+ for (; i < n; ++i)
60
+ o |= d[b++] << (i << 3);
61
+ return o;
62
+ };
63
+ var b4 = function(d, b) {
64
+ return (d[b] | d[b + 1] << 8 | d[b + 2] << 16 | d[b + 3] << 24) >>> 0;
65
+ };
66
+ var rzfh = function(dat, w) {
67
+ var n3 = dat[0] | dat[1] << 8 | dat[2] << 16;
68
+ if (n3 == 3126568 && dat[3] == 253) {
69
+ var flg = dat[4];
70
+ var ss = flg >> 5 & 1, cc = flg >> 2 & 1, df = flg & 3, fcf = flg >> 6;
71
+ if (flg & 8)
72
+ err(0);
73
+ var bt = 6 - ss;
74
+ var db = df == 3 ? 4 : df;
75
+ var di = rb(dat, bt, db);
76
+ bt += db;
77
+ var fsb = fcf ? 1 << fcf : ss;
78
+ var fss = rb(dat, bt, fsb) + (fcf == 1 && 256);
79
+ var ws = fss;
80
+ if (!ss) {
81
+ var wb = 1 << 10 + (dat[5] >> 3);
82
+ ws = wb + (wb >> 3) * (dat[5] & 7);
83
+ }
84
+ if (ws > 2145386496)
85
+ err(1);
86
+ var buf = new u8((w == 1 ? fss || ws : w ? 0 : ws) + 12);
87
+ buf[0] = 1, buf[4] = 4, buf[8] = 8;
88
+ return {
89
+ b: bt + fsb,
90
+ y: 0,
91
+ l: 0,
92
+ d: di,
93
+ w: w && w != 1 ? w : buf.subarray(12),
94
+ e: ws,
95
+ o: new i32(buf.buffer, 0, 3),
96
+ u: fss,
97
+ c: cc,
98
+ m: Math.min(131072, ws)
99
+ };
100
+ } else if ((n3 >> 4 | dat[3] << 20) == 25481893) {
101
+ return b4(dat, 4) + 8;
102
+ }
103
+ err(0);
104
+ };
105
+ var msb = function(val) {
106
+ var bits = 0;
107
+ for (; 1 << bits <= val; ++bits)
108
+ ;
109
+ return bits - 1;
110
+ };
111
+ var rfse = function(dat, bt, mal) {
112
+ var tpos = (bt << 3) + 4;
113
+ var al = (dat[bt] & 15) + 5;
114
+ if (al > mal)
115
+ err(3);
116
+ var sz = 1 << al;
117
+ var probs = sz, sym = -1, re = -1, i = -1, ht = sz;
118
+ var buf = new ab(512 + (sz << 2));
119
+ var freq = new i16(buf, 0, 256);
120
+ var dstate = new u16(buf, 0, 256);
121
+ var nstate = new u16(buf, 512, sz);
122
+ var bb1 = 512 + (sz << 1);
123
+ var syms = new u8(buf, bb1, sz);
124
+ var nbits = new u8(buf, bb1 + sz);
125
+ while (sym < 255 && probs > 0) {
126
+ var bits = msb(probs + 1);
127
+ var cbt = tpos >> 3;
128
+ var msk = (1 << bits + 1) - 1;
129
+ var val = (dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (tpos & 7) & msk;
130
+ var msk1fb = (1 << bits) - 1;
131
+ var msv = msk - probs - 1;
132
+ var sval = val & msk1fb;
133
+ if (sval < msv)
134
+ tpos += bits, val = sval;
135
+ else {
136
+ tpos += bits + 1;
137
+ if (val > msk1fb)
138
+ val -= msv;
139
+ }
140
+ freq[++sym] = --val;
141
+ if (val == -1) {
142
+ probs += val;
143
+ syms[--ht] = sym;
144
+ } else
145
+ probs -= val;
146
+ if (!val) {
147
+ do {
148
+ var rbt = tpos >> 3;
149
+ re = (dat[rbt] | dat[rbt + 1] << 8) >> (tpos & 7) & 3;
150
+ tpos += 2;
151
+ sym += re;
152
+ } while (re == 3);
153
+ }
154
+ }
155
+ if (sym > 255 || probs)
156
+ err(0);
157
+ var sympos = 0;
158
+ var sstep = (sz >> 1) + (sz >> 3) + 3;
159
+ var smask = sz - 1;
160
+ for (var s = 0; s <= sym; ++s) {
161
+ var sf = freq[s];
162
+ if (sf < 1) {
163
+ dstate[s] = -sf;
164
+ continue;
165
+ }
166
+ for (i = 0; i < sf; ++i) {
167
+ syms[sympos] = s;
168
+ do {
169
+ sympos = sympos + sstep & smask;
170
+ } while (sympos >= ht);
171
+ }
172
+ }
173
+ if (sympos)
174
+ err(0);
175
+ for (i = 0; i < sz; ++i) {
176
+ var ns = dstate[syms[i]]++;
177
+ var nb = nbits[i] = al - msb(ns);
178
+ nstate[i] = (ns << nb) - sz;
179
+ }
180
+ return [tpos + 7 >> 3, {
181
+ b: al,
182
+ s: syms,
183
+ n: nbits,
184
+ t: nstate
185
+ }];
186
+ };
187
+ var rhu = function(dat, bt) {
188
+ var i = 0, wc = -1;
189
+ var buf = new u8(292), hb = dat[bt];
190
+ var hw = buf.subarray(0, 256);
191
+ var rc = buf.subarray(256, 268);
192
+ var ri = new u16(buf.buffer, 268);
193
+ if (hb < 128) {
194
+ var _a = rfse(dat, bt + 1, 6), ebt = _a[0], fdt = _a[1];
195
+ bt += hb;
196
+ var epos = ebt << 3;
197
+ var lb = dat[bt];
198
+ if (!lb)
199
+ err(0);
200
+ var st1 = 0, st2 = 0, btr1 = fdt.b, btr2 = btr1;
201
+ var fpos = (++bt << 3) - 8 + msb(lb);
202
+ for (; ; ) {
203
+ fpos -= btr1;
204
+ if (fpos < epos)
205
+ break;
206
+ var cbt = fpos >> 3;
207
+ st1 += (dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr1) - 1;
208
+ hw[++wc] = fdt.s[st1];
209
+ fpos -= btr2;
210
+ if (fpos < epos)
211
+ break;
212
+ cbt = fpos >> 3;
213
+ st2 += (dat[cbt] | dat[cbt + 1] << 8) >> (fpos & 7) & (1 << btr2) - 1;
214
+ hw[++wc] = fdt.s[st2];
215
+ btr1 = fdt.n[st1];
216
+ st1 = fdt.t[st1];
217
+ btr2 = fdt.n[st2];
218
+ st2 = fdt.t[st2];
219
+ }
220
+ if (++wc > 255)
221
+ err(0);
222
+ } else {
223
+ wc = hb - 127;
224
+ for (; i < wc; i += 2) {
225
+ var byte = dat[++bt];
226
+ hw[i] = byte >> 4;
227
+ hw[i + 1] = byte & 15;
228
+ }
229
+ ++bt;
230
+ }
231
+ var wes = 0;
232
+ for (i = 0; i < wc; ++i) {
233
+ var wt = hw[i];
234
+ if (wt > 11)
235
+ err(0);
236
+ wes += wt && 1 << wt - 1;
237
+ }
238
+ var mb = msb(wes) + 1;
239
+ var ts = 1 << mb;
240
+ var rem = ts - wes;
241
+ if (rem & rem - 1)
242
+ err(0);
243
+ hw[wc++] = msb(rem) + 1;
244
+ for (i = 0; i < wc; ++i) {
245
+ var wt = hw[i];
246
+ ++rc[hw[i] = wt && mb + 1 - wt];
247
+ }
248
+ var hbuf = new u8(ts << 1);
249
+ var syms = hbuf.subarray(0, ts), nb = hbuf.subarray(ts);
250
+ ri[mb] = 0;
251
+ for (i = mb; i > 0; --i) {
252
+ var pv = ri[i];
253
+ fill(nb, i, pv, ri[i - 1] = pv + rc[i] * (1 << mb - i));
254
+ }
255
+ if (ri[0] != ts)
256
+ err(0);
257
+ for (i = 0; i < wc; ++i) {
258
+ var bits = hw[i];
259
+ if (bits) {
260
+ var code = ri[bits];
261
+ fill(syms, i, code, ri[bits] = code + (1 << mb - bits));
262
+ }
263
+ }
264
+ return [bt, {
265
+ n: nb,
266
+ b: mb,
267
+ s: syms
268
+ }];
269
+ };
270
+ var dllt = rfse(/* @__PURE__ */ new u8([
271
+ 81,
272
+ 16,
273
+ 99,
274
+ 140,
275
+ 49,
276
+ 198,
277
+ 24,
278
+ 99,
279
+ 12,
280
+ 33,
281
+ 196,
282
+ 24,
283
+ 99,
284
+ 102,
285
+ 102,
286
+ 134,
287
+ 70,
288
+ 146,
289
+ 4
290
+ ]), 0, 6)[1];
291
+ var dmlt = rfse(/* @__PURE__ */ new u8([
292
+ 33,
293
+ 20,
294
+ 196,
295
+ 24,
296
+ 99,
297
+ 140,
298
+ 33,
299
+ 132,
300
+ 16,
301
+ 66,
302
+ 8,
303
+ 33,
304
+ 132,
305
+ 16,
306
+ 66,
307
+ 8,
308
+ 33,
309
+ 68,
310
+ 68,
311
+ 68,
312
+ 68,
313
+ 68,
314
+ 68,
315
+ 68,
316
+ 68,
317
+ 36,
318
+ 9
319
+ ]), 0, 6)[1];
320
+ var doct = rfse(/* @__PURE__ */ new u8([
321
+ 32,
322
+ 132,
323
+ 16,
324
+ 66,
325
+ 102,
326
+ 70,
327
+ 68,
328
+ 68,
329
+ 68,
330
+ 68,
331
+ 36,
332
+ 73,
333
+ 2
334
+ ]), 0, 5)[1];
335
+ var b2bl = function(b, s) {
336
+ var len = b.length, bl = new i32(len);
337
+ for (var i = 0; i < len; ++i) {
338
+ bl[i] = s;
339
+ s += 1 << b[i];
340
+ }
341
+ return bl;
342
+ };
343
+ var llb = /* @__PURE__ */ new u8((/* @__PURE__ */ new i32([
344
+ 0,
345
+ 0,
346
+ 0,
347
+ 0,
348
+ 16843009,
349
+ 50528770,
350
+ 134678020,
351
+ 202050057,
352
+ 269422093
353
+ ])).buffer, 0, 36);
354
+ var llbl = /* @__PURE__ */ b2bl(llb, 0);
355
+ var mlb = /* @__PURE__ */ new u8((/* @__PURE__ */ new i32([
356
+ 0,
357
+ 0,
358
+ 0,
359
+ 0,
360
+ 0,
361
+ 0,
362
+ 0,
363
+ 0,
364
+ 16843009,
365
+ 50528770,
366
+ 117769220,
367
+ 185207048,
368
+ 252579084,
369
+ 16
370
+ ])).buffer, 0, 53);
371
+ var mlbl = /* @__PURE__ */ b2bl(mlb, 3);
372
+ var dhu = function(dat, out, hu) {
373
+ var len = dat.length, ss = out.length, lb = dat[len - 1], msk = (1 << hu.b) - 1, eb = -hu.b;
374
+ if (!lb)
375
+ err(0);
376
+ var st = 0, btr = hu.b, pos = (len << 3) - 8 + msb(lb) - btr, i = -1;
377
+ for (; pos > eb && i < ss; ) {
378
+ var cbt = pos >> 3;
379
+ var val = (dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (pos & 7);
380
+ st = (st << btr | val) & msk;
381
+ out[++i] = hu.s[st];
382
+ pos -= btr = hu.n[st];
383
+ }
384
+ if (pos != eb || i + 1 != ss)
385
+ err(0);
386
+ };
387
+ var dhu4 = function(dat, out, hu) {
388
+ var bt = 6;
389
+ var ss = out.length, sz1 = ss + 3 >> 2, sz2 = sz1 << 1, sz3 = sz1 + sz2;
390
+ dhu(dat.subarray(bt, bt += dat[0] | dat[1] << 8), out.subarray(0, sz1), hu);
391
+ dhu(dat.subarray(bt, bt += dat[2] | dat[3] << 8), out.subarray(sz1, sz2), hu);
392
+ dhu(dat.subarray(bt, bt += dat[4] | dat[5] << 8), out.subarray(sz2, sz3), hu);
393
+ dhu(dat.subarray(bt), out.subarray(sz3), hu);
394
+ };
395
+ var rzb = function(dat, st, out) {
396
+ var _a;
397
+ var bt = st.b;
398
+ var b0 = dat[bt], btype = b0 >> 1 & 3;
399
+ st.l = b0 & 1;
400
+ var sz = b0 >> 3 | dat[bt + 1] << 5 | dat[bt + 2] << 13;
401
+ var ebt = (bt += 3) + sz;
402
+ if (btype == 1) {
403
+ if (bt >= dat.length)
404
+ return;
405
+ st.b = bt + 1;
406
+ if (out) {
407
+ fill(out, dat[bt], st.y, st.y += sz);
408
+ return out;
409
+ }
410
+ return fill(new u8(sz), dat[bt]);
411
+ }
412
+ if (ebt > dat.length)
413
+ return;
414
+ if (btype == 0) {
415
+ st.b = ebt;
416
+ if (out) {
417
+ out.set(dat.subarray(bt, ebt), st.y);
418
+ st.y += sz;
419
+ return out;
420
+ }
421
+ return slc(dat, bt, ebt);
422
+ }
423
+ if (btype == 2) {
424
+ var b3 = dat[bt], lbt = b3 & 3, sf = b3 >> 2 & 3;
425
+ var lss = b3 >> 4, lcs = 0, s4 = 0;
426
+ if (lbt < 2) {
427
+ if (sf & 1)
428
+ lss |= dat[++bt] << 4 | (sf & 2 && dat[++bt] << 12);
429
+ else
430
+ lss = b3 >> 3;
431
+ } else {
432
+ s4 = sf;
433
+ if (sf < 2)
434
+ lss |= (dat[++bt] & 63) << 4, lcs = dat[bt] >> 6 | dat[++bt] << 2;
435
+ else if (sf == 2)
436
+ lss |= dat[++bt] << 4 | (dat[++bt] & 3) << 12, lcs = dat[bt] >> 2 | dat[++bt] << 6;
437
+ else
438
+ lss |= dat[++bt] << 4 | (dat[++bt] & 63) << 12, lcs = dat[bt] >> 6 | dat[++bt] << 2 | dat[++bt] << 10;
439
+ }
440
+ ++bt;
441
+ var buf = out ? out.subarray(st.y, st.y + st.m) : new u8(st.m);
442
+ var spl = buf.length - lss;
443
+ if (lbt == 0)
444
+ buf.set(dat.subarray(bt, bt += lss), spl);
445
+ else if (lbt == 1)
446
+ fill(buf, dat[bt++], spl);
447
+ else {
448
+ var hu = st.h;
449
+ if (lbt == 2) {
450
+ var hud = rhu(dat, bt);
451
+ lcs += bt - (bt = hud[0]);
452
+ st.h = hu = hud[1];
453
+ } else if (!hu)
454
+ err(0);
455
+ (s4 ? dhu4 : dhu)(dat.subarray(bt, bt += lcs), buf.subarray(spl), hu);
456
+ }
457
+ var ns = dat[bt++];
458
+ if (ns) {
459
+ if (ns == 255)
460
+ ns = (dat[bt++] | dat[bt++] << 8) + 32512;
461
+ else if (ns > 127)
462
+ ns = ns - 128 << 8 | dat[bt++];
463
+ var scm = dat[bt++];
464
+ if (scm & 3)
465
+ err(0);
466
+ var dts = [dmlt, doct, dllt];
467
+ for (var i = 2; i > -1; --i) {
468
+ var md = scm >> (i << 1) + 2 & 3;
469
+ if (md == 1) {
470
+ var rbuf = new u8([0, 0, dat[bt++]]);
471
+ dts[i] = {
472
+ s: rbuf.subarray(2, 3),
473
+ n: rbuf.subarray(0, 1),
474
+ t: new u16(rbuf.buffer, 0, 1),
475
+ b: 0
476
+ };
477
+ } else if (md == 2) {
478
+ _a = rfse(dat, bt, 9 - (i & 1)), bt = _a[0], dts[i] = _a[1];
479
+ } else if (md == 3) {
480
+ if (!st.t)
481
+ err(0);
482
+ dts[i] = st.t[i];
483
+ }
484
+ }
485
+ var _b = st.t = dts, mlt = _b[0], oct = _b[1], llt = _b[2];
486
+ var lb = dat[ebt - 1];
487
+ if (!lb)
488
+ err(0);
489
+ var spos = (ebt << 3) - 8 + msb(lb) - llt.b, cbt = spos >> 3, oubt = 0;
490
+ var lst = (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << llt.b) - 1;
491
+ cbt = (spos -= oct.b) >> 3;
492
+ var ost = (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << oct.b) - 1;
493
+ cbt = (spos -= mlt.b) >> 3;
494
+ var mst = (dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mlt.b) - 1;
495
+ for (++ns; --ns; ) {
496
+ var llc = llt.s[lst];
497
+ var lbtr = llt.n[lst];
498
+ var mlc = mlt.s[mst];
499
+ var mbtr = mlt.n[mst];
500
+ var ofc = oct.s[ost];
501
+ var obtr = oct.n[ost];
502
+ cbt = (spos -= ofc) >> 3;
503
+ var ofp = 1 << ofc;
504
+ var off = ofp + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16 | dat[cbt + 3] << 24) >>> (spos & 7) & ofp - 1);
505
+ cbt = (spos -= mlb[mlc]) >> 3;
506
+ var ml = mlbl[mlc] + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (spos & 7) & (1 << mlb[mlc]) - 1);
507
+ cbt = (spos -= llb[llc]) >> 3;
508
+ var ll = llbl[llc] + ((dat[cbt] | dat[cbt + 1] << 8 | dat[cbt + 2] << 16) >> (spos & 7) & (1 << llb[llc]) - 1);
509
+ cbt = (spos -= lbtr) >> 3;
510
+ lst = llt.t[lst] + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << lbtr) - 1);
511
+ cbt = (spos -= mbtr) >> 3;
512
+ mst = mlt.t[mst] + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << mbtr) - 1);
513
+ cbt = (spos -= obtr) >> 3;
514
+ ost = oct.t[ost] + ((dat[cbt] | dat[cbt + 1] << 8) >> (spos & 7) & (1 << obtr) - 1);
515
+ if (off > 3) {
516
+ st.o[2] = st.o[1];
517
+ st.o[1] = st.o[0];
518
+ st.o[0] = off -= 3;
519
+ } else {
520
+ var idx = off - (ll != 0);
521
+ if (idx) {
522
+ off = idx == 3 ? st.o[0] - 1 : st.o[idx];
523
+ if (idx > 1)
524
+ st.o[2] = st.o[1];
525
+ st.o[1] = st.o[0];
526
+ st.o[0] = off;
527
+ } else
528
+ off = st.o[0];
529
+ }
530
+ for (var i = 0; i < ll; ++i) {
531
+ buf[oubt + i] = buf[spl + i];
532
+ }
533
+ oubt += ll, spl += ll;
534
+ var stin = oubt - off;
535
+ if (stin < 0) {
536
+ var len = -stin;
537
+ var bs = st.e + stin;
538
+ if (len > ml)
539
+ len = ml;
540
+ for (var i = 0; i < len; ++i) {
541
+ buf[oubt + i] = st.w[bs + i];
542
+ }
543
+ oubt += len, ml -= len, stin = 0;
544
+ }
545
+ for (var i = 0; i < ml; ++i) {
546
+ buf[oubt + i] = buf[stin + i];
547
+ }
548
+ oubt += ml;
549
+ }
550
+ if (oubt != spl) {
551
+ while (spl < buf.length) {
552
+ buf[oubt++] = buf[spl++];
553
+ }
554
+ } else
555
+ oubt = buf.length;
556
+ if (out)
557
+ st.y += oubt;
558
+ else
559
+ buf = slc(buf, 0, oubt);
560
+ } else if (out) {
561
+ st.y += lss;
562
+ if (spl) {
563
+ for (var i = 0; i < lss; ++i) {
564
+ buf[i] = buf[spl + i];
565
+ }
566
+ }
567
+ } else if (spl)
568
+ buf = slc(buf, spl);
569
+ st.b = ebt;
570
+ return buf;
571
+ }
572
+ err(2);
573
+ };
574
+ var cct = function(bufs, ol) {
575
+ if (bufs.length == 1)
576
+ return bufs[0];
577
+ var buf = new u8(ol);
578
+ for (var i = 0, b = 0; i < bufs.length; ++i) {
579
+ var chk = bufs[i];
580
+ buf.set(chk, b);
581
+ b += chk.length;
582
+ }
583
+ return buf;
584
+ };
585
+ function decompress(dat, buf) {
586
+ var bufs = [], nb = +!buf;
587
+ var bt = 0, ol = 0;
588
+ for (; dat.length; ) {
589
+ var st = rzfh(dat, nb || buf);
590
+ if (typeof st == "object") {
591
+ if (nb) {
592
+ buf = null;
593
+ if (st.w.length == st.u) {
594
+ bufs.push(buf = st.w);
595
+ ol += st.u;
596
+ }
597
+ } else {
598
+ bufs.push(buf);
599
+ st.e = 0;
600
+ }
601
+ for (; !st.l; ) {
602
+ var blk = rzb(dat, st, buf);
603
+ if (!blk)
604
+ err(5);
605
+ if (buf)
606
+ st.e = st.y;
607
+ else {
608
+ bufs.push(blk);
609
+ ol += blk.length;
610
+ cpw(st.w, 0, blk.length);
611
+ st.w.set(blk, st.w.length - blk.length);
612
+ }
613
+ }
614
+ bt = st.b + st.c * 4;
615
+ } else
616
+ bt = st;
617
+ dat = dat.subarray(bt);
618
+ }
619
+ return cct(bufs, ol);
620
+ }
621
+
622
+ // src/nexrad/radarDecode.worker.ts
623
+ var SLOT_HDR_BYTES = 28;
624
+ function isZstd(bytes) {
625
+ return bytes.length >= 4 && bytes[0] === 40 && bytes[1] === 181 && bytes[2] === 47 && bytes[3] === 253;
626
+ }
627
+ function parseObjectKey(objectKey) {
628
+ const parts = objectKey.split("_");
629
+ if (parts.length < 2) return null;
630
+ return { stationId: parts[0] };
631
+ }
632
+ function buildRayBoundariesDeg(azimuths) {
633
+ const nRays = azimuths.length;
634
+ const boundaries = new Float32Array(nRays + 1);
635
+ if (nRays === 0) return boundaries;
636
+ let totalSpacing = 0;
637
+ let validCount = 0;
638
+ for (let i = 1; i < nRays; i++) {
639
+ let diff = azimuths[i] - azimuths[i - 1];
640
+ while (diff < -180) diff += 360;
641
+ while (diff > 180) diff -= 360;
642
+ const absDiff = Math.abs(diff);
643
+ if (absDiff > 0 && absDiff < 10) {
644
+ totalSpacing += absDiff;
645
+ validCount++;
646
+ }
647
+ }
648
+ let avgSpacing = validCount > 0 ? totalSpacing / validCount : 360 / nRays;
649
+ if (avgSpacing <= 0 || isNaN(avgSpacing)) avgSpacing = 1;
650
+ boundaries[0] = azimuths[0] - avgSpacing / 2;
651
+ for (let i = 1; i < nRays; i++) {
652
+ let diff = azimuths[i] - azimuths[i - 1];
653
+ while (diff < -180) diff += 360;
654
+ while (diff > 180) diff -= 360;
655
+ boundaries[i] = azimuths[i - 1] + diff / 2;
656
+ }
657
+ boundaries[nRays] = azimuths[nRays - 1] + avgSpacing / 2;
658
+ return boundaries;
659
+ }
660
+ self.onmessage = (event) => {
661
+ const data = event.data;
662
+ if (!data || data.type !== "DECODE_SLOT") return;
663
+ const {
664
+ requestId,
665
+ objectKey,
666
+ slotBuffer,
667
+ nRays,
668
+ nGates,
669
+ firstGateKm,
670
+ gateWidthKm,
671
+ azimuthsBuffer,
672
+ sites
673
+ } = data;
674
+ try {
675
+ const compressed = new Uint8Array(slotBuffer);
676
+ if (!isZstd(compressed)) {
677
+ self.postMessage({
678
+ type: "DECODE_RESULT",
679
+ requestId,
680
+ gateData: null,
681
+ error: `Slot for ${objectKey} is not valid zstd`
682
+ });
683
+ return;
684
+ }
685
+ const decompressed = decompress(compressed);
686
+ const buffer = decompressed.buffer.slice(
687
+ decompressed.byteOffset,
688
+ decompressed.byteOffset + decompressed.byteLength
689
+ );
690
+ const view = new DataView(buffer);
691
+ const valueScale = view.getFloat32(0, false);
692
+ const valueOffset = view.getFloat32(4, false);
693
+ const present = view.getUint32(8, false);
694
+ if (present === 0) {
695
+ self.postMessage({
696
+ type: "DECODE_RESULT",
697
+ requestId,
698
+ gateData: null,
699
+ error: `Slot for ${objectKey} marked not present`
700
+ });
701
+ return;
702
+ }
703
+ const slotNRays = view.getUint16(12, false);
704
+ const slotNGates = view.getUint16(14, false);
705
+ const gateBytes = buffer.byteLength - SLOT_HDR_BYTES;
706
+ const expectedGates = slotNRays * slotNGates;
707
+ const bytesPerGate = gateBytes / expectedGates;
708
+ if (bytesPerGate !== 1 && bytesPerGate !== 2 && bytesPerGate !== 4) {
709
+ self.postMessage({
710
+ type: "DECODE_RESULT",
711
+ requestId,
712
+ gateData: null,
713
+ error: `Unexpected bytesPerGate=${bytesPerGate} for ${objectKey}`
714
+ });
715
+ return;
716
+ }
717
+ const keyParts = parseObjectKey(objectKey);
718
+ if (!keyParts) {
719
+ self.postMessage({
720
+ type: "DECODE_RESULT",
721
+ requestId,
722
+ gateData: null,
723
+ error: `Unable to parse station from key: ${objectKey}`
724
+ });
725
+ return;
726
+ }
727
+ const site = sites.find((s) => s.id === keyParts.stationId);
728
+ if (!site) {
729
+ self.postMessage({
730
+ type: "DECODE_RESULT",
731
+ requestId,
732
+ gateData: null,
733
+ error: `Station "${keyParts.stationId}" not found`
734
+ });
735
+ return;
736
+ }
737
+ const azimuths = new Float32Array(slotNRays);
738
+ const azView = new DataView(azimuthsBuffer);
739
+ const headerNRays = azimuthsBuffer.byteLength / 4;
740
+ for (let i = 0; i < slotNRays; i++) {
741
+ if (i < headerNRays) {
742
+ azimuths[i] = azView.getFloat32(i * 4, false);
743
+ } else {
744
+ const prevAz = i > 0 ? azimuths[i - 1] : 0;
745
+ azimuths[i] = (prevAz + 360 / slotNRays) % 360;
746
+ }
747
+ }
748
+ const rayBoundariesDeg = buildRayBoundariesDeg(azimuths);
749
+ const gateCount = slotNRays * slotNGates;
750
+ const gateDataCopy = new Uint8Array(slotNRays * slotNGates * 2);
751
+ const outView = new DataView(gateDataCopy.buffer);
752
+ if (bytesPerGate === 1) {
753
+ const raw = new Uint8Array(buffer, SLOT_HDR_BYTES, gateCount);
754
+ for (let ray = 0; ray < slotNRays; ray++) {
755
+ let prev = 0;
756
+ for (let g = 0; g < slotNGates; g++) {
757
+ const idx = ray * slotNGates + g;
758
+ const delta = raw[idx];
759
+ const val = prev + delta & 255;
760
+ prev = val;
761
+ if (val === 0) {
762
+ outView.setInt16(idx * 2, -32768, false);
763
+ } else {
764
+ outView.setInt16(idx * 2, val, false);
765
+ }
766
+ }
767
+ }
768
+ } else {
769
+ const rawBytes = new Uint8Array(buffer, SLOT_HDR_BYTES, gateCount * 2);
770
+ for (let ray = 0; ray < slotNRays; ray++) {
771
+ let prev = 0;
772
+ for (let g = 0; g < slotNGates; g++) {
773
+ const idx = ray * slotNGates + g;
774
+ const hi = rawBytes[idx * 2];
775
+ const lo = rawBytes[idx * 2 + 1];
776
+ const delta = (hi << 8 | lo) << 16 >> 16;
777
+ const val = prev + delta | 0;
778
+ prev = val;
779
+ outView.setInt16(idx * 2, val, false);
780
+ }
781
+ }
782
+ }
783
+ const response = {
784
+ type: "DECODE_RESULT",
785
+ requestId,
786
+ gateData: gateDataCopy,
787
+ stationLat: site.lat,
788
+ stationLon: site.lon,
789
+ firstGateKm,
790
+ gateWidthKm,
791
+ valueScale,
792
+ valueOffset,
793
+ rayBoundariesDeg,
794
+ nRays: slotNRays,
795
+ nGates: slotNGates
796
+ };
797
+ self.postMessage(response, [
798
+ gateDataCopy.buffer,
799
+ rayBoundariesDeg.buffer
800
+ ]);
801
+ } catch (error) {
802
+ self.postMessage({
803
+ type: "DECODE_RESULT",
804
+ requestId,
805
+ gateData: null,
806
+ error: error instanceof Error ? error.message : "Unknown worker error"
807
+ });
808
+ }
809
+ };