@signalk/charts-plugin 3.6.2 → 3.8.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.
Files changed (60) hide show
  1. package/.prettierignore +1 -0
  2. package/CHANGELOG.md +109 -0
  3. package/README.md +72 -0
  4. package/docs/screenshots/1_overview.png +0 -0
  5. package/docs/screenshots/2_region.png +0 -0
  6. package/docs/screenshots/3_jobs.png +0 -0
  7. package/package.json +20 -12
  8. package/plugin/cacheLayout.d.ts +72 -0
  9. package/plugin/cacheLayout.d.ts.map +1 -0
  10. package/plugin/cacheLayout.js +243 -0
  11. package/plugin/cacheLayout.js.map +1 -0
  12. package/plugin/chartDownloader.d.ts +122 -29
  13. package/plugin/chartDownloader.d.ts.map +1 -1
  14. package/plugin/chartDownloader.js +488 -313
  15. package/plugin/chartDownloader.js.map +1 -1
  16. package/plugin/chartDownloaderMBTilesHelpers.d.ts +10 -0
  17. package/plugin/chartDownloaderMBTilesHelpers.d.ts.map +1 -0
  18. package/plugin/chartDownloaderMBTilesHelpers.js +235 -0
  19. package/plugin/chartDownloaderMBTilesHelpers.js.map +1 -0
  20. package/plugin/chartDownloaderTileHelpers.d.ts +30 -0
  21. package/plugin/chartDownloaderTileHelpers.d.ts.map +1 -0
  22. package/plugin/chartDownloaderTileHelpers.js +277 -0
  23. package/plugin/chartDownloaderTileHelpers.js.map +1 -0
  24. package/plugin/charts.d.ts.map +1 -1
  25. package/plugin/charts.js +23 -5
  26. package/plugin/charts.js.map +1 -1
  27. package/plugin/constants.d.ts.map +1 -1
  28. package/plugin/index.d.ts.map +1 -1
  29. package/plugin/index.js +561 -48
  30. package/plugin/index.js.map +1 -1
  31. package/plugin/pluginStatus.js.map +1 -1
  32. package/plugin/projection.js.map +1 -1
  33. package/plugin/tileServer.d.ts +4 -1
  34. package/plugin/tileServer.d.ts.map +1 -1
  35. package/plugin/tileServer.js +48 -10
  36. package/plugin/tileServer.js.map +1 -1
  37. package/plugin/tokenProvider.d.ts +63 -0
  38. package/plugin/tokenProvider.d.ts.map +1 -0
  39. package/plugin/tokenProvider.js +258 -0
  40. package/plugin/tokenProvider.js.map +1 -0
  41. package/plugin/types.d.ts +37 -2
  42. package/plugin/types.d.ts.map +1 -1
  43. package/public/images/jobs.png +0 -0
  44. package/public/images/overview.png +0 -0
  45. package/public/images/region.png +0 -0
  46. package/public/index.html +392 -113
  47. package/public/js/index.js +620 -0
  48. package/public/leaflet/images/downloads.png +0 -0
  49. package/public/leaflet/images/layers-2x.png +0 -0
  50. package/public/leaflet/images/layers.png +0 -0
  51. package/public/leaflet/images/lifebuoy.png +0 -0
  52. package/public/leaflet/images/spritesheet-2x.png +0 -0
  53. package/public/leaflet/images/spritesheet.svg +156 -0
  54. package/public/leaflet/leaflet.css +677 -0
  55. package/public/leaflet/leaflet.draw.css +253 -0
  56. package/public/leaflet/leaflet.draw.js +2957 -0
  57. package/public/leaflet/leaflet.js +7467 -0
  58. package/public/logo.svg +0 -2
  59. package/public/style.css +351 -37
  60. package/public/index.js +0 -349
