@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
@@ -0,0 +1,258 @@
1
+ "use strict";
2
+ /**
3
+ * Declarative token-based chart providers.
4
+ *
5
+ * Providers that need runtime-computed URLs (Navionics, ArcGIS-style key
6
+ * rotation, OAuth client_credentials) typically just need: fetch a
7
+ * token from a known URL, cache it for some TTL, template it into the
8
+ * tile URL and request headers. That shape is expressed here as JSON
9
+ * config — no executable code, no admin-supplied modules.
10
+ *
11
+ * Providers that need request signing or HMAC are out of scope; the
12
+ * right answer for those is a sandboxed extension point
13
+ * (worker_threads with a fixed message API), not arbitrary code
14
+ * execution.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.TokenProvider = void 0;
18
+ exports.chartProviderFromTokenConfig = chartProviderFromTokenConfig;
19
+ exports.validateTokenProviderConfig = validateTokenProviderConfig;
20
+ // Random-range placeholder used for sharded tile hostnames like
21
+ // `tile{1-5}.host.com`. Inclusive on both ends.
22
+ const RANGE_PLACEHOLDER = /\{(\d+)-(\d+)\}/g;
23
+ const TOKEN_PLACEHOLDER = /\{token\.([a-zA-Z0-9_]+)\}/g;
24
+ // Strip query string and userinfo from a URL before logging. Token
25
+ // endpoints commonly carry secrets in query params (?api_key=...) or
26
+ // userinfo (https://user:pass@host); the host alone is enough context
27
+ // for an admin to recognise which provider failed without the secrets
28
+ // landing in shared logs.
29
+ function redactUrl(raw) {
30
+ try {
31
+ const u = new URL(raw);
32
+ return `${u.protocol}//${u.host}${u.pathname}`;
33
+ }
34
+ catch {
35
+ return '<unparseable url>';
36
+ }
37
+ }
38
+ const DEFAULT_CLOCK = {
39
+ now: () => Date.now(),
40
+ rand: () => Math.random()
41
+ };
42
+ class TokenProvider {
43
+ config;
44
+ clock;
45
+ // Resolved token fields (string-valued only; non-strings from the JSON
46
+ // response are dropped during fetchToken to keep template substitution
47
+ // unambiguous).
48
+ token = {};
49
+ // Epoch-millis at which the cached token is considered stale. Zero forces
50
+ // a fetch on the first ensureFreshToken() call.
51
+ tokenExpiry = 0;
52
+ // Coalesces concurrent refresh attempts: the first caller wins, the rest
53
+ // await the same in-flight promise instead of triggering parallel fetches
54
+ // (which would all race to write `this.token`).
55
+ inFlight = null;
56
+ constructor(config, clock = DEFAULT_CLOCK) {
57
+ this.config = config;
58
+ this.clock = clock;
59
+ }
60
+ /**
61
+ * Refresh the cached token if it has expired. Safe to call on the hot
62
+ * path: a fresh-enough token short-circuits without I/O. Concurrent
63
+ * callers share the same in-flight fetch.
64
+ *
65
+ * Errors are swallowed to a console warning rather than thrown: a token
66
+ * fetch failure shouldn't take down a tile request that might still
67
+ * succeed against a stale token (worst case the upstream returns 401
68
+ * and the next request will re-attempt the refresh).
69
+ */
70
+ async ensureFreshToken() {
71
+ if (this.clock.now() < this.tokenExpiry)
72
+ return;
73
+ if (this.inFlight)
74
+ return this.inFlight;
75
+ this.inFlight = this.fetchToken()
76
+ .catch((err) => {
77
+ console.warn(`Token provider ${this.config.identifier}: token fetch failed: ${err.message}`);
78
+ })
79
+ .finally(() => {
80
+ this.inFlight = null;
81
+ });
82
+ return this.inFlight;
83
+ }
84
+ async fetchToken() {
85
+ const ep = this.config.tokenEndpoint;
86
+ const timeoutMs = ep.timeoutMs ?? 10000;
87
+ const controller = new AbortController();
88
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
89
+ let res;
90
+ try {
91
+ res = await fetch(ep.url, {
92
+ method: ep.method ?? 'GET',
93
+ headers: ep.headers,
94
+ body: ep.body,
95
+ signal: controller.signal
96
+ });
97
+ }
98
+ finally {
99
+ clearTimeout(timer);
100
+ }
101
+ if (!res.ok) {
102
+ // Avoid embedding the full URL in the error: token endpoints often
103
+ // carry secrets in query params, and this message lands in
104
+ // ensureFreshToken's console.warn.
105
+ throw new Error(`token endpoint ${redactUrl(ep.url)} returned ${res.status}`);
106
+ }
107
+ const data = (await res.json());
108
+ if (typeof data !== 'object' || data === null) {
109
+ throw new Error(`token endpoint ${redactUrl(ep.url)} returned non-object`);
110
+ }
111
+ const next = {};
112
+ for (const [k, v] of Object.entries(data)) {
113
+ if (typeof v === 'string')
114
+ next[k] = v;
115
+ }
116
+ this.token = next;
117
+ this.tokenExpiry = this.clock.now() + ep.ttlSeconds * 1000;
118
+ }
119
+ /**
120
+ * Force-invalidate the cached token. Used by the proxy fetch path when
121
+ * the upstream returns 401: next request will re-fetch the token rather
122
+ * than hammering with the stale one.
123
+ */
124
+ invalidateToken() {
125
+ this.tokenExpiry = 0;
126
+ }
127
+ /** Templated tile URL with the current token and any range placeholders. */
128
+ resolveUrl() {
129
+ return this.applyTemplates(this.config.tile.url);
130
+ }
131
+ /** Templated tile request headers with the current token. */
132
+ resolveHeaders() {
133
+ const out = {};
134
+ for (const [k, v] of Object.entries(this.config.tile.headers ?? {})) {
135
+ out[k] = this.applyTemplates(v);
136
+ }
137
+ return out;
138
+ }
139
+ // Substitute {token.<field>} from the cached token, then {<a>-<b>} with a
140
+ // random integer in [a, b]. Token comes first so a sharded hostname
141
+ // referenced inside a token field still randomises correctly.
142
+ applyTemplates(s) {
143
+ return s
144
+ .replace(TOKEN_PLACEHOLDER, (_, key) => this.token[key] ?? '')
145
+ .replace(RANGE_PLACEHOLDER, (_, lo, hi) => {
146
+ const a = parseInt(lo, 10);
147
+ const b = parseInt(hi, 10);
148
+ const span = b - a + 1;
149
+ return String(a + Math.floor(this.clock.rand() * span));
150
+ });
151
+ }
152
+ }
153
+ exports.TokenProvider = TokenProvider;
154
+ /**
155
+ * Build a ChartProvider view of a token-provider config. The returned
156
+ * object has property getters for `remoteUrl` and `headers` so the
157
+ * existing tile-serving code keeps reading provider.remoteUrl /
158
+ * provider.headers without knowing about token rotation. The proxy path
159
+ * is responsible for awaiting `_tokenProvider.ensureFreshToken()`
160
+ * before the fetch.
161
+ */
162
+ function chartProviderFromTokenConfig(cfg) {
163
+ const tp = new TokenProvider(cfg);
164
+ const provider = {
165
+ identifier: cfg.identifier,
166
+ name: cfg.name,
167
+ description: cfg.description ?? '',
168
+ type: cfg.type ?? 'tilelayer',
169
+ scale: cfg.scale ?? 250000,
170
+ proxy: true,
171
+ _filePath: '',
172
+ _tokenProvider: tp
173
+ };
174
+ if (cfg.format !== undefined)
175
+ provider.format = cfg.format;
176
+ if (cfg.minzoom !== undefined)
177
+ provider.minzoom = cfg.minzoom;
178
+ if (cfg.maxzoom !== undefined)
179
+ provider.maxzoom = cfg.maxzoom;
180
+ if (cfg.bounds !== undefined)
181
+ provider.bounds = cfg.bounds;
182
+ // Defining as accessors rather than data properties so every read pulls
183
+ // a freshly-templated string from the current token. The plain
184
+ // ChartProvider interface declares these as `string` / `object`; the
185
+ // getter shape is compatible at the call site.
186
+ Object.defineProperty(provider, 'remoteUrl', {
187
+ enumerable: true,
188
+ configurable: false,
189
+ get: () => tp.resolveUrl()
190
+ });
191
+ Object.defineProperty(provider, 'headers', {
192
+ enumerable: true,
193
+ configurable: false,
194
+ get: () => tp.resolveHeaders()
195
+ });
196
+ provider.v1 = {
197
+ tilemapUrl: `~tilePath~/${cfg.identifier}/{z}/{x}/{y}`,
198
+ chartLayers: []
199
+ };
200
+ provider.v2 = {
201
+ url: `~tilePath~/${cfg.identifier}/{z}/{x}/{y}`,
202
+ layers: []
203
+ };
204
+ return provider;
205
+ }
206
+ /**
207
+ * Lightweight validation of a parsed token-provider config. Returns the
208
+ * config on success and throws with a human-readable message on the first
209
+ * problem found. Validates the fields the implementation actually relies
210
+ * on; admins can still pass extra fields without error.
211
+ */
212
+ // Identifier shape: URL-safe characters only. Identifier flows into
213
+ // filename construction (export mbtiles), tile-route URLs
214
+ // (~tilePath~/{id}/...), and chartProviders dict keys; an identifier
215
+ // containing slashes, dots, or whitespace produces malformed URLs and
216
+ // confused-deputy lookups, even though the export-path traversal is
217
+ // caught downstream. Defensive check at the validator.
218
+ const IDENTIFIER_RE = /^[A-Za-z0-9_-]+$/;
219
+ function validateTokenProviderConfig(raw, index) {
220
+ const where = `token provider #${index}`;
221
+ if (typeof raw !== 'object' || raw === null) {
222
+ throw new Error(`${where}: expected an object`);
223
+ }
224
+ const c = raw;
225
+ if (typeof c['identifier'] !== 'string' || c['identifier'].length === 0) {
226
+ throw new Error(`${where}: identifier is required (non-empty string)`);
227
+ }
228
+ if (!IDENTIFIER_RE.test(c['identifier'])) {
229
+ throw new Error(`${where}: identifier "${c['identifier']}" must match /[A-Za-z0-9_-]+/ ` +
230
+ `(used as a URL path segment and filename component)`);
231
+ }
232
+ if (typeof c['name'] !== 'string' || c['name'].length === 0) {
233
+ throw new Error(`${where}: name is required (non-empty string)`);
234
+ }
235
+ const ep = c['tokenEndpoint'];
236
+ if (typeof ep !== 'object' || ep === null) {
237
+ throw new Error(`${where}: tokenEndpoint is required (object)`);
238
+ }
239
+ const epRec = ep;
240
+ if (typeof epRec['url'] !== 'string' || epRec['url'].length === 0) {
241
+ throw new Error(`${where}: tokenEndpoint.url is required (non-empty string)`);
242
+ }
243
+ if (typeof epRec['ttlSeconds'] !== 'number' ||
244
+ !Number.isFinite(epRec['ttlSeconds']) ||
245
+ epRec['ttlSeconds'] <= 0) {
246
+ throw new Error(`${where}: tokenEndpoint.ttlSeconds must be a positive number`);
247
+ }
248
+ const tile = c['tile'];
249
+ if (typeof tile !== 'object' || tile === null) {
250
+ throw new Error(`${where}: tile is required (object)`);
251
+ }
252
+ const tileRec = tile;
253
+ if (typeof tileRec['url'] !== 'string' || tileRec['url'].length === 0) {
254
+ throw new Error(`${where}: tile.url is required (non-empty string)`);
255
+ }
256
+ return c;
257
+ }
258
+ //# sourceMappingURL=tokenProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenProvider.js","sourceRoot":"","sources":["../src/tokenProvider.ts"],"names":[],"mappings":"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"}
package/plugin/types.d.ts CHANGED
@@ -1,10 +1,15 @@
1
1
  import type { OutgoingHttpHeaders } from 'http';
