signalk-backup 0.6.0 → 0.7.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.
@@ -0,0 +1,347 @@
1
+ // WHY: translate backup-server SSE events into SignalK deltas (issue #33); scheduled runs only.
2
+ const METRIC_BASE = 'server.backup';
3
+ const NOTIF_BASE = 'notifications.server.backup';
4
+ // Hysteresis band so a disk hovering at the boundary doesn't flap warn/normal repeatedly.
5
+ // Threshold values are documented in README.md "SignalK paths published" — keep in sync.
6
+ const STORAGE_LOW_WARN = 0.1; // <10% free → warn
7
+ const STORAGE_LOW_ALERT = 0.05; // <5% free → alert
8
+ const STORAGE_LOW_CLEAR = 0.12; // ≥12% free → clear
9
+ const TIER_INTERVAL_MS = {
10
+ hourly: 60 * 60 * 1000,
11
+ daily: 24 * 60 * 60 * 1000,
12
+ weekly: 7 * 24 * 60 * 60 * 1000,
13
+ startup: 0 // never overdue: triggers only on server start
14
+ };
15
+ // Documented in README.md "SignalK paths published" — keep in sync.
16
+ const OVERDUE_MULTIPLIER = 2;
17
+ // WHY this indirection: eslint's no-unnecessary-condition narrows literal-typed
18
+ // fields to a constant within a function scope. The `stopped` flag is mutated
19
+ // from outside (stopSignalKEmitter), so reading it through a function call
20
+ // blocks the narrowing without disabling the rule project-wide.
21
+ function isStopped(s) {
22
+ return s.stopped;
23
+ }
24
+ // WHY duck-type rather than rely on the static type: SSE input is untrusted
25
+ // JSON; a server-side rev that adds a new event type shouldn't crash the plugin.
26
+ function isBackupCompleted(e) {
27
+ return e.type === 'backup-completed';
28
+ }
29
+ let state = null;
30
+ // WHY idempotent + reconnect: container restart / image update during run shouldn't lose deltas.
31
+ export function startSignalKEmitter(app, baseUrl, config) {
32
+ if (state) {
33
+ app.debug('[signalk-deltas] start called while already running — ignoring');
34
+ return;
35
+ }
36
+ if (!config.emitSignalKDeltas) {
37
+ app.debug('[signalk-deltas] emitSignalKDeltas=false — not starting subscriber');
38
+ return;
39
+ }
40
+ state = {
41
+ app,
42
+ baseUrl,
43
+ config,
44
+ abortController: new AbortController(),
45
+ metaEmitted: false,
46
+ lastSuccessByTier: new Map(),
47
+ activeNotifications: new Set(),
48
+ reconnectTimer: null,
49
+ reconnectDelayMs: 1_000,
50
+ stopped: false
51
+ };
52
+ app.debug(`[signalk-deltas] starting SSE subscriber → ${baseUrl}/api/backups/events/stream`);
53
+ void connect(state);
54
+ }
55
+ export function stopSignalKEmitter() {
56
+ if (!state)
57
+ return;
58
+ state.stopped = true;
59
+ state.abortController.abort();
60
+ if (state.reconnectTimer) {
61
+ clearTimeout(state.reconnectTimer);
62
+ state.reconnectTimer = null;
63
+ }
64
+ state.app.debug('[signalk-deltas] stopped');
65
+ state = null;
66
+ }
67
+ async function connect(s) {
68
+ if (isStopped(s))
69
+ return;
70
+ try {
71
+ const res = await fetch(`${s.baseUrl}/api/backups/events/stream`, {
72
+ signal: s.abortController.signal,
73
+ headers: { Accept: 'text/event-stream' }
74
+ });
75
+ if (!res.ok || !res.body) {
76
+ throw new Error(`SSE connect failed: HTTP ${res.status}`);
77
+ }
78
+ s.app.debug('[signalk-deltas] SSE connected');
79
+ s.reconnectDelayMs = 1_000; // reset backoff on a clean connect
80
+ const reader = res.body.getReader();
81
+ const decoder = new TextDecoder();
82
+ let buffer = '';
83
+ // SSE frames are separated by a blank line. Each frame may have multiple
84
+ // `data:` lines (concatenated), interspersed with `:` keepalives we ignore.
85
+ while (!isStopped(s)) {
86
+ const { value, done } = await reader.read();
87
+ if (done)
88
+ throw new Error('SSE stream ended');
89
+ buffer += decoder.decode(value, { stream: true });
90
+ let sep;
91
+ while ((sep = buffer.indexOf('\n\n')) !== -1) {
92
+ const frame = buffer.slice(0, sep);
93
+ buffer = buffer.slice(sep + 2);
94
+ const dataLines = frame
95
+ .split('\n')
96
+ .filter((l) => l.startsWith('data:'))
97
+ .map((l) => l.slice(5).trimStart());
98
+ if (dataLines.length === 0)
99
+ continue;
100
+ try {
101
+ const event = JSON.parse(dataLines.join('\n'));
102
+ handleEvent(s, event);
103
+ }
104
+ catch (err) {
105
+ s.app.debug(`[signalk-deltas] failed to parse SSE frame: ${err.message}`);
106
+ }
107
+ }
108
+ }
109
+ }
110
+ catch (err) {
111
+ if (isStopped(s))
112
+ return;
113
+ s.app.debug(`[signalk-deltas] SSE disconnect: ${err.message}`);
114
+ scheduleReconnect(s);
115
+ }
116
+ }
117
+ function scheduleReconnect(s) {
118
+ if (isStopped(s))
119
+ return;
120
+ const delay = s.reconnectDelayMs;
121
+ s.reconnectDelayMs = Math.min(s.reconnectDelayMs * 2, 30_000);
122
+ s.reconnectTimer = setTimeout(() => {
123
+ s.reconnectTimer = null;
124
+ s.abortController = new AbortController();
125
+ void connect(s);
126
+ }, delay);
127
+ }
128
+ export function handleEvent(s, event) {
129
+ // Defensive: untrusted SSE input may carry a future event type the plugin doesn't know.
130
+ if (!isBackupCompleted(event))
131
+ return;
132
+ emitMetrics(s, event);
133
+ if (event.localResult === 'success' && event.cloudResult !== 'failure') {
134
+ s.lastSuccessByTier.set(event.tier, Date.parse(event.timestamp));
135
+ clearNotification(s, 'failed');
136
+ }
137
+ else {
138
+ raiseFailedNotification(s, event);
139
+ }
140
+ evaluateOverdue(s, event);
141
+ evaluateStorageLow(s, event);
142
+ }
143
+ function emitMetrics(s, event) {
144
+ const lastStatus = event.localResult === 'success' && event.cloudResult !== 'failure' ? 'success' : 'failure';
145
+ // The four metric paths the issue lists, plus a tier label so dashboards can split
146
+ // by tier without parsing the message.
147
+ const values = [
148
+ { path: `${METRIC_BASE}.lastRunTimestamp`, value: event.timestamp },
149
+ { path: `${METRIC_BASE}.lastStatus`, value: lastStatus },
150
+ { path: `${METRIC_BASE}.lastRunTier`, value: event.tier },
151
+ { path: `${METRIC_BASE}.nextScheduledTimestamp`, value: minTimestamp(event.nextScheduled) }
152
+ ];
153
+ // Emit 0 on failure so dashboards always have a value; explicit omit on unknown-size
154
+ // is handled by the server (event.localBytes undefined).
155
+ values.push({ path: `${METRIC_BASE}.lastRunBytes`, value: event.localBytes ?? 0 });
156
+ const updates = [
157
+ {
158
+ timestamp: event.timestamp,
159
+ values
160
+ }
161
+ ];
162
+ // Emit `meta` only once per process — first event seeds units + displayName for clients.
163
+ if (!s.metaEmitted) {
164
+ updates.push({ meta: metaSeed() });
165
+ s.metaEmitted = true;
166
+ }
167
+ s.app.handleMessage('signalk-backup', {
168
+ context: `vessels.${s.app.selfId}`,
169
+ updates: updates
170
+ });
171
+ }
172
+ function metaSeed() {
173
+ return [
174
+ {
175
+ path: `${METRIC_BASE}.lastRunBytes`,
176
+ value: {
177
+ units: 'B',
178
+ description: 'Size of the most recent scheduled backup',
179
+ displayName: 'Last backup size'
180
+ }
181
+ },
182
+ {
183
+ path: `${METRIC_BASE}.lastRunTimestamp`,
184
+ value: {
185
+ description: 'When the most recent scheduled backup ran',
186
+ displayName: 'Last backup'
187
+ }
188
+ },
189
+ {
190
+ path: `${METRIC_BASE}.lastStatus`,
191
+ value: {
192
+ description: 'Outcome of the most recent scheduled backup run',
193
+ displayName: 'Backup status'
194
+ }
195
+ },
196
+ {
197
+ path: `${METRIC_BASE}.lastRunTier`,
198
+ value: {
199
+ description: 'Scheduler tier that produced the most recent run',
200
+ displayName: 'Last backup tier'
201
+ }
202
+ },
203
+ {
204
+ path: `${METRIC_BASE}.nextScheduledTimestamp`,
205
+ value: {
206
+ description: 'When the next scheduled backup is due (earliest of all tiers)',
207
+ displayName: 'Next backup'
208
+ }
209
+ }
210
+ ];
211
+ }
212
+ function raiseFailedNotification(s, event) {
213
+ const failedParts = [];
214
+ if (event.localResult === 'failure') {
215
+ failedParts.push(`Local Kopia: ${event.localError ?? 'unknown error'}`);
216
+ }
217
+ if (event.cloudResult === 'failure') {
218
+ const target = event.cloudTarget ?? 'cloud';
219
+ failedParts.push(`${target}: ${event.cloudError ?? 'unknown error'}`);
220
+ }
221
+ const message = failedParts.length > 0
222
+ ? `Backup failed — ${failedParts.join('; ')}`
223
+ : 'Backup failed (no detail)';
224
+ emitNotification(s, 'failed', 'alert', message, event.timestamp);
225
+ }
226
+ function evaluateOverdue(s, event) {
227
+ const now = Date.parse(event.timestamp);
228
+ let overdue = null;
229
+ for (const tier of ['hourly', 'daily', 'weekly']) {
230
+ const interval = TIER_INTERVAL_MS[tier];
231
+ if (interval === 0)
232
+ continue;
233
+ const lastSuccess = s.lastSuccessByTier.get(tier);
234
+ if (lastSuccess === undefined)
235
+ continue; // no baseline yet, give it one cycle
236
+ if (now - lastSuccess > OVERDUE_MULTIPLIER * interval) {
237
+ overdue = tier;
238
+ break;
239
+ }
240
+ }
241
+ if (overdue) {
242
+ const msg = `Scheduled ${overdue} backup is overdue (last success >${(OVERDUE_MULTIPLIER * TIER_INTERVAL_MS[overdue]) / 3_600_000}h ago)`;
243
+ emitNotification(s, 'overdue', 'warn', msg, event.timestamp);
244
+ }
245
+ else {
246
+ clearNotification(s, 'overdue');
247
+ }
248
+ }
249
+ function evaluateStorageLow(s, event) {
250
+ if (event.totalBytes <= 0) {
251
+ // Server couldn't statfs — skip rather than raise a misleading alarm.
252
+ return;
253
+ }
254
+ const freeRatio = event.freeBytes / event.totalBytes;
255
+ const active = s.activeNotifications.has('storageLow');
256
+ let raisedState = null;
257
+ if (freeRatio < STORAGE_LOW_ALERT)
258
+ raisedState = 'alert';
259
+ else if (freeRatio < STORAGE_LOW_WARN)
260
+ raisedState = 'warn';
261
+ if (raisedState) {
262
+ const pct = (freeRatio * 100).toFixed(1);
263
+ emitNotification(s, 'storageLow', raisedState, `Backup storage low: ${pct}% free`, event.timestamp);
264
+ }
265
+ else if (active && freeRatio >= STORAGE_LOW_CLEAR) {
266
+ clearNotification(s, 'storageLow');
267
+ }
268
+ // freeRatio between WARN and CLEAR with no prior alarm → no-op (hysteresis dead-band).
269
+ }
270
+ function emitNotification(s, key, state, message, timestamp) {
271
+ const path = `${NOTIF_BASE}.${key}`;
272
+ s.app.handleMessage('signalk-backup', {
273
+ context: `vessels.${s.app.selfId}`,
274
+ updates: [
275
+ {
276
+ timestamp: timestamp,
277
+ values: [
278
+ {
279
+ path: path,
280
+ value: {
281
+ state,
282
+ method: ['visual'],
283
+ message,
284
+ timestamp
285
+ }
286
+ }
287
+ ]
288
+ }
289
+ ]
290
+ });
291
+ s.activeNotifications.add(key);
292
+ }
293
+ function clearNotification(s, key) {
294
+ if (!s.activeNotifications.has(key))
295
+ return;
296
+ const path = `${NOTIF_BASE}.${key}`;
297
+ s.app.handleMessage('signalk-backup', {
298
+ context: `vessels.${s.app.selfId}`,
299
+ updates: [
300
+ {
301
+ timestamp: new Date().toISOString(),
302
+ values: [
303
+ {
304
+ path: path,
305
+ value: {
306
+ state: 'normal',
307
+ method: [],
308
+ message: 'OK',
309
+ timestamp: new Date().toISOString()
310
+ }
311
+ }
312
+ ]
313
+ }
314
+ ]
315
+ });
316
+ s.activeNotifications.delete(key);
317
+ }
318
+ function minTimestamp(next) {
319
+ const candidates = [next.hourly, next.daily, next.weekly].filter((t) => !!t);
320
+ if (candidates.length === 0)
321
+ return new Date().toISOString();
322
+ candidates.sort((a, b) => Date.parse(a) - Date.parse(b));
323
+ return candidates[0] ?? new Date().toISOString();
324
+ }
325
+ // Test-only helpers exposed so the vitest suite can drive the translator without an SSE server.
326
+ export const __test_only__ = {
327
+ /** Inject a fresh state for tests; returns the test handle. */
328
+ bootstrap(app) {
329
+ return {
330
+ app,
331
+ baseUrl: 'http://test',
332
+ config: { emitSignalKDeltas: true },
333
+ abortController: new AbortController(),
334
+ metaEmitted: false,
335
+ lastSuccessByTier: new Map(),
336
+ activeNotifications: new Set(),
337
+ reconnectTimer: null,
338
+ reconnectDelayMs: 1_000,
339
+ stopped: false
340
+ };
341
+ },
342
+ handleEvent,
343
+ STORAGE_LOW_WARN,
344
+ STORAGE_LOW_ALERT,
345
+ STORAGE_LOW_CLEAR
346
+ };
347
+ //# sourceMappingURL=signalk-deltas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signalk-deltas.js","sourceRoot":"","sources":["../src/signalk-deltas.ts"],"names":[],"mappings":"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"}
package/plugin/types.d.ts CHANGED
@@ -154,6 +154,10 @@ export interface ContainerManagerApi {
154
154
  updateResources: (name: string, limits: ContainerResourceLimits) => Promise<UpdateResourcesResult>;
155
155
  getResources: (name: string) => ContainerResourceLimits;
156
156
  resolveContainerAddress: (name: string, port: number) => Promise<string | null>;
157
+ resolveHostPath?: (absPath: string) => Promise<{
158
+ source: string;
159
+ subPath: string;
160
+ } | null>;
157
161
  updates: UpdateServiceApi;
158
162
  }