@@ -1,73 +1,166 @@
1
- import type { BBox, FeatureCollection } from 'geojson';
2
- import { ResourcesApi } from '@signalk/server-api';
3
- import { ChartProvider } from './types';
4
- export interface Tile {
5
- x: number;
6
- y: number;
7
- z: number;
8
- }
9
- export declare enum Status {
1
+ import type { BBox } from 'geojson';
2
+ import { ChartProvider, MBTilesHandle } from './types';
3
+ import { Tile } from './chartDownloaderTileHelpers';
4
+ export type { Tile };
5
+ export declare enum State {
10
6
  Stopped = 0,
11
7
  Running = 1
12
8
  }
9
+ interface CacheStatistic {
10
+ requests: number;
11
+ hits: number;
12
+ misses: number;
13
+ failures: number;
14
+ }
15
+ export interface JobOptions {
16
+ refetch: boolean;
17
+ mbtiles: boolean;
18
+ vacuum: boolean;
19
+ }
20
+ declare enum JobType {
21
+ None = 0,
22
+ Seed = 1,
23
+ Delete = 2
24
+ }
25
+ export declare enum TileSource {
26
+ None = 0,
27
+ FetchedFromCache = 1,
28
+ FetchedFromRemote = 2
29
+ }
30
+ export declare enum FailureKind {
31
+ None = "none",
32
+ Timeout = "timeout",
33
+ HttpClient = "http_4xx",
34
+ HttpServer = "http_5xx",
35
+ Network = "network",
36
+ NoRemoteUrl = "no_remote_url"
37
+ }
38
+ export interface TileFetchFailure {
39
+ kind: FailureKind;
40
+ status?: number;
41
+ }
42
+ export interface TileFetchResult {
43
+ buffer: Buffer | null;
44
+ source: TileSource;
45
+ failure?: TileFetchFailure;
46
+ }
47
+ export type FailureCounts = Partial<Record<FailureKind, number>>;
13
48
  export declare class ChartSeedingManager {
14
49
  static ActiveJobs: {
15
50
  [key: number]: ChartDownloader;
16
51
  };
17
- static createJob(resourcesApi: ResourcesApi, chartsPath: string, provider: ChartProvider, maxZoom: number, regionGUID?: string | undefined, bbox?: BBox | undefined, tile?: Tile | undefined): Promise<ChartDownloader>;
52
+ /**
53
+ * Reset all module-level static state owned by ChartSeedingManager and
54
+ * ChartDownloader so a test harness can run from a known baseline.
55
+ *
56
+ * The plugin's static fields outlive a `stop()` / `start()` cycle in
57
+ * production (which is intended — process-global gates and ID sequences),
58
+ * but in a test process running 200+ tests in sequence the residue
59
+ * shows up as cross-test interference: nextJobId drifts upward, an
60
+ * earlier low-disk-space probe leaves CachingEnabled=false for 2s,
61
+ * stale CacheStatistics from one provider get seen by an unrelated
62
+ * test asserting "stats are an object".
63
+ *
64
+ * Production code never calls this. The test app's beforeEach does.
65
+ */
66
+ static resetForTests(): void;
67
+ static createJob(cachePath: string, provider: ChartProvider, options: JobOptions, minZoom: number, maxZoom: number, feature?: GeoJSON.Feature<GeoJSON.Geometry> | undefined, bbox?: BBox | undefined): Promise<ChartDownloader>;
18
68
  static cancelAll(): void;
19
69
  }
20
70
  export declare class ChartDownloader {
21
- private resourcesApi;
22
- private chartsPath;
71
+ private cachePath;
23
72
  private provider;
73
+ private options;
24
74
  private static MINIMUM_FREE_DISK_SPACE;
25
75
  private static nextJobId;
76
+ private static CachingEnabled;
77
+ private static CacheStatistics;
78
+ private static TilesCached;
79
+ private static lastDiskSpaceCheck;
80
+ private static lastDiskSpaceResult;
81
+ static tileRetryBackoffMs: number;
26
82
  private id;
83
+ private type;
84
+ private state;
27
85
  private status;
28
86
  private totalTiles;
29
87
  private downloadedTiles;
30
88
  private failedTiles;
31
89
  private cachedTiles;
32
- private concurrentDownloadsLimit;
90
+ private deletedTiles;
91
+ private failureCounts;
92
+ private sampleLogged;
33
93
  private areaDescription;
34
94
  private cancelRequested;
95
+ private regionName;
35
96
  private tiles;
36
- private tilesToDownload;
37
- constructor(resourcesApi: ResourcesApi, chartsPath: string, provider: ChartProvider);
97
+ private tilesInDB;
98
+ constructor(cachePath: string, provider: ChartProvider, options: JobOptions);
38
99
  get ID(): number;
39
- initializeJobFromRegion(regionGUID: string, maxZoom: number): Promise<void>;
40
- initializeJobFromBBox(bbox: BBox, maxZoom: number): Promise<void>;
41
- initializeJobFromTile(tile: Tile, maxZoom: number): Promise<void>;
42
- private static DISK_CHECK_INTERVAL_MS;
100
+ initalizeJobFromFeature(feature: GeoJSON.Feature<GeoJSON.Geometry>, minZoom: number, maxZoom: number): Promise<void>;
101
+ initializeJobFromBBox(bbox: BBox, minZoom: number, maxZoom: number): Promise<void>;
43
102
  /**
44
103
  * Download map tiles for a specific area.
45
104
  */
46
105
  seedCache(): Promise<void>;
47
106
  deleteCache(): Promise<void>;
48
107
  cancelJob(): void;
49
- private filterCachedTiles;
50
108
  info(): {
51
109
  id: number;
110
+ type: JobType;
52
111
  chartName: string;
53
112
  regionName: string;
54
113
  totalTiles: number;
55
114
  downloadedTiles: number;
56
115
  cachedTiles: number;
57
116
  failedTiles: number;
117
+ failures: {
118
+ http_4xx?: number | undefined;
119
+ http_5xx?: number | undefined;
120
+ network?: number | undefined;
121
+ no_remote_url?: number | undefined;
122
+ none?: number | undefined;
123
+ timeout?: number | undefined;
124
+ };
125
+ deletedTiles: number;
58
126
  progress: number;
59
- status: Status;
127
+ status: string;
128
+ state: State;
60
129
  };
61
- static getTileFromCacheOrRemote(chartsPath: string, provider: ChartProvider, tile: Tile): Promise<Buffer | null>;
130
+ static getTileFromCacheOrRemote(chartsPath: string, provider: ChartProvider, tile: Tile, overwrite?: boolean): Promise<TileFetchResult>;
131
+ static getTileFromMbTiles(mbtilesHandle: MBTilesHandle, tile: Tile): Promise<Buffer | null>;
132
+ static cacheTileToMbTiles(mbtilesHandle: MBTilesHandle, tile: Tile, buffer: Buffer | null): Promise<void>;
133
+ /**
134
+ * Detailed-result variant of fetchTileFromRemote. Returns the buffer on
135
+ * success and a `failure` discriminator on every other path so the
136
+ * caller can attribute "failed" tiles to a specific cause (timeout vs
137
+ * 5xx vs network) for diagnostic logs and per-job counters.
138
+ *
139
+ * Retries once on 502/503 with TILE_RETRY_BACKOFF_MS backoff: those are
140
+ * the response codes that genuinely benefit from one more try (LB hiccup,
141
+ * backend cold-start). 504 is excluded because it means the upstream
142
+ * already waited; another wait makes the per-tile latency intolerable.
143
+ * 4xx are not retried (auth or "tile genuinely doesn't exist" — neither
144
+ * gets better by trying again).
145
+ */
146
+ static fetchTileFromRemoteDetailed(provider: ChartProvider, tile: Tile, timeoutMs?: number): Promise<{
147
+ buffer: Buffer | null;
148
+ failure: TileFetchFailure;
149
+ }>;
150
+ /**
151
+ * Backwards-compatible wrapper for callers that only need the buffer.
152
+ * Internal callers should prefer fetchTileFromRemoteDetailed for the
153
+ * categorised failure information.
154
+ */
62
155
  static fetchTileFromRemote(provider: ChartProvider, tile: Tile, timeoutMs?: number): Promise<Buffer | null>;
63
- getSubTiles(tile: Tile, maxZoom: number): Tile[];
156
+ static hasDiskSpace(path: string): Promise<boolean>;
157
+ static getStatistics(): {
158
+ [k: string]: CacheStatistic;
159
+ };
64
160
  /**
65
- * Get all tiles that intersect a bounding box up to a maximum zoom level.
66
- * bbox = [minLon, minLat, maxLon, maxLat]
161
+ * Reset the static fields owned by ChartDownloader. See
162
+ * ChartSeedingManager.resetForTests for why this exists.
67
163
  */
68
- getTilesForBBox(bbox: BBox, maxZoom: number): Tile[];
69
- getTilesForGeoJSON(geojson: FeatureCollection, zoomMin?: number, zoomMax?: number): Tile[];
70
- private convertRegionToGeoJSON;
71
- private bboxPolygon;
164
+ static resetForTests(): void;
72
165
  }
73
166
  //# sourceMappingURL=chartDownloader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chartDownloader.d.ts","sourceRoot":"","sources":["../src/chartDownloader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chartDownloader.d.ts","sourceRoot":"","sources":["../src/chartDownloader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAEnC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAuBtD,OAAO,EACL,IAAI,EAML,MAAM,8BAA8B,CAAA;AAErC,YAAY,EAAE,IAAI,EAAE,CAAA;AAUpB,oBAAY,KAAK;IACf,OAAO,IAAA;IACP,OAAO,IAAA;CACR;AAED,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,aAAK,OAAO;IACV,IAAI,IAAA;IACJ,IAAI,IAAA;IACJ,MAAM,IAAA;CACP;AAED,oBAAY,UAAU;IACpB,IAAI,IAAA;IACJ,gBAAgB,IAAA;IAChB,iBAAiB,IAAA;CAClB;AAMD,oBAAY,WAAW;IACrB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,UAAU,aAAa;IACvB,UAAU,aAAa;IACvB,OAAO,YAAY;IACnB,WAAW,kBAAkB;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,WAAW,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,CAAC,EAAE,gBAAgB,CAAA;CAC3B;AAKD,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAA;AAehE,qBAAa,mBAAmB;IAC9B,OAAc,UAAU,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAA;KAAE,CAAK;IAEjE;;;;;;;;;;;;;OAaG;IACH,OAAc,aAAa,IAAI,IAAI,CAGlC;IAED,OAAoB,SAAS,CAC3B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,SAAqB,EAClE,IAAI,GAAE,IAAI,GAAG,SAAqB,GACjC,OAAO,CAAC,eAAe,CAAC,CAO1B;IAID,OAAc,SAAS,IAAI,IAAI,CAK9B;CACF;AAED,qBAAa,eAAe;IAuCxB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IAxCjB,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAqB;IAC3D,OAAO,CAAC,MAAM,CAAC,SAAS,CAAI;IAC5B,OAAO,CAAC,MAAM,CAAC,cAAc,CAAO;IACpC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAyC;IACvE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAI;IAC9B,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAI;IACrC,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAO;IAGzC,OAAc,kBAAkB,EAAE,MAAM,CAAgC;IAExE,OAAO,CAAC,EAAE,CAAsC;IAEhD,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,YAAY,CAAI;IAOxB,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,YAAY,CAA8B;IAElD,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,eAAe,CAAQ;IAE/B,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,SAAS,CAAuB;IAExC,YACU,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,UAAU,EACzB;IAEJ,IAAI,EAAE,IAAI,MAAM,CAEf;IAEY,uBAAuB,CAClC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAC1C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAmBf;IAEY,qBAAqB,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAef;IAED;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA4K/B;IAEK,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA+CjC;IAEM,SAAS,SAEf;IAEM,IAAI;;;;;;;;;;;;;;;;;;;;;MAiCV;IAED,OAAa,wBAAwB,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,IAAI,EACV,SAAS,UAAQ,GAChB,OAAO,CAAC,eAAe,CAAC,CAwC1B;IAED,OAAa,kBAAkB,CAC7B,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgCxB;IAED,OAAa,kBAAkB,CAC7B,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,OAAO,CAAC,IAAI,CAAC,CAoBf;IAED;;;;;;;;;;;;OAYG;IACH,OAAa,2BAA2B,CACtC,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,IAAI,EACV,SAAS,GAAE,MAA8B,GACxC,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,gBAAgB,CAAA;KAAE,CAAC,CAwG/D;IAED;;;;OAIG;IACH,OAAa,mBAAmB,CAC9B,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,IAAI,EACV,SAAS,GAAE,MAA8B,GACxC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxB;IAED,OAAa,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBxD;IAED,MAAM,CAAC,aAAa;;MAEnB;IAED;;;OAGG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI,CAU3B;CACF"}