signalk-questdb 1.8.2 → 1.8.4

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.
package/.prettierignore CHANGED
@@ -2,3 +2,4 @@ dist/
2
2
  node_modules/
3
3
  .mf/
4
4
  public/
5
+ dist-panel-test/
package/README.md CHANGED
@@ -34,7 +34,7 @@ The plugin embeds a React config panel in the Signal K Admin UI showing:
34
34
  - **Image Version** -- dropdown with latest, pre-releases, and last 3 stable releases
35
35
  - **Connection** -- managed container toggle, host/ports, PostgreSQL port for Grafana
36
36
  - **Recording** -- record self, record AIS targets, startup restore, console webapp, retention days
37
- - **Path filtering** (collapsible) -- exclude or include-only paths with glob patterns (e.g. exclude `navigation.position`)
37
+ - **Path filtering** (collapsible) -- exclude or include-only paths with glob patterns (e.g. exclude `notifications.*`); empty by default, so everything is recorded
38
38
  - **Compression** (collapsible) -- LZ4/ZSTD codec selection for on-disk storage
39
39
  - **InfluxDB Migration** (collapsible) -- auto-detect with manual URL for remote instances
40
40
  - **Data Export** (collapsible) -- date range picker, Parquet/CSV format, download button
@@ -133,7 +133,7 @@ wants to slice it into kopia-dedup-friendly shards. Allowed tables:
133
133
  | QuestDB console webapp | `true` | Serve QuestDB's console in the Signal K admin UI, admin only (see Console webapp) |
134
134
  | Retention (days) | `0` | Auto-delete old partitions (0 = keep forever) |
135
135
  | Path filter mode | `exclude` | `exclude` matching paths, or `include` only matching paths |
136
- | Path filter paths | _(empty)_ | Glob patterns, one per line (e.g. `navigation.position`); empty = record everything |
136
+ | Path filter paths | _(empty)_ | Glob patterns, one per line (e.g. `notifications.*`); empty = record everything, which is the default |
137
137
  | Compression codec | `lz4` | On-disk WAL compression: `none`, `lz4`, or `zstd` |
138
138
  | Compression level | `3` | ZSTD level 1-22 (only when codec is zstd) |
139
139
  | Container network | `sk-network` | Shared network for QuestDB (only applied when binding to 0.0.0.0) |
@@ -142,18 +142,74 @@ export function createConsoleProxy(deps) {
142
142
  "form-action 'self'; frame-ancestors 'self'; base-uri 'self'";
143
143
  // The console has no reason to be sniffed into a different type.
144
144
  headers["x-content-type-options"] = "nosniff";
145
- res.writeHead(proxied.statusCode ?? 502, headers);
146
- // A HEAD response carries no body by definition. QuestDB nonetheless
147
- // answers HEAD with `405 Transfer-Encoding: chunked` AND a body, which
148
- // is protocol-illegal; piping that upstream response through leaves
149
- // the client waiting for chunks that never legally arrive and the
150
- // connection dies with an empty reply. Terminate the response
151
- // ourselves and discard whatever the upstream sent.
152
- if (req.method === "HEAD") {
145
+ // QuestDB's redirect states NEITHER content-length nor
146
+ // transfer-encoding, so Node cannot know the response is complete and
147
+ // falls back to `Transfer-Encoding: chunked` — announcing a body that
148
+ // never arrives. The browser then waits on a 301 that never finishes,
149
+ // which is exactly how a working console still reported "console
150
+ // unavailable" after the Location rewrite was already correct.
151
+ //
152
+ // Declaring the length explicitly is what stops Node guessing. Applied
153
+ // to every status that carries no body by definition, not just 3xx.
154
+ // Deliberately keyed on the STATUS, not on the upstream's framing
155
+ // headers: an origin that omits both (QuestDB) and one that sends
156
+ // `chunked` for an empty body (Node's own server does this) must be
157
+ // handled identically, and only the status tells us a body is absent
158
+ // by definition.
159
+ const status = proxied.statusCode;
160
+ // 204 and 304 carry no body by protocol, whatever the origin sends.
161
+ // Node already frames these correctly, so they only need the upstream
162
+ // drained.
163
+ const neverHasBody = status === 204 || status === 304;
164
+ // A 3xx MAY carry a body (RFC 9110 §15.4) and browsers render it, so
165
+ // this cannot assume every redirect is empty — an earlier version did,
166
+ // and silently dropped the body.
167
+ //
168
+ // Bodyless means the upstream declared NEITHER framing header. Testing
169
+ // content-length alone is not enough: a redirect body sent with
170
+ // chunked encoding carries no length, and was also being dropped.
171
+ const declaresBody = proxied.headers["content-length"] !== undefined ||
172
+ proxied.headers["transfer-encoding"] !== undefined;
173
+ const redirectWithoutBody = status !== undefined &&
174
+ status >= 300 &&
175
+ status < 400 &&
176
+ !declaresBody;
177
+ if (req.method === "HEAD" || neverHasBody || redirectWithoutBody) {
178
+ // Synthesize `content-length: 0` only when the upstream declared no
179
+ // framing at all — that is the case where Node would otherwise guess
180
+ // and fall back to chunked for a body that never arrives.
181
+ //
182
+ // Do NOT synthesize it when the upstream stated a length. A HEAD
183
+ // response must carry the same headers a GET would (RFC 9110
184
+ // §9.3.2), so overwriting a real `content-length: 12345` with 0
185
+ // misreports the resource's size to the client.
186
+ //
187
+ // 204/304 must not carry content-length at all (RFC 9110 §6.4.1).
188
+ if (!neverHasBody && !declaresBody) {
189
+ headers["content-length"] = "0";
190
+ }
191
+ res.writeHead(status ?? 502, headers);
192
+ // Drain whatever the upstream sent regardless: QuestDB answers HEAD
193
+ // with a body under chunked framing, which is protocol-illegal, and
194
+ // leaving it unread holds the socket open.
153
195
  proxied.resume();
154
196
  res.end();
155
197
  return;
156
198
  }
199
+ res.writeHead(status ?? 502, headers);
200
+ // If the upstream dies mid-body, `pipe` alone never ends `res` — the
201
+ // browser sits on a response that will never complete. Node signals
202
+ // truncation to a direct client by aborting the socket; destroying our
203
+ // response does the same for ours, so a truncated console query fails
204
+ // visibly instead of hanging the tab.
205
+ proxied.on("aborted", () => {
206
+ deps.debug("console proxy: upstream aborted mid-response");
207
+ res.destroy();
208
+ });
209
+ proxied.on("error", (err) => {
210
+ deps.debug(`console proxy: upstream stream error: ${err.message}`);
211
+ res.destroy();
212
+ });
157
213
  proxied.pipe(res);
158
214
  });
