signalk-charts-provider-simple 2.0.4 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/charts-loader.d.ts +10 -1
- package/dist/charts-loader.d.ts.map +1 -1
- package/dist/charts-loader.js +116 -1
- package/dist/charts-loader.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +138 -3
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +34 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/download-manager.d.ts.map +1 -1
- package/dist/utils/download-manager.js +10 -2
- package/dist/utils/download-manager.js.map +1 -1
- package/dist/utils/mbtiles-metadata.d.ts +38 -2
- package/dist/utils/mbtiles-metadata.d.ts.map +1 -1
- package/dist/utils/mbtiles-metadata.js +148 -0
- package/dist/utils/mbtiles-metadata.js.map +1 -1
- package/dist/utils/mbtiles-reader.d.ts +45 -0
- package/dist/utils/mbtiles-reader.d.ts.map +1 -1
- package/dist/utils/mbtiles-reader.js +167 -0
- package/dist/utils/mbtiles-reader.js.map +1 -1
- package/dist/utils/path-safety.d.ts +16 -0
- package/dist/utils/path-safety.d.ts.map +1 -1
- package/dist/utils/path-safety.js +27 -0
- package/dist/utils/path-safety.js.map +1 -1
- package/package.json +1 -1
- package/public/js/download-simple.js +27 -1
- package/public/js/download-simple.ts +29 -1
- package/public/js/globals.d.ts +3 -0
- package/public/js/manage-charts-enhanced.js +191 -1
- package/public/js/manage-charts-enhanced.ts +230 -1
package/dist/charts-loader.d.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
-
import type { ChartProvider } from './types.js';
|
|
1
|
+
import type { ChartProvider, RepairableChart } from './types.js';
|
|
2
2
|
export declare function findCharts(chartBaseDir: string): Promise<Record<string, ChartProvider>>;
|
|
3
|
+
/**
|
|
4
|
+
* Find MBTiles that `findCharts` drops because `metadata.bounds` is missing
|
|
5
|
+
* but that have a valid tile pyramid — i.e. they can be repaired by
|
|
6
|
+
* deriving the missing metadata from the tiles table. Directories and
|
|
7
|
+
* already-loadable charts are not returned. The returned `relativePath` is
|
|
8
|
+
* the wire id the repair route expects (mirrors the rename flow's
|
|
9
|
+
* `chartPath`).
|
|
10
|
+
*/
|
|
11
|
+
export declare function findRepairableCharts(chartBaseDir: string): Promise<RepairableChart[]>;
|
|
3
12
|
//# sourceMappingURL=charts-loader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"charts-loader.d.ts","sourceRoot":"","sources":["../src/charts-loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"charts-loader.d.ts","sourceRoot":"","sources":["../src/charts-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EAIhB,MAAM,YAAY,CAAC;AAWpB,wBAAsB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAc7F;AAqOD;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAU3F"}
|
package/dist/charts-loader.js
CHANGED
|
@@ -64,6 +64,11 @@ async function openMbtilesFile(file, filename) {
|
|
|
64
64
|
}
|
|
65
65
|
const identifier = filename.replace(/\.mbtiles$/i, '');
|
|
66
66
|
const vectorLayers = metadata.vector_layers ? parseVectorLayers(metadata.vector_layers) : [];
|
|
67
|
+
// Advertise a non-256 tile size so clients build the raster source on
|
|
68
|
+
// the right grid. We only read PNG dimensions (getTilePixelSize) and
|
|
69
|
+
// only carry the field when it isn't the conventional 256, keeping the
|
|
70
|
+
// common case's descriptor unchanged.
|
|
71
|
+
const tileSize = readTileSize(metadata.format, reader);
|
|
67
72
|
const data = {
|
|
68
73
|
_fileFormat: 'mbtiles',
|
|
69
74
|
_filePath: file,
|
|
@@ -78,13 +83,15 @@ async function openMbtilesFile(file, filename) {
|
|
|
78
83
|
format: metadata.format ?? 'png',
|
|
79
84
|
type: resolveChartType(metadata.type),
|
|
80
85
|
scale: parseInt(metadata.scale ?? '', 10) || 250000,
|
|
86
|
+
...(tileSize !== undefined ? { tileSize } : {}),
|
|
81
87
|
v1: {
|
|
82
88
|
tilemapUrl: `~tilePath~/${identifier}/{z}/{x}/{y}`,
|
|
83
89
|
chartLayers: vectorLayers
|
|
84
90
|
},
|
|
85
91
|
v2: {
|
|
86
92
|
url: `~tilePath~/${identifier}/{z}/{x}/{y}`,
|
|
87
|
-
layers: vectorLayers
|
|
93
|
+
layers: vectorLayers,
|
|
94
|
+
...(tileSize !== undefined ? { tileSize } : {})
|
|
88
95
|
}
|
|
89
96
|
};
|
|
90
97
|
return data;
|
|
@@ -205,4 +212,112 @@ function parseIntIfNotUndefined(val) {
|
|
|
205
212
|
const parsed = parseInt(String(val));
|
|
206
213
|
return Number.isFinite(parsed) ? parsed : undefined;
|
|
207
214
|
}
|
|
215
|
+
/**
|
|
216
|
+
* Detect a non-default raster tile size for the chart descriptor. Returns a
|
|
217
|
+
* value only for raster formats (png/jpg/webp or unset, which defaults to
|
|
218
|
+
* png) when the detected size isn't the conventional 256; vector (pbf) and
|
|
219
|
+
* 256px charts get undefined so the descriptor stays minimal.
|
|
220
|
+
*/
|
|
221
|
+
function readTileSize(format, reader) {
|
|
222
|
+
if (format === 'pbf') {
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
const size = reader.getTilePixelSize();
|
|
226
|
+
if (size === undefined || size === 256) {
|
|
227
|
+
return undefined;
|
|
228
|
+
}
|
|
229
|
+
return size;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Find MBTiles that `findCharts` drops because `metadata.bounds` is missing
|
|
233
|
+
* but that have a valid tile pyramid — i.e. they can be repaired by
|
|
234
|
+
* deriving the missing metadata from the tiles table. Directories and
|
|
235
|
+
* already-loadable charts are not returned. The returned `relativePath` is
|
|
236
|
+
* the wire id the repair route expects (mirrors the rename flow's
|
|
237
|
+
* `chartPath`).
|
|
238
|
+
*/
|
|
239
|
+
export async function findRepairableCharts(chartBaseDir) {
|
|
240
|
+
try {
|
|
241
|
+
const results = await findRepairableRecursive(chartBaseDir, chartBaseDir);
|
|
242
|
+
return results.filter((c) => c !== null);
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
console.error(`Error scanning for repairable charts in ${chartBaseDir}: ${err instanceof Error ? err.message : String(err)}`);
|
|
246
|
+
return [];
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
async function findRepairableRecursive(currentDir, baseDir) {
|
|
250
|
+
const files = await fs.readdir(currentDir, { withFileTypes: true });
|
|
251
|
+
const results = [];
|
|
252
|
+
for (const file of files) {
|
|
253
|
+
const filePath = path.resolve(currentDir, file.name);
|
|
254
|
+
if (file.name.match(/\.mbtiles$/i)) {
|
|
255
|
+
results.push([await inspectMbtilesForRepair(filePath, file.name, baseDir)]);
|
|
256
|
+
}
|
|
257
|
+
else if (file.isDirectory()) {
|
|
258
|
+
if (file.name.startsWith('.') || file.name === 'node_modules') {
|
|
259
|
+
results.push([]);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
results.push(await findRepairableRecursive(filePath, baseDir));
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
results.push([]);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return results.flat();
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Mirror of `openMbtilesFile` with the load gate inverted: a chart is
|
|
272
|
+
* repairable when its metadata table is non-empty, `bounds` is missing, and
|
|
273
|
+
* it has tiles to derive bounds from. Anything that already loads (has
|
|
274
|
+
* bounds) or can't be fixed (no tiles) returns null. The read-only reader is
|
|
275
|
+
* always closed before returning.
|
|
276
|
+
*/
|
|
277
|
+
async function inspectMbtilesForRepair(file, filename, baseDir) {
|
|
278
|
+
let reader = null;
|
|
279
|
+
try {
|
|
280
|
+
reader = await openMbtiles(file);
|
|
281
|
+
const metadata = reader.getInfo();
|
|
282
|
+
// Already loadable, or no metadata at all — not our case.
|
|
283
|
+
if (!metadata ||
|
|
284
|
+
Object.keys(metadata).length === 0 ||
|
|
285
|
+
metadata.bounds !== undefined ||
|
|
286
|
+
!reader.hasTiles()) {
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
const bounds = reader.deriveBoundsFromTiles();
|
|
290
|
+
const zoom = reader.getZoomRangeFromTiles();
|
|
291
|
+
if (!bounds || !zoom) {
|
|
292
|
+
// Tiles present but unreadable extent — can't synthesize bounds.
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
const format = reader.sniffFormatFromTiles() ?? metadata.format ?? 'png';
|
|
296
|
+
const tileSize = readTileSize(format, reader);
|
|
297
|
+
const identifier = filename.replace(/\.mbtiles$/i, '');
|
|
298
|
+
const derived = {
|
|
299
|
+
bounds,
|
|
300
|
+
minzoom: zoom.minzoom,
|
|
301
|
+
maxzoom: zoom.maxzoom,
|
|
302
|
+
format,
|
|
303
|
+
...(tileSize !== undefined ? { tileSize } : {})
|
|
304
|
+
};
|
|
305
|
+
return {
|
|
306
|
+
identifier,
|
|
307
|
+
filePath: file,
|
|
308
|
+
relativePath: path.relative(baseDir, file),
|
|
309
|
+
name: metadata.name ?? metadata.id ?? identifier,
|
|
310
|
+
reason: 'missing_bounds',
|
|
311
|
+
hasTiles: true,
|
|
312
|
+
derived
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
catch (e) {
|
|
316
|
+
console.error(`Error inspecting chart for repair ${file}`, e instanceof Error ? e.message : String(e));
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
finally {
|
|
320
|
+
reader?.close();
|
|
321
|
+
}
|
|
322
|
+
}
|
|
208
323
|
//# sourceMappingURL=charts-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"charts-loader.js","sourceRoot":"","sources":["../src/charts-loader.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"charts-loader.js","sourceRoot":"","sources":["../src/charts-loader.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAQ,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAQ,MAAM,qBAAqB,CAAC;AAiExD,OAAO,KAAK,EACV,iBAAiB,EAQlB,MAAM,YAAY,CAAC;AAcpB,QAAA,MAAM,iBAAiB,GAAI,KAAK,iBAAiB,KAAG,MAwyFnD,CAAC;AAiHF,eAAe,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import path from 'path';
|
|
|
2
2
|
import fs from 'fs';
|
|
3
3
|
import https from 'https';
|
|
4
4
|
import { SKVersion } from '@signalk/server-api';
|
|
5
|
-
import { findCharts } from './charts-loader.js';
|
|
5
|
+
import { findCharts, findRepairableCharts } from './charts-loader.js';
|
|
6
6
|
import { scanChartsRecursively, scanAllFolders } from './utils/file-scanner.js';
|
|
7
7
|
import { initChartState, isChartEnabled, setChartEnabled } from './utils/chart-state.js';
|
|
8
8
|
import { downloadManager } from './utils/download-manager.js';
|
|
@@ -12,7 +12,8 @@ import { getContainerManager, waitForContainerManager } from './utils/container-
|
|
|
12
12
|
import { PLUGIN_OWNER_ID } from './utils/container-jobs.js';
|
|
13
13
|
import { cleanupQuarantineDir, makeQuarantineDir, promoteQuarantine, sweepStaleQuarantineDirs } from './utils/quarantine.js';
|
|
14
14
|
import { cleanCatalogTitle } from './utils/catalog-title.js';
|
|
15
|
-
import { setMbtilesDisplayName } from './utils/mbtiles-metadata.js';
|
|
15
|
+
import { setMbtilesDisplayName, repairMbtilesMetadata } from './utils/mbtiles-metadata.js';
|
|
16
|
+
import { open as openMbtilesReader } from './utils/mbtiles-reader.js';
|
|
16
17
|
import { initRncConverter, processRncZip, processPilotTar, getAllConversionProgress as getAllRncProgress, getConversionProgress as getRncProgress, setConversionFailed as setRncFailed } from './utils/rnc-converter.js';
|
|
17
18
|
import { processGshhg, processShpBasemap } from './utils/s57-converter.js';
|
|
18
19
|
import { getCpuBudget, setCpuBudget } from './utils/concurrency.js';
|
|
@@ -20,7 +21,7 @@ import { writeChartPathMarker } from './utils/path-marker.js';
|
|
|
20
21
|
import { parsePluginConfig } from './utils/plugin-config-schema.js';
|
|
21
22
|
import { Type } from '@sinclair/typebox';
|
|
22
23
|
import { parseBody, parseShape } from './utils/rest-validation.js';
|
|
23
|
-
import { isWithinBase, arePairWithinBase } from './utils/path-safety.js';
|
|
24
|
+
import { isWithinBase, arePairWithinBase, validateChartName } from './utils/path-safety.js';
|
|
24
25
|
import Busboy from 'busboy';
|
|
25
26
|
import { DatabaseSync } from 'node:sqlite';
|
|
26
27
|
// JSON import with type attribute (NodeNext ESM). package.json's `version`
|
|
@@ -390,6 +391,14 @@ const pluginConstructor = (app) => {
|
|
|
390
391
|
const validPaths = new Set(Object.values(charts)
|
|
391
392
|
.map((c) => c._filePath)
|
|
392
393
|
.filter(Boolean));
|
|
394
|
+
// Repairable charts (valid tiles, missing metadata.bounds) are
|
|
395
|
+
// deliberately excluded from findCharts(), so they'd otherwise be
|
|
396
|
+
// unlinked here as "invalid" — destroying the very files the repair
|
|
397
|
+
// flow exists to fix. Treat them as valid so the sweep skips them.
|
|
398
|
+
const repairable = await findRepairableCharts(chartPath);
|
|
399
|
+
for (const rc of repairable) {
|
|
400
|
+
validPaths.add(rc.filePath);
|
|
401
|
+
}
|
|
393
402
|
for (const file of allFiles) {
|
|
394
403
|
if (file.name.endsWith('.mbtiles') && !validPaths.has(file.path)) {
|
|
395
404
|
console.log(`[charts-provider] Removing invalid .mbtiles file: ${file.name}`);
|
|
@@ -486,6 +495,12 @@ const pluginConstructor = (app) => {
|
|
|
486
495
|
const ChartMetadataBody = Type.Object({
|
|
487
496
|
name: Type.String({ minLength: 1 })
|
|
488
497
|
});
|
|
498
|
+
const RepairChartBody = Type.Object({
|
|
499
|
+
// Case-insensitive: discovery matches `.mbtiles` case-insensitively, so
|
|
500
|
+
// a hand-copied FOO.MBTILES can appear in the repair list and must pass
|
|
501
|
+
// here too.
|
|
502
|
+
chartPath: Type.String({ minLength: 1, pattern: '\\.[mM][bB][tT][iI][lL][eE][sS]$' })
|
|
503
|
+
});
|
|
489
504
|
// Multipart/header field schemas. Same domain rules as the JSON-body
|
|
490
505
|
// counterparts: zoom bounds, https?:// URL floor, non-empty chart
|
|
491
506
|
// names. parseShape (via Value.Convert) handles the busboy-string-only
|
|
@@ -523,6 +538,15 @@ const pluginConstructor = (app) => {
|
|
|
523
538
|
return;
|
|
524
539
|
}
|
|
525
540
|
const { url: downloadUrl, targetFolder, chartName } = parsed;
|
|
541
|
+
// chartName becomes the on-disk filename in download-manager; a
|
|
542
|
+
// value like `../../foo` would write outside the quarantine dir.
|
|
543
|
+
const chartNameCheck = validateChartName(chartName);
|
|
544
|
+
if (!chartNameCheck.valid) {
|
|
545
|
+
res
|
|
546
|
+
.status(400)
|
|
547
|
+
.json({ success: false, error: `Invalid chart name: ${chartNameCheck.reason}` });
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
526
550
|
try {
|
|
527
551
|
console.log(`Creating download job for: ${downloadUrl}`);
|
|
528
552
|
console.log(`Target folder: ${targetFolder}`);
|
|
@@ -1026,6 +1050,107 @@ const pluginConstructor = (app) => {
|
|
|
1026
1050
|
.send('Error renaming chart: ' + (error instanceof Error ? error.message : String(error)));
|
|
1027
1051
|
}
|
|
1028
1052
|
});
|
|
1053
|
+
// List MBTiles that the loader dropped for missing `metadata.bounds`
|
|
1054
|
+
// but that have a valid tile pyramid — the Manage UI surfaces these
|
|
1055
|
+
// with a Repair action. Mirrors /local-charts' base-path resolution and
|
|
1056
|
+
// error shape.
|
|
1057
|
+
router.get('/repairable-charts', async (_req, res) => {
|
|
1058
|
+
try {
|
|
1059
|
+
const basePath = props.chartPath || defaultChartsPath;
|
|
1060
|
+
const repairable = await findRepairableCharts(basePath);
|
|
1061
|
+
res.json({ repairable, basePath });
|
|
1062
|
+
}
|
|
1063
|
+
catch (error) {
|
|
1064
|
+
console.error('Error listing repairable charts:', error);
|
|
1065
|
+
res.status(500).send('Error listing repairable charts');
|
|
1066
|
+
}
|
|
1067
|
+
});
|
|
1068
|
+
// Derive the missing metadata from the tile pyramid and write it into
|
|
1069
|
+
// the file so the chart loads. Mirrors /rename-chart: path-safety guard,
|
|
1070
|
+
// existence check, metadata write, refresh + delta. The read-only reader
|
|
1071
|
+
// used to derive values is closed before the writer opens.
|
|
1072
|
+
router.post('/repair-chart', async (req, res) => {
|
|
1073
|
+
const body = parseBody(RepairChartBody, req, res);
|
|
1074
|
+
if (!body) {
|
|
1075
|
+
return;
|
|
1076
|
+
}
|
|
1077
|
+
const { chartPath: chartPathBody } = body;
|
|
1078
|
+
app.debug(`Repair chart request: chartPath=${chartPathBody}`);
|
|
1079
|
+
try {
|
|
1080
|
+
const basePath = props.chartPath || defaultChartsPath;
|
|
1081
|
+
const sourcePath = path.join(basePath, chartPathBody);
|
|
1082
|
+
if (!isWithinBase(sourcePath, basePath)) {
|
|
1083
|
+
res.status(403).send('Access denied: Invalid path');
|
|
1084
|
+
return;
|
|
1085
|
+
}
|
|
1086
|
+
if (!fs.existsSync(sourcePath)) {
|
|
1087
|
+
app.error(`Chart not found at: ${sourcePath}`);
|
|
1088
|
+
res.status(404).send('Chart not found');
|
|
1089
|
+
return;
|
|
1090
|
+
}
|
|
1091
|
+
// Re-derive from a fresh read-only reader, then close it before the
|
|
1092
|
+
// writer opens — two handles on one sqlite file race on the lock.
|
|
1093
|
+
const reader = await openMbtilesReader(sourcePath);
|
|
1094
|
+
let derived;
|
|
1095
|
+
try {
|
|
1096
|
+
if (!reader.hasTiles()) {
|
|
1097
|
+
res.status(422).json({ error: 'Chart has no tiles — cannot derive metadata' });
|
|
1098
|
+
return;
|
|
1099
|
+
}
|
|
1100
|
+
const bounds = reader.deriveBoundsFromTiles();
|
|
1101
|
+
const zoom = reader.getZoomRangeFromTiles();
|
|
1102
|
+
if (!bounds || !zoom) {
|
|
1103
|
+
res.status(422).json({ error: 'Could not derive bounds from tiles' });
|
|
1104
|
+
return;
|
|
1105
|
+
}
|
|
1106
|
+
const format = reader.sniffFormatFromTiles() ?? reader.getInfo().format ?? 'png';
|
|
1107
|
+
const tileSize = format === 'pbf' ? undefined : reader.getTilePixelSize();
|
|
1108
|
+
derived = {
|
|
1109
|
+
bounds,
|
|
1110
|
+
minzoom: zoom.minzoom,
|
|
1111
|
+
maxzoom: zoom.maxzoom,
|
|
1112
|
+
format,
|
|
1113
|
+
...(tileSize !== undefined && tileSize !== 256 ? { tileSize } : {})
|
|
1114
|
+
};
|
|
1115
|
+
}
|
|
1116
|
+
finally {
|
|
1117
|
+
reader.close();
|
|
1118
|
+
}
|
|
1119
|
+
const result = await repairMbtilesMetadata(sourcePath, derived, {
|
|
1120
|
+
onMessage: (m) => app.debug(`repair-chart: ${m}`)
|
|
1121
|
+
});
|
|
1122
|
+
if (!result.ok) {
|
|
1123
|
+
console.warn(`[charts-provider] WARNING: ${result.message} (${path.basename(sourcePath)})`);
|
|
1124
|
+
res.status(500).json({ error: result.message });
|
|
1125
|
+
return;
|
|
1126
|
+
}
|
|
1127
|
+
if (derived.tileSize !== undefined && derived.tileSize !== 256) {
|
|
1128
|
+
console.warn(`[charts-provider] ${path.basename(sourcePath)} uses ${derived.tileSize}px tiles; ` +
|
|
1129
|
+
`Freeboard-SK renders charts at 256px and needs its own tileSize support to ` +
|
|
1130
|
+
`display this correctly.`);
|
|
1131
|
+
}
|
|
1132
|
+
await refreshChartProviders();
|
|
1133
|
+
// Case-insensitive strip so a repaired FOO.MBTILES still matches the
|
|
1134
|
+
// chartProviders key the loader derives (also case-insensitive).
|
|
1135
|
+
const chartId = path.basename(chartPathBody).replace(/\.mbtiles$/i, '');
|
|
1136
|
+
if (chartProviders[chartId]) {
|
|
1137
|
+
const chartData = sanitizeProvider(chartProviders[chartId], 2);
|
|
1138
|
+
emitChartDelta(chartId, chartData);
|
|
1139
|
+
}
|
|
1140
|
+
res.status(200).json({
|
|
1141
|
+
success: true,
|
|
1142
|
+
chartId,
|
|
1143
|
+
written: result.written,
|
|
1144
|
+
skipped: result.skipped
|
|
1145
|
+
});
|
|
1146
|
+
}
|
|
1147
|
+
catch (error) {
|
|
1148
|
+
app.error('Error repairing chart: ' + (error instanceof Error ? error.message : String(error)));
|
|
1149
|
+
res
|
|
1150
|
+
.status(500)
|
|
1151
|
+
.send('Error repairing chart: ' + (error instanceof Error ? error.message : String(error)));
|
|
1152
|
+
}
|
|
1153
|
+
});
|
|
1029
1154
|
router.put('/chart-metadata/:chartPath', async (req, res) => {
|
|
1030
1155
|
const chartPathParam = decodeURIComponent(req.params.chartPath);
|
|
1031
1156
|
const body = parseBody(ChartMetadataBody, req, res);
|
|
@@ -1576,6 +1701,16 @@ const pluginConstructor = (app) => {
|
|
|
1576
1701
|
return;
|
|
1577
1702
|
}
|
|
1578
1703
|
const { url, chartNumber, catalogFile, zipfileDatetime, targetFolder, minzoom, maxzoom } = body;
|
|
1704
|
+
// chartNumber reaches download-manager as the on-disk filename for
|
|
1705
|
+
// the direct-.mbtiles branch; guard it the same way as the locker
|
|
1706
|
+
// route so a crafted catalog entry can't escape the quarantine dir.
|
|
1707
|
+
const chartNumberCheck = validateChartName(chartNumber);
|
|
1708
|
+
if (!chartNumberCheck.valid) {
|
|
1709
|
+
res
|
|
1710
|
+
.status(400)
|
|
1711
|
+
.json({ success: false, error: `Invalid chart number: ${chartNumberCheck.reason}` });
|
|
1712
|
+
return;
|
|
1713
|
+
}
|
|
1579
1714
|
const registryEntry = getCatalogRegistry().find((r) => r.file === catalogFile);
|
|
1580
1715
|
const catalogCategory = registryEntry ? registryEntry.category : '';
|
|
1581
1716
|
const classification = classifyUrl(url, catalogCategory);
|