159
163
  declare global {
@@ -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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"}
@@ -1,2 +1,2 @@
1
- (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=`modulepreload`,t=function(e){return`/signalk-backup/`+e},n={},r=function(r,i,a){let o=Promise.resolve();if(i&&i.length>0){let r=document.getElementsByTagName(`link`),s=document.querySelector(`meta[property=csp-nonce]`),c=s?.nonce||s?.getAttribute(`nonce`);function l(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}o=l(i.map(i=>{if(i=t(i,a),i in n)return;n[i]=!0;let o=i.endsWith(`.css`),s=o?`[rel="stylesheet"]`:``;if(a)for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.href===i&&(!o||t.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${i}"]${s}`))return;let l=document.createElement(`link`);if(l.rel=o?`stylesheet`:e,o||(l.as=`script`),l.crossOrigin=``,l.href=i,c&&l.setAttribute(`nonce`,c),document.head.appendChild(l),o)return new Promise((e,t)=>{l.addEventListener(`load`,e),l.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${i}`)))})}))}function s(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return o.then(e=>{for(let t of e||[])t.status===`rejected`&&s(t.reason);return r().catch(s)})};async function i(){let e=await fetch(`/admin/.vite/manifest.json`);if(!e.ok)return;let t=await e.json(),n=new Set;for(let e of Object.values(t))if(e){for(let t of e.css??[])n.add(t);typeof e.file==`string`&&e.file.endsWith(`.css`)&&n.add(e.file)}await Promise.all([...n].map(e=>new Promise(t=>{let n=document.createElement(`link`);n.rel=`stylesheet`,n.href=`/admin/`+e,n.onload=t,n.onerror=t,document.head.appendChild(n)})))}try{await i()}catch(e){console.warn(`signalk-backup: admin CSS not available`,e)}finally{await r(()=>import(`./main-B53J3gmZ.js`),[])}
2
- //# sourceMappingURL=index-C8j20cZ-.js.map
1
+ (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=`modulepreload`,t=function(e){return`/signalk-backup/`+e},n={},r=function(r,i,a){let o=Promise.resolve();if(i&&i.length>0){let r=document.getElementsByTagName(`link`),s=document.querySelector(`meta[property=csp-nonce]`),c=s?.nonce||s?.getAttribute(`nonce`);function l(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}o=l(i.map(i=>{if(i=t(i,a),i in n)return;n[i]=!0;let o=i.endsWith(`.css`),s=o?`[rel="stylesheet"]`:``;if(a)for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.href===i&&(!o||t.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${i}"]${s}`))return;let l=document.createElement(`link`);if(l.rel=o?`stylesheet`:e,o||(l.as=`script`),l.crossOrigin=``,l.href=i,c&&l.setAttribute(`nonce`,c),document.head.appendChild(l),o)return new Promise((e,t)=>{l.addEventListener(`load`,e),l.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${i}`)))})}))}function s(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return o.then(e=>{for(let t of e||[])t.status===`rejected`&&s(t.reason);return r().catch(s)})};async function i(){let e=await fetch(`/admin/.vite/manifest.json`);if(!e.ok)return;let t=await e.json(),n=new Set;for(let e of Object.values(t))if(e){for(let t of e.css??[])n.add(t);typeof e.file==`string`&&e.file.endsWith(`.css`)&&n.add(e.file)}await Promise.all([...n].map(e=>new Promise(t=>{let n=document.createElement(`link`);n.rel=`stylesheet`,n.href=`/admin/`+e,n.onload=t,n.onerror=t,document.head.appendChild(n)})))}try{await i()}catch(e){console.warn(`signalk-backup: admin CSS not available`,e)}finally{await r(()=>import(`./main-CjcLMWrn.js`),[])}
2
+ //# sourceMappingURL=index-t6Jtw_Oz.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"m2DACM,eAAe,GAAiB,CAC9B,IAAM,EAAM,MAAM,MAAM,4BAA4B,EACpD,GAAI,CAAC,EAAI,GAAI,OACb,IAAM,EAAW,MAAM,EAAI,KAAK,EAC1B,EAAW,IAAI,IAMrB,IAAK,IAAM,KAAS,OAAO,OAAO,CAAQ,EACnC,KACL,KAAK,IAAM,KAAO,EAAM,KAAO,CAAC,EAAG,EAAS,IAAI,CAAG,EAC/C,OAAO,EAAM,MAAS,UAAY,EAAM,KAAK,SAAS,MAAM,GAC9D,EAAS,IAAI,EAAM,IAAI,CAF0B,CAKrD,MAAM,QAAQ,IACZ,CAAC,GAAG,CAAQ,EAAE,IACX,GACC,IAAI,QAAS,GAAY,CACvB,IAAM,EAAO,SAAS,cAAc,MAAM,EAC1C,EAAK,IAAM,aACX,EAAK,KAAO,UAAY,EACxB,EAAK,OAAS,EACd,EAAK,QAAU,EACf,SAAS,KAAK,YAAY,CAAI,CAChC,CAAC,CACL,CACF,CACF,CAEA,GAAI,CACF,MAAM,EAAe,CACvB,OAAS,EAAK,CACZ,QAAQ,KAAK,0CAA2C,CAAG,CAC7D,QAAU,CACR,YAAM,OAAO,yBACf","names":[],"ignoreList":[],"sources":["../../webapp/index.html?html-proxy&index=0.js"],"sourcesContent":["\n async function injectAdminCss() {\n const res = await fetch('/admin/.vite/manifest.json')\n if (!res.ok) return\n const manifest = await res.json()\n const cssFiles = new Set()\n // Two shapes are common: an entry whose `css` array lists its\n // stylesheet imports, OR a top-level entry whose `file` itself\n // ends in `.css` (when Vite extracts a global stylesheet). The\n // current SignalK admin uses the second shape; older builds and\n // the docs example use the first. Cover both.\n for (const entry of Object.values(manifest)) {\n if (!entry) continue\n for (const css of entry.css ?? []) cssFiles.add(css)\n if (typeof entry.file === 'string' && entry.file.endsWith('.css')) {\n cssFiles.add(entry.file)\n }\n }\n await Promise.all(\n [...cssFiles].map(\n (css) =>\n new Promise((resolve) => {\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = '/admin/' + css\n link.onload = resolve\n link.onerror = resolve\n document.head.appendChild(link)\n })\n )\n )\n }\n\n try {\n await injectAdminCss()\n } catch (err) {\n console.warn('signalk-backup: admin CSS not available', err)\n } finally {\n await import('./src/main.tsx')\n }\n "],"file":"index-C8j20cZ-.js"}
1
+ {"version":3,"mappings":"m2DACM,eAAe,GAAiB,CAC9B,IAAM,EAAM,MAAM,MAAM,4BAA4B,EACpD,GAAI,CAAC,EAAI,GAAI,OACb,IAAM,EAAW,MAAM,EAAI,KAAK,EAC1B,EAAW,IAAI,IAMrB,IAAK,IAAM,KAAS,OAAO,OAAO,CAAQ,EACnC,KACL,KAAK,IAAM,KAAO,EAAM,KAAO,CAAC,EAAG,EAAS,IAAI,CAAG,EAC/C,OAAO,EAAM,MAAS,UAAY,EAAM,KAAK,SAAS,MAAM,GAC9D,EAAS,IAAI,EAAM,IAAI,CAF0B,CAKrD,MAAM,QAAQ,IACZ,CAAC,GAAG,CAAQ,EAAE,IACX,GACC,IAAI,QAAS,GAAY,CACvB,IAAM,EAAO,SAAS,cAAc,MAAM,EAC1C,EAAK,IAAM,aACX,EAAK,KAAO,UAAY,EACxB,EAAK,OAAS,EACd,EAAK,QAAU,EACf,SAAS,KAAK,YAAY,CAAI,CAChC,CAAC,CACL,CACF,CACF,CAEA,GAAI,CACF,MAAM,EAAe,CACvB,OAAS,EAAK,CACZ,QAAQ,KAAK,0CAA2C,CAAG,CAC7D,QAAU,CACR,YAAM,OAAO,yBACf","names":[],"ignoreList":[],"sources":["../../webapp/index.html?html-proxy&index=0.js"],"sourcesContent":["\n async function injectAdminCss() {\n const res = await fetch('/admin/.vite/manifest.json')\n if (!res.ok) return\n const manifest = await res.json()\n const cssFiles = new Set()\n // Two shapes are common: an entry whose `css` array lists its\n // stylesheet imports, OR a top-level entry whose `file` itself\n // ends in `.css` (when Vite extracts a global stylesheet). The\n // current SignalK admin uses the second shape; older builds and\n // the docs example use the first. Cover both.\n for (const entry of Object.values(manifest)) {\n if (!entry) continue\n for (const css of entry.css ?? []) cssFiles.add(css)\n if (typeof entry.file === 'string' && entry.file.endsWith('.css')) {\n cssFiles.add(entry.file)\n }\n }\n await Promise.all(\n [...cssFiles].map(\n (css) =>\n new Promise((resolve) => {\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = '/admin/' + css\n link.onload = resolve\n link.onerror = resolve\n document.head.appendChild(link)\n })\n )\n )\n }\n\n try {\n await injectAdminCss()\n } catch (err) {\n console.warn('signalk-backup: admin CSS not available', err)\n } finally {\n await import('./src/main.tsx')\n }\n "],"file":"index-t6Jtw_Oz.js"}