signalk-questdb 1.5.3 → 1.5.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/README.md +29 -0
- package/dist/history-v2.js +32 -2
- package/dist/history-v2.js.map +1 -1
- package/dist/host-limits.d.ts +9 -0
- package/dist/host-limits.js +58 -0
- package/dist/host-limits.js.map +1 -0
- package/dist/index.js +33 -1
- package/dist/index.js.map +1 -1
- package/dist/query-client.d.ts +1 -1
- package/dist/query-client.js +13 -2
- package/dist/query-client.js.map +1 -1
- package/dist/test/history-v2.test.js +93 -0
- package/dist/test/history-v2.test.js.map +1 -1
- package/dist/test/host-limits.test.d.ts +1 -0
- package/dist/test/host-limits.test.js +71 -0
- package/dist/test/host-limits.test.js.map +1 -0
- package/dist/test/query-client.test.js +72 -0
- package/dist/test/query-client.test.js.map +1 -1
- package/package.json +1 -1
- package/public/540.js +1 -1
- package/public/805.js +1 -1
- package/public/main.js +1 -1
- package/public/remoteEntry.js +1 -1
|
@@ -130,4 +130,97 @@ const SELF_CONTEXT = "vessels.urn:mrn:imo:mmsi:123456789";
|
|
|
130
130
|
}
|
|
131
131
|
});
|
|
132
132
|
});
|
|
133
|
+
(0, node_test_1.describe)("history-v2 sample bucket guard", () => {
|
|
134
|
+
(0, node_test_1.it)("rejects a resolution that would fabricate millions of FILL(NULL) rows", async () => {
|
|
135
|
+
const captured = [];
|
|
136
|
+
const provider = (0, history_v2_1.createHistoryProviderV2)(makeMockClient(captured), SELF_CONTEXT);
|
|
137
|
+
// 60 days at 1s resolution = 5.18M buckets — over the 1M cap.
|
|
138
|
+
await strict_1.default.rejects(provider.getValues({
|
|
139
|
+
from: { toString: () => "2024-01-01T00:00:00Z" },
|
|
140
|
+
to: { toString: () => "2024-03-01T00:00:00Z" },
|
|
141
|
+
resolution: 1,
|
|
142
|
+
pathSpecs: [
|
|
143
|
+
{ path: "navigation.position", aggregate: "first", parameter: [] },
|
|
144
|
+
],
|
|
145
|
+
}), /sample buckets/);
|
|
146
|
+
// The guard must fire before any SQL reaches QuestDB.
|
|
147
|
+
strict_1.default.equal(captured.length, 0);
|
|
148
|
+
});
|
|
149
|
+
(0, node_test_1.it)("allows the same range at a sane resolution", async () => {
|
|
150
|
+
const captured = [];
|
|
151
|
+
const provider = (0, history_v2_1.createHistoryProviderV2)(makeMockClient(captured), SELF_CONTEXT);
|
|
152
|
+
await provider.getValues({
|
|
153
|
+
from: { toString: () => "2024-01-01T00:00:00Z" },
|
|
154
|
+
to: { toString: () => "2024-03-01T00:00:00Z" },
|
|
155
|
+
resolution: 2600, // ~2000 buckets, the well-behaved-client budget
|
|
156
|
+
pathSpecs: [
|
|
157
|
+
{ path: "navigation.position", aggregate: "first", parameter: [] },
|
|
158
|
+
],
|
|
159
|
+
});
|
|
160
|
+
strict_1.default.equal(captured.length, 1);
|
|
161
|
+
strict_1.default.ok(captured[0].sql.includes("SAMPLE BY 2600s"));
|
|
162
|
+
});
|
|
163
|
+
(0, node_test_1.it)("clamps fractional resolutions to 1s instead of SAMPLE BY 0s", async () => {
|
|
164
|
+
const captured = [];
|
|
165
|
+
const provider = (0, history_v2_1.createHistoryProviderV2)(makeMockClient(captured), SELF_CONTEXT);
|
|
166
|
+
await provider.getValues({
|
|
167
|
+
from: { toString: () => "2024-01-01T00:00:00Z" },
|
|
168
|
+
to: { toString: () => "2024-01-01T01:00:00Z" },
|
|
169
|
+
resolution: 0.5,
|
|
170
|
+
pathSpecs: [
|
|
171
|
+
{
|
|
172
|
+
path: "navigation.speedOverGround",
|
|
173
|
+
aggregate: "average",
|
|
174
|
+
parameter: [],
|
|
175
|
+
},
|
|
176
|
+
],
|
|
177
|
+
});
|
|
178
|
+
strict_1.default.equal(captured.length, 1);
|
|
179
|
+
strict_1.default.ok(captured[0].sql.includes("SAMPLE BY 1s"), `expected SAMPLE BY 1s, got: ${captured[0].sql}`);
|
|
180
|
+
});
|
|
181
|
+
(0, node_test_1.it)("caps the fabricated total across multiple sampled paths", async () => {
|
|
182
|
+
const captured = [];
|
|
183
|
+
const provider = (0, history_v2_1.createHistoryProviderV2)(makeMockClient(captured), SELF_CONTEXT);
|
|
184
|
+
// 7 days at 1s = ~605K buckets per series: one series passes the 1M cap,
|
|
185
|
+
// two series must not slip past it (1.21M fabricated rows total).
|
|
186
|
+
await strict_1.default.rejects(provider.getValues({
|
|
187
|
+
from: { toString: () => "2024-01-01T00:00:00Z" },
|
|
188
|
+
to: { toString: () => "2024-01-08T00:00:00Z" },
|
|
189
|
+
resolution: 1,
|
|
190
|
+
pathSpecs: [
|
|
191
|
+
{ path: "navigation.position", aggregate: "first", parameter: [] },
|
|
192
|
+
{
|
|
193
|
+
path: "navigation.speedOverGround",
|
|
194
|
+
aggregate: "average",
|
|
195
|
+
parameter: [],
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
}), /sample buckets/);
|
|
199
|
+
strict_1.default.equal(captured.length, 0);
|
|
200
|
+
});
|
|
201
|
+
(0, node_test_1.it)("does not reject client-side aggregates, which never SAMPLE BY", async () => {
|
|
202
|
+
// 60 days at 1s would be 5.18M buckets — but every client-side aggregate
|
|
203
|
+
// reads raw rows under a LIMIT, so the cap must not apply to any of them.
|
|
204
|
+
const cases = [
|
|
205
|
+
["sma", ["5"]],
|
|
206
|
+
["ema", ["0.2"]],
|
|
207
|
+
["middle_index", []],
|
|
208
|
+
];
|
|
209
|
+
for (const [aggregate, parameter] of cases) {
|
|
210
|
+
const captured = [];
|
|
211
|
+
const provider = (0, history_v2_1.createHistoryProviderV2)(makeMockClient(captured), SELF_CONTEXT);
|
|
212
|
+
await provider.getValues({
|
|
213
|
+
from: { toString: () => "2024-01-01T00:00:00Z" },
|
|
214
|
+
to: { toString: () => "2024-03-01T00:00:00Z" },
|
|
215
|
+
resolution: 1,
|
|
216
|
+
pathSpecs: [
|
|
217
|
+
{ path: "navigation.speedOverGround", aggregate, parameter },
|
|
218
|
+
],
|
|
219
|
+
});
|
|
220
|
+
strict_1.default.equal(captured.length, 1, `no query captured for '${aggregate}'`);
|
|
221
|
+
strict_1.default.ok(captured[0].sql.includes("LIMIT 50000") &&
|
|
222
|
+
!captured[0].sql.includes("SAMPLE BY"), `expected raw-row LIMIT query for '${aggregate}', got: ${captured[0].sql}`);
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
});
|
|
133
226
|
//# sourceMappingURL=history-v2.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"history-v2.test.js","sourceRoot":"","sources":["../../src/test/history-v2.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"history-v2.test.js","sourceRoot":"","sources":["../../src/test/history-v2.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAyC;AACzC,gEAAwC;AACxC,8CAAwD;AAMxD,SAAS,cAAc,CAAC,QAAyB;IAC/C,OAAO;QACL,IAAI,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;YAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QAC9D,CAAC;KACK,CAAC;AACX,CAAC;AAED,MAAM,YAAY,GAAG,oCAAoC,CAAC;AAE1D,IAAA,oBAAQ,EAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAA,cAAE,EAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,oCAAuB,EACtC,cAAc,CAAC,QAAQ,CAAC,EACxB,YAAY,CACb,CAAC;QAEF,MAAM,QAAQ,CAAC,SAAS,CAAC;YACvB,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAChD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAC9C,OAAO,EAAE,cAAc;YACvB,SAAS,EAAE;gBACT;oBACE,IAAI,EAAE,4BAA4B;oBAClC,SAAS,EAAE,SAAS;oBACpB,SAAS,EAAE,EAAE;iBACd;aACF;SACK,CAAC,CAAC;QAEV,gBAAM,CAAC,EAAE,CACP,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAC5C,qDAAqD,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CACvE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,oCAAuB,EACtC,cAAc,CAAC,QAAQ,CAAC,EACxB,YAAY,CACb,CAAC;QAEF,MAAM,QAAQ,CAAC,SAAS,CAAC;YACvB,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAChD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAC9C,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE;gBACT;oBACE,IAAI,EAAE,4BAA4B;oBAClC,SAAS,EAAE,SAAS;oBACpB,SAAS,EAAE,EAAE;iBACd;aACF;SACK,CAAC,CAAC;QAEV,gBAAM,CAAC,EAAE,CACP,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAC5C,qDAAqD,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CACvE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,oCAAuB,EACtC,cAAc,CAAC,QAAQ,CAAC,EACxB,YAAY,CACb,CAAC;QAEF,MAAM,QAAQ,CAAC,SAAS,CAAC;YACvB,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAChD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAC9C,OAAO,EAAE,MAAM;YACf,SAAS,EAAE;gBACT;oBACE,IAAI,EAAE,4BAA4B;oBAClC,SAAS,EAAE,SAAS;oBACpB,SAAS,EAAE,EAAE;iBACd;aACF;SACK,CAAC,CAAC;QAEV,gBAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,oCAAuB,EACtC,cAAc,CAAC,QAAQ,CAAC,EACxB,YAAY,CACb,CAAC;QAEF,MAAM,WAAW,GAAG,oCAAoC,CAAC;QACzD,MAAM,QAAQ,CAAC,SAAS,CAAC;YACvB,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAChD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAC9C,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE;gBACT;oBACE,IAAI,EAAE,4BAA4B;oBAClC,SAAS,EAAE,SAAS;oBACpB,SAAS,EAAE,EAAE;iBACd;aACF;SACK,CAAC,CAAC;QAEV,gBAAM,CAAC,EAAE,CACP,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,WAAW,GAAG,CAAC,EACtD,oDAAoD,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CACtE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,oCAAuB,EACtC,cAAc,CAAC,QAAQ,CAAC,EACxB,YAAY,CACb,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC;YACtC,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAChD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAC9C,SAAS,EAAE;gBACT;oBACE,IAAI,EAAE,4BAA4B;oBAClC,SAAS,EAAE,SAAS;oBACpB,SAAS,EAAE,EAAE;iBACd;aACF;SACK,CAAC,CAAC;QAEV,gBAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC7C,gBAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,oBAAQ,EAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,KAAK,UAAU,kBAAkB,CAAC,SAAiB;QACjD,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,oCAAuB,EACtC,cAAc,CAAC,QAAQ,CAAC,EACxB,YAAY,CACb,CAAC;QAEF,MAAM,QAAQ,CAAC,SAAS,CAAC;YACvB,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAChD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAC9C,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;SAChE,CAAC,CAAC;QAEV,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzB,CAAC;IAED,IAAA,cAAE,EAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC9C,gBAAM,CAAC,EAAE,CACP,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EACxD,wCAAwC,GAAG,EAAE,CAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC7C,gBAAM,CAAC,EAAE,CACP,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EACtD,sCAAsC,GAAG,EAAE,CAC5C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,KAAK,MAAM,SAAS,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;YACzE,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAChD,gBAAM,CAAC,EAAE,CACP,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EACxD,uCAAuC,SAAS,WAAW,GAAG,EAAE,CACjE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,oBAAQ,EAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,IAAA,cAAE,EAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,oCAAuB,EACtC,cAAc,CAAC,QAAQ,CAAC,EACxB,YAAY,CACb,CAAC;QAEF,8DAA8D;QAC9D,MAAM,gBAAM,CAAC,OAAO,CAClB,QAAQ,CAAC,SAAS,CAAC;YACjB,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAChD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAC9C,UAAU,EAAE,CAAC;YACb,SAAS,EAAE;gBACT,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;aACnE;SACK,CAAC,EACT,gBAAgB,CACjB,CAAC;QACF,sDAAsD;QACtD,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,oCAAuB,EACtC,cAAc,CAAC,QAAQ,CAAC,EACxB,YAAY,CACb,CAAC;QAEF,MAAM,QAAQ,CAAC,SAAS,CAAC;YACvB,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAChD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAC9C,UAAU,EAAE,IAAI,EAAE,gDAAgD;YAClE,SAAS,EAAE;gBACT,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;aACnE;SACK,CAAC,CAAC;QAEV,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjC,gBAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,oCAAuB,EACtC,cAAc,CAAC,QAAQ,CAAC,EACxB,YAAY,CACb,CAAC;QAEF,MAAM,QAAQ,CAAC,SAAS,CAAC;YACvB,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAChD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAC9C,UAAU,EAAE,GAAG;YACf,SAAS,EAAE;gBACT;oBACE,IAAI,EAAE,4BAA4B;oBAClC,SAAS,EAAE,SAAS;oBACpB,SAAS,EAAE,EAAE;iBACd;aACF;SACK,CAAC,CAAC;QAEV,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACjC,gBAAM,CAAC,EAAE,CACP,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,EACxC,+BAA+B,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CACjD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,oCAAuB,EACtC,cAAc,CAAC,QAAQ,CAAC,EACxB,YAAY,CACb,CAAC;QAEF,yEAAyE;QACzE,kEAAkE;QAClE,MAAM,gBAAM,CAAC,OAAO,CAClB,QAAQ,CAAC,SAAS,CAAC;YACjB,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAChD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;YAC9C,UAAU,EAAE,CAAC;YACb,SAAS,EAAE;gBACT,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;gBAClE;oBACE,IAAI,EAAE,4BAA4B;oBAClC,SAAS,EAAE,SAAS;oBACpB,SAAS,EAAE,EAAE;iBACd;aACF;SACK,CAAC,EACT,gBAAgB,CACjB,CAAC;QACF,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,yEAAyE;QACzE,0EAA0E;QAC1E,MAAM,KAAK,GAAyB;YAClC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,cAAc,EAAE,EAAE,CAAC;SACrB,CAAC;QACF,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAoB,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,IAAA,oCAAuB,EACtC,cAAc,CAAC,QAAQ,CAAC,EACxB,YAAY,CACb,CAAC;YAEF,MAAM,QAAQ,CAAC,SAAS,CAAC;gBACvB,IAAI,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;gBAChD,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,sBAAsB,EAAE;gBAC9C,UAAU,EAAE,CAAC;gBACb,SAAS,EAAE;oBACT,EAAE,IAAI,EAAE,4BAA4B,EAAE,SAAS,EAAE,SAAS,EAAE;iBAC7D;aACK,CAAC,CAAC;YAEV,gBAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,0BAA0B,SAAS,GAAG,CAAC,CAAC;YACzE,gBAAM,CAAC,EAAE,CACP,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;gBACrC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EACxC,qCAAqC,SAAS,WAAW,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAC3E,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const strict_1 = __importDefault(require("node:assert/strict"));
|
|
8
|
+
const promises_1 = require("fs/promises");
|
|
9
|
+
const os_1 = require("os");
|
|
10
|
+
const path_1 = require("path");
|
|
11
|
+
const host_limits_1 = require("../host-limits");
|
|
12
|
+
(0, node_test_1.describe)("parseMaxMapCount", () => {
|
|
13
|
+
(0, node_test_1.it)("parses the proc file format (number + trailing newline)", () => {
|
|
14
|
+
strict_1.default.equal((0, host_limits_1.parseMaxMapCount)("65530\n"), 65530);
|
|
15
|
+
});
|
|
16
|
+
(0, node_test_1.it)("parses without a trailing newline", () => {
|
|
17
|
+
strict_1.default.equal((0, host_limits_1.parseMaxMapCount)("1048576"), 1048576);
|
|
18
|
+
});
|
|
19
|
+
(0, node_test_1.it)("rejects garbage", () => {
|
|
20
|
+
strict_1.default.equal((0, host_limits_1.parseMaxMapCount)(""), null);
|
|
21
|
+
strict_1.default.equal((0, host_limits_1.parseMaxMapCount)("not a number\n"), null);
|
|
22
|
+
strict_1.default.equal((0, host_limits_1.parseMaxMapCount)("-1\n"), null);
|
|
23
|
+
strict_1.default.equal((0, host_limits_1.parseMaxMapCount)("65530 65530\n"), null);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
(0, node_test_1.describe)("evaluateMaxMapCount", () => {
|
|
27
|
+
(0, node_test_1.it)("flags the stock Debian default as too low", () => {
|
|
28
|
+
const status = (0, host_limits_1.evaluateMaxMapCount)(65530);
|
|
29
|
+
strict_1.default.equal(status.tooLow, true);
|
|
30
|
+
strict_1.default.equal(status.current, 65530);
|
|
31
|
+
strict_1.default.equal(status.recommended, host_limits_1.RECOMMENDED_MAX_MAP_COUNT);
|
|
32
|
+
});
|
|
33
|
+
(0, node_test_1.it)("accepts exactly the recommended value", () => {
|
|
34
|
+
strict_1.default.equal((0, host_limits_1.evaluateMaxMapCount)(host_limits_1.RECOMMENDED_MAX_MAP_COUNT).tooLow, false);
|
|
35
|
+
});
|
|
36
|
+
(0, node_test_1.it)("flags one below the recommended value", () => {
|
|
37
|
+
strict_1.default.equal((0, host_limits_1.evaluateMaxMapCount)(host_limits_1.RECOMMENDED_MAX_MAP_COUNT - 1).tooLow, true);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
(0, node_test_1.describe)("readMaxMapCount", () => {
|
|
41
|
+
(0, node_test_1.it)("reads and evaluates a proc-style file", async () => {
|
|
42
|
+
const dir = await (0, promises_1.mkdtemp)((0, path_1.join)((0, os_1.tmpdir)(), "host-limits-"));
|
|
43
|
+
try {
|
|
44
|
+
const file = (0, path_1.join)(dir, "max_map_count");
|
|
45
|
+
await (0, promises_1.writeFile)(file, "65530\n");
|
|
46
|
+
const status = await (0, host_limits_1.readMaxMapCount)(file);
|
|
47
|
+
strict_1.default.ok(status);
|
|
48
|
+
strict_1.default.equal(status.current, 65530);
|
|
49
|
+
strict_1.default.equal(status.tooLow, true);
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
await (0, promises_1.rm)(dir, { recursive: true, force: true });
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
(0, node_test_1.it)("returns null when the file is missing (non-Linux hosts)", async () => {
|
|
56
|
+
const status = await (0, host_limits_1.readMaxMapCount)("/nonexistent/max_map_count");
|
|
57
|
+
strict_1.default.equal(status, null);
|
|
58
|
+
});
|
|
59
|
+
(0, node_test_1.it)("returns null on unparseable content instead of a bogus warning", async () => {
|
|
60
|
+
const dir = await (0, promises_1.mkdtemp)((0, path_1.join)((0, os_1.tmpdir)(), "host-limits-"));
|
|
61
|
+
try {
|
|
62
|
+
const file = (0, path_1.join)(dir, "max_map_count");
|
|
63
|
+
await (0, promises_1.writeFile)(file, "garbage\n");
|
|
64
|
+
strict_1.default.equal(await (0, host_limits_1.readMaxMapCount)(file), null);
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
await (0, promises_1.rm)(dir, { recursive: true, force: true });
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=host-limits.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-limits.test.js","sourceRoot":"","sources":["../../src/test/host-limits.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
@@ -183,4 +216,43 @@ const emptyResult = {
|
|
|
183
216
|
strict_1.default.deepEqual(client.toObjects(result), []);
|
|
184
217
|
});
|
|
185
218
|
});
|
|
219
|
+
(0, node_test_1.describe)("QueryClient statement timeout header", () => {
|
|
220
|
+
// A real (loopback) HTTP server instead of a fetch stub: the point is to
|
|
221
|
+
// assert what actually goes on the wire, since Statement-Timeout is only
|
|
222
|
+
// honored when QuestDB receives it as a request header.
|
|
223
|
+
async function captureHeaders(run) {
|
|
224
|
+
const http = await Promise.resolve().then(() => __importStar(require("node:http")));
|
|
225
|
+
let headers = {};
|
|
226
|
+
const server = http.createServer((req, res) => {
|
|
227
|
+
headers = req.headers;
|
|
228
|
+
res.setHeader("content-type", "application/json");
|
|
229
|
+
res.end(JSON.stringify({ columns: [], dataset: [], count: 0, timestamp: -1 }));
|
|
230
|
+
});
|
|
231
|
+
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
232
|
+
const port = server.address().port;
|
|
233
|
+
try {
|
|
234
|
+
await run(new query_client_1.QueryClient("127.0.0.1", port));
|
|
235
|
+
}
|
|
236
|
+
finally {
|
|
237
|
+
server.close();
|
|
238
|
+
}
|
|
239
|
+
return headers;
|
|
240
|
+
}
|
|
241
|
+
(0, node_test_1.it)("mirrors the exec() deadline into Statement-Timeout (ms)", async () => {
|
|
242
|
+
const headers = await captureHeaders((client) => client.exec("SELECT 1", 12345));
|
|
243
|
+
strict_1.default.equal(headers["statement-timeout"], "12345");
|
|
244
|
+
});
|
|
245
|
+
(0, node_test_1.it)("sends the default deadline when none is given", async () => {
|
|
246
|
+
const headers = await captureHeaders((client) => client.exec("SELECT 1"));
|
|
247
|
+
strict_1.default.equal(headers["statement-timeout"], "30000");
|
|
248
|
+
});
|
|
249
|
+
(0, node_test_1.it)("bounds CSV exports the same way", async () => {
|
|
250
|
+
const headers = await captureHeaders((client) => client.execCsv("SELECT 1"));
|
|
251
|
+
strict_1.default.equal(headers["statement-timeout"], "60000");
|
|
252
|
+
});
|
|
253
|
+
(0, node_test_1.it)("mirrors an explicit CSV deadline into Statement-Timeout", async () => {
|
|
254
|
+
const headers = await captureHeaders((client) => client.execCsv("SELECT 1", 12345));
|
|
255
|
+
strict_1.default.equal(headers["statement-timeout"], "12345");
|
|
256
|
+
});
|
|
257
|
+
});
|
|
186
258
|
//# 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":"
|
|
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
package/public/540.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see 540.js.LICENSE.txt */
|
|
2
|
-
"use strict";(self.webpackChunksignalk_questdb=self.webpackChunksignalk_questdb||[]).push([[540],{869(e,t){var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),c=Symbol.for("react.consumer"),i=Symbol.for("react.context"),a=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),l=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),y=Symbol.for("react.activity"),d=Symbol.iterator,h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,b={};function m(e,t,n){this.props=e,this.context=t,this.refs=b,this.updater=n||h}function v(){}function S(e,t,n){this.props=e,this.context=t,this.refs=b,this.updater=n||h}m.prototype.isReactComponent={},m.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},m.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=m.prototype;var E=S.prototype=new v;E.constructor=S,_(E,m.prototype),E.isPureReactComponent=!0;var g=Array.isArray;function w(){}var k={H:null,A:null,T:null,S:null},H=Object.prototype.hasOwnProperty;function j(e,t,r){var o=r.ref;return{$$typeof:n,type:e,key:t,ref:void 0!==o?o:null,props:r}}function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var R=/\/+/g;function $(e,t){return"object"==typeof e&&null!==e&&null!=e.key?(n=""+e.key,r={"=":"=0",":":"=2"},"$"+n.replace(/[=:]/g,function(e){return r[e]})):t.toString(36);var n,r}function T(e,t,o,u,s){var c=typeof e;"undefined"!==c&&"boolean"!==c||(e=null);var i,a,f=!1;if(null===e)f=!0;else switch(c){case"bigint":case"string":case"number":f=!0;break;case"object":switch(e.$$typeof){case n:case r:f=!0;break;case p:return T((f=e._init)(e._payload),t,o,u,s)}}if(f)return s=s(e),f=""===u?"."+$(e,0):u,g(s)?(o="",null!=f&&(o=f.replace(R,"$&/")+"/"),T(s,t,o,"",function(e){return e})):null!=s&&(C(s)&&(i=s,a=o+(null==s.key||e&&e.key===s.key?"":(""+s.key).replace(R,"$&/")+"/")+f,s=j(i.type,a,i.props)),t.push(s)),1;f=0;var l,y=""===u?".":u+":";if(g(e))for(var h=0;h<e.length;h++)f+=T(u=e[h],t,o,c=y+$(u,h),s);else if("function"==typeof(h=null===(l=e)||"object"!=typeof l?null:"function"==typeof(l=d&&l[d]||l["@@iterator"])?l:null))for(e=h.call(e),h=0;!(u=e.next()).done;)f+=T(u=u.value,t,o,c=y+$(u,h++),s);else if("object"===c){if("function"==typeof e.then)return T(function(e){switch(e.status){case"fulfilled":return e.value;case"rejected":throw e.reason;default:switch("string"==typeof e.status?e.then(w,w):(e.status="pending",e.then(function(t){"pending"===e.status&&(e.status="fulfilled",e.value=t)},function(t){"pending"===e.status&&(e.status="rejected",e.reason=t)})),e.status){case"fulfilled":return e.value;case"rejected":throw e.reason}}throw e}(e),t,o,u,s);throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.")}return f}function x(e,t,n){if(null==e)return e;var r=[],o=0;return T(e,r,"","",function(e){return t.call(n,e,o++)}),r}function A(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)},function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var O="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)},I={map:x,forEach:function(e,t,n){x(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return x(e,function(){t++}),t},toArray:function(e){return x(e,function(e){return e})||[]},only:function(e){if(!C(e))throw Error("React.Children.only expected to receive a single React element child.");return e}};t.Activity=y,t.Children=I,t.Component=m,t.Fragment=o,t.Profiler=s,t.PureComponent=S,t.StrictMode=u,t.Suspense=f,t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=k,t.__COMPILER_RUNTIME={__proto__:null,c:function(e){return k.H.useMemoCache(e)}},t.cache=function(e){return function(){return e.apply(null,arguments)}},t.cacheSignal=function(){return null},t.cloneElement=function(e,t,n){if(null==e)throw Error("The argument must be a React element, but you passed "+e+".");var r=_({},e.props),o=e.key;if(null!=t)for(u in void 0!==t.key&&(o=""+t.key),t)!H.call(t,u)||"key"===u||"__self"===u||"__source"===u||"ref"===u&&void 0===t.ref||(r[u]=t[u]);var u=arguments.length-2;if(1===u)r.children=n;else if(1<u){for(var s=Array(u),c=0;c<u;c++)s[c]=arguments[c+2];r.children=s}return j(e.type,o,r)},t.createContext=function(e){return(e={$$typeof:i,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider=e,e.Consumer={$$typeof:c,_context:e},e},t.createElement=function(e,t,n){var r,o={},u=null;if(null!=t)for(r in void 0!==t.key&&(u=""+t.key),t)H.call(t,r)&&"key"!==r&&"__self"!==r&&"__source"!==r&&(o[r]=t[r]);var s=arguments.length-2;if(1===s)o.children=n;else if(1<s){for(var c=Array(s),i=0;i<s;i++)c[i]=arguments[i+2];o.children=c}if(e&&e.defaultProps)for(r in s=e.defaultProps)void 0===o[r]&&(o[r]=s[r]);return j(e,u,o)},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:a,render:e}},t.isValidElement=C,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:A}},t.memo=function(e,t){return{$$typeof:l,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=k.T,n={};k.T=n;try{var r=e(),o=k.S;null!==o&&o(n,r),"object"==typeof r&&null!==r&&"function"==typeof r.then&&r.then(w,O)}catch(e){O(e)}finally{null!==t&&null!==n.types&&(t.types=n.types),k.T=t}},t.unstable_useCacheRefresh=function(){return k.H.useCacheRefresh()},t.use=function(e){return k.H.use(e)},t.useActionState=function(e,t,n){return k.H.useActionState(e,t,n)},t.useCallback=function(e,t){return k.H.useCallback(e,t)},t.useContext=function(e){return k.H.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e,t){return k.H.useDeferredValue(e,t)},t.useEffect=function(e,t){return k.H.useEffect(e,t)},t.useEffectEvent=function(e){return k.H.useEffectEvent(e)},t.useId=function(){return k.H.useId()},t.useImperativeHandle=function(e,t,n){return k.H.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return k.H.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return k.H.useLayoutEffect(e,t)},t.useMemo=function(e,t){return k.H.useMemo(e,t)},t.useOptimistic=function(e,t){return k.H.useOptimistic(e,t)},t.useReducer=function(e,t,n){return k.H.useReducer(e,t,n)},t.useRef=function(e){return k.H.useRef(e)},t.useState=function(e){return k.H.useState(e)},t.useSyncExternalStore=function(e,t,n){return k.H.useSyncExternalStore(e,t,n)},t.useTransition=function(){return k.H.useTransition()},t.version="19.2.
|
|
2
|
+
"use strict";(self.webpackChunksignalk_questdb=self.webpackChunksignalk_questdb||[]).push([[540],{869(e,t){var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),c=Symbol.for("react.consumer"),i=Symbol.for("react.context"),a=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),l=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),y=Symbol.for("react.activity"),d=Symbol.iterator,h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,b={};function m(e,t,n){this.props=e,this.context=t,this.refs=b,this.updater=n||h}function v(){}function S(e,t,n){this.props=e,this.context=t,this.refs=b,this.updater=n||h}m.prototype.isReactComponent={},m.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},m.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=m.prototype;var E=S.prototype=new v;E.constructor=S,_(E,m.prototype),E.isPureReactComponent=!0;var g=Array.isArray;function w(){}var k={H:null,A:null,T:null,S:null},H=Object.prototype.hasOwnProperty;function j(e,t,r){var o=r.ref;return{$$typeof:n,type:e,key:t,ref:void 0!==o?o:null,props:r}}function C(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var R=/\/+/g;function $(e,t){return"object"==typeof e&&null!==e&&null!=e.key?(n=""+e.key,r={"=":"=0",":":"=2"},"$"+n.replace(/[=:]/g,function(e){return r[e]})):t.toString(36);var n,r}function T(e,t,o,u,s){var c=typeof e;"undefined"!==c&&"boolean"!==c||(e=null);var i,a,f=!1;if(null===e)f=!0;else switch(c){case"bigint":case"string":case"number":f=!0;break;case"object":switch(e.$$typeof){case n:case r:f=!0;break;case p:return T((f=e._init)(e._payload),t,o,u,s)}}if(f)return s=s(e),f=""===u?"."+$(e,0):u,g(s)?(o="",null!=f&&(o=f.replace(R,"$&/")+"/"),T(s,t,o,"",function(e){return e})):null!=s&&(C(s)&&(i=s,a=o+(null==s.key||e&&e.key===s.key?"":(""+s.key).replace(R,"$&/")+"/")+f,s=j(i.type,a,i.props)),t.push(s)),1;f=0;var l,y=""===u?".":u+":";if(g(e))for(var h=0;h<e.length;h++)f+=T(u=e[h],t,o,c=y+$(u,h),s);else if("function"==typeof(h=null===(l=e)||"object"!=typeof l?null:"function"==typeof(l=d&&l[d]||l["@@iterator"])?l:null))for(e=h.call(e),h=0;!(u=e.next()).done;)f+=T(u=u.value,t,o,c=y+$(u,h++),s);else if("object"===c){if("function"==typeof e.then)return T(function(e){switch(e.status){case"fulfilled":return e.value;case"rejected":throw e.reason;default:switch("string"==typeof e.status?e.then(w,w):(e.status="pending",e.then(function(t){"pending"===e.status&&(e.status="fulfilled",e.value=t)},function(t){"pending"===e.status&&(e.status="rejected",e.reason=t)})),e.status){case"fulfilled":return e.value;case"rejected":throw e.reason}}throw e}(e),t,o,u,s);throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.")}return f}function x(e,t,n){if(null==e)return e;var r=[],o=0;return T(e,r,"","",function(e){return t.call(n,e,o++)}),r}function A(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)},function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var O="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)},I={map:x,forEach:function(e,t,n){x(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return x(e,function(){t++}),t},toArray:function(e){return x(e,function(e){return e})||[]},only:function(e){if(!C(e))throw Error("React.Children.only expected to receive a single React element child.");return e}};t.Activity=y,t.Children=I,t.Component=m,t.Fragment=o,t.Profiler=s,t.PureComponent=S,t.StrictMode=u,t.Suspense=f,t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=k,t.__COMPILER_RUNTIME={__proto__:null,c:function(e){return k.H.useMemoCache(e)}},t.cache=function(e){return function(){return e.apply(null,arguments)}},t.cacheSignal=function(){return null},t.cloneElement=function(e,t,n){if(null==e)throw Error("The argument must be a React element, but you passed "+e+".");var r=_({},e.props),o=e.key;if(null!=t)for(u in void 0!==t.key&&(o=""+t.key),t)!H.call(t,u)||"key"===u||"__self"===u||"__source"===u||"ref"===u&&void 0===t.ref||(r[u]=t[u]);var u=arguments.length-2;if(1===u)r.children=n;else if(1<u){for(var s=Array(u),c=0;c<u;c++)s[c]=arguments[c+2];r.children=s}return j(e.type,o,r)},t.createContext=function(e){return(e={$$typeof:i,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider=e,e.Consumer={$$typeof:c,_context:e},e},t.createElement=function(e,t,n){var r,o={},u=null;if(null!=t)for(r in void 0!==t.key&&(u=""+t.key),t)H.call(t,r)&&"key"!==r&&"__self"!==r&&"__source"!==r&&(o[r]=t[r]);var s=arguments.length-2;if(1===s)o.children=n;else if(1<s){for(var c=Array(s),i=0;i<s;i++)c[i]=arguments[i+2];o.children=c}if(e&&e.defaultProps)for(r in s=e.defaultProps)void 0===o[r]&&(o[r]=s[r]);return j(e,u,o)},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:a,render:e}},t.isValidElement=C,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:A}},t.memo=function(e,t){return{$$typeof:l,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=k.T,n={};k.T=n;try{var r=e(),o=k.S;null!==o&&o(n,r),"object"==typeof r&&null!==r&&"function"==typeof r.then&&r.then(w,O)}catch(e){O(e)}finally{null!==t&&null!==n.types&&(t.types=n.types),k.T=t}},t.unstable_useCacheRefresh=function(){return k.H.useCacheRefresh()},t.use=function(e){return k.H.use(e)},t.useActionState=function(e,t,n){return k.H.useActionState(e,t,n)},t.useCallback=function(e,t){return k.H.useCallback(e,t)},t.useContext=function(e){return k.H.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e,t){return k.H.useDeferredValue(e,t)},t.useEffect=function(e,t){return k.H.useEffect(e,t)},t.useEffectEvent=function(e){return k.H.useEffectEvent(e)},t.useId=function(){return k.H.useId()},t.useImperativeHandle=function(e,t,n){return k.H.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return k.H.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return k.H.useLayoutEffect(e,t)},t.useMemo=function(e,t){return k.H.useMemo(e,t)},t.useOptimistic=function(e,t){return k.H.useOptimistic(e,t)},t.useReducer=function(e,t,n){return k.H.useReducer(e,t,n)},t.useRef=function(e){return k.H.useRef(e)},t.useState=function(e){return k.H.useState(e)},t.useSyncExternalStore=function(e,t,n){return k.H.useSyncExternalStore(e,t,n)},t.useTransition=function(){return k.H.useTransition()},t.version="19.2.8"},540(e,t,n){e.exports=n(869)}}]);
|
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:()=>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 s(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,o]=(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,b]=(0,n.useState)(a.questdbVersion||"latest"),[y,h]=(0,n.useState)(!1!==a.managedContainer),[E,v]=(0,n.useState)(!1!==a.recordSelf),[k,w]=(0,n.useState)(a.recordOthers||!1),[x,S]=(0,n.useState)(a.defaultSamplingRate??2e3),[R,T]=(0,n.useState)(a.retentionDays||0),[C,B]=(0,n.useState)("include"===a.pathFilter?.mode?"include":"exclude"),[D,I]=(0,n.useState)((Array.isArray(a.pathFilter?.paths)?a.pathFilter.paths:[]).join("\n")),[L,$]=(0,n.useState)(a.compression||"lz4"),[z,P]=(0,n.useState)(a.compressionLevel||3),[q,Q]=(0,n.useState)(a.networkName||"sk-network"),[A,N]=(0,n.useState)(a.exposeToContainers||!1),[W,j]=(0,n.useState)([]),[F,U]=(0,n.useState)(!1),[M,O]=(0,n.useState)(null),[V,H]=(0,n.useState)(!0),[G,_]=(0,n.useState)(null),[K,Z]=(0,n.useState)(!1),[J,X]=(0,n.useState)(""),[Y,ee]=(0,n.useState)(""),[te,ae]=(0,n.useState)(!1),[ne,le]=(0,n.useState)(null),[re,se]=(0,n.useState)(!1),[ie,oe]=(0,n.useState)(!1),[ce,de]=(0,n.useState)(!1),[ue,me]=(0,n.useState)(!1),[pe,ge]=(0,n.useState)(""),[fe,be]=(0,n.useState)(null),[ye,he]=(0,n.useState)(!1),Ee=(0,n.useRef)(0),[ve,ke]=(0,n.useState)(!1),we=(0,n.useCallback)(async()=>{U(!0);try{const e=await fetch("/plugins/signalk-questdb/api/versions");if(e.ok){const t=await e.json();j(t)}}catch{}U(!1)},[]),xe=(0,n.useCallback)(async()=>{try{const e=await fetch("/plugins/signalk-questdb/api/status");e.ok?O(await e.json()):O({status:"not_running"})}catch{O({status:"not_running"})}H(!1)},[]),Se=(0,n.useCallback)(async e=>{const t=++Ee.current;try{const a=await fetch("/plugins/signalk-questdb/api/wal-diagnosis",{signal:e});if(t!==Ee.current)return;if(a.ok){const e=await a.json();if(t!==Ee.current)return;be(e),he(!1)}else he(!0)}catch{t===Ee.current&&he(!0)}},[]),Re=Boolean(M&&"running"===M.status&&(M.suspendedTables||[]).length>0);(0,n.useEffect)(()=>{if(!Re)return be(null),void he(!1);let e=!1,t=null;const a=new AbortController,n=async()=>{await Se(a.signal),e||(t=setTimeout(n,15e3))};return n(),()=>{e=!0,a.abort(),t&&clearTimeout(t)}},[Re,Se]),(0,n.useEffect)(()=>{we(),xe();const e=setInterval(xe,5e3);return()=>clearInterval(e)},[we,xe]);const[Te,Ce]=(0,n.useState)(""),[Be,De]=(0,n.useState)(""),[Ie,Le]=(0,n.useState)("parquet"),[$e,ze]=(0,n.useState)(!1),Pe=M&&"running"===M.status,qe=Pe&&M.suspendedTables||[],Qe=qe.length>0,Ae=Pe&&M.schemaMismatch||!1,Ne=Pe&&M.ulimitClamp||null,We=W.filter(e=>!e.prerelease).slice(0,3),je=W.filter(e=>e.prerelease).slice(0,2);return n.createElement("div",{style:l.root},n.createElement("div",{style:l.sectionTitle},"QuestDB Status"),V?n.createElement("div",{style:l.empty},"Checking QuestDB..."):Pe?n.createElement(n.Fragment,null,Qe&&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 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.",n.createElement("code",{style:l.warnBannerCode},qe.map(e=>{const t=String(e.errorMessage||e.errorTag||"reason not reported").replace(/[\r\n]+/g," "),a=(fe?.tables||[]).find(t=>t.name===e.name),n=a?.suspendedSince?` — frozen since ${a.suspendedSince}`:"";return`${e.name}: ${s(e.txnLag)} txns behind — ${t}${n}`}).join("\n")),(fe?.tables||[]).filter(e=>e.applyError).map(e=>n.createElement("div",{key:e.name,style:{marginTop:8,fontSize:12}},"QuestDB's own log reports the apply failure on"," ",n.createElement("code",null,e.name)," as:",n.createElement("code",{style:l.warnBannerCode},e.applyError))),n.createElement("div",{style:{marginTop:10}},n.createElement("button",{style:{...l.btn,...l.btnPrimary,...ue||ve?l.btnDisabled:{}},disabled:ue||ve,onClick:async()=>{me(!0),ge("");try{const e=await fetch("/plugins/signalk-questdb/api/resume-wal",{method:"POST"}),t=await e.json().catch(()=>({error:e.statusText}));if(e.ok){const e=(t.results||[]).filter(e=>!e.ok);ge(0===e.length?`${t.message}. Recording resumes as the backlog drains — the banner clears once tables catch up.`:`${t.message}. `+e.map(e=>`${e.table}: ${e.error}`).join(" · ")),xe(),Se()}else ge(`Resume failed: ${t.error}`)}catch(e){ge(`Resume failed: ${e.message}`)}me(!1)}},ue?"Resuming...":"Resume recording")),qe.filter(e=>"failed"===e.autoResume).map(e=>{const t=(fe?.tables||[]).find(t=>t.name===e.name),a=t?.skipPlan;return a?n.createElement("div",{key:e.name,style:{marginTop:12}},n.createElement("div",{style:l.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"," ",n.createElement("b",null,s(a.skippedTxns)," transaction(s)")," ","recorded between ",n.createElement("b",null,a.skipWindowStart)," and"," ",n.createElement("b",null,a.skipWindowEnd),a.tailSkip?" — and this is the newest pending segment, so skipping it drops the ENTIRE pending backlog":` — everything after the skipped segment (${s(Math.max(0,e.txnLag-a.skippedTxns))} txns) is replayed without loss`,".",n.createElement("div",{style:{marginTop:8}},n.createElement("button",{style:{...l.btn,...l.btnDanger,...ve||ue||ye?l.btnDisabled:{}},disabled:ve||ue||ye,onClick:()=>(async(e,t)=>{const a=t.tailSkip?"\n\nWARNING: 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 ${s(t.skippedTxns)} transaction(s) recorded between ${t.skipWindowStart} and ${t.skipWindowEnd}. Everything after the skipped segment is replayed without loss.`+a)){ke(!0),ge("");try{const a=await fetch("/plugins/signalk-questdb/api/resume-wal/skip",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({table:e,confirmPlan:t})}),n=await a.json().catch(()=>({error:a.statusText}));a.ok?ge(n.message):ge(`Skip failed: ${n.error}`),xe(),Se()}catch(e){ge(`Skip failed: ${e.message}`)}ke(!1)}})(e.name,a)},ve?"Skipping...":"Skip unreadable segment (loses data)"),ye&&n.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}),n.createElement("div",{style:{marginTop:8,fontSize:12}},"Manual fallback in the QuestDB SQL console (",n.createElement("code",null,":9000"),"), one statement at a time — avoid running it from several tabs, the console retries a busy statement forever:",n.createElement("code",{style:l.warnBannerCode},qe.map(e=>{const t=`"${String(e.name).replace(/"/g,'""')}"`,a=(fe?.tables||[]).find(t=>t.name===e.name),n=[`ALTER TABLE ${t} RESUME WAL;`];return"failed"===e.autoResume&&a?.skipPlan&&!ye&&n.push(`-- if the resume re-suspends: skip the unreadable segment (loses ${s(a.skipPlan.skippedTxns)} txns)`,`ALTER TABLE ${t} RESUME WAL FROM TXN ${a.skipPlan.skipToTxn};`),n.join("\n")}).join("\n")))),pe&&n.createElement("div",{style:l.infoBanner},pe),Ae&&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.)"),Ne&&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,Ne.ulimit)," limit of"," ",s(Ne.requested),", but this host only allows"," ",s(Ne.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},M?.endpoint||`${i}:${u}`," ","· ",Qe?"WAL suspended":"Recording")),n.createElement("div",{style:{...l.stateIndicator,background:Qe?"#ef4444":"#10b981"},title:Qe?"WAL suspended":"Running"})),n.createElement("div",{style:l.statsGrid},n.createElement("div",{style:l.statCard},n.createElement("div",{style:l.statValue},s(M.totalRows)),n.createElement("div",{style:l.statLabel},"Total Rows")),n.createElement("div",{style:l.statCard},n.createElement("div",{style:l.statValue},s(M.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()=>{oe(!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&&b(t.newVersion),xe()}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)}oe(!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()=>{se(!0);try{const e=await fetch("/plugins/signalk-questdb/api/update/check");e.ok&&le(await e.json())}catch{}se(!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"===M?.status?"Not responding":"Not running",y?" — 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=>b(e.target.value)},n.createElement("option",{value:"latest"},"latest (recommended)"),je.map(e=>n.createElement("option",{key:e.tag,value:e.tag},e.tag," (pre-release)")),We.map((e,t)=>n.createElement("option",{key:e.tag,value:e.tag},e.tag,0===t?" (current stable)":""))),F&&n.createElement("span",{style:l.hint},"loading releases..."),n.createElement("button",{style:{...l.btn,...l.btnPrimary,padding:"4px 10px",fontSize:11},onClick:we},"↻")),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:y,onChange:e=>h(e.target.checked)}),n.createElement("span",{style:l.hint},y?"signalk-container manages QuestDB":"Connect to external QuestDB")),!y&&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=>o(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))}))),y&&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:A,onChange:e=>N(e.target.checked)}),n.createElement("span",{style:{...l.hint,color:A?"#ef4444":void 0}},A?"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")),y&&A&&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=>Q(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:x,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:k,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=>T(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:C,onChange:e=>B(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"===C?"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:L,onChange:e=>$(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"===L&&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:z,onChange:e=>P(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=J?`?url=${encodeURIComponent(J)}`:"",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(J?`No InfluxDB found at ${J}.`:"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:J,onChange:e=>X(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:Te,onChange:e=>Ce(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:Be,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:Ie,onChange:e=>Le(e.target.value)},n.createElement("option",{value:"parquet"},"Parquet"),n.createElement("option",{value:"csv"},"CSV"))),n.createElement("button",{style:{...l.btn,...l.btnPrimary,...$e?l.btnDisabled:{}},onClick:async()=>{if(!Te||!Be)return ee("Set both from and to dates for export."),void ae(!0);ze(!0),ee(`Exporting ${Ie.toUpperCase()}...`),ae(!1);try{const e=`/plugins/signalk-questdb/api/export?from=${encodeURIComponent(Te)}&to=${encodeURIComponent(Be)}&format=${Ie}`,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 ze(!1)}const a=await t.blob(),n="parquet"===Ie?"parquet":"csv",l=document.createElement("a");l.href=URL.createObjectURL(a),l.download=`signalk-export-${Te.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)}ze(!1)},disabled:$e},$e?"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),xe()):(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")),Y&&n.createElement("div",{style:{...l.status,color:te?"#ef4444":"#10b981",marginTop:16}},Y),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:y,defaultSamplingRate:x,recordSelf:E,recordOthers:k,retentionDays:R,compression:L,compressionLevel:z,networkName:q,exposeToContainers:A,pathFilter:{mode:C,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")))}}}]);
|
|
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 s(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,o]=(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,h]=(0,n.useState)(a.questdbVersion||"latest"),[y,b]=(0,n.useState)(!1!==a.managedContainer),[E,v]=(0,n.useState)(!1!==a.recordSelf),[w,k]=(0,n.useState)(a.recordOthers||!1),[x,S]=(0,n.useState)(a.defaultSamplingRate??2e3),[R,T]=(0,n.useState)(a.retentionDays||0),[B,C]=(0,n.useState)("include"===a.pathFilter?.mode?"include":"exclude"),[D,I]=(0,n.useState)((Array.isArray(a.pathFilter?.paths)?a.pathFilter.paths:[]).join("\n")),[L,$]=(0,n.useState)(a.compression||"lz4"),[z,P]=(0,n.useState)(a.compressionLevel||3),[q,Q]=(0,n.useState)(a.networkName||"sk-network"),[A,N]=(0,n.useState)(a.exposeToContainers||!1),[M,W]=(0,n.useState)([]),[j,F]=(0,n.useState)(!1),[U,O]=(0,n.useState)(null),[V,H]=(0,n.useState)(!0),[_,G]=(0,n.useState)(null),[K,Z]=(0,n.useState)(!1),[J,X]=(0,n.useState)(""),[Y,ee]=(0,n.useState)(""),[te,ae]=(0,n.useState)(!1),[ne,le]=(0,n.useState)(null),[re,se]=(0,n.useState)(!1),[ie,oe]=(0,n.useState)(!1),[ce,de]=(0,n.useState)(!1),[ue,me]=(0,n.useState)(!1),[pe,ge]=(0,n.useState)(""),[fe,he]=(0,n.useState)(null),[ye,be]=(0,n.useState)(!1),Ee=(0,n.useRef)(0),[ve,we]=(0,n.useState)(!1),ke=(0,n.useCallback)(async()=>{F(!0);try{const e=await fetch("/plugins/signalk-questdb/api/versions");if(e.ok){const t=await e.json();W(t)}}catch{}F(!1)},[]),xe=(0,n.useCallback)(async()=>{try{const e=await fetch("/plugins/signalk-questdb/api/status"),t=await e.json().catch(()=>null);O(t&&"object"==typeof t?t:{status:"not_running"})}catch{O({status:"not_running"})}H(!1)},[]),Se=(0,n.useCallback)(async e=>{const t=++Ee.current;try{const a=await fetch("/plugins/signalk-questdb/api/wal-diagnosis",{signal:e});if(t!==Ee.current)return;if(a.ok){const e=await a.json();if(t!==Ee.current)return;he(e),be(!1)}else be(!0)}catch{t===Ee.current&&be(!0)}},[]),Re=Boolean(U&&"running"===U.status&&(U.suspendedTables||[]).length>0);(0,n.useEffect)(()=>{if(!Re)return he(null),void be(!1);let e=!1,t=null;const a=new AbortController,n=async()=>{await Se(a.signal),e||(t=setTimeout(n,15e3))};return n(),()=>{e=!0,a.abort(),t&&clearTimeout(t)}},[Re,Se]),(0,n.useEffect)(()=>{ke(),xe();const e=setInterval(xe,5e3);return()=>clearInterval(e)},[ke,xe]);const[Te,Be]=(0,n.useState)(""),[Ce,De]=(0,n.useState)(""),[Ie,Le]=(0,n.useState)("parquet"),[$e,ze]=(0,n.useState)(!1),Pe=U&&"running"===U.status,qe=Pe&&U.suspendedTables||[],Qe=qe.length>0,Ae=Pe&&U.schemaMismatch||!1,Ne=Pe&&U.ulimitClamp||null,Me=U?.hostMaxMapCount?.tooLow&&U.hostMaxMapCount||null,We=M.filter(e=>!e.prerelease).slice(0,3),je=M.filter(e=>e.prerelease).slice(0,2);return n.createElement("div",{style:l.root},n.createElement("div",{style:l.sectionTitle},"QuestDB Status"),Me&&n.createElement("div",{style:l.infoBanner},n.createElement("div",{style:l.warnBannerTitle},"Host vm.max_map_count is low — ",s(Me.current)," ","(QuestDB recommends ",s(Me.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):",n.createElement("code",{style:l.warnBannerCode},`echo 'vm.max_map_count=${Me.recommended}' | sudo tee /etc/sysctl.d/99-questdb.conf && sudo sysctl --system`)),V?n.createElement("div",{style:l.empty},"Checking QuestDB..."):Pe?n.createElement(n.Fragment,null,Qe&&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 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.",n.createElement("code",{style:l.warnBannerCode},qe.map(e=>{const t=String(e.errorMessage||e.errorTag||"reason not reported").replace(/[\r\n]+/g," "),a=(fe?.tables||[]).find(t=>t.name===e.name),n=a?.suspendedSince?` — frozen since ${a.suspendedSince}`:"";return`${e.name}: ${s(e.txnLag)} txns behind — ${t}${n}`}).join("\n")),(fe?.tables||[]).filter(e=>e.applyError).map(e=>n.createElement("div",{key:e.name,style:{marginTop:8,fontSize:12}},"QuestDB's own log reports the apply failure on"," ",n.createElement("code",null,e.name)," as:",n.createElement("code",{style:l.warnBannerCode},e.applyError))),n.createElement("div",{style:{marginTop:10}},n.createElement("button",{style:{...l.btn,...l.btnPrimary,...ue||ve?l.btnDisabled:{}},disabled:ue||ve,onClick:async()=>{me(!0),ge("");try{const e=await fetch("/plugins/signalk-questdb/api/resume-wal",{method:"POST"}),t=await e.json().catch(()=>({error:e.statusText}));if(e.ok){const e=(t.results||[]).filter(e=>!e.ok);ge(0===e.length?`${t.message}. Recording resumes as the backlog drains — the banner clears once tables catch up.`:`${t.message}. `+e.map(e=>`${e.table}: ${e.error}`).join(" · ")),xe(),Se()}else ge(`Resume failed: ${t.error}`)}catch(e){ge(`Resume failed: ${e.message}`)}me(!1)}},ue?"Resuming...":"Resume recording")),qe.filter(e=>"failed"===e.autoResume).map(e=>{const t=(fe?.tables||[]).find(t=>t.name===e.name),a=t?.skipPlan;return a?n.createElement("div",{key:e.name,style:{marginTop:12}},n.createElement("div",{style:l.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"," ",n.createElement("b",null,s(a.skippedTxns)," transaction(s)")," ","recorded between ",n.createElement("b",null,a.skipWindowStart)," and"," ",n.createElement("b",null,a.skipWindowEnd),a.tailSkip?" — and this is the newest pending segment, so skipping it drops the ENTIRE pending backlog":` — everything after the skipped segment (${s(Math.max(0,e.txnLag-a.skippedTxns))} txns) is replayed without loss`,".",n.createElement("div",{style:{marginTop:8}},n.createElement("button",{style:{...l.btn,...l.btnDanger,...ve||ue||ye?l.btnDisabled:{}},disabled:ve||ue||ye,onClick:()=>(async(e,t)=>{const a=t.tailSkip?"\n\nWARNING: 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 ${s(t.skippedTxns)} transaction(s) recorded between ${t.skipWindowStart} and ${t.skipWindowEnd}. Everything after the skipped segment is replayed without loss.`+a)){we(!0),ge("");try{const a=await fetch("/plugins/signalk-questdb/api/resume-wal/skip",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({table:e,confirmPlan:t})}),n=await a.json().catch(()=>({error:a.statusText}));a.ok?ge(n.message):ge(`Skip failed: ${n.error}`),xe(),Se()}catch(e){ge(`Skip failed: ${e.message}`)}we(!1)}})(e.name,a)},ve?"Skipping...":"Skip unreadable segment (loses data)"),ye&&n.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}),n.createElement("div",{style:{marginTop:8,fontSize:12}},"Manual fallback in the QuestDB SQL console (",n.createElement("code",null,":9000"),"), one statement at a time — avoid running it from several tabs, the console retries a busy statement forever:",n.createElement("code",{style:l.warnBannerCode},qe.map(e=>{const t=`"${String(e.name).replace(/"/g,'""')}"`,a=(fe?.tables||[]).find(t=>t.name===e.name),n=[`ALTER TABLE ${t} RESUME WAL;`];return"failed"===e.autoResume&&a?.skipPlan&&!ye&&n.push(`-- if the resume re-suspends: skip the unreadable segment (loses ${s(a.skipPlan.skippedTxns)} txns)`,`ALTER TABLE ${t} RESUME WAL FROM TXN ${a.skipPlan.skipToTxn};`),n.join("\n")}).join("\n")))),pe&&n.createElement("div",{style:l.infoBanner},pe),Ae&&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.)"),Ne&&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,Ne.ulimit)," limit of"," ",s(Ne.requested),", but this host only allows"," ",s(Ne.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},U?.endpoint||`${i}:${u}`," ","· ",Qe?"WAL suspended":"Recording")),n.createElement("div",{style:{...l.stateIndicator,background:Qe?"#ef4444":"#10b981"},title:Qe?"WAL suspended":"Running"})),n.createElement("div",{style:l.statsGrid},n.createElement("div",{style:l.statCard},n.createElement("div",{style:l.statValue},s(U.totalRows)),n.createElement("div",{style:l.statLabel},"Total Rows")),n.createElement("div",{style:l.statCard},n.createElement("div",{style:l.statValue},s(U.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()=>{oe(!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&&h(t.newVersion),xe()}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)}oe(!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()=>{se(!0);try{const e=await fetch("/plugins/signalk-questdb/api/update/check");e.ok&&le(await e.json())}catch{}se(!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"===U?.status?"Not responding":"Not running",y?" — 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=>h(e.target.value)},n.createElement("option",{value:"latest"},"latest (recommended)"),je.map(e=>n.createElement("option",{key:e.tag,value:e.tag},e.tag," (pre-release)")),We.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:ke},"↻")),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:y,onChange:e=>b(e.target.checked)}),n.createElement("span",{style:l.hint},y?"signalk-container manages QuestDB":"Connect to external QuestDB")),!y&&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=>o(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))}))),y&&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:A,onChange:e=>N(e.target.checked)}),n.createElement("span",{style:{...l.hint,color:A?"#ef4444":void 0}},A?"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")),y&&A&&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=>Q(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:x,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:w,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=>T(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=>C(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:L,onChange:e=>$(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"===L&&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:z,onChange:e=>P(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=J?`?url=${encodeURIComponent(J)}`:"",t=await fetch(`/plugins/signalk-questdb/api/migration/detect${e}`);if(t.ok){const e=await t.json();G(e.sources),0===e.sources.length&&(ee(J?`No InfluxDB found at ${J}.`:"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")),_&&_.length>0&&n.createElement("div",null,_.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:J,onChange:e=>X(e.target.value)}),n.createElement("span",{style:l.hint},"for remote instances")),_&&0===_.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:Te,onChange:e=>Be(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:Ie,onChange:e=>Le(e.target.value)},n.createElement("option",{value:"parquet"},"Parquet"),n.createElement("option",{value:"csv"},"CSV"))),n.createElement("button",{style:{...l.btn,...l.btnPrimary,...$e?l.btnDisabled:{}},onClick:async()=>{if(!Te||!Ce)return ee("Set both from and to dates for export."),void ae(!0);ze(!0),ee(`Exporting ${Ie.toUpperCase()}...`),ae(!1);try{const e=`/plugins/signalk-questdb/api/export?from=${encodeURIComponent(Te)}&to=${encodeURIComponent(Ce)}&format=${Ie}`,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 ze(!1)}const a=await t.blob(),n="parquet"===Ie?"parquet":"csv",l=document.createElement("a");l.href=URL.createObjectURL(a),l.download=`signalk-export-${Te.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)}ze(!1)},disabled:$e},$e?"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),xe()):(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")),Y&&n.createElement("div",{style:{...l.status,color:te?"#ef4444":"#10b981",marginTop:16}},Y),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:y,defaultSamplingRate:x,recordSelf:E,recordOthers:w,retentionDays:R,compression:L,compressionLevel:z,networkName:q,exposeToContainers:A,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")))}}}]);
|
package/public/main.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{var e={316(){}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const s=t[n]={exports:{}};return e[n](s,s.exports,r),s.exports}r.m=e,r.c=t,r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,n)=>(r.f[n](e,t),t),[])),r.u=e=>e+".js",r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{const e={},t="signalk-questdb:";r.l=(n,o,s,i)=>{if(e[n])return void e[n].push(o);let c,l;if(void 0!==s){const e=document.getElementsByTagName("script");for(var a=0;a<e.length;a++){const r=e[a];if(r.getAttribute("src")==n||r.getAttribute("data-webpack")==t+s){c=r;break}}}c||(l=!0,c=document.createElement("script"),c.charset="utf-8",r.nc&&c.setAttribute("nonce",r.nc),c.setAttribute("data-webpack",t+s),c.src=n),e[n]=[o];const u=(t,r)=>{c.onerror=c.onload=null,clearTimeout(p);const o=e[n];if(delete e[n],c.parentNode?.removeChild(c),o?.forEach(e=>e(r)),t)return t(r)},p=setTimeout(u.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=u.bind(null,c.onerror),c.onload=u.bind(null,c.onload),l&&document.head.appendChild(c)}})(),(()=>{r.S={};const e={},t={};r.I=(n,o)=>{o||(o=[]);let s=t[n];if(s||(s=t[n]={}),o.indexOf(s)>=0)return;if(o.push(s),e[n])return e[n];r.o(r.S,n)||(r.S[n]={});const i=r.S[n],c="signalk-questdb",l=[];return"default"===n&&((e,t,n,o)=>{const s=i[e]=i[e]||{},l=s[t];(!l||!l.loaded&&(1!=!l.eager?o:c>l.from))&&(s[t]={get:()=>r.e(540).then(()=>()=>r(540)),from:c,eager:!1})})("react","19.2.
|
|
1
|
+
(()=>{var e={316(){}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const s=t[n]={exports:{}};return e[n](s,s.exports,r),s.exports}r.m=e,r.c=t,r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,n)=>(r.f[n](e,t),t),[])),r.u=e=>e+".js",r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{const e={},t="signalk-questdb:";r.l=(n,o,s,i)=>{if(e[n])return void e[n].push(o);let c,l;if(void 0!==s){const e=document.getElementsByTagName("script");for(var a=0;a<e.length;a++){const r=e[a];if(r.getAttribute("src")==n||r.getAttribute("data-webpack")==t+s){c=r;break}}}c||(l=!0,c=document.createElement("script"),c.charset="utf-8",r.nc&&c.setAttribute("nonce",r.nc),c.setAttribute("data-webpack",t+s),c.src=n),e[n]=[o];const u=(t,r)=>{c.onerror=c.onload=null,clearTimeout(p);const o=e[n];if(delete e[n],c.parentNode?.removeChild(c),o?.forEach(e=>e(r)),t)return t(r)},p=setTimeout(u.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=u.bind(null,c.onerror),c.onload=u.bind(null,c.onload),l&&document.head.appendChild(c)}})(),(()=>{r.S={};const e={},t={};r.I=(n,o)=>{o||(o=[]);let s=t[n];if(s||(s=t[n]={}),o.indexOf(s)>=0)return;if(o.push(s),e[n])return e[n];r.o(r.S,n)||(r.S[n]={});const i=r.S[n],c="signalk-questdb",l=[];return"default"===n&&((e,t,n,o)=>{const s=i[e]=i[e]||{},l=s[t];(!l||!l.loaded&&(1!=!l.eager?o:c>l.from))&&(s[t]={get:()=>r.e(540).then(()=>()=>r(540)),from:c,eager:!1})})("react","19.2.8"),e[n]=l.length?Promise.all(l).then(()=>e[n]=1):1}})(),(()=>{let e;r.g.importScripts&&(e=r.g.location+"");const t=r.g.document;if(!e&&t&&("SCRIPT"===t.currentScript?.tagName.toUpperCase()&&(e=t.currentScript.src),!e)){const r=t.getElementsByTagName("script");if(r.length){let t=r.length-1;for(;t>-1&&(!e||!/^http(s?):/.test(e));)e=r[t--].src}}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),r.p=e})(),(()=>{const e={792:0};r.f.j=(t,n)=>{let o=r.o(e,t)?e[t]:void 0;if(0!==o)if(o)n.push(o[2]);else{const s=new Promise((r,n)=>o=e[t]=[r,n]);n.push(o[2]=s);const i=r.p+r.u(t),c=new Error,l=n=>{if(r.o(e,t)&&(o=e[t],0!==o&&(e[t]=void 0),o)){const e=n&&("load"===n.type?"missing":n.type),r=n&&n.target&&n.target.src;c.message="Loading chunk "+t+" failed.\n("+e+": "+r+")",c.name="ChunkLoadError",c.type=e,c.request=r,c.event=n,o[1](c)}};r.l(i,l,"chunk-"+t,t)}};const t=(t,n)=>{let[o,s,i]=n;var c,l,a=0;if(o.some(t=>0!==e[t])){for(c in s)r.o(s,c)&&(r.m[c]=s[c]);i&&i(r)}for(t&&t(n);a<o.length;a++)l=o[a],r.o(e,l)&&e[l]&&e[l][0](),e[l]=0},n=self.webpackChunksignalk_questdb=self.webpackChunksignalk_questdb||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})(),r(316)})();
|
package/public/remoteEntry.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var signalk_questdb;(()=>{"use strict";var e={623(e,t,r){const n={"./PluginConfigurationPanel":()=>r.e(805).then(()=>()=>r(805))},o=(e,t)=>(r.R=t,t=r.o(n,e)?n[e]():Promise.resolve().then(()=>{throw new Error('Module "'+e+'" does not exist in container.')}),r.R=void 0,t),i=(e,t)=>{if(!r.S)return;const n="default",o=r.S[n];if(o&&o!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return r.S[n]=e,r.I(n,t)};r.d(t,{get:()=>o,init:()=>i})}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}r.m=e,r.c=t,r.d=(e,t)=>{if(Array.isArray(t))for(var n=0;n<t.length;){var o=t[n++],i=t[n++];r.o(e,o)?0===i&&n++:0===i?Object.defineProperty(e,o,{enumerable:!0,value:t[n++]}):Object.defineProperty(e,o,{enumerable:!0,get:i})}else for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,n)=>(r.f[n](e,t),t),[])),r.u=e=>e+".js",r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{const e={},t="signalk-questdb:";r.l=(n,o,i,s)=>{if(e[n])return void e[n].push(o);let a,u;if(void 0!==i){const e=document.getElementsByTagName("script");for(var l=0;l<e.length;l++){const r=e[l];if(r.getAttribute("src")==n||r.getAttribute("data-webpack")==t+i){a=r;break}}}a||(u=!0,a=document.createElement("script"),a.charset="utf-8",r.nc&&a.setAttribute("nonce",r.nc),a.setAttribute("data-webpack",t+i),a.src=n),e[n]=[o];const c=(t,r)=>{a.onerror=a.onload=null,clearTimeout(f);const o=e[n];if(delete e[n],a.parentNode?.removeChild(a),o?.forEach(e=>e(r)),t)return t(r)},f=setTimeout(c.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=c.bind(null,a.onerror),a.onload=c.bind(null,a.onload),u&&document.head.appendChild(a)}})(),r.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{r.S={};const e={},t={};r.I=(n,o)=>{o||(o=[]);let i=t[n];if(i||(i=t[n]={}),o.indexOf(i)>=0)return;if(o.push(i),e[n])return e[n];r.o(r.S,n)||(r.S[n]={});const s=r.S[n],a="signalk-questdb",u=[];return"default"===n&&((e,t,n,o)=>{const i=s[e]=s[e]||{},u=i[t];(!u||!u.loaded&&(1!=!u.eager?o:a>u.from))&&(i[t]={get:()=>r.e(540).then(()=>()=>r(540)),from:a,eager:!1})})("react","19.2.
|
|
1
|
+
var signalk_questdb;(()=>{"use strict";var e={623(e,t,r){const n={"./PluginConfigurationPanel":()=>r.e(805).then(()=>()=>r(805))},o=(e,t)=>(r.R=t,t=r.o(n,e)?n[e]():Promise.resolve().then(()=>{throw new Error('Module "'+e+'" does not exist in container.')}),r.R=void 0,t),i=(e,t)=>{if(!r.S)return;const n="default",o=r.S[n];if(o&&o!==e)throw new Error("Container initialization failed as it has already been initialized with a different share scope");return r.S[n]=e,r.I(n,t)};r.d(t,{get:()=>o,init:()=>i})}};const t={};function r(n){const o=t[n];if(void 0!==o)return o.exports;const i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}r.m=e,r.c=t,r.d=(e,t)=>{if(Array.isArray(t))for(var n=0;n<t.length;){var o=t[n++],i=t[n++];r.o(e,o)?0===i&&n++:0===i?Object.defineProperty(e,o,{enumerable:!0,value:t[n++]}):Object.defineProperty(e,o,{enumerable:!0,get:i})}else for(var o in t)r.o(t,o)&&!r.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((t,n)=>(r.f[n](e,t),t),[])),r.u=e=>e+".js",r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{const e={},t="signalk-questdb:";r.l=(n,o,i,s)=>{if(e[n])return void e[n].push(o);let a,u;if(void 0!==i){const e=document.getElementsByTagName("script");for(var l=0;l<e.length;l++){const r=e[l];if(r.getAttribute("src")==n||r.getAttribute("data-webpack")==t+i){a=r;break}}}a||(u=!0,a=document.createElement("script"),a.charset="utf-8",r.nc&&a.setAttribute("nonce",r.nc),a.setAttribute("data-webpack",t+i),a.src=n),e[n]=[o];const c=(t,r)=>{a.onerror=a.onload=null,clearTimeout(f);const o=e[n];if(delete e[n],a.parentNode?.removeChild(a),o?.forEach(e=>e(r)),t)return t(r)},f=setTimeout(c.bind(null,void 0,{type:"timeout",target:a}),12e4);a.onerror=c.bind(null,a.onerror),a.onload=c.bind(null,a.onload),u&&document.head.appendChild(a)}})(),r.r=e=>{Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{r.S={};const e={},t={};r.I=(n,o)=>{o||(o=[]);let i=t[n];if(i||(i=t[n]={}),o.indexOf(i)>=0)return;if(o.push(i),e[n])return e[n];r.o(r.S,n)||(r.S[n]={});const s=r.S[n],a="signalk-questdb",u=[];return"default"===n&&((e,t,n,o)=>{const i=s[e]=s[e]||{},u=i[t];(!u||!u.loaded&&(1!=!u.eager?o:a>u.from))&&(i[t]={get:()=>r.e(540).then(()=>()=>r(540)),from:a,eager:!1})})("react","19.2.8"),e[n]=u.length?Promise.all(u).then(()=>e[n]=1):1}})(),(()=>{let e;r.g.importScripts&&(e=r.g.location+"");const t=r.g.document;if(!e&&t&&("SCRIPT"===t.currentScript?.tagName.toUpperCase()&&(e=t.currentScript.src),!e)){const r=t.getElementsByTagName("script");if(r.length){let t=r.length-1;for(;t>-1&&(!e||!/^http(s?):/.test(e));)e=r[t--].src}}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),r.p=e})(),(()=>{var e=e=>{var t=e=>e.split(".").map(e=>+e==e?+e:e),r=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(e),n=r[1]?t(r[1]):[];return r[2]&&(n.length++,n.push.apply(n,t(r[2]))),r[3]&&(n.push([]),n.push.apply(n,t(r[3]))),n},t=e=>{var r=e[0],n="";if(1===e.length)return"*";if(r+.5){n+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var o=1,i=1;i<e.length;i++)o--,n+="u"==(typeof(a=e[i]))[0]?"-":(o>0?".":"")+(o=2,a);return n}var s=[];for(i=1;i<e.length;i++){var a=e[i];s.push(0===a?"not("+u()+")":1===a?"("+u()+" || "+u()+")":2===a?s.pop()+" "+s.pop():t(a))}return u();function u(){return s.pop().replace(/^\((.+)\)$/,"$1")}},n=(t,r)=>{if(0 in t){r=e(r);var o=t[0],i=o<0;i&&(o=-o-1);for(var s=0,a=1,u=!0;;a++,s++){var l,c,f=a<t.length?(typeof t[a])[0]:"";if(s>=r.length||"o"==(c=(typeof(l=r[s]))[0]))return!u||("u"==f?a>o&&!i:""==f!=i);if("u"==c){if(!u||"u"!=f)return!1}else if(u)if(f==c)if(a<=o){if(l!=t[a])return!1}else{if(i?l>t[a]:l<t[a])return!1;l!=t[a]&&(u=!1)}else if("s"!=f&&"n"!=f){if(i||a<=o)return!1;u=!1,a--}else{if(a<=o||c<f!=i)return!1;u=!1}else"s"!=f&&"n"!=f&&(u=!1,a--)}}var d=[],p=d.pop.bind(d);for(s=1;s<t.length;s++){var h=t[s];d.push(1==h?p()|p():2==h?p()&p():h?n(h,r):!p())}return!!p()};const o=(t,r,n)=>{const o=n?(e=>Object.keys(e).reduce((t,r)=>(e[r].eager&&(t[r]=e[r]),t),{}))(t[r]):t[r];return Object.keys(o).reduce((t,r)=>!t||!o[t].loaded&&((t,r)=>{t=e(t),r=e(r);for(var n=0;;){if(n>=t.length)return n<r.length&&"u"!=(typeof r[n])[0];var o=t[n],i=(typeof o)[0];if(n>=r.length)return"u"==i;var s=r[n],a=(typeof s)[0];if(i!=a)return"o"==i&&"n"==a||"s"==a||"u"==i;if("o"!=i&&"u"!=i&&o!=s)return o<s;n++}})(t,r)?r:t,0)},i=(e,t,r)=>r?r():((e,t)=>(e=>{throw new Error(e)})("Shared module "+t+" doesn't exist in shared scope "+e))(e,t),s=(e=>function(t,n,o,i,s){const a=r.I(t);return a?.then&&!o?a.then(e.bind(e,t,r.S[t],n,!1,i,s)):e(t,r.S[t],n,o,i,s)})((e,s,a,u,l,c)=>{if(!((e,t)=>e&&r.o(e,t))(s,a))return i(e,a,c);const f=o(s,a,u);return n(l,f)||(p=((e,r,n,o)=>"Unsatisfied version "+n+" from "+(n&&e[r][n].from)+" of shared singleton module "+r+" (required "+t(o)+")")(s,a,f,l),"undefined"!=typeof console&&console.warn&&console.warn(p)),(d=s[a][f]).loaded=1,d.get();var d,p}),a={},u={231:()=>s("default","react",!1,[1,19],()=>r.e(540).then(()=>()=>r(540)))},l={805:[231]},c={};r.f.consumes=(e,t)=>{r.o(l,e)&&l[e].forEach(e=>{if(r.o(a,e))return t.push(a[e]);if(!c[e]){const n=t=>{a[e]=0,r.m[e]=n=>{delete r.c[e],n.exports=t()}};c[e]=!0;const o=t=>{delete a[e],r.m[e]=n=>{throw delete r.c[e],t}};try{const r=u[e]();r.then?t.push(a[e]=r.then(n).catch(o)):n(r)}catch(e){o(e)}}})}})(),(()=>{const e={807:0};r.f.j=(t,n)=>{let o=r.o(e,t)?e[t]:void 0;if(0!==o)if(o)n.push(o[2]);else{const i=new Promise((r,n)=>o=e[t]=[r,n]);n.push(o[2]=i);const s=r.p+r.u(t),a=new Error,u=n=>{if(r.o(e,t)&&(o=e[t],0!==o&&(e[t]=void 0),o)){const e=n&&("load"===n.type?"missing":n.type),r=n&&n.target&&n.target.src;a.message="Loading chunk "+t+" failed.\n("+e+": "+r+")",a.name="ChunkLoadError",a.type=e,a.request=r,a.event=n,o[1](a)}};r.l(s,u,"chunk-"+t,t)}};const t=(t,n)=>{let[o,i,s]=n;var a,u,l=0;if(o.some(t=>0!==e[t])){for(a in i)r.o(i,a)&&(r.m[a]=i[a]);s&&s(r)}for(t&&t(n);l<o.length;l++)u=o[l],r.o(e,u)&&e[u]&&e[u][0](),e[u]=0},n=self.webpackChunksignalk_questdb=self.webpackChunksignalk_questdb||[];n.forEach(t.bind(null,0)),n.push=t.bind(null,n.push.bind(n))})();let n=r(623);signalk_questdb=n})();
|