2
- type MapSourceType = 'tilelayer' | 'S-57' | 'WMS' | 'WMTS' | 'mapstyleJSON' | 'tileJSON';
2
+ import type { DatabaseSync } from 'node:sqlite';
3
+ export type MapSourceType = 'tilelayer' | 'S-57' | 'WMS' | 'WMTS' | 'mapstyleJSON' | 'tileJSON';
3
4
  export interface MBTilesHandle {
5
+ putTile: (z: number, x: number, y: number, tile: Buffer, callback: (err: Error | null) => void) => void;
6
+ startWriting: (callback: (err: Error | null) => void) => void;
7
+ putInfo: (info: MBTilesMetadata, callback: (err: Error | null) => void) => void;
4
8
  getTile: (z: number, x: number, y: number, callback: (err: Error | null, tile: Buffer, headers: OutgoingHttpHeaders) => void) => void;
5
9
  getInfo: (callback: (err: Error | null, metadata: MBTilesMetadata) => void) => void;
6
10
  close: (callback: (err: Error | null) => void) => void;
7
11
  on: (event: 'error', listener: (err: Error) => void) => MBTilesHandle;
12
+ _db?: DatabaseSync;
8
13
  }
9
14
  export interface MBTilesMetadata {
10
15
  name?: string;
@@ -24,6 +29,10 @@ export interface ChartProvider {
24
29
  _filePath: string;
25
30
  _mbtilesHandle?: MBTilesHandle;
26
31
  _flipY?: boolean;
32
+ _tokenProvider?: {
33
+ ensureFreshToken: () => Promise<void>;
34
+ invalidateToken: () => void;
35
+ };
27
36
  identifier: string;
28
37
  name: string;
29
38
  description: string;
@@ -62,5 +71,31 @@ export interface OnlineChartProvider {
62
71
  style: string;
63
72
  layers: string[];
64
73
  }
65
- export {};
74
+ export interface TokenProviderConfig {
75
+ identifier: string;
76
+ name: string;
77
+ description?: string;
78
+ type?: MapSourceType;
79
+ format?: string;
80
+ scale?: number;
81
+ minzoom?: number;
82
+ maxzoom?: number;
83
+ bounds?: number[];
84
+ tokenEndpoint: {
85
+ url: string;
86
+ method?: 'GET' | 'POST';
87
+ headers?: {
88
+ [key: string]: string;
89
+ };
90
+ body?: string;
91
+ ttlSeconds: number;
92
+ timeoutMs?: number;
93
+ };
94
+ tile: {
95
+ url: string;
96
+ headers?: {
97
+ [key: string]: string;
98
+ };
99
+ };
100
+ }
66
101
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
Binary file
Binary file
Binary file