159
215
  upstream.on("error", (err) => {
@@ -1 +1 @@
1
- {"version":3,"file":"console-proxy.js","sourceRoot":"","sources":["../src/console-proxy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"console-proxy.js","sourceRoot":"","sources":["../src/console-proxy.ts"],"names":[],"mappings":"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"}
@@ -259,6 +259,175 @@ describe("console proxy redirect rewriting", () => {
259
259
  await new Promise((r) => up.close(() => r()));
260
260
  }
261
261
  }
262
+ it("does not announce a chunked body on a bodyless redirect", async () => {
263
+ // QuestDB's 301 states NEITHER content-length nor transfer-encoding, so
264
+ // Node falls back to chunked framing — announcing a body that never
265
+ // arrives. The browser waits on a redirect that never completes, which is
266
+ // how a working console still reported "console unavailable" even after
267
+ // the Location rewrite was correct. Rewriting Location was necessary but
268
+ // not sufficient; this is the other half.
269
+ // Exactly QuestDB's shape: no content-length, no transfer-encoding, no
270
+ // body. `res.writeHead(...); res.end()` will NOT do — Node adds
271
+ // `chunked` for an empty body, which the real origin does not send, and a
272
+ // stand-in that declares framing is not the case under test. Write the
273
+ // raw response so the bytes match what QuestDB actually emits.
274
+ const up = http.createServer((_req, res) => {
275
+ res.socket?.end("HTTP/1.1 301 Moved Permanently\r\n" +
276
+ "Location: /index.html\r\n" +
277
+ "Connection: close\r\n" +
278
+ "\r\n");
279
+ });
280
+ await new Promise((r) => up.listen(0, "127.0.0.1", r));
281
+ const upPort = up.address().port;
282
+ const proxy = createConsoleProxy({
283
+ baseUrl: () => `http://127.0.0.1:${upPort}`,
284
+ debug: () => { },
285
+ mountPath: MOUNT,
286
+ });
287
+ const front = http.createServer((req, res) => proxy(req, res));
288
+ await new Promise((r) => front.listen(0, "127.0.0.1", r));
289
+ const { port } = front.address();
290
+ try {
291
+ // Raw client: fetch() normalises framing away, hiding the very header
292
+ // this test exists to check.
293
+ const headers = await new Promise((resolve, reject) => {
294
+ const r = http.request({
295
+ host: "127.0.0.1",
296
+ port,
297
+ path: "/",
298
+ headers: { connection: "close" },
299
+ }, (res) => {
300
+ res.resume();
301
+ res.on("end", () => resolve(res.headers));
302
+ });
303
+ r.on("error", reject);
304
+ r.end();
305
+ });
306
+ assert.equal(headers["transfer-encoding"], undefined, "a bodyless redirect must not be chunked");
307
+ assert.equal(headers["content-length"], "0");
308
+ }
309
+ finally {
310
+ front.closeAllConnections?.();
311
+ await new Promise((r) => front.close(() => r()));
312
+ await new Promise((r) => up.close(() => r()));
313
+ }
314
+ });
315
+ it("passes a 304 through without inventing a content-length", async () => {
316
+ // QuestDB really does serve 304 for the console's assets, so this is the
317
+ // browser-caching path, not a hypothetical. RFC 9110 §6.4.1: a 304 must
318
+ // not carry content-length — adding one here would be a protocol error on
319
+ // every cached asset load.
320
+ const up = http.createServer((_req, res) => {
321
+ res.writeHead(304, { etag: '"abc"' });
322
+ res.end();
323
+ });
324
+ await new Promise((r) => up.listen(0, "127.0.0.1", r));
325
+ const upPort = up.address().port;
326
+ const proxy = createConsoleProxy({
327
+ baseUrl: () => `http://127.0.0.1:${upPort}`,
328
+ debug: () => { },
329
+ mountPath: MOUNT,
330
+ });
331
+ const front = http.createServer((req, res) => proxy(req, res));
332
+ await new Promise((r) => front.listen(0, "127.0.0.1", r));
333
+ const { port } = front.address();
334
+ try {
335
+ const headers = await new Promise((resolve, reject) => {
336
+ const r = http.request({
337
+ host: "127.0.0.1",
338
+ port,
339
+ path: "/",
340
+ headers: { connection: "close" },
341
+ }, (res) => {
342
+ res.resume();
343
+ res.on("end", () => resolve(res.headers));
344
+ });
345
+ r.on("error", reject);
346
+ r.end();
347
+ });
348
+ assert.equal(headers["content-length"], undefined);
349
+ assert.equal(headers["transfer-encoding"], undefined);
350
+ assert.equal(headers.etag, '"abc"');
351
+ }
352
+ finally {
353
+ front.closeAllConnections?.();
354
+ await new Promise((r) => front.close(() => r()));
355
+ await new Promise((r) => up.close(() => r()));
356
+ }
357
+ });
358
+ it("preserves a redirect that legitimately carries a body", async () => {
359
+ // Self-audit catch. A 3xx MAY carry a body (RFC 9110 §15.4) and browsers
360
+ // render it. The first version of the bodyless fix keyed purely on status,
361
+ // so it dropped that body AND overwrote a correct content-length with 0 —
362
+ // trading one framing bug for a worse, silent one.
363
+ const body = "<html>Moved. <a href='/x'>here</a></html>";
364
+ const up = http.createServer((_req, res) => {
365
+ res.writeHead(302, {
366
+ location: "/x",
367
+ "content-type": "text/html",
368
+ "content-length": String(Buffer.byteLength(body)),
369
+ });
370
+ res.end(body);
371
+ });
372
+ await new Promise((r) => up.listen(0, "127.0.0.1", r));
373
+ const upPort = up.address().port;
374
+ const proxy = createConsoleProxy({
375
+ baseUrl: () => `http://127.0.0.1:${upPort}`,
376
+ debug: () => { },
377
+ mountPath: MOUNT,
378
+ });
379
+ const front = http.createServer((req, res) => proxy(req, res));
380
+ await new Promise((r) => front.listen(0, "127.0.0.1", r));
381
+ const { port } = front.address();
382
+ try {
383
+ const res = await fetch(`http://127.0.0.1:${port}/`, {
384
+ redirect: "manual",
385
+ headers: { connection: "close" },
386
+ });
387
+ assert.equal(res.status, 302);
388
+ assert.equal(await res.text(), body, "a redirect body must not be dropped");
389
+ assert.equal(res.headers.get("content-length"), String(body.length));
390
+ }
391
+ finally {
392
+ front.closeAllConnections?.();
393
+ await new Promise((r) => front.close(() => r()));
394
+ await new Promise((r) => up.close(() => r()));
395
+ }
396
+ });
397
+ it("preserves a redirect body sent with chunked encoding", async () => {
398
+ // Second self-audit catch. Keying "bodyless" on the absence of
399
+ // content-length alone still dropped a redirect body streamed with
400
+ // chunked encoding, which carries no length. Both framing headers have to
401
+ // be absent before a 3xx can be treated as empty.
402
+ const body = "<html>Moved chunked</html>";
403
+ const up = http.createServer((_req, res) => {
404
+ // No content-length: Node frames this as chunked.
405
+ res.writeHead(302, { location: "/x", "content-type": "text/html" });
406
+ res.end(body);
407
+ });
408
+ await new Promise((r) => up.listen(0, "127.0.0.1", r));
409
+ const upPort = up.address().port;
410
+ const proxy = createConsoleProxy({
411
+ baseUrl: () => `http://127.0.0.1:${upPort}`,
412
+ debug: () => { },
413
+ mountPath: MOUNT,
414
+ });
415
+ const front = http.createServer((req, res) => proxy(req, res));
416
+ await new Promise((r) => front.listen(0, "127.0.0.1", r));
417
+ const { port } = front.address();
418
+ try {
419
+ const res = await fetch(`http://127.0.0.1:${port}/`, {
420
+ redirect: "manual",
421
+ headers: { connection: "close" },
422
+ });
423
+ assert.equal(await res.text(), body, "a chunked redirect body must survive");
424
+ }
425
+ finally {
426
+ front.closeAllConnections?.();
427
+ await new Promise((r) => front.close(() => r()));
428
+ await new Promise((r) => up.close(() => r()));
429
+ }
430
+ });
262
431
  it("keeps a root-relative redirect inside the mount", async () => {
263
432
  assert.equal(await locationThrough("/index.html"), `${MOUNT}/index.html`);
264
433
  });
@@ -279,6 +448,97 @@ describe("console proxy redirect rewriting", () => {
279
448
  assert.equal(await locationThrough("//evil.example.com/"), "//evil.example.com/");
280
449
  });
281
450
  });
451
+ describe("console proxy upstream failure mid-response", () => {
452
+ it("does not leave the client hanging when the upstream dies mid-body", async () => {
453
+ // Self-audit catch. `proxied.pipe(res)` had no error/abort handler, so an
454
+ // upstream that dies after headers were sent never ended our response —
455
+ // the browser tab sat on a request that would never complete. Node signals
456
+ // truncation to a direct client by aborting; the proxy must do the same.
457
+ const up = http.createServer((_req, res) => {
458
+ res.writeHead(200, {
459
+ "content-type": "text/plain",
460
+ "content-length": "100",
461
+ });
462
+ res.write("partial");
463
+ setTimeout(() => res.socket?.destroy(), 30);
464
+ });
465
+ await new Promise((r) => up.listen(0, "127.0.0.1", r));
466
+ const upPort = up.address().port;
467
+ const proxy = createConsoleProxy({
468
+ baseUrl: () => `http://127.0.0.1:${upPort}`,
469
+ debug: () => { },
470
+ mountPath: MOUNT,
471
+ });
472
+ const front = http.createServer((req, res) => proxy(req, res));
473
+ await new Promise((r) => front.listen(0, "127.0.0.1", r));
474
+ const { port } = front.address();
475
+ try {
476
+ const outcome = await new Promise((resolve) => {
477
+ const timer = setTimeout(() => resolve("HUNG"), 4000);
478
+ const settle = (v) => {
479
+ clearTimeout(timer);
480
+ resolve(v);
481
+ };
482
+ const r = http.request({
483
+ host: "127.0.0.1",
484
+ port,
485
+ path: "/",
486
+ headers: { connection: "close" },
487
+ }, (res) => {
488
+ res.resume();
489
+ res.on("aborted", () => settle("aborted"));
490
+ res.on("end", () => settle("ended"));
491
+ });
492
+ r.on("error", () => settle("error"));
493
+ r.end();
494
+ });
495
+ assert.notEqual(outcome, "HUNG", "a truncated response must not hang");
496
+ assert.notEqual(outcome, "ended", "a truncated response must not look like a clean end");
497
+ }
498
+ finally {
499
+ front.closeAllConnections?.();
500
+ await new Promise((r) => front.close(() => r()));
501
+ await new Promise((r) => up.close(() => r()));
502
+ }
503
+ });
504
+ });
505
+ describe("console proxy HEAD content-length", () => {
506
+ it("reports the resource's real length, not zero", async () => {
507
+ // Third self-audit catch. A HEAD response must carry the headers a GET
508
+ // would return (RFC 9110 §9.3.2), so overwriting a stated
509
+ // `content-length: 12345` with 0 misreports the resource's size — a
510
+ // client sizing a download from HEAD would read it as empty.
511
+ const up = http.createServer((_req, res) => {
512
+ res.writeHead(200, {
513
+ "content-type": "text/plain",
514
+ "content-length": "12345",
515
+ });
516
+ res.end();
517
+ });
518
+ await new Promise((r) => up.listen(0, "127.0.0.1", r));
519
+ const upPort = up.address().port;
520
+ const proxy = createConsoleProxy({
521
+ baseUrl: () => `http://127.0.0.1:${upPort}`,
522
+ debug: () => { },
523
+ mountPath: MOUNT,
524
+ });
525
+ const front = http.createServer((req, res) => proxy(req, res));
526
+ await new Promise((r) => front.listen(0, "127.0.0.1", r));
527
+ const { port } = front.address();
528
+ try {
529
+ const res = await fetch(`http://127.0.0.1:${port}/`, {
530
+ method: "HEAD",
531
+ headers: { connection: "close" },
532
+ });
533
+ assert.equal(res.headers.get("content-length"), "12345");
534
+ }
535
+ finally {
536
+ front.closeAllConnections?.();
537
+ await new Promise((r) => front.close(() => r()));
538
+ await new Promise((r) => up.close(() => r()));
539
+ }
540
+ });
541
+ });
282
542
  describe("console proxy HEAD handling", () => {
283
543
  it("answers HEAD without hanging", async () => {
284
544
  // QuestDB replies to HEAD with `405 Transfer-Encoding: chunked` AND a
@@ -1 +1 @@
1
- {"version":3,"file":"console-proxy.test.js","sourceRoot":"","sources":["../../src/test/console-proxy.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"console-proxy.test.js","sourceRoot":"","sources":["../../src/test/console-proxy.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "signalk-questdb",
3
- "version": "1.8.2",
3
+ "version": "1.8.4",
4
4
  "type": "module",
5
5
  "description": "QuestDB history provider for Signal K — replaces signalk-to-influxdb",
6
6
  "keywords": [
@@ -30,8 +30,10 @@
30
30
  "format": "npm run prettier && npm run lint",
31
31
  "ci-lint": "eslint && prettier --check .",
32
32
  "test": "node --test 'dist/test/**/*.test.js'",
33
- "build:all": "npm run build && npm test",
34
- "prepublishOnly": "npm run build"
33
+ "build:all": "npm run build && npm test && npm run test:panel",
34
+ "prepublishOnly": "npm run build",
35
+ "build:panel-test": "tsc -p src/test/panel/tsconfig.json",
36
+ "test:panel": "npm run build:panel-test && node --test \"dist-panel-test/src/test/panel/**/*.test.js\""
35
37
  },
36
38
  "engines": {
37
39
  "node": ">=22"
@@ -54,6 +56,7 @@
54
56
  "@types/express": "^5.0.0",
55
57
  "@types/node": "^22.0.0",
56
58
  "@types/react": "^19.2.18",
59
+ "@types/react-dom": "^19.2.4",
57
60
  "@vitejs/plugin-react": "^6.0.5",
58
61
  "eslint": "^10.2.0",
59
62
  "eslint-config-prettier": "^10.1.8",
@@ -62,6 +65,7 @@
62
65
  "jiti": "^2.7.0",
63
66
  "prettier": "^3.9.0",
64
67
  "react": "^19.2.4",
68
+ "react-dom": "^19.2.8",
65
69
  "typescript": "^6.0.3",
66
70
  "typescript-eslint": "^8.58.0",
67
71
  "vite": "^8.2.1"
@@ -0,0 +1,9 @@
1
+ import{a as e,i as t,n,r,t as i}from"./_virtual_mf___mfe_internal__signalk_questdb__mf_owner__1__loadShare__react__loadShare__.js-DzhF4wXp.js";var a={root:{fontFamily:`-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`,color:`#333`,padding:`16px 0`},sectionTitle:{fontSize:13,fontWeight:600,color:`#888`,textTransform:`uppercase`,letterSpacing:`0.05em`,marginBottom:10,marginTop:24},sectionToggle:{color:`#555`,display:`flex`,alignItems:`center`,gap:6,width:`100%`,textAlign:`left`,background:`none`,border:`none`,padding:0,cursor:`pointer`,userSelect:`none`},sectionMarker:{fontSize:11,transition:`transform 0.15s`},btn:{display:`inline-flex`,alignItems:`center`,gap:8,padding:`8px 16px`,border:`none`,borderRadius:6,fontSize:13,fontWeight:600,cursor:`pointer`},btnPrimary:{background:`#3b82f6`,color:`#fff`},btnSave:{background:`#3b82f6`,color:`#fff`},btnDanger:{background:`#ef4444`,color:`#fff`,padding:`6px 12px`,fontSize:12},btnDisabled:{opacity:.5,cursor:`not-allowed`},status:{marginTop:8,fontSize:12,minHeight:18},warnBanner:{padding:`12px 16px`,background:`#fef2f2`,border:`1px solid #fecaca`,borderRadius:10,marginBottom:12,fontSize:13,color:`#991b1b`,lineHeight:1.5},warnBannerTitle:{fontWeight:700,marginBottom:4},infoBanner:{padding:`12px 16px`,background:`#fffbeb`,border:`1px solid #fde68a`,borderRadius:10,marginBottom:12,fontSize:13,color:`#92400e`,lineHeight:1.5},warnBannerCode:{display:`block`,marginTop:8,padding:`8px 10px`,background:`#fff`,border:`1px solid #fecaca`,borderRadius:6,fontFamily:`monospace`,fontSize:12,color:`#7f1d1d`,whiteSpace:`pre-wrap`,wordBreak:`break-word`},card:{display:`flex`,alignItems:`center`,gap:14,padding:`14px 18px`,background:`#f8f9fa`,border:`1px solid #e0e0e0`,borderRadius:10,marginBottom:12},cardIcon:{width:44,height:44,borderRadius:10,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:20,fontWeight:700,flexShrink:0},cardInfo:{flex:1},cardTitle:{fontSize:15,fontWeight:600,color:`#333`},cardMeta:{fontSize:12,color:`#888`},stateIndicator:{width:10,height:10,borderRadius:`50%`,flexShrink:0},fieldRow:{display:`flex`,alignItems:`center`,gap:12,marginBottom:10},label:{fontSize:13,fontWeight:500,color:`#555`,width:180,flexShrink:0},select:{padding:`6px 10px`,borderRadius:6,border:`1px solid #ccc`,fontSize:13,background:`#fff`,color:`#333`,minWidth:200},input:{padding:`6px 10px`,borderRadius:6,border:`1px solid #ccc`,fontSize:13,background:`#fff`,color:`#333`,width:200},inputSmall:{padding:`6px 10px`,borderRadius:6,border:`1px solid #ccc`,fontSize:13,background:`#fff`,color:`#333`,width:80},checkbox:{width:16,height:16,accentColor:`#3b82f6`},hint:{fontSize:11,color:`#aaa`,marginLeft:8},fieldHelp:{fontSize:12,color:`#666`,marginTop:6,lineHeight:1.5},textarea:{padding:`6px 10px`,borderRadius:6,border:`1px solid #ccc`,fontSize:13,fontFamily:`monospace`,background:`#fff`,color:`#333`,width:`100%`,minHeight:70,boxSizing:`border-box`,resize:`vertical`},empty:{textAlign:`center`,padding:`30px 16px`,color:`#999`,fontSize:13},tag:{display:`inline-block`,padding:`2px 8px`,borderRadius:4,fontSize:10,fontWeight:600,marginLeft:8},tagPre:{background:`#fef3c7`,color:`#92400e`},tagLatest:{background:`#dcfce7`,color:`#166534`},migrationItem:{display:`flex`,alignItems:`center`,gap:12,padding:`12px 16px`,background:`#f8f9fa`,border:`1px solid #e0e0e0`,borderRadius:10,marginBottom:8},migrationActions:{display:`flex`,gap:8,alignItems:`center`},statsGrid:{display:`grid`,gridTemplateColumns:`repeat(auto-fit, minmax(140px, 1fr))`,gap:10,marginBottom:12},statCard:{padding:`12px 16px`,background:`#f8f9fa`,border:`1px solid #e0e0e0`,borderRadius:10,textAlign:`center`},statValue:{fontSize:22,fontWeight:700,color:`#333`},statLabel:{fontSize:11,color:`#888`,marginTop:2}},o=e=>typeof e==`object`&&!!e;function s(e){return Array.isArray(e)?e.filter(e=>o(e)&&typeof e.tag==`string`&&typeof e.prerelease==`boolean`):[]}function ee(e){let t=o(e)?e.sources:void 0;return Array.isArray(t)?t.filter(e=>o(e)&&typeof e.type==`string`&&typeof e.url==`string`&&typeof e.status==`string`&&(e.version===void 0||typeof e.version==`string`)):[]}function c(e){return e instanceof Error?e.message:String(e)}function l(e,t){return e??t}var u=[`none`,`lz4`,`zstd`];function te(e){return u.includes(e)?e:`lz4`}function d({title:t,defaultOpen:n=!1,children:r}){let[o,s]=e(n);return i.createElement(`div`,null,i.createElement(`button`,{type:`button`,"aria-expanded":o,style:{...a.sectionTitle,...a.sectionToggle},onClick:()=>s(!o)},i.createElement(`span`,{style:{...a.sectionMarker,transform:o?`rotate(90deg)`:`rotate(0deg)`}},`▶`),t),o&&i.createElement(`div`,{style:{marginBottom:16}},r))}function f(e){return e==null?`—`:e>=1e6?(e/1e6).toFixed(1)+`M`:e>=1e3?(e/1e3).toFixed(1)+`K`:String(e)}function p({configuration:o,save:u}){let p=o||{},[m,ne]=e(p.questdbHost||`127.0.0.1`),[h,re]=e(p.questdbIlpPort||9009),[g,ie]=e(p.questdbHttpPort||9e3),[ae,oe]=e(p.questdbPgPort||8812),[se,ce]=e(p.questdbVersion||`latest`),[_,le]=e(p.managedContainer!==!1),[ue,de]=e(p.recordSelf!==!1),[fe,pe]=e(p.recordOthers!==!1),[v,me]=e(p.restoreOnStart===!0),[he,ge]=e(p.enableConsole!==!1),[_e,ve]=e((p.restoreMaxAgeMinutes??0)>0?p.restoreMaxAgeMinutes:9),[ye,be]=e(p.defaultSamplingRate??2e3),[y,xe]=e(String(p.ilpFlushIntervalMs??5e3)),[Se,Ce]=e(p.retentionDays||0),[b,we]=e(p.pathFilter?.mode===`include`?`include`:`exclude`),[x,Te]=e((Array.isArray(p.pathFilter?.paths)?p.pathFilter.paths:[]).join(`
2
+ `)),[S,Ee]=e(p.compression||`lz4`),[De,Oe]=e(p.compressionLevel||3),[ke,Ae]=e(p.networkName||`sk-network`),[C,je]=e(p.exposeToContainers||!1),[Me,Ne]=e([]),[Pe,Fe]=e(!1),[w,Ie]=e(null),[Le,Re]=e(!0),[T,ze]=e(null),[E,Be]=e(!1),[D,Ve]=e(``),[He,O]=e(``),[Ue,k]=e(!1),[A,We]=e(null),[j,Ge]=e(!1),[M,Ke]=e(!1),[N,qe]=e(!1),[P,Je]=e(!1),[Ye,F]=e(``),[I,Xe]=e(null),[L,R]=e(!1),z=t(0),[B,Ze]=e(!1),V=n(async()=>{Fe(!0);try{let e=await fetch(`/plugins/signalk-questdb/api/versions`);e.ok&&Ne(s(await e.json().catch(()=>null)))}catch{}Fe(!1)},[]),H=n(async()=>{try{let e=await(await fetch(`/plugins/signalk-questdb/api/status`)).json().catch(()=>null);Ie(e&&typeof e==`object`?e:{status:`not_running`})}catch{Ie({status:`not_running`})}Re(!1)},[]),U=n(async e=>{let t=++z.current;try{let n=await fetch(`/plugins/signalk-questdb/api/wal-diagnosis`,{signal:e});if(t!==z.current)return;if(n.ok){let e=await n.json();if(t!==z.current)return;Xe(e),R(!1)}else R(!0)}catch{t===z.current&&R(!0)}},[]),Qe=!!(w&&w.status===`running`&&(w.suspendedTables||[]).length>0);r(()=>{if(!Qe){Xe(null),R(!1);return}let e=!1,t=null,n=new AbortController,r=async()=>{await U(n.signal),e||(t=setTimeout(r,15e3))};return r(),()=>{e=!0,n.abort(),t&&clearTimeout(t)}},[Qe,U]);let $e=async(e,t)=>{let n=t.tailSkip?`
3
+
4
+ WARNING: this is the newest pending segment — skipping it drops the ENTIRE pending backlog.`:``;if(window.confirm(`Skip the unreadable WAL segment on ${e}?\n\nThis permanently loses ${f(t.skippedTxns)} transaction(s) recorded between ${t.skipWindowStart} and ${t.skipWindowEnd}. Everything after the skipped segment is replayed without loss.`+n)){Ze(!0),F(``);try{let n=await fetch(`/plugins/signalk-questdb/api/resume-wal/skip`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({table:e,confirmPlan:t})}),r=await n.json().catch(()=>({error:n.statusText}));n.ok?F(r.message??``):F(`Skip failed: ${l(r.error,`unknown error`)}`),H(),U()}catch(e){F(`Skip failed: ${c(e)}`)}Ze(!1)}},et=async()=>{Ge(!0);try{let e=await fetch(`/plugins/signalk-questdb/api/update/check`);e.ok&&We(await e.json())}catch{}Ge(!1)},tt=async()=>{Ke(!0),O(`Pulling new image and restarting...`),k(!1);try{let e=await fetch(`/plugins/signalk-questdb/api/update/apply`,{method:`POST`});if(e.ok){let t=await e.json();O(t.message??``),We(null),t.newVersion&&ce(t.newVersion),H()}else{let t=await e.json().catch(()=>({error:e.statusText}));O(`Update failed: ${l(t.error,`unknown error`)}`),k(!0)}}catch(e){O(`Update failed: ${c(e)}`),k(!0)}Ke(!1)},nt=async()=>{if(window.confirm(`Remove the QuestDB container and DELETE ALL recorded data? This cannot be undone.`)){qe(!0),O(`Removing QuestDB container and data...`),k(!1);try{let e=await fetch(`/plugins/signalk-questdb/api/purge-data`,{method:`POST`}),t=await e.json().catch(()=>({error:e.statusText}));e.ok?(O(t.message??``),H()):(O(`Remove failed: ${l(t.error,`unknown error`)}`),k(!0))}catch(e){O(`Remove failed: ${c(e)}`),k(!0)}qe(!1)}},rt=async()=>{Je(!0),F(``);try{let e=await fetch(`/plugins/signalk-questdb/api/resume-wal`,{method:`POST`}),t=await e.json().catch(()=>({error:e.statusText}));if(e.ok){let e=(t.results||[]).filter(e=>!e.ok);F(e.length===0?`${l(t.message,`Resume requested`)}. Recording resumes as the backlog drains — the banner clears once tables catch up.`:`${l(t.message,`Resume requested`)}. `+e.map(e=>`${e.table}: ${e.error}`).join(` · `)),H(),U()}else F(`Resume failed: ${l(t.error,`unknown error`)}`)}catch(e){F(`Resume failed: ${c(e)}`)}Je(!1)},it=async()=>{Be(!0),O(``);try{let e=D?`?url=${encodeURIComponent(D)}`:``,t=await fetch(`/plugins/signalk-questdb/api/migration/detect${e}`);if(t.ok){let e=ee(await t.json().catch(()=>null));ze(e),e.length===0&&(O(D?`No InfluxDB found at ${D}.`:`No InfluxDB instances detected on localhost:8086.`),k(!1))}}catch(e){O(`Detection failed: `+c(e)),k(!0)}Be(!1)};r(()=>{V(),H();let e=setInterval(H,5e3);return()=>clearInterval(e)},[V,H]);let[W,at]=e(``),[G,ot]=e(``),[K,st]=e(`parquet`),[q,J]=e(!1),ct=()=>{let e=Number(y);if(y===``||!Number.isFinite(e)||e<500||e>3e5){O(`Write batch interval must be 500–300000 ms.`),k(!0);return}u({...p,questdbHost:m,questdbIlpPort:h,questdbHttpPort:g,questdbPgPort:ae,questdbVersion:se,managedContainer:_,defaultSamplingRate:ye,ilpFlushIntervalMs:e,recordSelf:ue,recordOthers:fe,restoreOnStart:v,enableConsole:he,restoreMaxAgeMinutes:_e,retentionDays:Se,compression:S,compressionLevel:De,networkName:ke,exposeToContainers:C,pathFilter:{mode:b,paths:x.split(`
5
+ `).map(e=>e.trim()).filter(Boolean)},samplingRates:p.samplingRates||{}}),O(`Saved! Plugin will restart with new configuration.`),k(!1)},lt=async()=>{if(!W||!G){O(`Set both from and to dates for export.`),k(!0);return}J(!0),O(`Exporting ${K.toUpperCase()}...`),k(!1);try{let e=`/plugins/signalk-questdb/api/export?from=${encodeURIComponent(W)}&to=${encodeURIComponent(G)}&format=${K}`,t=await fetch(e);if(!t.ok){let e=await t.json().catch(()=>({error:t.statusText}));O(`Export failed: ${l(e.error,`unknown error`)}`),k(!0),J(!1);return}let n=await t.blob(),r=K===`parquet`?`parquet`:`csv`,i=document.createElement(`a`);i.href=URL.createObjectURL(n),i.download=`signalk-export-${W.slice(0,10)}.${r}`,i.click(),URL.revokeObjectURL(i.href),O(`Exported ${(n.size/1024/1024).toFixed(1)} MB`)}catch(e){O(`Export failed: ${c(e)}`),k(!0)}J(!1)},Y=w&&w.status===`running`,X=Y&&w.suspendedTables||[],Z=X.length>0,ut=Y&&w.schemaMismatch||!1,Q=Y&&w.ulimitClamp||null,$=w?.hostMaxMapCount?.tooLow&&w.hostMaxMapCount||null,dt=Me.filter(e=>!e.prerelease).slice(0,3),ft=Me.filter(e=>e.prerelease).slice(0,2);return i.createElement(`div`,{style:a.root},i.createElement(`div`,{style:a.sectionTitle},`QuestDB Status`),$&&i.createElement(`div`,{style:a.infoBanner},i.createElement(`div`,{style:a.warnBannerTitle},`Host vm.max_map_count is low — `,f($.current),` `,`(QuestDB recommends `,f($.recommended),`)`),`QuestDB memory-maps every partition and WAL segment it touches. As the database grows, this kernel limit can run out — mmap then fails with out-of-memory errors even though RAM is free, which shows up as slow or failing history queries, can suspend recording, and can take QuestDB down entirely. Run this in a shell on the host machine — not inside the QuestDB container, which can neither change the kernel-global limit nor has sudo (takes effect immediately, no restart needed):`,i.createElement(`code`,{style:a.warnBannerCode},`echo 'vm.max_map_count=${$.recommended}' | sudo tee /etc/sysctl.d/99-questdb.conf && sudo sysctl --system`)),Le?i.createElement(`div`,{style:a.empty},`Checking QuestDB...`):Y?i.createElement(i.Fragment,null,Z&&i.createElement(`div`,{style:a.warnBanner},i.createElement(`div`,{style:a.warnBannerTitle},`QuestDB WAL suspended — recording stalled`),`Rows are arriving but no longer commit, so the counts below have stopped advancing. This follows an error while QuestDB applied the write-ahead log — see the reason reported per table below. Resuming replays every pending transaction, so no data is lost.`,i.createElement(`code`,{style:a.warnBannerCode},X.map(e=>{let t=String(e.errorMessage||e.errorTag||`reason not reported`).replace(/[\r\n]+/g,` `),n=(I?.tables||[]).find(t=>t.name===e.name),r=n?.suspendedSince?` — frozen since ${n.suspendedSince}`:``;return`${e.name}: ${f(e.txnLag)} txns behind — ${t}${r}`}).join(`
6
+ `)),(I?.tables||[]).filter(e=>e.applyError).map(e=>i.createElement(`div`,{key:e.name,style:{marginTop:8,fontSize:12}},`QuestDB's own log reports the apply failure on`,` `,i.createElement(`code`,null,e.name),` as:`,i.createElement(`code`,{style:a.warnBannerCode},e.applyError))),i.createElement(`div`,{style:{marginTop:10}},i.createElement(`button`,{style:{...a.btn,...a.btnPrimary,...P||B?a.btnDisabled:{}},disabled:P||B,onClick:rt},P?`Resuming...`:`Resume recording`)),X.filter(e=>e.autoResume===`failed`).map(e=>{let t=(I?.tables||[]).find(t=>t.name===e.name);if(t?.partitionOpenFailure)return i.createElement(`div`,{key:e.name,style:{marginTop:12}},i.createElement(`div`,{style:a.warnBannerTitle},e.name,`: table data damaged — automatic repair not possible`),`QuestDB fails while opening this table's stored data, before it reaches any pending transaction. That means the commit record on disk describes rows whose data never made it to storage — the signature of a power loss during a write. Skipping transactions cannot fix this (the failure happens before them) and would discard the `,f(e.txnLag),` pending transactions for nothing, so no repair button is offered. Recovering this table means repairing its commit record by hand; please open an issue with the error above. Recording continues into the other tables, and “Resume recording” will re-suspend this one within milliseconds — it is safe to press, but it cannot repair this damage.`);let n=t?.skipPlan;return n?i.createElement(`div`,{key:e.name,style:{marginTop:12}},i.createElement(`div`,{style:a.warnBannerTitle},e.name,`: automatic resume failed — WAL segment unreadable`),`A lossless resume was attempted and the table re-suspended at the same transaction: the write-ahead-log segment at the stall point cannot be read back (typically corrupted by an unclean shutdown mid-write). Replaying can never get past it. The only repair is to skip the unreadable segment, losing`,` `,i.createElement(`b`,null,f(n.skippedTxns),` transaction(s)`),` `,`recorded between `,i.createElement(`b`,null,n.skipWindowStart),` and`,` `,i.createElement(`b`,null,n.skipWindowEnd),n.tailSkip?` — and this is the newest pending segment, so skipping it drops the ENTIRE pending backlog`:` — everything after the skipped segment (${f(Math.max(0,e.txnLag-n.skippedTxns))} txns) is replayed without loss`,`.`,i.createElement(`div`,{style:{marginTop:8}},i.createElement(`button`,{style:{...a.btn,...a.btnDanger,...B||P||L?a.btnDisabled:{}},disabled:B||P||L,onClick:()=>$e(e.name,n)},B?`Skipping...`:`Skip unreadable segment (loses data)`),L&&i.createElement(`div`,{style:{marginTop:6,fontSize:12}},`The diagnosis could not be refreshed — the numbers above may be stale. The skip re-enables once a refresh succeeds.`))):null}),i.createElement(`div`,{style:{marginTop:8,fontSize:12}},`Manual fallback in the QuestDB SQL console (`,i.createElement(`code`,null,`:9000`),`), one statement at a time — avoid running it from several tabs, the console retries a busy statement forever:`,i.createElement(`code`,{style:a.warnBannerCode},X.map(e=>{let t=`"${String(e.name).replace(/"/g,`""`)}"`,n=(I?.tables||[]).find(t=>t.name===e.name),r=[`ALTER TABLE ${t} RESUME WAL;`];return e.autoResume===`failed`&&n?.skipPlan&&!L&&r.push(`-- if the resume re-suspends: skip the unreadable segment (loses ${f(n.skipPlan.skippedTxns)} txns)`,`ALTER TABLE ${t} RESUME WAL FROM TXN ${n.skipPlan.skipToTxn};`),r.join(`
7
+ `)}).join(`
8
+ `)))),Ye&&i.createElement(`div`,{style:a.infoBanner},Ye),ut&&i.createElement(`div`,{style:a.warnBanner},i.createElement(`div`,{style:a.warnBannerTitle},`QuestDB table schema mismatch — data not readable`),`A QuestDB table was re-created by ILP ingestion with the wrong timestamp column, so rows are being stored but reads filtering on time (history, Grafana, and the counts above) return nothing. The plugin rebuilds the affected table with the correct schema automatically within a minute; if this persists, restart the plugin. (The few rows written into the wrong-schema table are lost — they were unreadable anyway.)`),Q&&i.createElement(`div`,{style:a.infoBanner},i.createElement(`div`,{style:a.warnBannerTitle},`QuestDB open-files limit capped by the host`),`QuestDB requested a `,i.createElement(`code`,null,Q.ulimit),` limit of`,` `,f(Q.requested),`, but this host only allows`,` `,f(Q.granted),`, so it was capped. QuestDB is running on the lower limit. To grant the full value, raise the host limit for the user running the container runtime — under rootless Podman that means a systemd `,i.createElement(`code`,null,`user@.service`),` `,i.createElement(`code`,null,`LimitNOFILE`),` drop-in (editing`,` `,i.createElement(`code`,null,`/etc/security/limits.conf`),` alone is usually not enough) — then restart the Signal K server so the plugin can re-create the QuestDB container with the raised limit (signalk-container 1.25.3+; on older versions remove the container once with `,i.createElement(`code`,null,`podman rm -f sk-signalk-questdb`),` instead). This warning clears itself once the container is running with the full value.`,` `,i.createElement(`a`,{href:`https://github.com/dirkwa/signalk-container#raising-the-open-files-limit-nofile`,target:`_blank`,rel:`noreferrer`,style:{color:`#92400e`,textDecoration:`underline`}},`Step-by-step instructions`),`.`),i.createElement(`div`,{style:a.card},i.createElement(`div`,{style:{...a.cardIcon,background:`#7c3aed`,color:`#fff`}},`Q`),i.createElement(`div`,{style:a.cardInfo},i.createElement(`div`,{style:a.cardTitle},`QuestDB`),i.createElement(`div`,{style:a.cardMeta},w?.endpoint||`${m}:${g}`,` `,`· `,Z?`WAL suspended`:`Recording`)),i.createElement(`div`,{style:{...a.stateIndicator,background:Z?`#ef4444`:`#10b981`},title:Z?`WAL suspended`:`Running`})),i.createElement(`div`,{style:a.statsGrid},i.createElement(`div`,{style:a.statCard},i.createElement(`div`,{style:a.statValue},f(w.totalRows)),i.createElement(`div`,{style:a.statLabel},`Total Rows`)),i.createElement(`div`,{style:a.statCard},i.createElement(`div`,{style:a.statValue},f(w.activePathsToday)),i.createElement(`div`,{style:a.statLabel},`Active Paths Today`)),w.restore&&i.createElement(`div`,{style:a.statCard},i.createElement(`div`,{style:a.statValue},w.restore.failed?`—`:f(w.restore.contexts)),i.createElement(`div`,{style:a.statLabel},w.restore.failed?`Restore failed`:`Vessels Restored`))),i.createElement(`div`,{style:{display:`flex`,alignItems:`center`,gap:10,marginBottom:12}},A&&A.updateAvailable?i.createElement(i.Fragment,null,i.createElement(`span`,{style:{fontSize:13}},`v`,A.currentVersion,` →`,` `,i.createElement(`strong`,null,`v`,A.latestVersion),` available`),i.createElement(`button`,{style:{...a.btn,...a.btnPrimary,padding:`4px 12px`,fontSize:12,...M?a.btnDisabled:{}},onClick:tt,disabled:M},M?`Updating...`:`Update QuestDB`)):A&&!A.updateAvailable?i.createElement(`span`,{style:{fontSize:12,color:`#888`}},`v`,A.currentVersion,` (up to date)`):i.createElement(`button`,{style:{...a.btn,padding:`4px 12px`,fontSize:12,background:`#f1f5f9`,color:`#475569`,border:`1px solid #e2e8f0`,...j?a.btnDisabled:{}},onClick:et,disabled:j},j?`Checking...`:`Check for updates`))):i.createElement(`div`,{style:a.card},i.createElement(`div`,{style:{...a.cardIcon,background:`#fef2f2`,color:`#ef4444`}},`Q`),i.createElement(`div`,{style:a.cardInfo},i.createElement(`div`,{style:a.cardTitle},`QuestDB`),i.createElement(`div`,{style:a.cardMeta},w?.status===`unhealthy`?`Not responding`:`Not running`,_?` — enable plugin to start container`:``)),i.createElement(`div`,{style:{...a.stateIndicator,background:`#ef4444`}})),i.createElement(`div`,{style:a.sectionTitle},`Image Version`),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`QuestDB version`),i.createElement(`select`,{style:a.select,value:se,onChange:e=>ce(e.target.value)},i.createElement(`option`,{value:`latest`},`latest (recommended)`),ft.map(e=>i.createElement(`option`,{key:e.tag,value:e.tag},e.tag,` (pre-release)`)),dt.map((e,t)=>i.createElement(`option`,{key:e.tag,value:e.tag},e.tag,t===0?` (current stable)`:``))),Pe&&i.createElement(`span`,{style:a.hint},`loading releases...`),i.createElement(`button`,{style:{...a.btn,...a.btnPrimary,padding:`4px 10px`,fontSize:11},onClick:V},`↻`)),i.createElement(`div`,{style:a.sectionTitle},`Connection`),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Managed container`),i.createElement(`input`,{type:`checkbox`,style:a.checkbox,checked:_,onChange:e=>le(e.target.checked)}),i.createElement(`span`,{style:a.hint},_?`signalk-container manages QuestDB`:`Connect to external QuestDB`)),!_&&i.createElement(i.Fragment,null,i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`QuestDB host`),i.createElement(`input`,{style:a.input,value:m,onChange:e=>ne(e.target.value)})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`HTTP port (queries)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:g,onChange:e=>ie(Number(e.target.value))})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`ILP port (writes)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:h,onChange:e=>re(Number(e.target.value))}))),_&&i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Bind to 0.0.0.0`),i.createElement(`input`,{type:`checkbox`,style:a.checkbox,checked:C,onChange:e=>je(e.target.checked)}),i.createElement(`span`,{style:{...a.hint,color:C?`#ef4444`:void 0}},C?`Caution! This exposes your data to the network`:`Signal K reaches QuestDB automatically — only enable to reach it from another machine or a separate-Docker Grafana`)),_&&C&&i.createElement(i.Fragment,null,i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`HTTP port (queries)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:g,onChange:e=>ie(Number(e.target.value))})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`ILP port (writes)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:h,onChange:e=>re(Number(e.target.value))})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`PostgreSQL wire port`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:ae,onChange:e=>oe(Number(e.target.value))}),i.createElement(`span`,{style:a.hint},`for Grafana`)),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Container network`),i.createElement(`input`,{style:a.input,value:ke,onChange:e=>Ae(e.target.value)}),i.createElement(`span`,{style:a.hint},`shared with signalk-grafana`))),i.createElement(`div`,{style:a.sectionTitle},`Recording`),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Default sampling rate (ms)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:ye,onChange:e=>be(Number(e.target.value))}),i.createElement(`span`,{style:a.hint},`1000 = max 1 write/sec per path (0 = every update)`)),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Write batch interval (ms)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,min:500,max:3e5,"aria-label":`Write batch interval in milliseconds`,value:y,onChange:e=>xe(e.target.value)}),i.createElement(`span`,{style:a.hint},`one QuestDB transaction per table per interval; longer = bigger batches, but up to this many ms lost on a hard crash (default 5000)`)),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Record own vessel`),i.createElement(`input`,{type:`checkbox`,style:a.checkbox,checked:ue,onChange:e=>de(e.target.checked)})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Record AIS targets`),i.createElement(`input`,{type:`checkbox`,style:a.checkbox,checked:fe,onChange:e=>pe(e.target.checked)})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Restore vessels on startup`),i.createElement(`input`,{type:`checkbox`,style:a.checkbox,"aria-label":`Restore vessels on startup`,checked:v,onChange:e=>me(e.target.checked)}),i.createElement(`span`,{style:a.hint},`replay each vessel's last recorded position after a restart, so AIS targets appear at once instead of only when they next transmit`)),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`QuestDB console webapp`),i.createElement(`input`,{type:`checkbox`,style:a.checkbox,"aria-label":`QuestDB console webapp`,checked:he,onChange:e=>ge(e.target.checked)}),i.createElement(`span`,{style:a.hint},`serve QuestDB's own console inside the Signal K admin UI (admin only). It is a full SQL client — unlike the read-only query endpoint it can modify and delete recorded data`)),v&&i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Restore max age (minutes)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,min:1,"aria-label":`Restore max age (minutes)`,value:_e,onChange:e=>{let t=Number(e.target.value);Number.isFinite(t)&&t>=1&&ve(t)}}),i.createElement(`span`,{style:a.hint},`only replay values this recent (default 9, matching Freeboard's AIS expiry); higher puts staler positions on the chart`)),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Retention (days)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:Se,onChange:e=>Ce(Number(e.target.value))}),i.createElement(`span`,{style:a.hint},`0 = keep forever`)),i.createElement(d,{title:`Path filtering`,defaultOpen:x.trim()!==``},i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Filter mode`),i.createElement(`select`,{style:a.select,value:b,onChange:e=>we(e.target.value===`include`?`include`:`exclude`)},i.createElement(`option`,{value:`exclude`},`Exclude matching paths`),i.createElement(`option`,{value:`include`},`Include only matching paths`))),i.createElement(`div`,{style:{marginBottom:10}},i.createElement(`div`,{style:{...a.label,width:`auto`,marginBottom:6}},`Path patterns (one per line, glob supported) — optional`),i.createElement(`textarea`,{style:a.textarea,value:x,onChange:e=>Te(e.target.value),placeholder:`notifications.*
9
+ environment.wind.*`}),i.createElement(`div`,{style:a.fieldHelp},`Empty = record everything (the default). Nothing is filtered out unless you list a pattern here.`),i.createElement(`div`,{style:{...a.hint,marginLeft:0}},b===`exclude`?`These paths are NOT recorded; everything else is.`:`ONLY these paths are recorded; everything else is dropped.`))),i.createElement(d,{title:`Compression (on-disk)`},i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Compression codec`),i.createElement(`select`,{style:a.select,value:S,onChange:e=>Ee(te(e.target.value))},i.createElement(`option`,{value:`none`},`None`),i.createElement(`option`,{value:`lz4`},`LZ4 (fast)`),i.createElement(`option`,{value:`zstd`},`ZSTD (smaller)`)),i.createElement(`span`,{style:a.hint},`applies to new data after save`)),S===`zstd`&&i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`ZSTD level`),i.createElement(`input`,{style:a.inputSmall,type:`number`,min:`1`,max:`22`,value:De,onChange:e=>Oe(Number(e.target.value))}),i.createElement(`span`,{style:a.hint},`1 (fast) to 22 (smallest)`))),i.createElement(d,{title:`InfluxDB Migration`},i.createElement(`div`,{style:{display:`flex`,gap:10,alignItems:`center`,marginBottom:10}},i.createElement(`button`,{style:{...a.btn,...a.btnPrimary,...E?a.btnDisabled:{}},onClick:it,disabled:E},E?`Detecting...`:`Detect InfluxDB`),i.createElement(`span`,{style:a.hint},`Checks localhost:8086 for InfluxDB 1.x and 2.x`)),T&&T.length>0&&i.createElement(`div`,null,T.map((e,t)=>i.createElement(`div`,{key:t,style:a.migrationItem},i.createElement(`div`,{style:{...a.cardIcon,width:36,height:36,fontSize:16,background:e.type===`influxdb2`?`#020a47`:`#22adf6`,color:`#fff`}},e.type===`influxdb2`?`2`:`1`),i.createElement(`div`,{style:a.cardInfo},i.createElement(`div`,{style:a.cardTitle},`InfluxDB `,e.type===`influxdb2`?`2.x`:`1.x`,i.createElement(`span`,{style:{...a.tag,...a.tagLatest}},e.status)),i.createElement(`div`,{style:a.cardMeta},e.url,` · v`,e.version))))),i.createElement(`div`,{style:{...a.fieldRow,marginTop:10}},i.createElement(`span`,{style:a.label},`Manual InfluxDB URL`),i.createElement(`input`,{style:a.input,placeholder:`http://192.168.1.100:8086`,value:D,onChange:e=>Ve(e.target.value)}),i.createElement(`span`,{style:a.hint},`for remote instances`)),T&&T.length===0&&!E&&i.createElement(`div`,{style:{...a.empty,padding:`16px`,textAlign:`left`}},`No InfluxDB found on localhost. Use manual URL above for remote instances.`)),i.createElement(d,{title:`Data Export`},i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`From`),i.createElement(`input`,{style:a.input,type:`datetime-local`,value:W,onChange:e=>at(e.target.value)})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`To`),i.createElement(`input`,{style:a.input,type:`datetime-local`,value:G,onChange:e=>ot(e.target.value)})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Format`),i.createElement(`select`,{style:a.select,value:K,onChange:e=>st(e.target.value)},i.createElement(`option`,{value:`parquet`},`Parquet`),i.createElement(`option`,{value:`csv`},`CSV`))),i.createElement(`button`,{style:{...a.btn,...a.btnPrimary,...q?a.btnDisabled:{}},onClick:lt,disabled:q},q?`Exporting...`:`Export Data`)),p.managedContainer!==!1&&i.createElement(d,{title:`Danger zone`},i.createElement(`div`,{style:{fontSize:13,color:`#555`,marginBottom:10}},`Remove the QuestDB container and permanently delete all recorded data. Use this to fully reset QuestDB — Signal K's plugin-uninstall cannot delete this data on rootless Podman. This cannot be undone.`),i.createElement(`button`,{style:{...a.btn,...a.btnDanger,...N?a.btnDisabled:{}},onClick:nt,disabled:N},N?`Removing...`:`Remove container & all data`)),He&&i.createElement(`div`,{style:{...a.status,color:Ue?`#ef4444`:`#10b981`,marginTop:16}},He),i.createElement(`div`,{style:{marginTop:24}},i.createElement(`button`,{style:{...a.btn,...a.btnSave},onClick:ct},`Save Configuration`)))}export{p as default};
@@ -1 +1 @@
1
- import{t as e}from"./vite-preload-helper-HclGiUj8.js";import"./virtualExposes-Cj0hoMce.js";var t=`__mf_module_cache__`;globalThis[t]||={share:{},remote:{}},globalThis[t].share||={},globalThis[t].remote||={};var n=globalThis[t];for(let e of Object.keys(n.share))if(e.startsWith(`default:`)){let t=e.slice(8);n.share[t]===void 0&&(n.share[t]=n.share[e])}else if(!e.includes(`:`)){let t=`default:`+e;n.share[t]===void 0&&(n.share[t]=n.share[e])}(async()=>{let t=await e(()=>import(`./hostInit-BK1oa2Z9.js`),[],import.meta.url);await t.__tla;let{initHost:r}=t;await r(),n.pendingShareLoads&&await Promise.all(n.pendingShareLoads)})().then(()=>e(()=>import(`./configpanel-BvRk9kiK.js`),[],import.meta.url));
1
+ import{t as e}from"./vite-preload-helper-HclGiUj8.js";import"./virtualExposes-BkvbtHi8.js";var t=`__mf_module_cache__`;globalThis[t]||={share:{},remote:{}},globalThis[t].share||={},globalThis[t].remote||={};var n=globalThis[t];for(let e of Object.keys(n.share))if(e.startsWith(`default:`)){let t=e.slice(8);n.share[t]===void 0&&(n.share[t]=n.share[e])}else if(!e.includes(`:`)){let t=`default:`+e;n.share[t]===void 0&&(n.share[t]=n.share[e])}(async()=>{let t=await e(()=>import(`./hostInit-BK1oa2Z9.js`),[],import.meta.url);await t.__tla;let{initHost:r}=t;await r(),n.pendingShareLoads&&await Promise.all(n.pendingShareLoads)})().then(()=>e(()=>import(`./configpanel-BvRk9kiK.js`),[],import.meta.url));
@@ -1 +1 @@
1
- import{t as e}from"./vite-preload-helper-HclGiUj8.js";var t={},n=new Set,r=Promise.resolve();async function i(e){let t=r.then(e,e);return r=t.then(()=>void 0,()=>void 0),t}async function a(e){if(typeof document>`u`)return;let r=t[e]||[];await Promise.all(r.map(e=>{let t=new URL(e,import.meta.url).href;return n.has(t)||(n.add(t),document.querySelector(`link[rel="stylesheet"][href="${t}"]`))?Promise.resolve():new Promise((e,n)=>{let r=document.createElement(`link`);r.rel=`stylesheet`,r.href=t,r.onload=()=>e(),r.onerror=()=>n(Error(`[Module Federation] Failed to load CSS asset: ${t}`)),document.head.appendChild(r)})}))}var o={"./PluginConfigurationPanel":async()=>{await a(`./PluginConfigurationPanel`),await Promise.all([]);let t=await i(()=>e(()=>import(`./PluginConfigurationPanel-u1H_dS78.js`),[],import.meta.url)),n=t&&t.__mf_remote_dependency_pending;n&&typeof n.then==`function`&&await n;let r={};return Object.assign(r,t),Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),r},"./AppPanel":async()=>{await a(`./AppPanel`),await Promise.all([]);let t=await i(()=>e(()=>import(`./AppPanel-CNFtJpeq.js`),[],import.meta.url)),n=t&&t.__mf_remote_dependency_pending;n&&typeof n.then==`function`&&await n;let r={};return Object.assign(r,t),Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),r}};export{o as default};
1
+ import{t as e}from"./vite-preload-helper-HclGiUj8.js";var t={},n=new Set,r=Promise.resolve();async function i(e){let t=r.then(e,e);return r=t.then(()=>void 0,()=>void 0),t}async function a(e){if(typeof document>`u`)return;let r=t[e]||[];await Promise.all(r.map(e=>{let t=new URL(e,import.meta.url).href;return n.has(t)||(n.add(t),document.querySelector(`link[rel="stylesheet"][href="${t}"]`))?Promise.resolve():new Promise((e,n)=>{let r=document.createElement(`link`);r.rel=`stylesheet`,r.href=t,r.onload=()=>e(),r.onerror=()=>n(Error(`[Module Federation] Failed to load CSS asset: ${t}`)),document.head.appendChild(r)})}))}var o={"./PluginConfigurationPanel":async()=>{await a(`./PluginConfigurationPanel`),await Promise.all([]);let t=await i(()=>e(()=>import(`./PluginConfigurationPanel-BUIFH2d0.js`),[],import.meta.url)),n=t&&t.__mf_remote_dependency_pending;n&&typeof n.then==`function`&&await n;let r={};return Object.assign(r,t),Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),r},"./AppPanel":async()=>{await a(`./AppPanel`),await Promise.all([]);let t=await i(()=>e(()=>import(`./AppPanel-CNFtJpeq.js`),[],import.meta.url)),n=t&&t.__mf_remote_dependency_pending;n&&typeof n.then==`function`&&await n;let r={};return Object.assign(r,t),Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),r}};export{o as default};
@@ -1 +1 @@
1
- import{t as e}from"./assets/vite-preload-helper-HclGiUj8.js";import{r as t,t as n}from"./assets/dist-BxwXn66h.js";({...t.global});var r=t.share;t.utils,typeof __VUE_HMR_RUNTIME__>`u`&&(globalThis.__VUE_HMR_RUNTIME__={createRecord(){},rerender(){},reload(){}});var i=`__mf_init__virtual:mf:__mfe_internal__signalk_questdb__mf_owner__1__mf_v__runtimeInit__mf_v__.js__`,a=globalThis[i];if(!a){let e,t,n=new Promise((n,r)=>{e=n,t=r});a=globalThis[i]={initPromise:n,initResolve:e,initReject:t}}var o=a.initResolve,s=`__mf_module_cache__`;globalThis[s]||={share:{},remote:{}},globalThis[s].share||={},globalThis[s].remote||={};var c=globalThis[s];for(let e of Object.keys(c.share))if(e.startsWith(`default:`)){let t=e.slice(8);c.share[t]===void 0&&(c.share[t]=c.share[e])}else if(!e.includes(`:`)){let t=`default:`+e;c.share[t]===void 0&&(c.share[t]=c.share[e])}var l={},u=Array.isArray(`default`)?`default`:[`default`],d=`default`,f=`signalk_questdb`,p,m;async function h(e){for(let t=0;;t++)try{return await e()}catch(e){throw e}}var g=Symbol(`mf.originalSharedProvider`),_={emit:e=>e},v=(e,t)=>{if(t!==`version-first`)return e;let n={};for(let[t,r]of Object.entries(e))n[t]=Object.assign({},r,{[g]:r});return n},y=(e,t)=>{if(!t)return;let n=Object.entries(e||{}),r=n.find(([,e])=>e===t);if(r)return{version:r[0],provider:t,registered:!0};if(typeof t.version==`string`&&t.version)return{version:t.version,provider:t,registered:!1};let i=n.filter(([,e])=>e===t||!!(t.from&&e?.from===t.from));if(i.length===1)return{version:i[0][0],provider:t,registered:!1}},b=(e,t,n,i)=>{if(!e||!n)return;let a=Array.isArray(n.scope)?n.scope:[n.scope||`default`],o=v(e,i),s={};for(let e of a)s[e||`default`]={[t]:o};let c=r.getRegisteredShare(s,t,{...n,scope:a,strategy:i},_)?.shared;return c?.[g]||c},x=(e,t,n,r)=>{let i=e=>S(e,n),a=Object.fromEntries(Object.entries(e||{}).filter(([,e])=>!i(e)));n?.version&&n.shareConfig?.import!==!1&&(a[n.version]||(a[n.version]=n));let o=b(a,t,n,r);return i(o)?void 0:o},S=(e,t)=>e===t||!!(t?.from&&e?.from===t.from),C=(e,t,n,r,i,a,o,s,c)=>{if(c!==`version-first`||!s)return;let l=t?.options?.shared?.[i],u=Array.isArray(l)?l.find(e=>e?.version===a):void 0,d=(s?.from===t?.options?.name?s:void 0)||(S(u,s)?u:t?void 0:s);if(d)return e.some(e=>e!==t&&e?.options?.name===o?.from&&e?.shareScopeMap?.[r]===n)?d:void 0},w=(e,t,n,r,i,a,o,s,c)=>{let l=a.registered?C(e,t,n,r,i,a.version,a.provider,s,c):void 0,u=l||o;if(u&&!(a.registered&&!S(u,s)))return{provider:u,scopeRootProvider:l}};async function T(){return p||=h(()=>e(()=>import(`./assets/_virtual_mf-localSharedImportMap___mfe_internal__signalk_questdb__mf_owner__1-CVM43rXb.js`),[],import.meta.url)).catch(e=>{throw p=void 0,e}),p}async function E(){return m||=h(()=>e(()=>import(`./assets/virtualExposes-Cj0hoMce.js`),[],import.meta.url)).then(e=>e.default??e).catch(e=>{throw m=void 0,e}),m}async function D(e={},t=[]){let r=(e,t,n,r)=>{let i=(Array.isArray(r)?r[0]:r)||`default`,a=t||!n?e:e+`@`+n,o={canonical:i+`:`+a};return i==="default"&&(o.aliases=[a]),o},i=(e,t)=>{let n=e[t.canonical];if(n!==void 0)return n;let r=t.aliases||[];for(let n of r){if(!Object.prototype.hasOwnProperty.call(e,n))continue;let r=e[n];if(r!==void 0)return e[t.canonical]=r,r}},a=Symbol.for(`module-federation.shared-cache-listeners`),s=Symbol.for(`module-federation.shared-cache-owners`),p=e=>{let t=e[s];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,s,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},m=(e,t)=>e[s]?.[t.canonical],g=(e,t,n,r)=>{e[t.canonical]=n;let i=t.aliases||[];for(let t of i)Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0});let o=e[s];r===void 0?o&&delete o[t.canonical]:p(e)[t.canonical]=r;let c=e[a]?.[t.canonical];if(c)for(let e of c)e(n);return n},_=Symbol.for(`module-federation.tree-shaking-shared-cache`),v=e=>{let t=e[_];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,_,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},C=(e,t,n,r)=>{if(!Array.isArray(n))return r;let i=[...new Set(n)].sort(),a=v(e),o=a[t.canonical]||=[],s=o.find(e=>e.providedExports.length===i.length&&e.providedExports.every((e,t)=>e===i[t]));return s?s.value=r:o.push({providedExports:i,value:r}),r},E=Symbol.for(`module-federation.tree-shaking-shared-selection-cache`),D=e=>{let t=e[E];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,E,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},O=(e,t,n)=>{let r=i(e,t);return r===void 0?e[E]?.[t.canonical]?.[n]:r},k=(e,t,n,r)=>{let i=D(e),a=i[t.canonical]||=Object.create(null);return a[n]=r,r},A=globalThis.__FEDERATION__?.__INSTANCES__||[],j=t.find(e=>e?.from)?.from,ee=A.find(t=>t?.options?.name===j&&t?.shareScopeMap?.default===e)||A.find(t=>t?.options?.name!==f&&t?.shareScopeMap?.default===e),M=Object.create(null);for(let[t,n]of Object.entries(e)){let e=M[t]=Object.create(null);for(let[t,r]of Object.entries(n))e[t]=Object.assign({},r)}let{usedShared:N,usedRemotes:P}=await T();var F=l[d];if(F||=l[d]={from:f},t.indexOf(F)>=0)return;t.push(F);let I=e=>{let t=e;for(let e=0;e<5;e++){let e=t?.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t},L=[],R=globalThis.window===void 0?await Promise.all([]):[],z=`__mf_vite_runtime_share_load_id__`,te=0,B=new Map,V=new Map,H=n({name:f,remotes:P,shared:N,plugins:[ne(),...L,...R],shareStrategy:`version-first`});H.initShareScopeMap(`default`,e);function ne(){return{name:`vite-share-pin-lifecycle-plugin`,resolveShare(e){let t=e.shareInfo?.[z],n=t===void 0?void 0:V.get(t);if(!n)return e;let r=e.resolver;return e.resolver=(...e)=>(n.pinned.reapply(),r(...e)),n.pinned.reveal(),e}}}let U=H.sharedHandler.hooks.lifecycle.resolveShare,W=new WeakMap;U.on(e=>{let t=e.shareInfo?.[z],n=e.resolver;return typeof n==`function`&&(e.resolver=(...e)=>{let r=n(...e),i=r?.shared;return i&&(typeof i==`object`||typeof i==`function`)&&!W.has(i)&&W.set(i,{from:i.from}),t!==void 0&&i&&B.set(t,i),r}),e});let re=(e,t,n,r)=>{if(!e||e[t]!==n)return;let i=Object.assign({},r,{version:r.version??t,scope:r.scope??n?.scope??[`default`],strategy:`loaded-first`}),a=r.from;e[t]=i;let o=()=>n===void 0?e[t]===void 0:e[t]===n;return{provider:i,reveal(){return e[t]===i&&(n===void 0?delete e[t]:e[t]=n,!0)},reapply(){return o()?(e[t]=i,!0):!1},release(s,c=!0){return r.from=a,e[t]===i?c?s?(i.from=a,s&&i.lib&&(i.loaded=!0),r.strategy===void 0?delete i.strategy:i.strategy=r.strategy,!0):(n===void 0?delete e[t]:e[t]=n,!1):(n===void 0?delete e[t]:e[t]=n,!0):!c&&o()}}},ie=e=>Object.entries(e||{}).map(([e,t])=>({provider:t,version:e,from:t.from,registered:!0})),ae=(e,t)=>{if(t===void 0)return;let n;for(let r of e){let e=r.provider,i=e.treeShaking||e;if(r.loadedFactory===t||e.lib===t||i.lib===t){if(n)return;n=r}}return n},oe=async(e,t,n)=>{let r=++te;V.set(r,{pinned:n});try{let n=await H.loadShare(e,{customShareInfo:{shareConfig:t,[z]:r}});return{factory:n===!1?void 0:n,selectedProvider:B.get(r)}}finally{B.delete(r),V.delete(r)}},G=async(e,t,n,r,i,a,o=!0)=>{let s=a.from,c=re(n,r,i,a);if(!c)return;let l;try{l=await oe(e,t,c)}catch(e){throw c.release(!1),e}let u=l?.factory;if(u===void 0){c.release(!1);return}let d=ie(n),f=c.provider.treeShaking||c.provider,p=c.provider.lib===u||f.lib===u;if(!o&&p){let e=d.findIndex(e=>e.provider===c.provider);e!==-1&&d.splice(e,1)}!o&&!d.some(e=>e.provider===a)&&d.push({provider:a,version:r,from:s,registered:!1,loadedFactory:p?u:void 0});let m=!o&&l.selectedProvider===c.provider&&p?a:l.selectedProvider;if(m&&!d.some(e=>e.provider===m)){let e=W.get(m),t=typeof m.version==`string`&&m.version?m.version:r;d.push({provider:m,version:t,from:e?e.from:m.from,registered:n?.[t]===m,loadedFactory:u})}let h=d.find(e=>e.provider===m)??ae(d,u);if(!c.release(!0,h?.provider===c.provider)||!h)return;let g=W.get(h.provider);h.from=h.provider===a?s:g?g.from:h.provider.from,g&&(h.provider.from=g.from);let _=typeof u==`function`?u():u,v=await Promise.resolve(_);if(!(h.registered&&n?.[h.version]!==h.provider))return{provider:h.provider,selection:h,resolved:v}},K=new Set,q=new Map,se=async(t,n,a)=>{let o=!!n.shareConfig?.singleton;if(!o&&n.canLiveRebind!==!1)try{let s=x(a,t,n,`version-first`),l=y(a,s);if(!l)return;let{version:u}=l;if(!o&&u!==n.version||!s.lib&&!s.loading&&!(s.loaded&&typeof s.get==`function`))return;let d=r(t,o,n.version,n.scope);if(i(c.share,d)!==void 0)return;let f=e[t],p=f?.[u];if(l.registered&&!S(p,s))return;let m,h=s.lib;if(!h&&s.loading&&(h=await s.loading),!h&&s.loaded&&typeof s.get==`function`&&(h=await s.get()),!h)return;let _=typeof h==`function`?h():h,v=await Promise.resolve(_),b=l.registered?p:s;m={provider:b,selection:{provider:b,version:u,from:s.from,registered:l.registered},resolved:v};let C=m?.provider,w=m?.selection;if(!w)return;let T=m?.resolved;if(T===void 0||i(c.share,d)!==void 0||w.registered&&f?.[w.version]!==C)return;g(c.share,d,I(T),w.from),K.add(C)}catch(e){console.error(`[Module Federation] Failed to bridge materialized shared module "`+t+`"`,e)}},J=async(t,n,a,o,s)=>{try{let l=r(t,n.shareConfig?.singleton,n.version,n.scope),u=i(c.share,l),d=m(c.share,l),p=x(a,t,n,`version-first`),h=p||b(a,t,n,`version-first`)||n,_=y(a,h);if(!_)return;let v=S(h,n),{version:C}=_;if(!n.shareConfig?.singleton&&C!==n.version)return;let T=o?.[C],E=w(A,ee,e,`default`,t,_,p,T,`version-first`);if(!E&&!v)return;let{provider:D,scopeRootProvider:O}=E||{provider:h,scopeRootProvider:void 0};if(n.canLiveRebind===!1||u!==void 0&&d!==f)return;let k=e[t],j=k?.[C];if(_.registered&&!O&&!S(j,D))return;let M=await G(t,n.shareConfig,k,C,j,D,_.registered&&!v),N=M?.provider,P=M?.selection;if(!P||S(N,n)||s&&(s.version!==P.version||!S({from:P.from},s.provider))||K.has(N))return;let F=M?.resolved;if(F===void 0)return;let L=i(c.share,l),R=m(c.share,l);if(L!==void 0&&R!==f||P.registered&&k?.[P.version]!==N)return;s||q.set(t,{version:P.version,provider:{from:P.from}}),K.add(N);let z=I(F);g(c.share,l,z,P.from)}catch(e){console.error(`[Module Federation] Failed to bridge external shared module "`+t+`"`,e)}};for(let[e,t]of Object.entries(N))t.treeShaking||await se(e,t,M[e]);for(let[e,t]of Object.entries(N)){if(t.treeShaking)continue;let n=r(e,t.shareConfig?.singleton,t.version,t.scope);if(i(c.share,n)!==void 0)continue;let a=r(e,!0,t.version,t.scope),o=i(c.share,a);o!==void 0&&g(c.share,n,o,m(c.share,a))}let Y=[`react`].filter(e=>N[e]!==void 0),X=e=>e.startsWith(`@`)?e.split(`/`).slice(0,2).join(`/`):e.split(`/`)[0];for(let e of Object.keys(N)){if(Y.includes(e))continue;let t=X(e),n=Y.indexOf(t);if(n===-1){Y.push(e);continue}let r=n;for(;r>0&&X(Y[r-1])===t&&Y[r-1]!==t;)r--;Y.splice(r,0,e)}var Z=async e=>{for(let t of e){let e=N[t],n=r(t,e.shareConfig?.singleton,e.version,e.scope);if(e.shareConfig?.import===!1||e.treeShaking||i(c.share,n)!==void 0)continue;let a=r(t,!0,e.version,e.scope),o=i(c.share,a);if(o!==void 0){g(c.share,n,o,m(c.share,a));continue}let s=await e.get(),l=typeof s==`function`?s():s,u=await Promise.resolve(l),d=(e=>{let t=e;for(let e=0;e<5;e++){let e=t?.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t})(u),p=d===u?{...u}:d;p.__esModule!==!0&&Object.defineProperty(p,"__esModule",{value:!0,enumerable:!1}),g(c.share,n,p,f)}};let Q=e=>{let t=N[e];if(!t.treeShaking&&t.shareConfig?.import!==!1)return!1;let n=r(e,t.shareConfig?.singleton,t.version,t.scope);return t.treeShaking?O(c.share,n,f)===void 0&&i(c.share,n)===void 0:i(c.share,n)===void 0},$=Y.findIndex(e=>{let t=N[e],n=r(e,t.shareConfig?.singleton,t.version,t.scope);return(t.treeShaking?O(c.share,n,f)??i(c.share,n):i(c.share,n))===void 0?t.treeShaking||t.shareConfig?.import===!1?!0:typeof x==`function`&&!!x(M[e],e,t,`version-first`):!1}),ce=$===-1?Y:Y.slice(0,$);var le=$===-1?[]:Y.slice($);await Z(ce);try{await h(async()=>{await Promise.all(await H.initializeSharing(`default`,{strategy:`version-first`,from:`build`,initScope:t}))})}catch(e){console.error(`[Module Federation]`,e)}for(let[t,n]of Object.entries(N))n.treeShaking||await J(t,n,e[t],M[t],void 0);try{let e=globalThis.__FEDERATION__?.__SHARE__,t=Object.create(null);if(e)for(let[,n]of Object.entries(e))for(let e of u){let r=n?.[e];if(r)for(let[e,n]of Object.entries(r)){let r=N?.[e],i=M[e],a=q.get(e);if(!r||!i||!a||r.treeShaking)continue;let o=t[e]||(t[e]=Object.create(null));for(let[e,t]of Object.entries(n)){if(!t.lib||a.version!==e||!S(t,a.provider))continue;let n=i[e];(t===n||n?.from&&t.from===n.from)&&(t===r||r.from&&t.from===r.from||o[e]===void 0&&(o[e]=t))}}}for(let[e,n]of Object.entries(t))await J(e,N[e],n,M[e],q.get(e))}catch(e){console.error(`[Module Federation] Failed to bridge external shared modules`,e)}let ue=async()=>{},de=async(t,n)=>{let a=r(t,n.shareConfig?.singleton,n.version,n.scope),o=n.treeShaking?O(c.share,a,f):i(c.share,a);if(n.shareConfig?.import!==!1||o!==void 0)return;let s=e=>{let t=e;for(let e=0;e<5;e++){let e=t?.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t},l=e?.[t],u=b(l,t,n,`version-first`)||n,d=y(l,u);if(!d)return;let{version:p}=d,m=l?.[p],h=await G(t,n.shareConfig,l,p,m,u,d.registered&&!S(u,n)),_=h?.selection,v=h?.provider,x=h?.resolved;if(!_||S(v,n)||x===void 0||(n.treeShaking?O(c.share,a,f):i(c.share,a))!==void 0||_.registered&&l?.[_.version]!==v)return;let w=s(x);if(n.treeShaking){let e=n.treeShaking.providedExports??n.treeShaking.usedExports??[];C(c.share,a,e,w),k(c.share,a,f,w)}else g(c.share,a,w,_.from)};for(let e of le){let t=N[e];if(Q(e)&&(t.treeShaking?await ue(e,t):t.shareConfig?.import===!1&&await de(e,t)),Q(e))break;await Z([e])}return o(H),H}async function O(e){let t=await E();if(!(e in t))throw Error(`[Module Federation] Module ${e} does not exist in container.`);return c.pendingShareLoads&&await Promise.all(c.pendingShareLoads),t[e]().then(e=>()=>e)}export{O as get,D as init};
1
+ import{t as e}from"./assets/vite-preload-helper-HclGiUj8.js";import{r as t,t as n}from"./assets/dist-BxwXn66h.js";({...t.global});var r=t.share;t.utils,typeof __VUE_HMR_RUNTIME__>`u`&&(globalThis.__VUE_HMR_RUNTIME__={createRecord(){},rerender(){},reload(){}});var i=`__mf_init__virtual:mf:__mfe_internal__signalk_questdb__mf_owner__1__mf_v__runtimeInit__mf_v__.js__`,a=globalThis[i];if(!a){let e,t,n=new Promise((n,r)=>{e=n,t=r});a=globalThis[i]={initPromise:n,initResolve:e,initReject:t}}var o=a.initResolve,s=`__mf_module_cache__`;globalThis[s]||={share:{},remote:{}},globalThis[s].share||={},globalThis[s].remote||={};var c=globalThis[s];for(let e of Object.keys(c.share))if(e.startsWith(`default:`)){let t=e.slice(8);c.share[t]===void 0&&(c.share[t]=c.share[e])}else if(!e.includes(`:`)){let t=`default:`+e;c.share[t]===void 0&&(c.share[t]=c.share[e])}var l={},u=Array.isArray(`default`)?`default`:[`default`],d=`default`,f=`signalk_questdb`,p,m;async function h(e){for(let t=0;;t++)try{return await e()}catch(e){throw e}}var g=Symbol(`mf.originalSharedProvider`),_={emit:e=>e},v=(e,t)=>{if(t!==`version-first`)return e;let n={};for(let[t,r]of Object.entries(e))n[t]=Object.assign({},r,{[g]:r});return n},y=(e,t)=>{if(!t)return;let n=Object.entries(e||{}),r=n.find(([,e])=>e===t);if(r)return{version:r[0],provider:t,registered:!0};if(typeof t.version==`string`&&t.version)return{version:t.version,provider:t,registered:!1};let i=n.filter(([,e])=>e===t||!!(t.from&&e?.from===t.from));if(i.length===1)return{version:i[0][0],provider:t,registered:!1}},b=(e,t,n,i)=>{if(!e||!n)return;let a=Array.isArray(n.scope)?n.scope:[n.scope||`default`],o=v(e,i),s={};for(let e of a)s[e||`default`]={[t]:o};let c=r.getRegisteredShare(s,t,{...n,scope:a,strategy:i},_)?.shared;return c?.[g]||c},x=(e,t,n,r)=>{let i=e=>S(e,n),a=Object.fromEntries(Object.entries(e||{}).filter(([,e])=>!i(e)));n?.version&&n.shareConfig?.import!==!1&&(a[n.version]||(a[n.version]=n));let o=b(a,t,n,r);return i(o)?void 0:o},S=(e,t)=>e===t||!!(t?.from&&e?.from===t.from),C=(e,t,n,r,i,a,o,s,c)=>{if(c!==`version-first`||!s)return;let l=t?.options?.shared?.[i],u=Array.isArray(l)?l.find(e=>e?.version===a):void 0,d=(s?.from===t?.options?.name?s:void 0)||(S(u,s)?u:t?void 0:s);if(d)return e.some(e=>e!==t&&e?.options?.name===o?.from&&e?.shareScopeMap?.[r]===n)?d:void 0},w=(e,t,n,r,i,a,o,s,c)=>{let l=a.registered?C(e,t,n,r,i,a.version,a.provider,s,c):void 0,u=l||o;if(u&&!(a.registered&&!S(u,s)))return{provider:u,scopeRootProvider:l}};async function T(){return p||=h(()=>e(()=>import(`./assets/_virtual_mf-localSharedImportMap___mfe_internal__signalk_questdb__mf_owner__1-CVM43rXb.js`),[],import.meta.url)).catch(e=>{throw p=void 0,e}),p}async function E(){return m||=h(()=>e(()=>import(`./assets/virtualExposes-BkvbtHi8.js`),[],import.meta.url)).then(e=>e.default??e).catch(e=>{throw m=void 0,e}),m}async function D(e={},t=[]){let r=(e,t,n,r)=>{let i=(Array.isArray(r)?r[0]:r)||`default`,a=t||!n?e:e+`@`+n,o={canonical:i+`:`+a};return i==="default"&&(o.aliases=[a]),o},i=(e,t)=>{let n=e[t.canonical];if(n!==void 0)return n;let r=t.aliases||[];for(let n of r){if(!Object.prototype.hasOwnProperty.call(e,n))continue;let r=e[n];if(r!==void 0)return e[t.canonical]=r,r}},a=Symbol.for(`module-federation.shared-cache-listeners`),s=Symbol.for(`module-federation.shared-cache-owners`),p=e=>{let t=e[s];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,s,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},m=(e,t)=>e[s]?.[t.canonical],g=(e,t,n,r)=>{e[t.canonical]=n;let i=t.aliases||[];for(let t of i)Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0});let o=e[s];r===void 0?o&&delete o[t.canonical]:p(e)[t.canonical]=r;let c=e[a]?.[t.canonical];if(c)for(let e of c)e(n);return n},_=Symbol.for(`module-federation.tree-shaking-shared-cache`),v=e=>{let t=e[_];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,_,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},C=(e,t,n,r)=>{if(!Array.isArray(n))return r;let i=[...new Set(n)].sort(),a=v(e),o=a[t.canonical]||=[],s=o.find(e=>e.providedExports.length===i.length&&e.providedExports.every((e,t)=>e===i[t]));return s?s.value=r:o.push({providedExports:i,value:r}),r},E=Symbol.for(`module-federation.tree-shaking-shared-selection-cache`),D=e=>{let t=e[E];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,E,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},O=(e,t,n)=>{let r=i(e,t);return r===void 0?e[E]?.[t.canonical]?.[n]:r},k=(e,t,n,r)=>{let i=D(e),a=i[t.canonical]||=Object.create(null);return a[n]=r,r},A=globalThis.__FEDERATION__?.__INSTANCES__||[],j=t.find(e=>e?.from)?.from,ee=A.find(t=>t?.options?.name===j&&t?.shareScopeMap?.default===e)||A.find(t=>t?.options?.name!==f&&t?.shareScopeMap?.default===e),M=Object.create(null);for(let[t,n]of Object.entries(e)){let e=M[t]=Object.create(null);for(let[t,r]of Object.entries(n))e[t]=Object.assign({},r)}let{usedShared:N,usedRemotes:P}=await T();var F=l[d];if(F||=l[d]={from:f},t.indexOf(F)>=0)return;t.push(F);let I=e=>{let t=e;for(let e=0;e<5;e++){let e=t?.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t},L=[],R=globalThis.window===void 0?await Promise.all([]):[],z=`__mf_vite_runtime_share_load_id__`,te=0,B=new Map,V=new Map,H=n({name:f,remotes:P,shared:N,plugins:[ne(),...L,...R],shareStrategy:`version-first`});H.initShareScopeMap(`default`,e);function ne(){return{name:`vite-share-pin-lifecycle-plugin`,resolveShare(e){let t=e.shareInfo?.[z],n=t===void 0?void 0:V.get(t);if(!n)return e;let r=e.resolver;return e.resolver=(...e)=>(n.pinned.reapply(),r(...e)),n.pinned.reveal(),e}}}let U=H.sharedHandler.hooks.lifecycle.resolveShare,W=new WeakMap;U.on(e=>{let t=e.shareInfo?.[z],n=e.resolver;return typeof n==`function`&&(e.resolver=(...e)=>{let r=n(...e),i=r?.shared;return i&&(typeof i==`object`||typeof i==`function`)&&!W.has(i)&&W.set(i,{from:i.from}),t!==void 0&&i&&B.set(t,i),r}),e});let re=(e,t,n,r)=>{if(!e||e[t]!==n)return;let i=Object.assign({},r,{version:r.version??t,scope:r.scope??n?.scope??[`default`],strategy:`loaded-first`}),a=r.from;e[t]=i;let o=()=>n===void 0?e[t]===void 0:e[t]===n;return{provider:i,reveal(){return e[t]===i&&(n===void 0?delete e[t]:e[t]=n,!0)},reapply(){return o()?(e[t]=i,!0):!1},release(s,c=!0){return r.from=a,e[t]===i?c?s?(i.from=a,s&&i.lib&&(i.loaded=!0),r.strategy===void 0?delete i.strategy:i.strategy=r.strategy,!0):(n===void 0?delete e[t]:e[t]=n,!1):(n===void 0?delete e[t]:e[t]=n,!0):!c&&o()}}},ie=e=>Object.entries(e||{}).map(([e,t])=>({provider:t,version:e,from:t.from,registered:!0})),ae=(e,t)=>{if(t===void 0)return;let n;for(let r of e){let e=r.provider,i=e.treeShaking||e;if(r.loadedFactory===t||e.lib===t||i.lib===t){if(n)return;n=r}}return n},oe=async(e,t,n)=>{let r=++te;V.set(r,{pinned:n});try{let n=await H.loadShare(e,{customShareInfo:{shareConfig:t,[z]:r}});return{factory:n===!1?void 0:n,selectedProvider:B.get(r)}}finally{B.delete(r),V.delete(r)}},G=async(e,t,n,r,i,a,o=!0)=>{let s=a.from,c=re(n,r,i,a);if(!c)return;let l;try{l=await oe(e,t,c)}catch(e){throw c.release(!1),e}let u=l?.factory;if(u===void 0){c.release(!1);return}let d=ie(n),f=c.provider.treeShaking||c.provider,p=c.provider.lib===u||f.lib===u;if(!o&&p){let e=d.findIndex(e=>e.provider===c.provider);e!==-1&&d.splice(e,1)}!o&&!d.some(e=>e.provider===a)&&d.push({provider:a,version:r,from:s,registered:!1,loadedFactory:p?u:void 0});let m=!o&&l.selectedProvider===c.provider&&p?a:l.selectedProvider;if(m&&!d.some(e=>e.provider===m)){let e=W.get(m),t=typeof m.version==`string`&&m.version?m.version:r;d.push({provider:m,version:t,from:e?e.from:m.from,registered:n?.[t]===m,loadedFactory:u})}let h=d.find(e=>e.provider===m)??ae(d,u);if(!c.release(!0,h?.provider===c.provider)||!h)return;let g=W.get(h.provider);h.from=h.provider===a?s:g?g.from:h.provider.from,g&&(h.provider.from=g.from);let _=typeof u==`function`?u():u,v=await Promise.resolve(_);if(!(h.registered&&n?.[h.version]!==h.provider))return{provider:h.provider,selection:h,resolved:v}},K=new Set,q=new Map,se=async(t,n,a)=>{let o=!!n.shareConfig?.singleton;if(!o&&n.canLiveRebind!==!1)try{let s=x(a,t,n,`version-first`),l=y(a,s);if(!l)return;let{version:u}=l;if(!o&&u!==n.version||!s.lib&&!s.loading&&!(s.loaded&&typeof s.get==`function`))return;let d=r(t,o,n.version,n.scope);if(i(c.share,d)!==void 0)return;let f=e[t],p=f?.[u];if(l.registered&&!S(p,s))return;let m,h=s.lib;if(!h&&s.loading&&(h=await s.loading),!h&&s.loaded&&typeof s.get==`function`&&(h=await s.get()),!h)return;let _=typeof h==`function`?h():h,v=await Promise.resolve(_),b=l.registered?p:s;m={provider:b,selection:{provider:b,version:u,from:s.from,registered:l.registered},resolved:v};let C=m?.provider,w=m?.selection;if(!w)return;let T=m?.resolved;if(T===void 0||i(c.share,d)!==void 0||w.registered&&f?.[w.version]!==C)return;g(c.share,d,I(T),w.from),K.add(C)}catch(e){console.error(`[Module Federation] Failed to bridge materialized shared module "`+t+`"`,e)}},J=async(t,n,a,o,s)=>{try{let l=r(t,n.shareConfig?.singleton,n.version,n.scope),u=i(c.share,l),d=m(c.share,l),p=x(a,t,n,`version-first`),h=p||b(a,t,n,`version-first`)||n,_=y(a,h);if(!_)return;let v=S(h,n),{version:C}=_;if(!n.shareConfig?.singleton&&C!==n.version)return;let T=o?.[C],E=w(A,ee,e,`default`,t,_,p,T,`version-first`);if(!E&&!v)return;let{provider:D,scopeRootProvider:O}=E||{provider:h,scopeRootProvider:void 0};if(n.canLiveRebind===!1||u!==void 0&&d!==f)return;let k=e[t],j=k?.[C];if(_.registered&&!O&&!S(j,D))return;let M=await G(t,n.shareConfig,k,C,j,D,_.registered&&!v),N=M?.provider,P=M?.selection;if(!P||S(N,n)||s&&(s.version!==P.version||!S({from:P.from},s.provider))||K.has(N))return;let F=M?.resolved;if(F===void 0)return;let L=i(c.share,l),R=m(c.share,l);if(L!==void 0&&R!==f||P.registered&&k?.[P.version]!==N)return;s||q.set(t,{version:P.version,provider:{from:P.from}}),K.add(N);let z=I(F);g(c.share,l,z,P.from)}catch(e){console.error(`[Module Federation] Failed to bridge external shared module "`+t+`"`,e)}};for(let[e,t]of Object.entries(N))t.treeShaking||await se(e,t,M[e]);for(let[e,t]of Object.entries(N)){if(t.treeShaking)continue;let n=r(e,t.shareConfig?.singleton,t.version,t.scope);if(i(c.share,n)!==void 0)continue;let a=r(e,!0,t.version,t.scope),o=i(c.share,a);o!==void 0&&g(c.share,n,o,m(c.share,a))}let Y=[`react`].filter(e=>N[e]!==void 0),X=e=>e.startsWith(`@`)?e.split(`/`).slice(0,2).join(`/`):e.split(`/`)[0];for(let e of Object.keys(N)){if(Y.includes(e))continue;let t=X(e),n=Y.indexOf(t);if(n===-1){Y.push(e);continue}let r=n;for(;r>0&&X(Y[r-1])===t&&Y[r-1]!==t;)r--;Y.splice(r,0,e)}var Z=async e=>{for(let t of e){let e=N[t],n=r(t,e.shareConfig?.singleton,e.version,e.scope);if(e.shareConfig?.import===!1||e.treeShaking||i(c.share,n)!==void 0)continue;let a=r(t,!0,e.version,e.scope),o=i(c.share,a);if(o!==void 0){g(c.share,n,o,m(c.share,a));continue}let s=await e.get(),l=typeof s==`function`?s():s,u=await Promise.resolve(l),d=(e=>{let t=e;for(let e=0;e<5;e++){let e=t?.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t})(u),p=d===u?{...u}:d;p.__esModule!==!0&&Object.defineProperty(p,"__esModule",{value:!0,enumerable:!1}),g(c.share,n,p,f)}};let Q=e=>{let t=N[e];if(!t.treeShaking&&t.shareConfig?.import!==!1)return!1;let n=r(e,t.shareConfig?.singleton,t.version,t.scope);return t.treeShaking?O(c.share,n,f)===void 0&&i(c.share,n)===void 0:i(c.share,n)===void 0},$=Y.findIndex(e=>{let t=N[e],n=r(e,t.shareConfig?.singleton,t.version,t.scope);return(t.treeShaking?O(c.share,n,f)??i(c.share,n):i(c.share,n))===void 0?t.treeShaking||t.shareConfig?.import===!1?!0:typeof x==`function`&&!!x(M[e],e,t,`version-first`):!1}),ce=$===-1?Y:Y.slice(0,$);var le=$===-1?[]:Y.slice($);await Z(ce);try{await h(async()=>{await Promise.all(await H.initializeSharing(`default`,{strategy:`version-first`,from:`build`,initScope:t}))})}catch(e){console.error(`[Module Federation]`,e)}for(let[t,n]of Object.entries(N))n.treeShaking||await J(t,n,e[t],M[t],void 0);try{let e=globalThis.__FEDERATION__?.__SHARE__,t=Object.create(null);if(e)for(let[,n]of Object.entries(e))for(let e of u){let r=n?.[e];if(r)for(let[e,n]of Object.entries(r)){let r=N?.[e],i=M[e],a=q.get(e);if(!r||!i||!a||r.treeShaking)continue;let o=t[e]||(t[e]=Object.create(null));for(let[e,t]of Object.entries(n)){if(!t.lib||a.version!==e||!S(t,a.provider))continue;let n=i[e];(t===n||n?.from&&t.from===n.from)&&(t===r||r.from&&t.from===r.from||o[e]===void 0&&(o[e]=t))}}}for(let[e,n]of Object.entries(t))await J(e,N[e],n,M[e],q.get(e))}catch(e){console.error(`[Module Federation] Failed to bridge external shared modules`,e)}let ue=async()=>{},de=async(t,n)=>{let a=r(t,n.shareConfig?.singleton,n.version,n.scope),o=n.treeShaking?O(c.share,a,f):i(c.share,a);if(n.shareConfig?.import!==!1||o!==void 0)return;let s=e=>{let t=e;for(let e=0;e<5;e++){let e=t?.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t},l=e?.[t],u=b(l,t,n,`version-first`)||n,d=y(l,u);if(!d)return;let{version:p}=d,m=l?.[p],h=await G(t,n.shareConfig,l,p,m,u,d.registered&&!S(u,n)),_=h?.selection,v=h?.provider,x=h?.resolved;if(!_||S(v,n)||x===void 0||(n.treeShaking?O(c.share,a,f):i(c.share,a))!==void 0||_.registered&&l?.[_.version]!==v)return;let w=s(x);if(n.treeShaking){let e=n.treeShaking.providedExports??n.treeShaking.usedExports??[];C(c.share,a,e,w),k(c.share,a,f,w)}else g(c.share,a,w,_.from)};for(let e of le){let t=N[e];if(Q(e)&&(t.treeShaking?await ue(e,t):t.shareConfig?.import===!1&&await de(e,t)),Q(e))break;await Z([e])}return o(H),H}async function O(e){let t=await E();if(!(e in t))throw Error(`[Module Federation] Module ${e} does not exist in container.`);return c.pendingShareLoads&&await Promise.all(c.pendingShareLoads),t[e]().then(e=>()=>e)}export{O as get,D as init};
@@ -1,10 +0,0 @@
1
- import{a as e,i as t,n,r,t as i}from"./_virtual_mf___mfe_internal__signalk_questdb__mf_owner__1__loadShare__react__loadShare__.js-DzhF4wXp.js";var a={root:{fontFamily:`-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`,color:`#333`,padding:`16px 0`},sectionTitle:{fontSize:13,fontWeight:600,color:`#888`,textTransform:`uppercase`,letterSpacing:`0.05em`,marginBottom:10,marginTop:24},btn:{display:`inline-flex`,alignItems:`center`,gap:8,padding:`8px 16px`,border:`none`,borderRadius:6,fontSize:13,fontWeight:600,cursor:`pointer`},btnPrimary:{background:`#3b82f6`,color:`#fff`},btnSave:{background:`#3b82f6`,color:`#fff`},btnDanger:{background:`#ef4444`,color:`#fff`,padding:`6px 12px`,fontSize:12},btnDisabled:{opacity:.5,cursor:`not-allowed`},status:{marginTop:8,fontSize:12,minHeight:18},warnBanner:{padding:`12px 16px`,background:`#fef2f2`,border:`1px solid #fecaca`,borderRadius:10,marginBottom:12,fontSize:13,color:`#991b1b`,lineHeight:1.5},warnBannerTitle:{fontWeight:700,marginBottom:4},infoBanner:{padding:`12px 16px`,background:`#fffbeb`,border:`1px solid #fde68a`,borderRadius:10,marginBottom:12,fontSize:13,color:`#92400e`,lineHeight:1.5},warnBannerCode:{display:`block`,marginTop:8,padding:`8px 10px`,background:`#fff`,border:`1px solid #fecaca`,borderRadius:6,fontFamily:`monospace`,fontSize:12,color:`#7f1d1d`,whiteSpace:`pre-wrap`,wordBreak:`break-word`},card:{display:`flex`,alignItems:`center`,gap:14,padding:`14px 18px`,background:`#f8f9fa`,border:`1px solid #e0e0e0`,borderRadius:10,marginBottom:12},cardIcon:{width:44,height:44,borderRadius:10,display:`flex`,alignItems:`center`,justifyContent:`center`,fontSize:20,fontWeight:700,flexShrink:0},cardInfo:{flex:1},cardTitle:{fontSize:15,fontWeight:600,color:`#333`},cardMeta:{fontSize:12,color:`#888`},stateIndicator:{width:10,height:10,borderRadius:`50%`,flexShrink:0},fieldRow:{display:`flex`,alignItems:`center`,gap:12,marginBottom:10},label:{fontSize:13,fontWeight:500,color:`#555`,width:180,flexShrink:0},select:{padding:`6px 10px`,borderRadius:6,border:`1px solid #ccc`,fontSize:13,background:`#fff`,color:`#333`,minWidth:200},input:{padding:`6px 10px`,borderRadius:6,border:`1px solid #ccc`,fontSize:13,background:`#fff`,color:`#333`,width:200},inputSmall:{padding:`6px 10px`,borderRadius:6,border:`1px solid #ccc`,fontSize:13,background:`#fff`,color:`#333`,width:80},checkbox:{width:16,height:16,accentColor:`#3b82f6`},hint:{fontSize:11,color:`#aaa`,marginLeft:8},textarea:{padding:`6px 10px`,borderRadius:6,border:`1px solid #ccc`,fontSize:13,fontFamily:`monospace`,background:`#fff`,color:`#333`,width:`100%`,minHeight:70,boxSizing:`border-box`,resize:`vertical`},empty:{textAlign:`center`,padding:`30px 16px`,color:`#999`,fontSize:13},tag:{display:`inline-block`,padding:`2px 8px`,borderRadius:4,fontSize:10,fontWeight:600,marginLeft:8},tagPre:{background:`#fef3c7`,color:`#92400e`},tagLatest:{background:`#dcfce7`,color:`#166534`},migrationItem:{display:`flex`,alignItems:`center`,gap:12,padding:`12px 16px`,background:`#f8f9fa`,border:`1px solid #e0e0e0`,borderRadius:10,marginBottom:8},migrationActions:{display:`flex`,gap:8,alignItems:`center`},statsGrid:{display:`grid`,gridTemplateColumns:`repeat(auto-fit, minmax(140px, 1fr))`,gap:10,marginBottom:12},statCard:{padding:`12px 16px`,background:`#f8f9fa`,border:`1px solid #e0e0e0`,borderRadius:10,textAlign:`center`},statValue:{fontSize:22,fontWeight:700,color:`#333`},statLabel:{fontSize:11,color:`#888`,marginTop:2}},o=e=>typeof e==`object`&&!!e;function ee(e){return Array.isArray(e)?e.filter(e=>o(e)&&typeof e.tag==`string`&&typeof e.prerelease==`boolean`):[]}function te(e){let t=o(e)?e.sources:void 0;return Array.isArray(t)?t.filter(e=>o(e)&&typeof e.type==`string`&&typeof e.url==`string`&&typeof e.status==`string`&&(e.version===void 0||typeof e.version==`string`)):[]}function s(e){return e instanceof Error?e.message:String(e)}function c(e,t){return e??t}var ne=[`none`,`lz4`,`zstd`];function re(e){return ne.includes(e)?e:`lz4`}function l({title:t,children:n}){let[r,o]=e(!1);return i.createElement(`div`,null,i.createElement(`button`,{type:`button`,"aria-expanded":r,style:{...a.sectionTitle,cursor:`pointer`,userSelect:`none`,display:`flex`,alignItems:`center`,gap:6,width:`100%`,textAlign:`left`,background:`none`,border:`none`,padding:0},onClick:()=>o(!r)},i.createElement(`span`,{style:{fontSize:10,transition:`transform 0.15s`,transform:r?`rotate(90deg)`:`rotate(0deg)`}},`▶`),t),r&&i.createElement(`div`,{style:{marginBottom:16}},n))}function u(e){return e==null?`—`:e>=1e6?(e/1e6).toFixed(1)+`M`:e>=1e3?(e/1e3).toFixed(1)+`K`:String(e)}function d({configuration:o,save:ne}){let d=o||{},[f,ie]=e(d.questdbHost||`127.0.0.1`),[p,ae]=e(d.questdbIlpPort||9009),[m,oe]=e(d.questdbHttpPort||9e3),[se,ce]=e(d.questdbPgPort||8812),[le,h]=e(d.questdbVersion||`latest`),[g,ue]=e(d.managedContainer!==!1),[de,fe]=e(d.recordSelf!==!1),[pe,me]=e(d.recordOthers!==!1),[_,he]=e(d.restoreOnStart===!0),[ge,_e]=e(d.enableConsole!==!1),[ve,ye]=e((d.restoreMaxAgeMinutes??0)>0?d.restoreMaxAgeMinutes:9),[be,xe]=e(d.defaultSamplingRate??2e3),[v,Se]=e(String(d.ilpFlushIntervalMs??5e3)),[Ce,we]=e(d.retentionDays||0),[y,Te]=e(d.pathFilter?.mode===`include`?`include`:`exclude`),[Ee,De]=e((Array.isArray(d.pathFilter?.paths)?d.pathFilter.paths:[]).join(`
2
- `)),[b,Oe]=e(d.compression||`lz4`),[ke,Ae]=e(d.compressionLevel||3),[x,je]=e(d.networkName||`sk-network`),[S,Me]=e(d.exposeToContainers||!1),[C,Ne]=e([]),[Pe,Fe]=e(!1),[w,Ie]=e(null),[Le,Re]=e(!0),[T,ze]=e(null),[E,Be]=e(!1),[D,Ve]=e(``),[He,O]=e(``),[Ue,k]=e(!1),[A,We]=e(null),[j,Ge]=e(!1),[M,Ke]=e(!1),[N,qe]=e(!1),[P,Je]=e(!1),[Ye,F]=e(``),[I,Xe]=e(null),[L,R]=e(!1),z=t(0),[B,Ze]=e(!1),V=n(async()=>{Fe(!0);try{let e=await fetch(`/plugins/signalk-questdb/api/versions`);e.ok&&Ne(ee(await e.json().catch(()=>null)))}catch{}Fe(!1)},[]),H=n(async()=>{try{let e=await(await fetch(`/plugins/signalk-questdb/api/status`)).json().catch(()=>null);Ie(e&&typeof e==`object`?e:{status:`not_running`})}catch{Ie({status:`not_running`})}Re(!1)},[]),U=n(async e=>{let t=++z.current;try{let n=await fetch(`/plugins/signalk-questdb/api/wal-diagnosis`,{signal:e});if(t!==z.current)return;if(n.ok){let e=await n.json();if(t!==z.current)return;Xe(e),R(!1)}else R(!0)}catch{t===z.current&&R(!0)}},[]),Qe=!!(w&&w.status===`running`&&(w.suspendedTables||[]).length>0);r(()=>{if(!Qe){Xe(null),R(!1);return}let e=!1,t=null,n=new AbortController,r=async()=>{await U(n.signal),e||(t=setTimeout(r,15e3))};return r(),()=>{e=!0,n.abort(),t&&clearTimeout(t)}},[Qe,U]);let $e=async(e,t)=>{let n=t.tailSkip?`
3
-
4
- WARNING: this is the newest pending segment — skipping it drops the ENTIRE pending backlog.`:``;if(window.confirm(`Skip the unreadable WAL segment on ${e}?\n\nThis permanently loses ${u(t.skippedTxns)} transaction(s) recorded between ${t.skipWindowStart} and ${t.skipWindowEnd}. Everything after the skipped segment is replayed without loss.`+n)){Ze(!0),F(``);try{let n=await fetch(`/plugins/signalk-questdb/api/resume-wal/skip`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({table:e,confirmPlan:t})}),r=await n.json().catch(()=>({error:n.statusText}));n.ok?F(r.message??``):F(`Skip failed: ${c(r.error,`unknown error`)}`),H(),U()}catch(e){F(`Skip failed: ${s(e)}`)}Ze(!1)}},et=async()=>{Ge(!0);try{let e=await fetch(`/plugins/signalk-questdb/api/update/check`);e.ok&&We(await e.json())}catch{}Ge(!1)},tt=async()=>{Ke(!0),O(`Pulling new image and restarting...`),k(!1);try{let e=await fetch(`/plugins/signalk-questdb/api/update/apply`,{method:`POST`});if(e.ok){let t=await e.json();O(t.message??``),We(null),t.newVersion&&h(t.newVersion),H()}else{let t=await e.json().catch(()=>({error:e.statusText}));O(`Update failed: ${c(t.error,`unknown error`)}`),k(!0)}}catch(e){O(`Update failed: ${s(e)}`),k(!0)}Ke(!1)},nt=async()=>{if(window.confirm(`Remove the QuestDB container and DELETE ALL recorded data? This cannot be undone.`)){qe(!0),O(`Removing QuestDB container and data...`),k(!1);try{let e=await fetch(`/plugins/signalk-questdb/api/purge-data`,{method:`POST`}),t=await e.json().catch(()=>({error:e.statusText}));e.ok?(O(t.message??``),H()):(O(`Remove failed: ${c(t.error,`unknown error`)}`),k(!0))}catch(e){O(`Remove failed: ${s(e)}`),k(!0)}qe(!1)}},rt=async()=>{Je(!0),F(``);try{let e=await fetch(`/plugins/signalk-questdb/api/resume-wal`,{method:`POST`}),t=await e.json().catch(()=>({error:e.statusText}));if(e.ok){let e=(t.results||[]).filter(e=>!e.ok);F(e.length===0?`${c(t.message,`Resume requested`)}. Recording resumes as the backlog drains — the banner clears once tables catch up.`:`${c(t.message,`Resume requested`)}. `+e.map(e=>`${e.table}: ${e.error}`).join(` · `)),H(),U()}else F(`Resume failed: ${c(t.error,`unknown error`)}`)}catch(e){F(`Resume failed: ${s(e)}`)}Je(!1)},it=async()=>{Be(!0),O(``);try{let e=D?`?url=${encodeURIComponent(D)}`:``,t=await fetch(`/plugins/signalk-questdb/api/migration/detect${e}`);if(t.ok){let e=te(await t.json().catch(()=>null));ze(e),e.length===0&&(O(D?`No InfluxDB found at ${D}.`:`No InfluxDB instances detected on localhost:8086.`),k(!1))}}catch(e){O(`Detection failed: `+s(e)),k(!0)}Be(!1)};r(()=>{V(),H();let e=setInterval(H,5e3);return()=>clearInterval(e)},[V,H]);let[W,at]=e(``),[G,ot]=e(``),[K,st]=e(`parquet`),[q,J]=e(!1),ct=()=>{let e=Number(v);if(v===``||!Number.isFinite(e)||e<500||e>3e5){O(`Write batch interval must be 500–300000 ms.`),k(!0);return}ne({...d,questdbHost:f,questdbIlpPort:p,questdbHttpPort:m,questdbPgPort:se,questdbVersion:le,managedContainer:g,defaultSamplingRate:be,ilpFlushIntervalMs:e,recordSelf:de,recordOthers:pe,restoreOnStart:_,enableConsole:ge,restoreMaxAgeMinutes:ve,retentionDays:Ce,compression:b,compressionLevel:ke,networkName:x,exposeToContainers:S,pathFilter:{mode:y,paths:Ee.split(`
5
- `).map(e=>e.trim()).filter(Boolean)},samplingRates:d.samplingRates||{}}),O(`Saved! Plugin will restart with new configuration.`),k(!1)},lt=async()=>{if(!W||!G){O(`Set both from and to dates for export.`),k(!0);return}J(!0),O(`Exporting ${K.toUpperCase()}...`),k(!1);try{let e=`/plugins/signalk-questdb/api/export?from=${encodeURIComponent(W)}&to=${encodeURIComponent(G)}&format=${K}`,t=await fetch(e);if(!t.ok){let e=await t.json().catch(()=>({error:t.statusText}));O(`Export failed: ${c(e.error,`unknown error`)}`),k(!0),J(!1);return}let n=await t.blob(),r=K===`parquet`?`parquet`:`csv`,i=document.createElement(`a`);i.href=URL.createObjectURL(n),i.download=`signalk-export-${W.slice(0,10)}.${r}`,i.click(),URL.revokeObjectURL(i.href),O(`Exported ${(n.size/1024/1024).toFixed(1)} MB`)}catch(e){O(`Export failed: ${s(e)}`),k(!0)}J(!1)},Y=w&&w.status===`running`,X=Y&&w.suspendedTables||[],Z=X.length>0,ut=Y&&w.schemaMismatch||!1,Q=Y&&w.ulimitClamp||null,$=w?.hostMaxMapCount?.tooLow&&w.hostMaxMapCount||null,dt=C.filter(e=>!e.prerelease).slice(0,3),ft=C.filter(e=>e.prerelease).slice(0,2);return i.createElement(`div`,{style:a.root},i.createElement(`div`,{style:a.sectionTitle},`QuestDB Status`),$&&i.createElement(`div`,{style:a.infoBanner},i.createElement(`div`,{style:a.warnBannerTitle},`Host vm.max_map_count is low — `,u($.current),` `,`(QuestDB recommends `,u($.recommended),`)`),`QuestDB memory-maps every partition and WAL segment it touches. As the database grows, this kernel limit can run out — mmap then fails with out-of-memory errors even though RAM is free, which shows up as slow or failing history queries, can suspend recording, and can take QuestDB down entirely. Run this in a shell on the host machine — not inside the QuestDB container, which can neither change the kernel-global limit nor has sudo (takes effect immediately, no restart needed):`,i.createElement(`code`,{style:a.warnBannerCode},`echo 'vm.max_map_count=${$.recommended}' | sudo tee /etc/sysctl.d/99-questdb.conf && sudo sysctl --system`)),Le?i.createElement(`div`,{style:a.empty},`Checking QuestDB...`):Y?i.createElement(i.Fragment,null,Z&&i.createElement(`div`,{style:a.warnBanner},i.createElement(`div`,{style:a.warnBannerTitle},`QuestDB WAL suspended — recording stalled`),`Rows are arriving but no longer commit, so the counts below have stopped advancing. This follows an error while QuestDB applied the write-ahead log — see the reason reported per table below. Resuming replays every pending transaction, so no data is lost.`,i.createElement(`code`,{style:a.warnBannerCode},X.map(e=>{let t=String(e.errorMessage||e.errorTag||`reason not reported`).replace(/[\r\n]+/g,` `),n=(I?.tables||[]).find(t=>t.name===e.name),r=n?.suspendedSince?` — frozen since ${n.suspendedSince}`:``;return`${e.name}: ${u(e.txnLag)} txns behind — ${t}${r}`}).join(`
6
- `)),(I?.tables||[]).filter(e=>e.applyError).map(e=>i.createElement(`div`,{key:e.name,style:{marginTop:8,fontSize:12}},`QuestDB's own log reports the apply failure on`,` `,i.createElement(`code`,null,e.name),` as:`,i.createElement(`code`,{style:a.warnBannerCode},e.applyError))),i.createElement(`div`,{style:{marginTop:10}},i.createElement(`button`,{style:{...a.btn,...a.btnPrimary,...P||B?a.btnDisabled:{}},disabled:P||B,onClick:rt},P?`Resuming...`:`Resume recording`)),X.filter(e=>e.autoResume===`failed`).map(e=>{let t=(I?.tables||[]).find(t=>t.name===e.name);if(t?.partitionOpenFailure)return i.createElement(`div`,{key:e.name,style:{marginTop:12}},i.createElement(`div`,{style:a.warnBannerTitle},e.name,`: table data damaged — automatic repair not possible`),`QuestDB fails while opening this table's stored data, before it reaches any pending transaction. That means the commit record on disk describes rows whose data never made it to storage — the signature of a power loss during a write. Skipping transactions cannot fix this (the failure happens before them) and would discard the `,u(e.txnLag),` pending transactions for nothing, so no repair button is offered. Recovering this table means repairing its commit record by hand; please open an issue with the error above. Recording continues into the other tables, and “Resume recording” will re-suspend this one within milliseconds — it is safe to press, but it cannot repair this damage.`);let n=t?.skipPlan;return n?i.createElement(`div`,{key:e.name,style:{marginTop:12}},i.createElement(`div`,{style:a.warnBannerTitle},e.name,`: automatic resume failed — WAL segment unreadable`),`A lossless resume was attempted and the table re-suspended at the same transaction: the write-ahead-log segment at the stall point cannot be read back (typically corrupted by an unclean shutdown mid-write). Replaying can never get past it. The only repair is to skip the unreadable segment, losing`,` `,i.createElement(`b`,null,u(n.skippedTxns),` transaction(s)`),` `,`recorded between `,i.createElement(`b`,null,n.skipWindowStart),` and`,` `,i.createElement(`b`,null,n.skipWindowEnd),n.tailSkip?` — and this is the newest pending segment, so skipping it drops the ENTIRE pending backlog`:` — everything after the skipped segment (${u(Math.max(0,e.txnLag-n.skippedTxns))} txns) is replayed without loss`,`.`,i.createElement(`div`,{style:{marginTop:8}},i.createElement(`button`,{style:{...a.btn,...a.btnDanger,...B||P||L?a.btnDisabled:{}},disabled:B||P||L,onClick:()=>$e(e.name,n)},B?`Skipping...`:`Skip unreadable segment (loses data)`),L&&i.createElement(`div`,{style:{marginTop:6,fontSize:12}},`The diagnosis could not be refreshed — the numbers above may be stale. The skip re-enables once a refresh succeeds.`))):null}),i.createElement(`div`,{style:{marginTop:8,fontSize:12}},`Manual fallback in the QuestDB SQL console (`,i.createElement(`code`,null,`:9000`),`), one statement at a time — avoid running it from several tabs, the console retries a busy statement forever:`,i.createElement(`code`,{style:a.warnBannerCode},X.map(e=>{let t=`"${String(e.name).replace(/"/g,`""`)}"`,n=(I?.tables||[]).find(t=>t.name===e.name),r=[`ALTER TABLE ${t} RESUME WAL;`];return e.autoResume===`failed`&&n?.skipPlan&&!L&&r.push(`-- if the resume re-suspends: skip the unreadable segment (loses ${u(n.skipPlan.skippedTxns)} txns)`,`ALTER TABLE ${t} RESUME WAL FROM TXN ${n.skipPlan.skipToTxn};`),r.join(`
7
- `)}).join(`
8
- `)))),Ye&&i.createElement(`div`,{style:a.infoBanner},Ye),ut&&i.createElement(`div`,{style:a.warnBanner},i.createElement(`div`,{style:a.warnBannerTitle},`QuestDB table schema mismatch — data not readable`),`A QuestDB table was re-created by ILP ingestion with the wrong timestamp column, so rows are being stored but reads filtering on time (history, Grafana, and the counts above) return nothing. The plugin rebuilds the affected table with the correct schema automatically within a minute; if this persists, restart the plugin. (The few rows written into the wrong-schema table are lost — they were unreadable anyway.)`),Q&&i.createElement(`div`,{style:a.infoBanner},i.createElement(`div`,{style:a.warnBannerTitle},`QuestDB open-files limit capped by the host`),`QuestDB requested a `,i.createElement(`code`,null,Q.ulimit),` limit of`,` `,u(Q.requested),`, but this host only allows`,` `,u(Q.granted),`, so it was capped. QuestDB is running on the lower limit. To grant the full value, raise the host limit for the user running the container runtime — under rootless Podman that means a systemd `,i.createElement(`code`,null,`user@.service`),` `,i.createElement(`code`,null,`LimitNOFILE`),` drop-in (editing`,` `,i.createElement(`code`,null,`/etc/security/limits.conf`),` alone is usually not enough) — then restart the Signal K server so the plugin can re-create the QuestDB container with the raised limit (signalk-container 1.25.3+; on older versions remove the container once with `,i.createElement(`code`,null,`podman rm -f sk-signalk-questdb`),` instead). This warning clears itself once the container is running with the full value.`,` `,i.createElement(`a`,{href:`https://github.com/dirkwa/signalk-container#raising-the-open-files-limit-nofile`,target:`_blank`,rel:`noreferrer`,style:{color:`#92400e`,textDecoration:`underline`}},`Step-by-step instructions`),`.`),i.createElement(`div`,{style:a.card},i.createElement(`div`,{style:{...a.cardIcon,background:`#7c3aed`,color:`#fff`}},`Q`),i.createElement(`div`,{style:a.cardInfo},i.createElement(`div`,{style:a.cardTitle},`QuestDB`),i.createElement(`div`,{style:a.cardMeta},w?.endpoint||`${f}:${m}`,` `,`· `,Z?`WAL suspended`:`Recording`)),i.createElement(`div`,{style:{...a.stateIndicator,background:Z?`#ef4444`:`#10b981`},title:Z?`WAL suspended`:`Running`})),i.createElement(`div`,{style:a.statsGrid},i.createElement(`div`,{style:a.statCard},i.createElement(`div`,{style:a.statValue},u(w.totalRows)),i.createElement(`div`,{style:a.statLabel},`Total Rows`)),i.createElement(`div`,{style:a.statCard},i.createElement(`div`,{style:a.statValue},u(w.activePathsToday)),i.createElement(`div`,{style:a.statLabel},`Active Paths Today`)),w.restore&&i.createElement(`div`,{style:a.statCard},i.createElement(`div`,{style:a.statValue},w.restore.failed?`—`:u(w.restore.contexts)),i.createElement(`div`,{style:a.statLabel},w.restore.failed?`Restore failed`:`Vessels Restored`))),i.createElement(`div`,{style:{display:`flex`,alignItems:`center`,gap:10,marginBottom:12}},A&&A.updateAvailable?i.createElement(i.Fragment,null,i.createElement(`span`,{style:{fontSize:13}},`v`,A.currentVersion,` →`,` `,i.createElement(`strong`,null,`v`,A.latestVersion),` available`),i.createElement(`button`,{style:{...a.btn,...a.btnPrimary,padding:`4px 12px`,fontSize:12,...M?a.btnDisabled:{}},onClick:tt,disabled:M},M?`Updating...`:`Update QuestDB`)):A&&!A.updateAvailable?i.createElement(`span`,{style:{fontSize:12,color:`#888`}},`v`,A.currentVersion,` (up to date)`):i.createElement(`button`,{style:{...a.btn,padding:`4px 12px`,fontSize:12,background:`#f1f5f9`,color:`#475569`,border:`1px solid #e2e8f0`,...j?a.btnDisabled:{}},onClick:et,disabled:j},j?`Checking...`:`Check for updates`))):i.createElement(`div`,{style:a.card},i.createElement(`div`,{style:{...a.cardIcon,background:`#fef2f2`,color:`#ef4444`}},`Q`),i.createElement(`div`,{style:a.cardInfo},i.createElement(`div`,{style:a.cardTitle},`QuestDB`),i.createElement(`div`,{style:a.cardMeta},w?.status===`unhealthy`?`Not responding`:`Not running`,g?` — enable plugin to start container`:``)),i.createElement(`div`,{style:{...a.stateIndicator,background:`#ef4444`}})),i.createElement(`div`,{style:a.sectionTitle},`Image Version`),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`QuestDB version`),i.createElement(`select`,{style:a.select,value:le,onChange:e=>h(e.target.value)},i.createElement(`option`,{value:`latest`},`latest (recommended)`),ft.map(e=>i.createElement(`option`,{key:e.tag,value:e.tag},e.tag,` (pre-release)`)),dt.map((e,t)=>i.createElement(`option`,{key:e.tag,value:e.tag},e.tag,t===0?` (current stable)`:``))),Pe&&i.createElement(`span`,{style:a.hint},`loading releases...`),i.createElement(`button`,{style:{...a.btn,...a.btnPrimary,padding:`4px 10px`,fontSize:11},onClick:V},`↻`)),i.createElement(`div`,{style:a.sectionTitle},`Connection`),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Managed container`),i.createElement(`input`,{type:`checkbox`,style:a.checkbox,checked:g,onChange:e=>ue(e.target.checked)}),i.createElement(`span`,{style:a.hint},g?`signalk-container manages QuestDB`:`Connect to external QuestDB`)),!g&&i.createElement(i.Fragment,null,i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`QuestDB host`),i.createElement(`input`,{style:a.input,value:f,onChange:e=>ie(e.target.value)})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`HTTP port (queries)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:m,onChange:e=>oe(Number(e.target.value))})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`ILP port (writes)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:p,onChange:e=>ae(Number(e.target.value))}))),g&&i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Bind to 0.0.0.0`),i.createElement(`input`,{type:`checkbox`,style:a.checkbox,checked:S,onChange:e=>Me(e.target.checked)}),i.createElement(`span`,{style:{...a.hint,color:S?`#ef4444`:void 0}},S?`Caution! This exposes your data to the network`:`Signal K reaches QuestDB automatically — only enable to reach it from another machine or a separate-Docker Grafana`)),g&&S&&i.createElement(i.Fragment,null,i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`HTTP port (queries)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:m,onChange:e=>oe(Number(e.target.value))})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`ILP port (writes)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:p,onChange:e=>ae(Number(e.target.value))})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`PostgreSQL wire port`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:se,onChange:e=>ce(Number(e.target.value))}),i.createElement(`span`,{style:a.hint},`for Grafana`)),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Container network`),i.createElement(`input`,{style:a.input,value:x,onChange:e=>je(e.target.value)}),i.createElement(`span`,{style:a.hint},`shared with signalk-grafana`))),i.createElement(`div`,{style:a.sectionTitle},`Recording`),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Default sampling rate (ms)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:be,onChange:e=>xe(Number(e.target.value))}),i.createElement(`span`,{style:a.hint},`1000 = max 1 write/sec per path (0 = every update)`)),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Write batch interval (ms)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,min:500,max:3e5,"aria-label":`Write batch interval in milliseconds`,value:v,onChange:e=>Se(e.target.value)}),i.createElement(`span`,{style:a.hint},`one QuestDB transaction per table per interval; longer = bigger batches, but up to this many ms lost on a hard crash (default 5000)`)),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Record own vessel`),i.createElement(`input`,{type:`checkbox`,style:a.checkbox,checked:de,onChange:e=>fe(e.target.checked)})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Record AIS targets`),i.createElement(`input`,{type:`checkbox`,style:a.checkbox,checked:pe,onChange:e=>me(e.target.checked)})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Restore vessels on startup`),i.createElement(`input`,{type:`checkbox`,style:a.checkbox,"aria-label":`Restore vessels on startup`,checked:_,onChange:e=>he(e.target.checked)}),i.createElement(`span`,{style:a.hint},`replay each vessel's last recorded position after a restart, so AIS targets appear at once instead of only when they next transmit`)),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`QuestDB console webapp`),i.createElement(`input`,{type:`checkbox`,style:a.checkbox,"aria-label":`QuestDB console webapp`,checked:ge,onChange:e=>_e(e.target.checked)}),i.createElement(`span`,{style:a.hint},`serve QuestDB's own console inside the Signal K admin UI (admin only). It is a full SQL client — unlike the read-only query endpoint it can modify and delete recorded data`)),_&&i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Restore max age (minutes)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,min:1,"aria-label":`Restore max age (minutes)`,value:ve,onChange:e=>{let t=Number(e.target.value);Number.isFinite(t)&&t>=1&&ye(t)}}),i.createElement(`span`,{style:a.hint},`only replay values this recent (default 9, matching Freeboard's AIS expiry); higher puts staler positions on the chart`)),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Retention (days)`),i.createElement(`input`,{style:a.inputSmall,type:`number`,value:Ce,onChange:e=>we(Number(e.target.value))}),i.createElement(`span`,{style:a.hint},`0 = keep forever`)),i.createElement(l,{title:`Path filtering`},i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Filter mode`),i.createElement(`select`,{style:a.select,value:y,onChange:e=>Te(e.target.value===`include`?`include`:`exclude`)},i.createElement(`option`,{value:`exclude`},`Exclude matching paths`),i.createElement(`option`,{value:`include`},`Include only matching paths`))),i.createElement(`div`,{style:{marginBottom:10}},i.createElement(`div`,{style:{...a.label,width:`auto`,marginBottom:6}},`Path patterns (one per line, glob supported)`),i.createElement(`textarea`,{style:a.textarea,value:Ee,onChange:e=>De(e.target.value),placeholder:`navigation.position
9
- navigation.*
10
- notifications.*`}),i.createElement(`div`,{style:a.hint},y===`exclude`?`These paths are NOT recorded; everything else is.`:`ONLY these paths are recorded; everything else is dropped.`,` `,`Leave empty to record everything.`))),i.createElement(l,{title:`Compression (on-disk)`},i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Compression codec`),i.createElement(`select`,{style:a.select,value:b,onChange:e=>Oe(re(e.target.value))},i.createElement(`option`,{value:`none`},`None`),i.createElement(`option`,{value:`lz4`},`LZ4 (fast)`),i.createElement(`option`,{value:`zstd`},`ZSTD (smaller)`)),i.createElement(`span`,{style:a.hint},`applies to new data after save`)),b===`zstd`&&i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`ZSTD level`),i.createElement(`input`,{style:a.inputSmall,type:`number`,min:`1`,max:`22`,value:ke,onChange:e=>Ae(Number(e.target.value))}),i.createElement(`span`,{style:a.hint},`1 (fast) to 22 (smallest)`))),i.createElement(l,{title:`InfluxDB Migration`},i.createElement(`div`,{style:{display:`flex`,gap:10,alignItems:`center`,marginBottom:10}},i.createElement(`button`,{style:{...a.btn,...a.btnPrimary,...E?a.btnDisabled:{}},onClick:it,disabled:E},E?`Detecting...`:`Detect InfluxDB`),i.createElement(`span`,{style:a.hint},`Checks localhost:8086 for InfluxDB 1.x and 2.x`)),T&&T.length>0&&i.createElement(`div`,null,T.map((e,t)=>i.createElement(`div`,{key:t,style:a.migrationItem},i.createElement(`div`,{style:{...a.cardIcon,width:36,height:36,fontSize:16,background:e.type===`influxdb2`?`#020a47`:`#22adf6`,color:`#fff`}},e.type===`influxdb2`?`2`:`1`),i.createElement(`div`,{style:a.cardInfo},i.createElement(`div`,{style:a.cardTitle},`InfluxDB `,e.type===`influxdb2`?`2.x`:`1.x`,i.createElement(`span`,{style:{...a.tag,...a.tagLatest}},e.status)),i.createElement(`div`,{style:a.cardMeta},e.url,` · v`,e.version))))),i.createElement(`div`,{style:{...a.fieldRow,marginTop:10}},i.createElement(`span`,{style:a.label},`Manual InfluxDB URL`),i.createElement(`input`,{style:a.input,placeholder:`http://192.168.1.100:8086`,value:D,onChange:e=>Ve(e.target.value)}),i.createElement(`span`,{style:a.hint},`for remote instances`)),T&&T.length===0&&!E&&i.createElement(`div`,{style:{...a.empty,padding:`16px`,textAlign:`left`}},`No InfluxDB found on localhost. Use manual URL above for remote instances.`)),i.createElement(l,{title:`Data Export`},i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`From`),i.createElement(`input`,{style:a.input,type:`datetime-local`,value:W,onChange:e=>at(e.target.value)})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`To`),i.createElement(`input`,{style:a.input,type:`datetime-local`,value:G,onChange:e=>ot(e.target.value)})),i.createElement(`div`,{style:a.fieldRow},i.createElement(`span`,{style:a.label},`Format`),i.createElement(`select`,{style:a.select,value:K,onChange:e=>st(e.target.value)},i.createElement(`option`,{value:`parquet`},`Parquet`),i.createElement(`option`,{value:`csv`},`CSV`))),i.createElement(`button`,{style:{...a.btn,...a.btnPrimary,...q?a.btnDisabled:{}},onClick:lt,disabled:q},q?`Exporting...`:`Export Data`)),d.managedContainer!==!1&&i.createElement(l,{title:`Danger zone`},i.createElement(`div`,{style:{fontSize:13,color:`#555`,marginBottom:10}},`Remove the QuestDB container and permanently delete all recorded data. Use this to fully reset QuestDB — Signal K's plugin-uninstall cannot delete this data on rootless Podman. This cannot be undone.`),i.createElement(`button`,{style:{...a.btn,...a.btnDanger,...N?a.btnDisabled:{}},onClick:nt,disabled:N},N?`Removing...`:`Remove container & all data`)),He&&i.createElement(`div`,{style:{...a.status,color:Ue?`#ef4444`:`#10b981`,marginTop:16}},He),i.createElement(`div`,{style:{marginTop:24}},i.createElement(`button`,{style:{...a.btn,...a.btnSave},onClick:ct},`Save Configuration`)))}export{d as default};