signalk-questdb 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -33,9 +33,11 @@ The plugin embeds a React config panel in the Signal K Admin UI showing:
33
33
  - **Image Version** -- dropdown with latest, pre-releases, and last 3 stable releases
34
34
  - **Connection** -- managed container toggle, host/ports, PostgreSQL port for Grafana
35
35
  - **Recording** -- record self, record AIS targets, retention days
36
+ - **Path filtering** (collapsible) -- exclude or include-only paths with glob patterns (e.g. exclude `navigation.position`)
36
37
  - **Compression** (collapsible) -- LZ4/ZSTD codec selection for on-disk storage
37
38
  - **InfluxDB Migration** (collapsible) -- auto-detect with manual URL for remote instances
38
39
  - **Data Export** (collapsible) -- date range picker, Parquet/CSV format, download button
40
+ - **Danger zone** (collapsible) -- "Remove container & all data" to fully reset QuestDB (deletes data Signal K's plugin-uninstall can't, on rootless Podman)
39
41
 
40
42
  ## QuestDB Schema
41
43
 
@@ -86,6 +88,7 @@ All mounted at `/plugins/signalk-questdb/api/`:
86
88
  | GET | `/versions` | QuestDB releases from GitHub (for version picker) |
87
89
  | GET | `/update/check` | Compare running version against latest release |
88
90
  | POST | `/update/apply` | Pull latest image, recreate container, reconnect |
91
+ | POST | `/purge-data` | Remove the QuestDB container and delete all its data (rootless-Podman-safe) |
89
92
  | GET | `/migration/detect` | Auto-detect InfluxDB (supports `?url=` for remote) |
90
93
  | GET | `/export?from=...&to=...&format=parquet` | Parquet or CSV export of the `signalk` numeric table (date range required) |
91
94
  | GET | `/full-export/tables` | List tables exposed by the per-table full-export route |
@@ -103,24 +106,26 @@ wants to slice it into kopia-dedup-friendly shards. Allowed tables:
103
106
 
104
107
  ## Configuration
105
108
 
106
- | Setting | Default | Description |
107
- | ------------------ | ------------ | ----------------------------------------------------------------- |
108
- | QuestDB version | `latest` | Docker image tag (dropdown shows stable + pre-releases) |
109
- | Managed container | `true` | Let signalk-container manage QuestDB, or connect to external |
110
- | QuestDB host | `127.0.0.1` | External QuestDB host (only used when managed=false) |
111
- | HTTP port | `9000` | External mode, or the host binding when "Bind to 0.0.0.0" is on |
112
- | ILP port | `9009` | External mode, or the host binding when "Bind to 0.0.0.0" is on |
113
- | PostgreSQL port | `8812` | Host binding for Grafana/psql when "Bind to 0.0.0.0" is on |
114
- | Sampling rate (ms) | `2000` | Default min ms between writes per path (0 = every update) |
115
- | Memory limit | `768m` | Hard cgroup cap on QuestDB container RAM (empty = unlimited) |
116
- | CPU limit (cores) | `1.5` | Max CPU cores QuestDB can use (0 = unlimited) |
117
- | Record own vessel | `true` | Record self context |
118
- | Record AIS targets | `false` | Record other vessels |
119
- | Retention (days) | `0` | Auto-delete old partitions (0 = keep forever) |
120
- | Compression codec | `lz4` | On-disk WAL compression: `none`, `lz4`, or `zstd` |
121
- | Compression level | `3` | ZSTD level 1-22 (only when codec is zstd) |
122
- | Container network | `sk-network` | Shared network for QuestDB (only applied when binding to 0.0.0.0) |
123
- | Bind to 0.0.0.0 | `false` | Expose QuestDB's ports on the LAN (see Connectivity below) |
109
+ | Setting | Default | Description |
110
+ | ------------------ | ------------ | ----------------------------------------------------------------------------------- |
111
+ | QuestDB version | `latest` | Docker image tag (dropdown shows stable + pre-releases) |
112
+ | Managed container | `true` | Let signalk-container manage QuestDB, or connect to external |
113
+ | QuestDB host | `127.0.0.1` | External QuestDB host (only used when managed=false) |
114
+ | HTTP port | `9000` | External mode, or the host binding when "Bind to 0.0.0.0" is on |
115
+ | ILP port | `9009` | External mode, or the host binding when "Bind to 0.0.0.0" is on |
116
+ | PostgreSQL port | `8812` | Host binding for Grafana/psql when "Bind to 0.0.0.0" is on |
117
+ | Sampling rate (ms) | `2000` | Default min ms between writes per path (0 = every update) |
118
+ | Memory limit | `768m` | Hard cgroup cap on QuestDB container RAM (empty = unlimited) |
119
+ | CPU limit (cores) | `1.5` | Max CPU cores QuestDB can use (0 = unlimited) |
120
+ | Record own vessel | `true` | Record self context |
121
+ | Record AIS targets | `false` | Record other vessels |
122
+ | Retention (days) | `0` | Auto-delete old partitions (0 = keep forever) |
123
+ | Path filter mode | `exclude` | `exclude` matching paths, or `include` only matching paths |
124
+ | Path filter paths | _(empty)_ | Glob patterns, one per line (e.g. `navigation.position`); empty = record everything |
125
+ | Compression codec | `lz4` | On-disk WAL compression: `none`, `lz4`, or `zstd` |
126
+ | Compression level | `3` | ZSTD level 1-22 (only when codec is zstd) |
127
+ | Container network | `sk-network` | Shared network for QuestDB (only applied when binding to 0.0.0.0) |
128
+ | Bind to 0.0.0.0 | `false` | Expose QuestDB's ports on the LAN (see Connectivity below) |
124
129
 
125
130
  ## Connectivity
126
131
 
package/dist/index.js CHANGED
@@ -83,6 +83,10 @@ const QUESTDB_HEALTHCHECK = {
83
83
  // host can actually grant (a rootless container cannot exceed the calling
84
84
  // user's hard limit), so this is safe even where the host limit is lower.
85
85
  const QUESTDB_ULIMITS = { nofile: 1048576 };
86
+ // How often to re-check that the owned tables still have the correct `ts`
87
+ // schema (and rebuild any ILP auto-created with the wrong shape). 60s is far
88
+ // faster than a human would notice "recording broke" yet negligible load.
89
+ const SCHEMA_HEAL_INTERVAL_MS = 60_000;
86
90
  function buildResourceLimits(config) {
87
91
  return {
88
92
  memory: config.questdbMemoryLimit?.trim() || null,
@@ -95,7 +99,84 @@ module.exports = (app) => {
95
99
  let writer = null;
96
100
  let queryClient = null;
97
101
  let retentionTimer = null;
102
+ let schemaHealTimer = null;
98
103
  let currentConfig = null;
104
+ // True when the `signalk` table exists with the wrong (ILP-auto-created)
105
+ // schema — rows ingest but reads filtering on `ts` see nothing. Surfaced in
106
+ // /api/status; the heal heartbeat clears it once the table is rebuilt.
107
+ let schemaMismatch = false;
108
+ // Last nofile-ulimit clamp reported by signalk-container, surfaced in
109
+ // /api/status and the config panel so the operator can see the host limit
110
+ // capped QuestDB's requested value. Null until a clamp happens (or on a
111
+ // signalk-container older than 1.18.0, which doesn't emit the event).
112
+ let ulimitClamp = null;
113
+ // Serializes the lifecycle operations that create or destroy QuestDB
114
+ // resources — asyncStart, /api/update/apply, and /api/purge-data — so they
115
+ // can never interleave. Without this, a purge (or update) issued while a
116
+ // multi-second asyncStart is awaiting whenReady()/ensureRunning()/connect()
117
+ // could tear down resources the start is about to (re)create, or the start
118
+ // could resurrect a just-purged container. A simple promise-chain mutex:
119
+ // each call waits for the previous to settle, then runs.
120
+ let lifecycleChain = Promise.resolve();
121
+ const withLifecycleLock = (fn) => {
122
+ const run = lifecycleChain.then(fn, fn);
123
+ // Keep the chain alive regardless of this op's outcome.
124
+ lifecycleChain = run.then(() => undefined, () => undefined);
125
+ return run;
126
+ };
127
+ // AbortController for the start currently in flight (null when no start is
128
+ // running). /api/purge-data — the recovery action — aborts it so a wedged
129
+ // start releases the lock instead of pinning purge behind it forever.
130
+ // runStart checks this signal after each long/external await and bails
131
+ // without creating resources, so an aborted start can't resurrect a
132
+ // just-purged container.
133
+ let startAbort = null;
134
+ // How long purge waits to acquire the lifecycle lock before proceeding
135
+ // anyway. After this it forces its teardown through even if a hung start
136
+ // never released the lock (see PURGE_LOCK_TIMEOUT_MS use below).
137
+ const PURGE_LOCK_TIMEOUT_MS = 30000;
138
+ // Record a clamp event so /api/status and the config-panel banner can
139
+ // surface it. (The plugin status line is not used — it is driven by the
140
+ // recording state and would immediately overwrite a warning set here.)
141
+ // Wired into both ensureRunning call sites so an in-place update keeps the
142
+ // warning current.
143
+ const onUlimitClamped = (event) => {
144
+ ulimitClamp = event;
145
+ app.debug(event.reason);
146
+ };
147
+ // Tables the plugin owns; each is rebuilt if ILP auto-created it with the
148
+ // wrong designated-timestamp schema. (signalk_position uses `ts` too.)
149
+ const OWNED_TABLES = ["signalk", "signalk_str", "signalk_position"];
150
+ // Guard so a slow heal (DROP + recreate) on one heartbeat can't overlap the
151
+ // next tick.
152
+ let healing = false;
153
+ // Detect and repair any owned table that ILP auto-created with the wrong
154
+ // schema, updating the `schemaMismatch` flag that /api/status reports. Runs
155
+ // at startup and on a heartbeat so a table dropped while the plugin is live
156
+ // is rebuilt with the correct `ts` schema. Best-effort: introspection/heal
157
+ // errors are logged, not thrown, so they never break the lifecycle.
158
+ const healSchemaTables = async () => {
159
+ if (!queryClient || healing)
160
+ return;
161
+ healing = true;
162
+ try {
163
+ let mismatch = false;
164
+ for (const table of OWNED_TABLES) {
165
+ if (await queryClient.healSchema(table)) {
166
+ app.debug(`Rebuilt ${table}: ILP had auto-created it with a wrong schema`);
167
+ }
168
+ if (await queryClient.hasSchemaMismatch(table))
169
+ mismatch = true;
170
+ }
171
+ schemaMismatch = mismatch;
172
+ }
173
+ catch (err) {
174
+ app.debug(`schema heal check failed: ${err instanceof Error ? err.message : String(err)}`);
175
+ }
176
+ finally {
177
+ healing = false;
178
+ }
179
+ };
99
180
  // The HTTP/ILP endpoints the Signal K process uses to reach QuestDB. In
100
181
  // managed mode signalk-container resolves these (loopback bare-metal,
101
182
  // container DNS when SK is containerized); in external mode they come from
@@ -248,7 +329,31 @@ module.exports = (app) => {
248
329
  }
249
330
  return false;
250
331
  }
251
- async function asyncStart(config) {
332
+ // Runs the actual startup. Always invoked through the lifecycle lock (see
333
+ // asyncStart) so a purge/update can't interleave with it.
334
+ //
335
+ // Abortable: a fresh AbortController is published in `startAbort` at entry so
336
+ // /api/purge-data can preempt a slow start. The container API mirror exposes
337
+ // no AbortSignal, so we can't cancel an in-flight whenReady()/ensureRunning()
338
+ // — instead we check `signal.aborted` after each long/external await and bail
339
+ // before registering any resources, so an aborted (preempted) start never
340
+ // resurrects what purge is about to remove. (Purge's own bounded lock-acquire
341
+ // covers the case where such a call truly never settles.)
342
+ async function runStart(config) {
343
+ const abort = new AbortController();
344
+ startAbort = abort;
345
+ const { signal } = abort;
346
+ try {
347
+ await runStartInner(config, signal);
348
+ }
349
+ finally {
350
+ // Only clear if we're still the in-flight start; a later start may have
351
+ // already replaced us.
352
+ if (startAbort === abort)
353
+ startAbort = null;
354
+ }
355
+ }
356
+ async function runStartInner(config, signal) {
252
357
  currentConfig = config;
253
358
  // External mode: the configured host/ports are authoritative. Managed mode
254
359
  // overwrites this below with the endpoints signalk-container resolves.
@@ -271,6 +376,10 @@ module.exports = (app) => {
271
376
  }
272
377
  app.setPluginStatus("Waiting for container runtime detection...");
273
378
  await containers.whenReady();
379
+ // Purge may have preempted us while whenReady() was pending; bail before
380
+ // touching the runtime so we don't recreate what purge is removing.
381
+ if (signal.aborted)
382
+ return;
274
383
  if (!containers.getRuntime()) {
275
384
  app.debug("container runtime not detected");
276
385
  app.setPluginError("No container runtime detected. Check signalk-container plugin.");
@@ -308,6 +417,8 @@ module.exports = (app) => {
308
417
  : {}),
309
418
  };
310
419
  const volumeSource = await resolveQuestdbVolumeSource(containers);
420
+ if (signal.aborted)
421
+ return;
311
422
  const containerConfig = {
312
423
  image: "questdb/questdb",
313
424
  tag: config.questdbVersion ?? "latest",
@@ -321,8 +432,21 @@ module.exports = (app) => {
321
432
  healthcheck: QUESTDB_HEALTHCHECK,
322
433
  };
323
434
  const resolveEndpoints = await applyQuestdbNetworking(config, containers, QUESTDB_CONTAINER_NAME, containerConfig);
435
+ if (signal.aborted)
436
+ return;
324
437
  app.setPluginStatus("Starting QuestDB container...");
325
- await containers.ensureRunning(QUESTDB_CONTAINER_NAME, containerConfig);
438
+ // Clear any prior clamp so a run that no longer clamps (e.g. the host
439
+ // limit was raised) doesn't leave a stale warning; onUlimitClamped
440
+ // re-sets it if this run clamps again.
441
+ ulimitClamp = null;
442
+ await containers.ensureRunning(QUESTDB_CONTAINER_NAME, containerConfig, {
443
+ onUlimitClamped,
444
+ });
445
+ // ensureRunning() just (re)created the container. If purge preempted us
446
+ // while it ran, return now so we don't proceed to resolve endpoints and
447
+ // wire up a writer against a container purge is about to remove.
448
+ if (signal.aborted)
449
+ return;
326
450
  app.debug("QuestDB container ready");
327
451
  questdbEndpoints = await resolveEndpoints();
328
452
  }
@@ -339,16 +463,28 @@ module.exports = (app) => {
339
463
  app.setPluginStatus("Waiting for QuestDB to become ready...");
340
464
  const deadline = Date.now() + 30000;
341
465
  while (Date.now() < deadline) {
466
+ if (signal.aborted) {
467
+ queryClient = null;
468
+ return;
469
+ }
342
470
  if (await queryClient.isHealthy())
343
471
  break;
344
472
  await new Promise((resolve) => setTimeout(resolve, 500));
345
473
  }
474
+ if (signal.aborted) {
475
+ queryClient = null;
476
+ return;
477
+ }
346
478
  if (!(await queryClient.isHealthy())) {
347
479
  app.setPluginError(`QuestDB not responding at ${httpHost}:${httpPort}`);
348
480
  return;
349
481
  }
350
482
  app.setPluginStatus("Creating tables...");
351
483
  await queryClient.ensureTables();
484
+ // A prior crash/drop may have left an ILP-auto-created `signalk` table with
485
+ // the wrong (`timestamp`, not `ts`) schema; heal it before the writer can
486
+ // ingest into the broken shape.
487
+ await healSchemaTables();
352
488
  writer = new ilp_writer_1.ILPWriter(ilpHost, ilpPort, (msg) => app.debug(msg), {
353
489
  // Surface a flapping ILP connection instead of leaving the status line
354
490
  // stuck on a cheerful "Recording" while every sample is dropped.
@@ -356,6 +492,20 @@ module.exports = (app) => {
356
492
  onHealthy: () => app.setPluginStatus(`Recording to QuestDB at ${ilpHost}:${ilpPort}`),
357
493
  });
358
494
  await writer.connect();
495
+ // Last abort checkpoint before we register providers, the stream
496
+ // subscription, and the retention/heal timers — none of which is wired up
497
+ // yet, so tearing down here is just nulling the writer/client we created.
498
+ if (signal.aborted) {
499
+ try {
500
+ await writer.disconnect();
501
+ }
502
+ catch {
503
+ /* ignore */
504
+ }
505
+ writer = null;
506
+ queryClient = null;
507
+ return;
508
+ }
359
509
  const v2Provider = (0, history_v2_1.createHistoryProviderV2)(queryClient, app.selfContext);
360
510
  app.registerHistoryApiProvider(v2Provider);
361
511
  // Set ourselves as default history provider (other plugins like Kip may
@@ -407,8 +557,19 @@ module.exports = (app) => {
407
557
  if (config.retentionDays && config.retentionDays > 0) {
408
558
  retentionTimer = (0, retention_1.startRetention)(queryClient, config.retentionDays, (msg) => app.debug(msg));
409
559
  }
560
+ // Heartbeat: catch and repair a table that gets dropped (e.g. a manual
561
+ // WAL recovery) and re-auto-created by ILP with the wrong schema, so
562
+ // recording silently breaking heals itself instead of needing a restart.
563
+ schemaHealTimer = setInterval(() => {
564
+ void healSchemaTables();
565
+ }, SCHEMA_HEAL_INTERVAL_MS);
410
566
  app.setPluginStatus(`Recording to QuestDB at ${ilpHost}:${ilpPort}`);
411
567
  }
568
+ // Public entry: serialize startup behind the lifecycle lock so a purge or
569
+ // update can't interleave with it.
570
+ function asyncStart(config) {
571
+ return withLifecycleLock(() => runStart(config));
572
+ }
412
573
  const plugin = {
413
574
  id: "signalk-questdb",
414
575
  name: "QuestDB History",
@@ -434,6 +595,14 @@ module.exports = (app) => {
434
595
  clearInterval(retentionTimer);
435
596
  retentionTimer = null;
436
597
  }
598
+ if (schemaHealTimer) {
599
+ clearInterval(schemaHealTimer);
600
+ schemaHealTimer = null;
601
+ }
602
+ schemaMismatch = false;
603
+ // Clear the clamp warning so it doesn't survive into the next start
604
+ // (e.g. a switch to external/unmanaged mode that never calls ensureRunning).
605
+ ulimitClamp = null;
437
606
  if (writer) {
438
607
  await writer.disconnect();
439
608
  writer = null;
@@ -513,6 +682,8 @@ module.exports = (app) => {
513
682
  activePathsToday,
514
683
  walSuspended: suspendedTables.length > 0,
515
684
  suspendedTables,
685
+ schemaMismatch,
686
+ ulimitClamp,
516
687
  endpoint: questdbEndpoints
517
688
  ? `${questdbEndpoints.http.host}:${questdbEndpoints.http.port}`
518
689
  : null,
@@ -664,79 +835,89 @@ module.exports = (app) => {
664
835
  return;
665
836
  }
666
837
  const newTag = stable.tag_name;
667
- app.setPluginStatus(`Pulling QuestDB ${newTag}...`);
668
- await containers.pullImage(`questdb/questdb:${newTag}`);
669
- if (currentConfig) {
670
- currentConfig.questdbVersion = newTag;
671
- await new Promise((resolve, reject) => {
672
- app.savePluginOptions({ ...currentConfig }, (err) => {
673
- if (err)
674
- reject(err);
675
- else
676
- resolve();
838
+ // Run the mutating update under the lifecycle lock so a concurrent
839
+ // purge/start can't interleave with the pull + recreate + reconnect.
840
+ const ilp = await withLifecycleLock(async () => {
841
+ app.setPluginStatus(`Pulling QuestDB ${newTag}...`);
842
+ await containers.pullImage(`questdb/questdb:${newTag}`);
843
+ if (currentConfig) {
844
+ currentConfig.questdbVersion = newTag;
845
+ await new Promise((resolve, reject) => {
846
+ app.savePluginOptions({ ...currentConfig }, (err) => {
847
+ if (err)
848
+ reject(err);
849
+ else
850
+ resolve();
851
+ });
677
852
  });
678
- });
679
- }
680
- const updateVolumeSource = await resolveQuestdbVolumeSource(containers);
681
- app.setPluginStatus(`Starting QuestDB ${newTag}...`);
682
- const updateConfig = {
683
- image: "questdb/questdb",
684
- tag: newTag,
685
- volumes: {
686
- "/var/lib/questdb": updateVolumeSource,
687
- },
688
- env: {
689
- QDB_TELEMETRY_ENABLED: "false",
690
- QDB_HTTP_ENABLED: "true",
691
- QDB_LINE_TCP_ENABLED: "true",
692
- ...(currentConfig?.compression &&
693
- currentConfig.compression !== "none"
694
- ? {
695
- QDB_CAIRO_WAL_SEGMENT_COMPRESSION_CODEC: currentConfig.compression === "zstd" ? "ZSTD" : "LZ4",
696
- ...(currentConfig.compression === "zstd" &&
697
- currentConfig.compressionLevel
698
- ? {
699
- QDB_CAIRO_WAL_SEGMENT_COMPRESSION_LEVEL: String(currentConfig.compressionLevel),
700
- }
701
- : {}),
702
- }
703
- : {}),
704
- },
705
- restart: "unless-stopped",
706
- resources: currentConfig
707
- ? buildResourceLimits(currentConfig)
708
- : undefined,
709
- ulimits: QUESTDB_ULIMITS,
710
- healthcheck: QUESTDB_HEALTHCHECK,
711
- };
712
- const resolveUpdateEndpoints = await applyQuestdbNetworking(currentConfig ?? {}, containers, QUESTDB_CONTAINER_NAME, updateConfig);
713
- await containers.ensureRunning(QUESTDB_CONTAINER_NAME, updateConfig);
714
- // Re-resolve so the export endpoints and status line reflect the
715
- // current endpoint. The version bump keeps the same container name
716
- // and networking, so the endpoint is stable — the existing
717
- // QueryClient/ILPWriter stay valid (and the registered history
718
- // providers keep their reference).
719
- questdbEndpoints = await resolveUpdateEndpoints();
720
- const { host: ilpHost, port: ilpPort } = questdbEndpoints.ilp;
721
- // Wait for the recreated container to answer, then reconnect ILP.
722
- if (queryClient) {
723
- const deadline = Date.now() + 30000;
724
- while (Date.now() < deadline) {
725
- if (await queryClient.isHealthy())
726
- break;
727
- await new Promise((resolve) => setTimeout(resolve, 500));
728
853
  }
729
- }
730
- if (writer) {
731
- try {
732
- await writer.disconnect();
854
+ const updateVolumeSource = await resolveQuestdbVolumeSource(containers);
855
+ app.setPluginStatus(`Starting QuestDB ${newTag}...`);
856
+ const updateConfig = {
857
+ image: "questdb/questdb",
858
+ tag: newTag,
859
+ volumes: {
860
+ "/var/lib/questdb": updateVolumeSource,
861
+ },
862
+ env: {
863
+ QDB_TELEMETRY_ENABLED: "false",
864
+ QDB_HTTP_ENABLED: "true",
865
+ QDB_LINE_TCP_ENABLED: "true",
866
+ ...(currentConfig?.compression &&
867
+ currentConfig.compression !== "none"
868
+ ? {
869
+ QDB_CAIRO_WAL_SEGMENT_COMPRESSION_CODEC: currentConfig.compression === "zstd" ? "ZSTD" : "LZ4",
870
+ ...(currentConfig.compression === "zstd" &&
871
+ currentConfig.compressionLevel
872
+ ? {
873
+ QDB_CAIRO_WAL_SEGMENT_COMPRESSION_LEVEL: String(currentConfig.compressionLevel),
874
+ }
875
+ : {}),
876
+ }
877
+ : {}),
878
+ },
879
+ restart: "unless-stopped",
880
+ resources: currentConfig
881
+ ? buildResourceLimits(currentConfig)
882
+ : undefined,
883
+ ulimits: QUESTDB_ULIMITS,
884
+ healthcheck: QUESTDB_HEALTHCHECK,
885
+ };
886
+ const resolveUpdateEndpoints = await applyQuestdbNetworking(currentConfig ?? {}, containers, QUESTDB_CONTAINER_NAME, updateConfig);
887
+ // Clear any prior clamp before re-running so a no-longer-clamping
888
+ // update doesn't leave a stale warning.
889
+ ulimitClamp = null;
890
+ await containers.ensureRunning(QUESTDB_CONTAINER_NAME, updateConfig, {
891
+ onUlimitClamped,
892
+ });
893
+ // Re-resolve so the export endpoints and status line reflect the
894
+ // current endpoint. The version bump keeps the same container name
895
+ // and networking, so the endpoint is stable — the existing
896
+ // QueryClient/ILPWriter stay valid (and the registered history
897
+ // providers keep their reference).
898
+ questdbEndpoints = await resolveUpdateEndpoints();
899
+ const { host: ilpHost, port: ilpPort } = questdbEndpoints.ilp;
900
+ // Wait for the recreated container to answer, then reconnect ILP.
901
+ if (queryClient) {
902
+ const deadline = Date.now() + 30000;
903
+ while (Date.now() < deadline) {
904
+ if (await queryClient.isHealthy())
905
+ break;
906
+ await new Promise((resolve) => setTimeout(resolve, 500));
907
+ }
733
908
  }
734
- catch {
735
- /* ignore */
909
+ if (writer) {
910
+ try {
911
+ await writer.disconnect();
912
+ }
913
+ catch {
914
+ /* ignore */
915
+ }
916
+ await writer.connect();
736
917
  }
737
- await writer.connect();
738
- }
739
- app.setPluginStatus(`Recording to QuestDB ${newTag} at ${ilpHost}:${ilpPort}`);
918
+ return { ilpHost, ilpPort };
919
+ });
920
+ app.setPluginStatus(`Recording to QuestDB ${newTag} at ${ilp.ilpHost}:${ilp.ilpPort}`);
740
921
  res.json({
741
922
  status: "updated",
742
923
  newVersion: newTag,
@@ -749,6 +930,131 @@ module.exports = (app) => {
749
930
  });
750
931
  }
751
932
  });
933
+ // Remove the QuestDB container AND delete all its data. Exists because
934
+ // Signal K's own plugin-uninstall can't delete the data dir on rootless
935
+ // Podman (the container writes files as a subuid the SK user can't
936
+ // remove); removeManagedData wipes them from inside the userns.
937
+ router.post("/api/purge-data", async (_req, res) => {
938
+ try {
939
+ // External mode is a config fact independent of the runtime, so
940
+ // answer it first — an external-mode install without signalk-container
941
+ // should get the clear 400, not a 503 about a missing container
942
+ // manager it doesn't need.
943
+ if (currentConfig?.managedContainer === false) {
944
+ res.status(400).json({
945
+ error: "QuestDB is not managed by this plugin (external mode); nothing to remove.",
946
+ });
947
+ return;
948
+ }
949
+ const containers = globalThis.__signalk_containerManager;
950
+ if (!containers || !containers.getRuntime()) {
951
+ res.status(503).json({ error: "Container manager not available" });
952
+ return;
953
+ }
954
+ if (!containers.removeManagedData) {
955
+ res.status(501).json({
956
+ error: "Data removal requires signalk-container 1.19.0 or newer. Update it, or delete the QuestDB data directory manually.",
957
+ });
958
+ return;
959
+ }
960
+ // The actual teardown + data removal. Normally runs under the
961
+ // lifecycle lock; the timeout fallback below may run it unlocked.
962
+ // `teardownStarted` makes it run at most once: if the timeout
963
+ // fallback runs the teardown while a wedged start still holds the
964
+ // lock, the locked attempt becomes a no-op once the start finally
965
+ // releases it (so removeManagedData isn't invoked twice).
966
+ let teardownStarted = false;
967
+ const teardown = async () => {
968
+ if (teardownStarted)
969
+ return;
970
+ teardownStarted = true;
971
+ // Stop all activity against the container before it and its data go
972
+ // away — otherwise the retention timer keeps issuing DROP PARTITION
973
+ // against a removed container and the writer keeps trying to connect.
974
+ if (schemaHealTimer) {
975
+ clearInterval(schemaHealTimer);
976
+ schemaHealTimer = null;
977
+ }
978
+ if (retentionTimer) {
979
+ clearInterval(retentionTimer);
980
+ retentionTimer = null;
981
+ }
982
+ if (writer) {
983
+ try {
984
+ await writer.disconnect();
985
+ }
986
+ catch {
987
+ /* ignore */
988
+ }
989
+ writer = null;
990
+ }
991
+ queryClient = null;
992
+ const hostPath = await resolveQuestdbVolumeSource(containers);
993
+ app.setPluginStatus("Removing QuestDB container and data...");
994
+ await containers.removeManagedData(QUESTDB_CONTAINER_NAME, hostPath, { ownerPluginId: "signalk-questdb" });
995
+ };
996
+ // Purge is the RECOVERY action, so it must make progress even when a
997
+ // start is wedged on a never-settling container call. Step 1: signal
998
+ // any in-flight start to bail (its post-await checks return without
999
+ // creating resources). Step 2: try to acquire the lifecycle lock so
1000
+ // we still serialize against a start/update that IS progressing —
1001
+ // but only for a bounded time. If the lock isn't free within
1002
+ // PURGE_LOCK_TIMEOUT_MS (a truly hung start that ignored the abort
1003
+ // and never released it), run the teardown anyway. Interleaving risk
1004
+ // is minimal because we already aborted the start, so any start that
1005
+ // later wakes up returns early instead of recreating the container.
1006
+ startAbort?.abort();
1007
+ let lockedTeardownSettled = false;
1008
+ let lockedTeardownError;
1009
+ const lockedTeardown = withLifecycleLock(teardown).then(() => {
1010
+ lockedTeardownSettled = true;
1011
+ }, (err) => {
1012
+ // Capture rather than rethrow: in the timeout branch nothing
1013
+ // awaits this promise, so a rethrow would surface as an
1014
+ // unhandled rejection. The locked branch re-throws it below.
1015
+ lockedTeardownSettled = true;
1016
+ lockedTeardownError = err;
1017
+ });
1018
+ let timeoutTimer;
1019
+ const timeout = new Promise((resolve) => {
1020
+ timeoutTimer = setTimeout(() => resolve("timeout"), PURGE_LOCK_TIMEOUT_MS);
1021
+ });
1022
+ const outcome = await Promise.race([
1023
+ lockedTeardown.then(() => "locked"),
1024
+ timeout,
1025
+ ]);
1026
+ if (timeoutTimer)
1027
+ clearTimeout(timeoutTimer);
1028
+ if (outcome === "locked") {
1029
+ // The lock-held teardown completed (or failed). Propagate its error
1030
+ // to the outer catch so the client sees the real failure.
1031
+ if (lockedTeardownError)
1032
+ throw lockedTeardownError;
1033
+ }
1034
+ else if (!lockedTeardownSettled) {
1035
+ app.debug("purge: lifecycle lock not acquired within timeout; a start " +
1036
+ "appears wedged. Proceeding with teardown to make progress.");
1037
+ await teardown();
1038
+ // The wedged start still owns the old chain (its promise never
1039
+ // settled), so reset the gate to a fresh resolved promise —
1040
+ // otherwise every future lifecycle op (e.g. the asyncStart when the
1041
+ // operator re-enables the plugin) would queue behind the dead chain
1042
+ // forever. The abandoned start's own resources are already aborted.
1043
+ lifecycleChain = Promise.resolve();
1044
+ startAbort = null;
1045
+ }
1046
+ app.setPluginStatus("QuestDB data removed. Disable and re-enable the plugin to start fresh.");
1047
+ res.json({
1048
+ status: "removed",
1049
+ message: "QuestDB container and all data removed. Re-enable the plugin to start a fresh database.",
1050
+ });
1051
+ }
1052
+ catch (err) {
1053
+ res.status(500).json({
1054
+ error: err instanceof Error ? err.message : "Unknown error",
1055
+ });
1056
+ }
1057
+ });
752
1058
  router.get("/api/migration/detect", async (req, res) => {
753
1059
  const baseUrl = req.query.url || "http://localhost:8086";
754
1060
  try {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -19,5 +19,8 @@ export declare class QueryClient {
19
19
  execCsv(sql: string): Promise<string>;
20
20
  isHealthy(): Promise<boolean>;
21
21
  ensureTables(): Promise<void>;
22
+ designatedTimestamp(table: string): Promise<string | null>;
23
+ hasSchemaMismatch(table: string): Promise<boolean>;
24
+ healSchema(table: string): Promise<boolean>;
22
25
  toObjects(result: QuestDBResult): Record<string, unknown>[];
23
26
  }
@@ -105,6 +105,45 @@ class QueryClient {
105
105
  DEDUP UPSERT KEYS(ts, context)
106
106
  `);
107
107
  }
108
+ // QuestDB's ILP ingestion auto-creates a missing table, but names the
109
+ // designated timestamp `timestamp`, whereas our schema (and every query)
110
+ // uses `ts`. If the `signalk` table is dropped while the plugin runs, the
111
+ // next ILP flush can recreate it with the wrong shape — rows then ingest but
112
+ // `WHERE ts > ...` and the history providers read nothing. This returns the
113
+ // name of the designated-timestamp column, or null if the table is missing
114
+ // (or has no designated timestamp).
115
+ async designatedTimestamp(table) {
116
+ const result = await this.exec(`SELECT column FROM table_columns('${validateIdentifier(table)}') WHERE designated = true`);
117
+ return result.dataset.length > 0 ? result.dataset[0][0] : null;
118
+ }
119
+ // True when `table` exists but its designated timestamp is not our expected
120
+ // `ts` (i.e. ILP auto-created it). A missing table is NOT a mismatch —
121
+ // ensureTables creates it correctly.
122
+ async hasSchemaMismatch(table) {
123
+ // Validate up front so an invalid identifier rejects loudly instead of
124
+ // being swallowed below as "no mismatch".
125
+ validateIdentifier(table);
126
+ try {
127
+ const ts = await this.designatedTimestamp(table);
128
+ return ts !== null && ts !== "ts";
129
+ }
130
+ catch {
131
+ // table doesn't exist / introspection unavailable — not a mismatch.
132
+ return false;
133
+ }
134
+ }
135
+ // Self-heal a table ILP auto-created with the wrong schema: drop it and let
136
+ // ensureTables recreate it correctly. Returns true if a rebuild happened.
137
+ // The rows ILP wrote into the wrong-schema table are lost, but they are
138
+ // unreadable anyway (history API and status query filter on `ts`, which the
139
+ // auto-created table lacks).
140
+ async healSchema(table) {
141
+ if (!(await this.hasSchemaMismatch(table)))
142
+ return false;
143
+ await this.exec(`DROP TABLE IF EXISTS ${validateIdentifier(table)}`);
144
+ await this.ensureTables();
145
+ return true;
146
+ }
108
147
  toObjects(result) {
109
148
  return result.dataset.map((row) => {
110
149
  const obj = {};
@@ -1 +1 @@
1
- {"version":3,"file":"query-client.js","sourceRoot":"","sources":["../src/query-client.ts"],"names":[],"mappings":";;;AAiBA,gDAKC;AAED,8CAMC;AAED,sCAEC;AAlCD,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAC7C,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAClD,MAAM,aAAa,GACjB,qEAAqE,CAAC;AAcxE,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACzB,CAAC;AAED,SAAgB,aAAa,CAAC,GAAW;IACvC,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,CAAC;AAED,MAAa,WAAW;IACd,OAAO,CAAS;IAExB,YAAY,IAAY,EAAE,IAAY;QACpC,IAAI,CAAC,OAAO,GAAG,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACnC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YACtC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,EAA4B,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAW;QACxB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW;QACvB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAEnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YACtC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,sBAAsB,EAAE;gBAC7D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;KAUf,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;KAUf,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;KAUf,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,MAAqB;QAC7B,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAChC,MAAM,GAAG,GAA4B,EAAE,CAAC;YACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAzGD,kCAyGC"}
1
+ {"version":3,"file":"query-client.js","sourceRoot":"","sources":["../src/query-client.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,32 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const node_test_1 = require("node:test");
7
7
  const strict_1 = __importDefault(require("node:assert/strict"));
8
8
  const query_client_1 = require("../query-client");
9
+ // Build a QueryClient whose exec() is stubbed: every call records the SQL and
10
+ // returns the next canned result (a single-column `column` dataset for the
11
+ // designated-timestamp introspection, or an empty dataset for DDL). Lets us
12
+ // test the schema-heal logic without a live QuestDB.
13
+ function stubClient(responder) {
14
+ const client = new query_client_1.QueryClient("127.0.0.1", 9000);
15
+ const sql = [];
16
+ client.exec =
17
+ (q) => {
18
+ sql.push(q);
19
+ return Promise.resolve(responder(q));
20
+ };
21
+ return { client, sql };
22
+ }
23
+ const tsRow = (column) => ({
24
+ columns: [{ name: "column", type: "STRING" }],
25
+ dataset: [[column]],
26
+ count: 1,
27
+ timestamp: -1,
28
+ });
29
+ const emptyResult = {
30
+ columns: [{ name: "column", type: "STRING" }],
31
+ dataset: [],
32
+ count: 0,
33
+ timestamp: -1,
34
+ };
9
35
  (0, node_test_1.describe)("validateIdentifier", () => {
10
36
  (0, node_test_1.it)("accepts valid Signal K paths", () => {
11
37
  strict_1.default.equal((0, query_client_1.validateIdentifier)("navigation.speedOverGround"), "navigation.speedOverGround");
@@ -58,4 +84,64 @@ const query_client_1 = require("../query-client");
58
84
  strict_1.default.ok(!(0, query_client_1.isReadOnlySQL)("SELECT 1; DROP TABLE signalk"), "Should block DROP even after SELECT");
59
85
  });
60
86
  });
87
+ (0, node_test_1.describe)("QueryClient schema heal", () => {
88
+ (0, node_test_1.it)("reports the designated timestamp column", async () => {
89
+ const { client } = stubClient(() => tsRow("ts"));
90
+ strict_1.default.equal(await client.designatedTimestamp("signalk"), "ts");
91
+ });
92
+ (0, node_test_1.it)("returns null when the table has no designated timestamp / is missing", async () => {
93
+ const { client } = stubClient(() => emptyResult);
94
+ strict_1.default.equal(await client.designatedTimestamp("signalk"), null);
95
+ });
96
+ (0, node_test_1.it)("treats a `ts` designated timestamp as no mismatch", async () => {
97
+ const { client } = stubClient(() => tsRow("ts"));
98
+ strict_1.default.equal(await client.hasSchemaMismatch("signalk"), false);
99
+ });
100
+ (0, node_test_1.it)("flags a `timestamp` (ILP auto-created) designated timestamp as a mismatch", async () => {
101
+ const { client } = stubClient(() => tsRow("timestamp"));
102
+ strict_1.default.equal(await client.hasSchemaMismatch("signalk"), true);
103
+ });
104
+ (0, node_test_1.it)("treats a missing table as no mismatch", async () => {
105
+ const { client } = stubClient(() => emptyResult);
106
+ strict_1.default.equal(await client.hasSchemaMismatch("signalk"), false);
107
+ });
108
+ (0, node_test_1.it)("treats introspection failure as no mismatch (swallowed)", async () => {
109
+ const { client } = stubClient(() => {
110
+ throw new Error("table does not exist");
111
+ });
112
+ strict_1.default.equal(await client.hasSchemaMismatch("signalk"), false);
113
+ });
114
+ (0, node_test_1.it)("healSchema is a no-op on a correct table", async () => {
115
+ const { client, sql } = stubClient(() => tsRow("ts"));
116
+ strict_1.default.equal(await client.healSchema("signalk"), false);
117
+ // Only the introspection query ran — no DROP, no CREATE.
118
+ strict_1.default.ok(sql.every((q) => !/DROP TABLE|CREATE TABLE/i.test(q)));
119
+ });
120
+ (0, node_test_1.it)("healSchema drops and recreates a wrong-schema table", async () => {
121
+ // First introspection says `timestamp` (mismatch); after the rebuild the
122
+ // CREATE TABLE statements just return empty.
123
+ let firstIntrospection = true;
124
+ const { client, sql } = stubClient((q) => {
125
+ if (/table_columns/.test(q)) {
126
+ if (firstIntrospection) {
127
+ firstIntrospection = false;
128
+ return tsRow("timestamp");
129
+ }
130
+ return tsRow("ts");
131
+ }
132
+ return emptyResult;
133
+ });
134
+ strict_1.default.equal(await client.healSchema("signalk"), true);
135
+ strict_1.default.ok(sql.some((q) => /DROP TABLE IF EXISTS signalk/i.test(q)), "should drop the wrong-schema table");
136
+ strict_1.default.ok(sql.some((q) => /CREATE TABLE IF NOT EXISTS signalk\b/i.test(q)), "should recreate via ensureTables");
137
+ });
138
+ (0, node_test_1.it)("rejects an invalid table identifier", async () => {
139
+ const { client } = stubClient(() => emptyResult);
140
+ await strict_1.default.rejects(() => client.designatedTimestamp("signalk; DROP TABLE x"));
141
+ });
142
+ (0, node_test_1.it)("hasSchemaMismatch rejects an invalid identifier instead of swallowing it", async () => {
143
+ const { client } = stubClient(() => emptyResult);
144
+ await strict_1.default.rejects(() => client.hasSchemaMismatch("signalk; DROP TABLE x"));
145
+ });
146
+ });
61
147
  //# sourceMappingURL=query-client.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-client.test.js","sourceRoot":"","sources":["../../src/test/query-client.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAyC;AACzC,gEAAwC;AACxC,kDAIyB;AAEzB,IAAA,oBAAQ,EAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAA,cAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,gBAAM,CAAC,KAAK,CACV,IAAA,iCAAkB,EAAC,4BAA4B,CAAC,EAChD,4BAA4B,CAC7B,CAAC;QACF,gBAAM,CAAC,KAAK,CAAC,IAAA,iCAAkB,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACjD,gBAAM,CAAC,KAAK,CACV,IAAA,iCAAkB,EAAC,oCAAoC,CAAC,EACxD,oCAAoC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,gBAAM,CAAC,KAAK,CACV,IAAA,iCAAkB,EAAC,yCAAyC,CAAC,EAC7D,yCAAyC,CAC1C,CAAC;QACF,gBAAM,CAAC,KAAK,CACV,IAAA,iCAAkB,EAAC,wCAAwC,CAAC,EAC5D,wCAAwC,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,gBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,iCAAkB,EAAC,0BAA0B,CAAC,CAAC,CAAC;QACpE,gBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,iCAAkB,EAAC,aAAa,CAAC,CAAC,CAAC;QACvD,gBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,iCAAkB,EAAC,cAAc,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,oBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAA,cAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,IAAA,gCAAiB,EAAC,0BAA0B,CAAC,CAAC;QAC7D,gBAAM,CAAC,KAAK,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,IAAA,gCAAiB,EAAC,YAAY,CAAC,CAAC;QAC/C,gBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,QAAQ,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,gBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,gCAAiB,EAAC,YAAY,CAAC,CAAC,CAAC;QACrD,gBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,gCAAiB,EAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,oBAAQ,EAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAA,cAAE,EAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,gBAAM,CAAC,EAAE,CAAC,IAAA,4BAAa,EAAC,6BAA6B,CAAC,CAAC,CAAC;QACxD,gBAAM,CAAC,EAAE,CACP,IAAA,4BAAa,EAAC,oDAAoD,CAAC,CACpE,CAAC;QACF,gBAAM,CAAC,EAAE,CAAC,IAAA,4BAAa,EAAC,0CAA0C,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,gBAAM,CAAC,EAAE,CAAC,IAAA,4BAAa,EAAC,aAAa,CAAC,CAAC,CAAC;QACxC,gBAAM,CAAC,EAAE,CAAC,IAAA,4BAAa,EAAC,2BAA2B,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAA,4BAAa,EAAC,oBAAoB,CAAC,CAAC,CAAC;QAChD,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAA,4BAAa,EAAC,sCAAsC,CAAC,CAAC,CAAC;QAClE,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAA,4BAAa,EAAC,gCAAgC,CAAC,CAAC,CAAC;QAC5D,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAA,4BAAa,EAAC,sCAAsC,CAAC,CAAC,CAAC;QAClE,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAA,4BAAa,EAAC,2BAA2B,CAAC,CAAC,CAAC;QACvD,gBAAM,CAAC,EAAE,CAAC,CAAC,IAAA,4BAAa,EAAC,wBAAwB,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,gBAAM,CAAC,EAAE,CACP,CAAC,IAAA,4BAAa,EAAC,8BAA8B,CAAC,EAC9C,qCAAqC,CACtC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"query-client.test.js","sourceRoot":"","sources":["../../src/test/query-client.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.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "QuestDB history provider for Signal K — replaces signalk-to-influxdb",
5
5
  "keywords": [
6
6
  "signalk-node-server-plugin",
package/public/805.js CHANGED
@@ -1 +1 @@
1
- "use strict";(self.webpackChunksignalk_questdb=self.webpackChunksignalk_questdb||[]).push([[805],{805(e,t,a){a.r(t),a.d(t,{default:()=>s});var n=a(231);const l={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},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},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}};function r({title:e,children:t}){const[a,r]=(0,n.useState)(!1);return n.createElement("div",null,n.createElement("div",{style:{...l.sectionTitle,cursor:"pointer",userSelect:"none",display:"flex",alignItems:"center",gap:6},onClick:()=>r(!a)},n.createElement("span",{style:{fontSize:10,transition:"transform 0.15s",transform:a?"rotate(90deg)":"rotate(0deg)"}},"▶"),e),a&&n.createElement("div",{style:{marginBottom:16}},t))}function o(e){return null==e?"—":e>=1e6?(e/1e6).toFixed(1)+"M":e>=1e3?(e/1e3).toFixed(1)+"K":String(e)}function s({configuration:e,save:t}){const a=e||{},[s,i]=(0,n.useState)(a.questdbHost||"127.0.0.1"),[c,d]=(0,n.useState)(a.questdbIlpPort||9009),[u,m]=(0,n.useState)(a.questdbHttpPort||9e3),[p,g]=(0,n.useState)(a.questdbPgPort||8812),[f,y]=(0,n.useState)(a.questdbVersion||"latest"),[b,E]=(0,n.useState)(!1!==a.managedContainer),[h,v]=(0,n.useState)(!1!==a.recordSelf),[x,k]=(0,n.useState)(a.recordOthers||!1),[S,w]=(0,n.useState)(a.defaultSamplingRate??2e3),[R,C]=(0,n.useState)(a.retentionDays||0),[T,I]=(0,n.useState)(a.compression||"lz4"),[B,D]=(0,n.useState)(a.compressionLevel||3),[z,L]=(0,n.useState)(a.networkName||"sk-network"),[q,P]=(0,n.useState)(a.exposeToContainers||!1),[$,N]=(0,n.useState)([]),[U,Q]=(0,n.useState)(!1),[F,A]=(0,n.useState)(null),[W,M]=(0,n.useState)(!0),[V,j]=(0,n.useState)(null),[H,O]=(0,n.useState)(!1),[G,_]=(0,n.useState)(""),[Z,K]=(0,n.useState)(""),[X,J]=(0,n.useState)(!1),[Y,ee]=(0,n.useState)(null),[te,ae]=(0,n.useState)(!1),[ne,le]=(0,n.useState)(!1),re=(0,n.useCallback)(async()=>{Q(!0);try{const e=await fetch("/plugins/signalk-questdb/api/versions");if(e.ok){const t=await e.json();N(t)}}catch{}Q(!1)},[]),oe=(0,n.useCallback)(async()=>{try{const e=await fetch("/plugins/signalk-questdb/api/status");e.ok?A(await e.json()):A({status:"not_running"})}catch{A({status:"not_running"})}M(!1)},[]);(0,n.useEffect)(()=>{re(),oe();const e=setInterval(oe,5e3);return()=>clearInterval(e)},[re,oe]);const[se,ie]=(0,n.useState)(""),[ce,de]=(0,n.useState)(""),[ue,me]=(0,n.useState)("parquet"),[pe,ge]=(0,n.useState)(!1),fe=F&&"running"===F.status,ye=fe&&F.suspendedTables||[],be=ye.length>0,Ee=$.filter(e=>!e.prerelease).slice(0,3),he=$.filter(e=>e.prerelease).slice(0,2);return n.createElement("div",{style:l.root},n.createElement("div",{style:l.sectionTitle},"QuestDB Status"),W?n.createElement("div",{style:l.empty},"Checking QuestDB..."):fe?n.createElement(n.Fragment,null,be&&n.createElement("div",{style:l.warnBanner},n.createElement("div",{style:l.warnBannerTitle},"QuestDB WAL suspended — recording stalled"),"Rows are arriving but no longer commit, so the counts below have stopped advancing. This usually follows a torn write (often a low host ",n.createElement("code",null,"fs.file-max")," limit). Resume each suspended table in the QuestDB SQL console (",n.createElement("code",null,":9000"),"), skipping the broken transaction:",n.createElement("code",{style:l.warnBannerCode},ye.map(e=>`ALTER TABLE "${String(e.name).replace(/"/g,'""')}" RESUME WAL FROM TXN ${e.writerTxn+1}; -- ${o(e.txnLag)} txns behind`).join("\n"))),n.createElement("div",{style:l.card},n.createElement("div",{style:{...l.cardIcon,background:"#7c3aed",color:"#fff"}},"Q"),n.createElement("div",{style:l.cardInfo},n.createElement("div",{style:l.cardTitle},"QuestDB"),n.createElement("div",{style:l.cardMeta},F?.endpoint||`${s}:${u}`," ","· ",be?"WAL suspended":"Recording")),n.createElement("div",{style:{...l.stateIndicator,background:be?"#ef4444":"#10b981"},title:be?"WAL suspended":"Running"})),n.createElement("div",{style:l.statsGrid},n.createElement("div",{style:l.statCard},n.createElement("div",{style:l.statValue},o(F.totalRows)),n.createElement("div",{style:l.statLabel},"Total Rows")),n.createElement("div",{style:l.statCard},n.createElement("div",{style:l.statValue},o(F.activePathsToday)),n.createElement("div",{style:l.statLabel},"Active Paths Today"))),n.createElement("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:12}},Y&&Y.updateAvailable?n.createElement(n.Fragment,null,n.createElement("span",{style:{fontSize:13}},"v",Y.currentVersion," →"," ",n.createElement("strong",null,"v",Y.latestVersion)," available"),n.createElement("button",{style:{...l.btn,...l.btnPrimary,padding:"4px 12px",fontSize:12,...ne?l.btnDisabled:{}},onClick:async()=>{le(!0),K("Pulling new image and restarting..."),J(!1);try{const e=await fetch("/plugins/signalk-questdb/api/update/apply",{method:"POST"});if(e.ok){const t=await e.json();K(t.message),ee(null),t.newVersion&&y(t.newVersion),oe()}else{const t=await e.json().catch(()=>({error:e.statusText}));K(`Update failed: ${t.error}`),J(!0)}}catch(e){K(`Update failed: ${e.message}`),J(!0)}le(!1)},disabled:ne},ne?"Updating...":"Update QuestDB")):Y&&!Y.updateAvailable?n.createElement("span",{style:{fontSize:12,color:"#888"}},"v",Y.currentVersion," (up to date)"):n.createElement("button",{style:{...l.btn,padding:"4px 12px",fontSize:12,background:"#f1f5f9",color:"#475569",border:"1px solid #e2e8f0",...te?l.btnDisabled:{}},onClick:async()=>{ae(!0);try{const e=await fetch("/plugins/signalk-questdb/api/update/check");e.ok&&ee(await e.json())}catch{}ae(!1)},disabled:te},te?"Checking...":"Check for updates"))):n.createElement("div",{style:l.card},n.createElement("div",{style:{...l.cardIcon,background:"#fef2f2",color:"#ef4444"}},"Q"),n.createElement("div",{style:l.cardInfo},n.createElement("div",{style:l.cardTitle},"QuestDB"),n.createElement("div",{style:l.cardMeta},"unhealthy"===F?.status?"Not responding":"Not running",b?" — enable plugin to start container":"")),n.createElement("div",{style:{...l.stateIndicator,background:"#ef4444"}})),n.createElement("div",{style:l.sectionTitle},"Image Version"),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"QuestDB version"),n.createElement("select",{style:l.select,value:f,onChange:e=>y(e.target.value)},n.createElement("option",{value:"latest"},"latest (recommended)"),he.map(e=>n.createElement("option",{key:e.tag,value:e.tag},e.tag," (pre-release)")),Ee.map((e,t)=>n.createElement("option",{key:e.tag,value:e.tag},e.tag,0===t?" (current stable)":""))),U&&n.createElement("span",{style:l.hint},"loading releases..."),n.createElement("button",{style:{...l.btn,...l.btnPrimary,padding:"4px 10px",fontSize:11},onClick:re},"↻")),n.createElement("div",{style:l.sectionTitle},"Connection"),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Managed container"),n.createElement("input",{type:"checkbox",style:l.checkbox,checked:b,onChange:e=>E(e.target.checked)}),n.createElement("span",{style:l.hint},b?"signalk-container manages QuestDB":"Connect to external QuestDB")),!b&&n.createElement(n.Fragment,null,n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"QuestDB host"),n.createElement("input",{style:l.input,value:s,onChange:e=>i(e.target.value)})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"HTTP port (queries)"),n.createElement("input",{style:l.inputSmall,type:"number",value:u,onChange:e=>m(Number(e.target.value))})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"ILP port (writes)"),n.createElement("input",{style:l.inputSmall,type:"number",value:c,onChange:e=>d(Number(e.target.value))}))),b&&n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Bind to 0.0.0.0"),n.createElement("input",{type:"checkbox",style:l.checkbox,checked:q,onChange:e=>P(e.target.checked)}),n.createElement("span",{style:{...l.hint,color:q?"#ef4444":void 0}},q?"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")),b&&q&&n.createElement(n.Fragment,null,n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"HTTP port (queries)"),n.createElement("input",{style:l.inputSmall,type:"number",value:u,onChange:e=>m(Number(e.target.value))})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"ILP port (writes)"),n.createElement("input",{style:l.inputSmall,type:"number",value:c,onChange:e=>d(Number(e.target.value))})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"PostgreSQL wire port"),n.createElement("input",{style:l.inputSmall,type:"number",value:p,onChange:e=>g(Number(e.target.value))}),n.createElement("span",{style:l.hint},"for Grafana")),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Container network"),n.createElement("input",{style:l.input,value:z,onChange:e=>L(e.target.value)}),n.createElement("span",{style:l.hint},"shared with signalk-grafana"))),n.createElement("div",{style:l.sectionTitle},"Recording"),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Default sampling rate (ms)"),n.createElement("input",{style:l.inputSmall,type:"number",value:S,onChange:e=>w(Number(e.target.value))}),n.createElement("span",{style:l.hint},"1000 = max 1 write/sec per path (0 = every update)")),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Record own vessel"),n.createElement("input",{type:"checkbox",style:l.checkbox,checked:h,onChange:e=>v(e.target.checked)})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Record AIS targets"),n.createElement("input",{type:"checkbox",style:l.checkbox,checked:x,onChange:e=>k(e.target.checked)})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Retention (days)"),n.createElement("input",{style:l.inputSmall,type:"number",value:R,onChange:e=>C(Number(e.target.value))}),n.createElement("span",{style:l.hint},"0 = keep forever")),n.createElement(r,{title:"Compression (on-disk)"},n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Compression codec"),n.createElement("select",{style:l.select,value:T,onChange:e=>I(e.target.value)},n.createElement("option",{value:"none"},"None"),n.createElement("option",{value:"lz4"},"LZ4 (fast)"),n.createElement("option",{value:"zstd"},"ZSTD (smaller)")),n.createElement("span",{style:l.hint},"applies to new data after save")),"zstd"===T&&n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"ZSTD level"),n.createElement("input",{style:l.inputSmall,type:"number",min:"1",max:"22",value:B,onChange:e=>D(Number(e.target.value))}),n.createElement("span",{style:l.hint},"1 (fast) to 22 (smallest)"))),n.createElement(r,{title:"InfluxDB Migration"},n.createElement("div",{style:{display:"flex",gap:10,alignItems:"center",marginBottom:10}},n.createElement("button",{style:{...l.btn,...l.btnPrimary,...H?l.btnDisabled:{}},onClick:async()=>{O(!0),K("");try{const e=G?`?url=${encodeURIComponent(G)}`:"",t=await fetch(`/plugins/signalk-questdb/api/migration/detect${e}`);if(t.ok){const e=await t.json();j(e.sources),0===e.sources.length&&(K(G?`No InfluxDB found at ${G}.`:"No InfluxDB instances detected on localhost:8086."),J(!1))}}catch(e){K("Detection failed: "+e.message),J(!0)}O(!1)},disabled:H},H?"Detecting...":"Detect InfluxDB"),n.createElement("span",{style:l.hint},"Checks localhost:8086 for InfluxDB 1.x and 2.x")),V&&V.length>0&&n.createElement("div",null,V.map((e,t)=>n.createElement("div",{key:t,style:l.migrationItem},n.createElement("div",{style:{...l.cardIcon,width:36,height:36,fontSize:16,background:"influxdb2"===e.type?"#020a47":"#22adf6",color:"#fff"}},"influxdb2"===e.type?"2":"1"),n.createElement("div",{style:l.cardInfo},n.createElement("div",{style:l.cardTitle},"InfluxDB ","influxdb2"===e.type?"2.x":"1.x",n.createElement("span",{style:{...l.tag,...l.tagLatest}},e.status)),n.createElement("div",{style:l.cardMeta},e.url," · v",e.version))))),n.createElement("div",{style:{...l.fieldRow,marginTop:10}},n.createElement("span",{style:l.label},"Manual InfluxDB URL"),n.createElement("input",{style:l.input,placeholder:"http://192.168.1.100:8086",value:G,onChange:e=>_(e.target.value)}),n.createElement("span",{style:l.hint},"for remote instances")),V&&0===V.length&&!H&&n.createElement("div",{style:{...l.empty,padding:"16px",textAlign:"left"}},"No InfluxDB found on localhost. Use manual URL above for remote instances.")),n.createElement(r,{title:"Data Export"},n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"From"),n.createElement("input",{style:l.input,type:"datetime-local",value:se,onChange:e=>ie(e.target.value)})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"To"),n.createElement("input",{style:l.input,type:"datetime-local",value:ce,onChange:e=>de(e.target.value)})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Format"),n.createElement("select",{style:l.select,value:ue,onChange:e=>me(e.target.value)},n.createElement("option",{value:"parquet"},"Parquet"),n.createElement("option",{value:"csv"},"CSV"))),n.createElement("button",{style:{...l.btn,...l.btnPrimary,...pe?l.btnDisabled:{}},onClick:async()=>{if(!se||!ce)return K("Set both from and to dates for export."),void J(!0);ge(!0),K(`Exporting ${ue.toUpperCase()}...`),J(!1);try{const e=`/plugins/signalk-questdb/api/export?from=${encodeURIComponent(se)}&to=${encodeURIComponent(ce)}&format=${ue}`,t=await fetch(e);if(!t.ok){const e=await t.json().catch(()=>({error:t.statusText}));return K(`Export failed: ${e.error}`),J(!0),void ge(!1)}const a=await t.blob(),n="parquet"===ue?"parquet":"csv",l=document.createElement("a");l.href=URL.createObjectURL(a),l.download=`signalk-export-${se.slice(0,10)}.${n}`,l.click(),URL.revokeObjectURL(l.href),K(`Exported ${(a.size/1024/1024).toFixed(1)} MB`)}catch(e){K(`Export failed: ${e.message}`),J(!0)}ge(!1)},disabled:pe},pe?"Exporting...":"Export Data")),Z&&n.createElement("div",{style:{...l.status,color:X?"#ef4444":"#10b981",marginTop:16}},Z),n.createElement("div",{style:{marginTop:24}},n.createElement("button",{style:{...l.btn,...l.btnSave},onClick:()=>{t({questdbHost:s,questdbIlpPort:c,questdbHttpPort:u,questdbPgPort:p,questdbVersion:f,managedContainer:b,defaultSamplingRate:S,recordSelf:h,recordOthers:x,retentionDays:R,compression:T,compressionLevel:B,networkName:z,exposeToContainers:q,pathFilter:a.pathFilter||{mode:"exclude",paths:[]},samplingRates:a.samplingRates||{}}),K("Saved! Plugin will restart with new configuration."),J(!1)}},"Save Configuration")))}}}]);
1
+ "use strict";(self.webpackChunksignalk_questdb=self.webpackChunksignalk_questdb||[]).push([[805],{805(e,t,a){a.r(t),a.d(t,{default:()=>i});var n=a(231);const l={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}};function r({title:e,children:t}){const[a,r]=(0,n.useState)(!1);return n.createElement("div",null,n.createElement("button",{type:"button","aria-expanded":a,style:{...l.sectionTitle,cursor:"pointer",userSelect:"none",display:"flex",alignItems:"center",gap:6,width:"100%",textAlign:"left",background:"none",border:"none",padding:0},onClick:()=>r(!a)},n.createElement("span",{style:{fontSize:10,transition:"transform 0.15s",transform:a?"rotate(90deg)":"rotate(0deg)"}},"▶"),e),a&&n.createElement("div",{style:{marginBottom:16}},t))}function o(e){return null==e?"—":e>=1e6?(e/1e6).toFixed(1)+"M":e>=1e3?(e/1e3).toFixed(1)+"K":String(e)}function i({configuration:e,save:t}){const a=e||{},[i,s]=(0,n.useState)(a.questdbHost||"127.0.0.1"),[c,d]=(0,n.useState)(a.questdbIlpPort||9009),[u,m]=(0,n.useState)(a.questdbHttpPort||9e3),[p,g]=(0,n.useState)(a.questdbPgPort||8812),[f,y]=(0,n.useState)(a.questdbVersion||"latest"),[b,h]=(0,n.useState)(!1!==a.managedContainer),[E,v]=(0,n.useState)(!1!==a.recordSelf),[x,w]=(0,n.useState)(a.recordOthers||!1),[k,S]=(0,n.useState)(a.defaultSamplingRate??2e3),[R,C]=(0,n.useState)(a.retentionDays||0),[B,T]=(0,n.useState)("include"===a.pathFilter?.mode?"include":"exclude"),[D,I]=(0,n.useState)((Array.isArray(a.pathFilter?.paths)?a.pathFilter.paths:[]).join("\n")),[z,L]=(0,n.useState)(a.compression||"lz4"),[P,q]=(0,n.useState)(a.compressionLevel||3),[Q,$]=(0,n.useState)(a.networkName||"sk-network"),[F,N]=(0,n.useState)(a.exposeToContainers||!1),[A,U]=(0,n.useState)([]),[j,M]=(0,n.useState)(!1),[W,V]=(0,n.useState)(null),[H,O]=(0,n.useState)(!0),[G,_]=(0,n.useState)(null),[K,Z]=(0,n.useState)(!1),[X,Y]=(0,n.useState)(""),[J,ee]=(0,n.useState)(""),[te,ae]=(0,n.useState)(!1),[ne,le]=(0,n.useState)(null),[re,oe]=(0,n.useState)(!1),[ie,se]=(0,n.useState)(!1),[ce,de]=(0,n.useState)(!1),ue=(0,n.useCallback)(async()=>{M(!0);try{const e=await fetch("/plugins/signalk-questdb/api/versions");if(e.ok){const t=await e.json();U(t)}}catch{}M(!1)},[]),me=(0,n.useCallback)(async()=>{try{const e=await fetch("/plugins/signalk-questdb/api/status");e.ok?V(await e.json()):V({status:"not_running"})}catch{V({status:"not_running"})}O(!1)},[]);(0,n.useEffect)(()=>{ue(),me();const e=setInterval(me,5e3);return()=>clearInterval(e)},[ue,me]);const[pe,ge]=(0,n.useState)(""),[fe,ye]=(0,n.useState)(""),[be,he]=(0,n.useState)("parquet"),[Ee,ve]=(0,n.useState)(!1),xe=W&&"running"===W.status,we=xe&&W.suspendedTables||[],ke=we.length>0,Se=xe&&W.schemaMismatch||!1,Re=xe&&W.ulimitClamp||null,Ce=A.filter(e=>!e.prerelease).slice(0,3),Be=A.filter(e=>e.prerelease).slice(0,2);return n.createElement("div",{style:l.root},n.createElement("div",{style:l.sectionTitle},"QuestDB Status"),H?n.createElement("div",{style:l.empty},"Checking QuestDB..."):xe?n.createElement(n.Fragment,null,ke&&n.createElement("div",{style:l.warnBanner},n.createElement("div",{style:l.warnBannerTitle},"QuestDB WAL suspended — recording stalled"),"Rows are arriving but no longer commit, so the counts below have stopped advancing. This usually follows a torn write (often a low host ",n.createElement("code",null,"fs.file-max")," limit). Resume each suspended table in the QuestDB SQL console (",n.createElement("code",null,":9000"),"), skipping the broken transaction:",n.createElement("code",{style:l.warnBannerCode},we.map(e=>`ALTER TABLE "${String(e.name).replace(/"/g,'""')}" RESUME WAL FROM TXN ${e.writerTxn+1}; -- ${o(e.txnLag)} txns behind`).join("\n"))),Se&&n.createElement("div",{style:l.warnBanner},n.createElement("div",{style:l.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.)"),Re&&n.createElement("div",{style:l.infoBanner},n.createElement("div",{style:l.warnBannerTitle},"QuestDB open-files limit capped by the host"),"QuestDB requested a ",n.createElement("code",null,Re.ulimit)," limit of"," ",o(Re.requested),", but this host only allows"," ",o(Re.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 ",n.createElement("code",null,"user@.service")," ",n.createElement("code",null,"LimitNOFILE")," drop-in (editing"," ",n.createElement("code",null,"/etc/security/limits.conf")," alone is usually not enough) — then restart the QuestDB container."," ",n.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"),"."),n.createElement("div",{style:l.card},n.createElement("div",{style:{...l.cardIcon,background:"#7c3aed",color:"#fff"}},"Q"),n.createElement("div",{style:l.cardInfo},n.createElement("div",{style:l.cardTitle},"QuestDB"),n.createElement("div",{style:l.cardMeta},W?.endpoint||`${i}:${u}`," ","· ",ke?"WAL suspended":"Recording")),n.createElement("div",{style:{...l.stateIndicator,background:ke?"#ef4444":"#10b981"},title:ke?"WAL suspended":"Running"})),n.createElement("div",{style:l.statsGrid},n.createElement("div",{style:l.statCard},n.createElement("div",{style:l.statValue},o(W.totalRows)),n.createElement("div",{style:l.statLabel},"Total Rows")),n.createElement("div",{style:l.statCard},n.createElement("div",{style:l.statValue},o(W.activePathsToday)),n.createElement("div",{style:l.statLabel},"Active Paths Today"))),n.createElement("div",{style:{display:"flex",alignItems:"center",gap:10,marginBottom:12}},ne&&ne.updateAvailable?n.createElement(n.Fragment,null,n.createElement("span",{style:{fontSize:13}},"v",ne.currentVersion," →"," ",n.createElement("strong",null,"v",ne.latestVersion)," available"),n.createElement("button",{style:{...l.btn,...l.btnPrimary,padding:"4px 12px",fontSize:12,...ie?l.btnDisabled:{}},onClick:async()=>{se(!0),ee("Pulling new image and restarting..."),ae(!1);try{const e=await fetch("/plugins/signalk-questdb/api/update/apply",{method:"POST"});if(e.ok){const t=await e.json();ee(t.message),le(null),t.newVersion&&y(t.newVersion),me()}else{const t=await e.json().catch(()=>({error:e.statusText}));ee(`Update failed: ${t.error}`),ae(!0)}}catch(e){ee(`Update failed: ${e.message}`),ae(!0)}se(!1)},disabled:ie},ie?"Updating...":"Update QuestDB")):ne&&!ne.updateAvailable?n.createElement("span",{style:{fontSize:12,color:"#888"}},"v",ne.currentVersion," (up to date)"):n.createElement("button",{style:{...l.btn,padding:"4px 12px",fontSize:12,background:"#f1f5f9",color:"#475569",border:"1px solid #e2e8f0",...re?l.btnDisabled:{}},onClick:async()=>{oe(!0);try{const e=await fetch("/plugins/signalk-questdb/api/update/check");e.ok&&le(await e.json())}catch{}oe(!1)},disabled:re},re?"Checking...":"Check for updates"))):n.createElement("div",{style:l.card},n.createElement("div",{style:{...l.cardIcon,background:"#fef2f2",color:"#ef4444"}},"Q"),n.createElement("div",{style:l.cardInfo},n.createElement("div",{style:l.cardTitle},"QuestDB"),n.createElement("div",{style:l.cardMeta},"unhealthy"===W?.status?"Not responding":"Not running",b?" — enable plugin to start container":"")),n.createElement("div",{style:{...l.stateIndicator,background:"#ef4444"}})),n.createElement("div",{style:l.sectionTitle},"Image Version"),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"QuestDB version"),n.createElement("select",{style:l.select,value:f,onChange:e=>y(e.target.value)},n.createElement("option",{value:"latest"},"latest (recommended)"),Be.map(e=>n.createElement("option",{key:e.tag,value:e.tag},e.tag," (pre-release)")),Ce.map((e,t)=>n.createElement("option",{key:e.tag,value:e.tag},e.tag,0===t?" (current stable)":""))),j&&n.createElement("span",{style:l.hint},"loading releases..."),n.createElement("button",{style:{...l.btn,...l.btnPrimary,padding:"4px 10px",fontSize:11},onClick:ue},"↻")),n.createElement("div",{style:l.sectionTitle},"Connection"),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Managed container"),n.createElement("input",{type:"checkbox",style:l.checkbox,checked:b,onChange:e=>h(e.target.checked)}),n.createElement("span",{style:l.hint},b?"signalk-container manages QuestDB":"Connect to external QuestDB")),!b&&n.createElement(n.Fragment,null,n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"QuestDB host"),n.createElement("input",{style:l.input,value:i,onChange:e=>s(e.target.value)})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"HTTP port (queries)"),n.createElement("input",{style:l.inputSmall,type:"number",value:u,onChange:e=>m(Number(e.target.value))})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"ILP port (writes)"),n.createElement("input",{style:l.inputSmall,type:"number",value:c,onChange:e=>d(Number(e.target.value))}))),b&&n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Bind to 0.0.0.0"),n.createElement("input",{type:"checkbox",style:l.checkbox,checked:F,onChange:e=>N(e.target.checked)}),n.createElement("span",{style:{...l.hint,color:F?"#ef4444":void 0}},F?"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")),b&&F&&n.createElement(n.Fragment,null,n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"HTTP port (queries)"),n.createElement("input",{style:l.inputSmall,type:"number",value:u,onChange:e=>m(Number(e.target.value))})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"ILP port (writes)"),n.createElement("input",{style:l.inputSmall,type:"number",value:c,onChange:e=>d(Number(e.target.value))})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"PostgreSQL wire port"),n.createElement("input",{style:l.inputSmall,type:"number",value:p,onChange:e=>g(Number(e.target.value))}),n.createElement("span",{style:l.hint},"for Grafana")),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Container network"),n.createElement("input",{style:l.input,value:Q,onChange:e=>$(e.target.value)}),n.createElement("span",{style:l.hint},"shared with signalk-grafana"))),n.createElement("div",{style:l.sectionTitle},"Recording"),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Default sampling rate (ms)"),n.createElement("input",{style:l.inputSmall,type:"number",value:k,onChange:e=>S(Number(e.target.value))}),n.createElement("span",{style:l.hint},"1000 = max 1 write/sec per path (0 = every update)")),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Record own vessel"),n.createElement("input",{type:"checkbox",style:l.checkbox,checked:E,onChange:e=>v(e.target.checked)})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Record AIS targets"),n.createElement("input",{type:"checkbox",style:l.checkbox,checked:x,onChange:e=>w(e.target.checked)})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Retention (days)"),n.createElement("input",{style:l.inputSmall,type:"number",value:R,onChange:e=>C(Number(e.target.value))}),n.createElement("span",{style:l.hint},"0 = keep forever")),n.createElement(r,{title:"Path filtering"},n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Filter mode"),n.createElement("select",{style:l.select,value:B,onChange:e=>T(e.target.value)},n.createElement("option",{value:"exclude"},"Exclude matching paths"),n.createElement("option",{value:"include"},"Include only matching paths"))),n.createElement("div",{style:{marginBottom:10}},n.createElement("div",{style:{...l.label,width:"auto",marginBottom:6}},"Path patterns (one per line, glob supported)"),n.createElement("textarea",{style:l.textarea,value:D,onChange:e=>I(e.target.value),placeholder:"navigation.position\nnavigation.*\nnotifications.*"}),n.createElement("div",{style:l.hint},"exclude"===B?"These paths are NOT recorded; everything else is.":"ONLY these paths are recorded; everything else is dropped."," ","Leave empty to record everything."))),n.createElement(r,{title:"Compression (on-disk)"},n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Compression codec"),n.createElement("select",{style:l.select,value:z,onChange:e=>L(e.target.value)},n.createElement("option",{value:"none"},"None"),n.createElement("option",{value:"lz4"},"LZ4 (fast)"),n.createElement("option",{value:"zstd"},"ZSTD (smaller)")),n.createElement("span",{style:l.hint},"applies to new data after save")),"zstd"===z&&n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"ZSTD level"),n.createElement("input",{style:l.inputSmall,type:"number",min:"1",max:"22",value:P,onChange:e=>q(Number(e.target.value))}),n.createElement("span",{style:l.hint},"1 (fast) to 22 (smallest)"))),n.createElement(r,{title:"InfluxDB Migration"},n.createElement("div",{style:{display:"flex",gap:10,alignItems:"center",marginBottom:10}},n.createElement("button",{style:{...l.btn,...l.btnPrimary,...K?l.btnDisabled:{}},onClick:async()=>{Z(!0),ee("");try{const e=X?`?url=${encodeURIComponent(X)}`:"",t=await fetch(`/plugins/signalk-questdb/api/migration/detect${e}`);if(t.ok){const e=await t.json();_(e.sources),0===e.sources.length&&(ee(X?`No InfluxDB found at ${X}.`:"No InfluxDB instances detected on localhost:8086."),ae(!1))}}catch(e){ee("Detection failed: "+e.message),ae(!0)}Z(!1)},disabled:K},K?"Detecting...":"Detect InfluxDB"),n.createElement("span",{style:l.hint},"Checks localhost:8086 for InfluxDB 1.x and 2.x")),G&&G.length>0&&n.createElement("div",null,G.map((e,t)=>n.createElement("div",{key:t,style:l.migrationItem},n.createElement("div",{style:{...l.cardIcon,width:36,height:36,fontSize:16,background:"influxdb2"===e.type?"#020a47":"#22adf6",color:"#fff"}},"influxdb2"===e.type?"2":"1"),n.createElement("div",{style:l.cardInfo},n.createElement("div",{style:l.cardTitle},"InfluxDB ","influxdb2"===e.type?"2.x":"1.x",n.createElement("span",{style:{...l.tag,...l.tagLatest}},e.status)),n.createElement("div",{style:l.cardMeta},e.url," · v",e.version))))),n.createElement("div",{style:{...l.fieldRow,marginTop:10}},n.createElement("span",{style:l.label},"Manual InfluxDB URL"),n.createElement("input",{style:l.input,placeholder:"http://192.168.1.100:8086",value:X,onChange:e=>Y(e.target.value)}),n.createElement("span",{style:l.hint},"for remote instances")),G&&0===G.length&&!K&&n.createElement("div",{style:{...l.empty,padding:"16px",textAlign:"left"}},"No InfluxDB found on localhost. Use manual URL above for remote instances.")),n.createElement(r,{title:"Data Export"},n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"From"),n.createElement("input",{style:l.input,type:"datetime-local",value:pe,onChange:e=>ge(e.target.value)})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"To"),n.createElement("input",{style:l.input,type:"datetime-local",value:fe,onChange:e=>ye(e.target.value)})),n.createElement("div",{style:l.fieldRow},n.createElement("span",{style:l.label},"Format"),n.createElement("select",{style:l.select,value:be,onChange:e=>he(e.target.value)},n.createElement("option",{value:"parquet"},"Parquet"),n.createElement("option",{value:"csv"},"CSV"))),n.createElement("button",{style:{...l.btn,...l.btnPrimary,...Ee?l.btnDisabled:{}},onClick:async()=>{if(!pe||!fe)return ee("Set both from and to dates for export."),void ae(!0);ve(!0),ee(`Exporting ${be.toUpperCase()}...`),ae(!1);try{const e=`/plugins/signalk-questdb/api/export?from=${encodeURIComponent(pe)}&to=${encodeURIComponent(fe)}&format=${be}`,t=await fetch(e);if(!t.ok){const e=await t.json().catch(()=>({error:t.statusText}));return ee(`Export failed: ${e.error}`),ae(!0),void ve(!1)}const a=await t.blob(),n="parquet"===be?"parquet":"csv",l=document.createElement("a");l.href=URL.createObjectURL(a),l.download=`signalk-export-${pe.slice(0,10)}.${n}`,l.click(),URL.revokeObjectURL(l.href),ee(`Exported ${(a.size/1024/1024).toFixed(1)} MB`)}catch(e){ee(`Export failed: ${e.message}`),ae(!0)}ve(!1)},disabled:Ee},Ee?"Exporting...":"Export Data")),!1!==a.managedContainer&&n.createElement(r,{title:"Danger zone"},n.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."),n.createElement("button",{style:{...l.btn,...l.btnDanger,...ce?l.btnDisabled:{}},onClick:async()=>{if(window.confirm("Remove the QuestDB container and DELETE ALL recorded data? This cannot be undone.")){de(!0),ee("Removing QuestDB container and data..."),ae(!1);try{const e=await fetch("/plugins/signalk-questdb/api/purge-data",{method:"POST"}),t=await e.json().catch(()=>({error:e.statusText}));e.ok?(ee(t.message),me()):(ee(`Remove failed: ${t.error}`),ae(!0))}catch(e){ee(`Remove failed: ${e.message}`),ae(!0)}de(!1)}},disabled:ce},ce?"Removing...":"Remove container & all data")),J&&n.createElement("div",{style:{...l.status,color:te?"#ef4444":"#10b981",marginTop:16}},J),n.createElement("div",{style:{marginTop:24}},n.createElement("button",{style:{...l.btn,...l.btnSave},onClick:()=>{t({questdbHost:i,questdbIlpPort:c,questdbHttpPort:u,questdbPgPort:p,questdbVersion:f,managedContainer:b,defaultSamplingRate:k,recordSelf:E,recordOthers:x,retentionDays:R,compression:z,compressionLevel:P,networkName:Q,exposeToContainers:F,pathFilter:{mode:B,paths:D.split("\n").map(e=>e.trim()).filter(Boolean)},samplingRates:a.samplingRates||{}}),ee("Saved! Plugin will restart with new configuration."),ae(!1)}},"Save Configuration")))}}}]);