signalk-container 1.5.0 → 1.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.
- package/.coderabbit.yaml +161 -0
- package/AGENTS.md +172 -0
- package/CLAUDE.md +1 -0
- package/README.md +36 -19
- package/dist/containers.d.ts +233 -4
- package/dist/containers.d.ts.map +1 -1
- package/dist/containers.js +685 -27
- package/dist/containers.js.map +1 -1
- package/dist/index.js +394 -10
- package/dist/index.js.map +1 -1
- package/dist/log-stream-broker.d.ts +84 -0
- package/dist/log-stream-broker.d.ts.map +1 -0
- package/dist/log-stream-broker.js +177 -0
- package/dist/log-stream-broker.js.map +1 -0
- package/dist/runtime.d.ts +62 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +132 -0
- package/dist/runtime.js.map +1 -1
- package/dist/types.d.ts +206 -5
- package/dist/types.d.ts.map +1 -1
- package/doc/plugin-developer-guide.md +156 -44
- package/doc/screenshots/signalk-container-1.png +0 -0
- package/doc/screenshots/signalk-container-2.png +0 -0
- package/doc/screenshots/signalk-container-3.png +0 -0
- package/package.json +14 -4
- package/public/520.js +1 -0
- package/public/main.js +1 -1
- package/public/remoteEntry.js +1 -1
- package/webpack.config.js +11 -3
- package/public/805.js +0 -1
package/dist/containers.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ContainerConfig, ContainerInfo, ContainerRuntimeInfo, ContainerState, HealthCheckOptions } from "./types";
|
|
1
|
+
import { ContainerConfig, ContainerInfo, ContainerRuntimeInfo, ContainerState, HealthCheckOptions, VolumeIssue, VolumeSpec } from "./types";
|
|
2
|
+
import { StreamingProcessHandle, spawnRuntimeStreaming } from "./runtime";
|
|
2
3
|
/**
|
|
3
4
|
* Build the value for a `-v <source>:<dest>[:flags]` argument with the
|
|
4
5
|
* correct SELinux relabel suffix for the runtime.
|
|
@@ -11,8 +12,162 @@ import { ContainerConfig, ContainerInfo, ContainerRuntimeInfo, ContainerState, H
|
|
|
11
12
|
* inputs/outputs (jobs.ts) so the named-volume guard stays in one place.
|
|
12
13
|
*/
|
|
13
14
|
export declare function volumeArg(hostPath: string, containerPath: string, runtime: ContainerRuntimeInfo, readOnly?: boolean): string;
|
|
15
|
+
/**
|
|
16
|
+
* Classify each volume entry against host-source existence and the
|
|
17
|
+
* declared `ifMissing` policy. Returns:
|
|
18
|
+
*
|
|
19
|
+
* - `kept`: the volumes that should be passed to the runtime,
|
|
20
|
+
* normalized to bare-string form (the shape `buildRunArgs` and
|
|
21
|
+
* `diffContainerConfig` already consume).
|
|
22
|
+
* - `skipped`: host-path volumes whose source is missing AND whose
|
|
23
|
+
* policy is `'skip'`. Caller should emit `onVolumeIssue`
|
|
24
|
+
* events for each.
|
|
25
|
+
* - `aborted`: host-path volumes whose source is missing AND whose
|
|
26
|
+
* policy is `'abort'`. Caller should emit `onVolumeIssue`
|
|
27
|
+
* events then throw.
|
|
28
|
+
*
|
|
29
|
+
* Bare-string entries and `ifMissing: 'create'` entries always end
|
|
30
|
+
* up in `kept` (the runtime auto-creates the host dir on demand,
|
|
31
|
+
* matching today's behaviour for the bare-string form).
|
|
32
|
+
*
|
|
33
|
+
* Named volumes (source without a leading `/` or `.`) always end up
|
|
34
|
+
* in `kept` regardless of policy — the runtime owns their lifecycle.
|
|
35
|
+
*
|
|
36
|
+
* `probe` is the host-path existence check; defaults to `existsSync`.
|
|
37
|
+
* Tests inject a stub so they don't touch the filesystem.
|
|
38
|
+
*/
|
|
39
|
+
export declare function classifyVolumeSources(volumes: Record<string, string | VolumeSpec> | undefined, probe?: (path: string) => boolean): {
|
|
40
|
+
kept: Record<string, string>;
|
|
41
|
+
skipped: Array<{
|
|
42
|
+
containerPath: string;
|
|
43
|
+
source: string;
|
|
44
|
+
}>;
|
|
45
|
+
aborted: Array<{
|
|
46
|
+
containerPath: string;
|
|
47
|
+
source: string;
|
|
48
|
+
}>;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Given the volume issues from the last `ensureRunning` call (both
|
|
52
|
+
* skipped and aborted entries) and the current call's classification,
|
|
53
|
+
* return the list of entries that are now present and applied — i.e.
|
|
54
|
+
* recovered. Used to fire `onVolumeIssue` with `action: 'recovered'`
|
|
55
|
+
* after the inner `ensureRunning` has recreated the container to
|
|
56
|
+
* include the recovered mount.
|
|
57
|
+
*
|
|
58
|
+
* A volume has "recovered" when:
|
|
59
|
+
* - it was in `prior.skipped` or `prior.aborted` (i.e. missing on
|
|
60
|
+
* the last call), AND
|
|
61
|
+
* - it is NOT in the current call's `currentSkipped` or
|
|
62
|
+
* `currentAborted` (i.e. it is no longer missing), AND
|
|
63
|
+
* - its `containerPath` is in `kept` (i.e. the runtime will actually
|
|
64
|
+
* mount it this time).
|
|
65
|
+
*
|
|
66
|
+
* Pure function — no I/O.
|
|
67
|
+
*/
|
|
68
|
+
export declare function collectRecoveredVolumes(prior: {
|
|
69
|
+
skipped: Array<{
|
|
70
|
+
containerPath: string;
|
|
71
|
+
source: string;
|
|
72
|
+
}>;
|
|
73
|
+
aborted: Array<{
|
|
74
|
+
containerPath: string;
|
|
75
|
+
source: string;
|
|
76
|
+
}>;
|
|
77
|
+
} | undefined, currentSkipped: Array<{
|
|
78
|
+
containerPath: string;
|
|
79
|
+
source: string;
|
|
80
|
+
}>, currentAborted: Array<{
|
|
81
|
+
containerPath: string;
|
|
82
|
+
source: string;
|
|
83
|
+
}>, kept: Record<string, string>): Array<{
|
|
84
|
+
containerPath: string;
|
|
85
|
+
source: string;
|
|
86
|
+
}>;
|
|
87
|
+
/**
|
|
88
|
+
* Invoke an `onVolumeIssue` callback safely. Synchronous throws AND
|
|
89
|
+
* rejected promises both route to `reportError`, so handler bugs (in
|
|
90
|
+
* either flavour) never escape as unhandled rejections.
|
|
91
|
+
*
|
|
92
|
+
* The declared callback type is `(event) => void | Promise<void>`,
|
|
93
|
+
* but TS allows assigning a plain async function where `void` is
|
|
94
|
+
* expected — the eventual rejection bypasses a naive `try/catch`.
|
|
95
|
+
* Wrap the call in `Promise.resolve(...).catch(...)` so the same
|
|
96
|
+
* error path catches both shapes.
|
|
97
|
+
*
|
|
98
|
+
* Pure-by-design: `reportError` is injected so tests can capture
|
|
99
|
+
* the message instead of writing to `app.error`.
|
|
100
|
+
*/
|
|
101
|
+
export declare function safeInvokeVolumeIssue(handler: ((event: VolumeIssue) => void | Promise<void>) | undefined, event: VolumeIssue, reportError: (err: unknown) => void): void;
|
|
102
|
+
/**
|
|
103
|
+
* Invoke an `onContainerLog` callback safely. Synchronous throws AND
|
|
104
|
+
* rejected promises both route to `reportError`, so handler bugs (in
|
|
105
|
+
* either flavour) never escape as unhandled rejections. Same shape
|
|
106
|
+
* and rationale as `safeInvokeVolumeIssue` — see that helper's
|
|
107
|
+
* doc for why the `try { Promise.resolve(...).catch(...) }` dance
|
|
108
|
+
* is needed.
|
|
109
|
+
*/
|
|
110
|
+
export declare function safeInvokeContainerLog(handler: ((line: string) => void | Promise<void>) | undefined, line: string, reportError: (err: unknown) => void): void;
|
|
111
|
+
/**
|
|
112
|
+
* Spawn `podman logs -f --tail=N sk-<name>` (or `docker logs -f`)
|
|
113
|
+
* and emit each line to `onLine`. Returns a stop-handle; the caller
|
|
114
|
+
* manages lifecycle (start after the container is running; stop on
|
|
115
|
+
* remove or recreate).
|
|
116
|
+
*
|
|
117
|
+
* `startTail` controls history-backfill on attach. Default 0 →
|
|
118
|
+
* only live lines after attach. Set to e.g. 100 for "last 100 +
|
|
119
|
+
* live" semantics. Both runtime CLIs accept `--tail` identically.
|
|
120
|
+
*
|
|
121
|
+
* `spawn` is exposed for tests (defaults to `spawnRuntimeStreaming`).
|
|
122
|
+
*/
|
|
123
|
+
export declare function tailContainerLogs(runtime: ContainerRuntimeInfo, name: string, onLine: (line: string) => void, options?: {
|
|
124
|
+
startTail?: number;
|
|
125
|
+
onError?: (msg: string) => void;
|
|
126
|
+
onExit?: (code: number | null) => void;
|
|
127
|
+
spawn?: typeof spawnRuntimeStreaming;
|
|
128
|
+
}): StreamingProcessHandle;
|
|
129
|
+
/** Upper bound for `--tail N` accepted at the public boundary. */
|
|
130
|
+
export declare const MAX_TAIL = 10000;
|
|
131
|
+
/**
|
|
132
|
+
* Validate an optional unsigned-integer query parameter (e.g.
|
|
133
|
+
* `?tail=200`, `?since=1700000000`) at the public REST boundary.
|
|
134
|
+
* Returns `{ value }` on success (or `undefined` when the input
|
|
135
|
+
* was omitted/empty) and `{ error }` with a human-readable
|
|
136
|
+
* message for non-integer, negative, or non-finite inputs.
|
|
137
|
+
*
|
|
138
|
+
* Used by the `/logs` route to reject malformed inputs with 400
|
|
139
|
+
* instead of forwarding silently-coerced values to runtime-facing
|
|
140
|
+
* logic. Exported so the parser is testable in isolation.
|
|
141
|
+
*/
|
|
142
|
+
export declare function parsePositiveIntQuery(raw: unknown, field: string): {
|
|
143
|
+
value: number | undefined;
|
|
144
|
+
error?: string;
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* Capture the last `tail` lines of a managed container's stdout
|
|
148
|
+
* and stderr via `podman logs --tail <N>` (no `-f`). Returns the
|
|
149
|
+
* array of lines. Caps `tail` at 10000 to prevent runaway-buffer
|
|
150
|
+
* requests against very chatty containers; `since` is a unix-epoch-
|
|
151
|
+
* seconds filter passed through to the runtime.
|
|
152
|
+
*
|
|
153
|
+
* Ordering caveat: `execFile` reads the runtime's stdout and stderr
|
|
154
|
+
* into separate buffers — the OS-level chronological interleave
|
|
155
|
+
* between the two is lost before we see them. We return stdout
|
|
156
|
+
* lines (in order) followed by stderr lines (in order); a stderr
|
|
157
|
+
* line the container actually emitted between two stdout lines
|
|
158
|
+
* will appear after the stdout chunk. This is a known limitation
|
|
159
|
+
* of one-shot capture; per-line `--timestamps` parsing would be
|
|
160
|
+
* the only way to reconstruct true chronology and is out of scope.
|
|
161
|
+
*
|
|
162
|
+
* Used both by the `GET /containers/:name/logs` REST route and by
|
|
163
|
+
* `ContainerManagerApi.getLogs` for in-process consumer-plugin calls.
|
|
164
|
+
*/
|
|
165
|
+
export declare function getContainerLogs(runtime: ContainerRuntimeInfo, name: string, options?: {
|
|
166
|
+
tail?: number;
|
|
167
|
+
since?: number;
|
|
168
|
+
}, exec?: ExecFn): Promise<string[]>;
|
|
14
169
|
export declare function qualifyImage(image: string, runtime: ContainerRuntimeInfo): string;
|
|
15
|
-
export declare function imageExists(runtime: ContainerRuntimeInfo, image: string): Promise<boolean>;
|
|
170
|
+
export declare function imageExists(runtime: ContainerRuntimeInfo, image: string, exec?: ExecFn): Promise<boolean>;
|
|
16
171
|
/**
|
|
17
172
|
* Return the local image ID (sha256 digest) for a given image reference,
|
|
18
173
|
* or null if the image is not present locally. Used for digest-drift
|
|
@@ -95,10 +250,84 @@ export declare function parsePortBindings(json: string): Map<number, PortBinding
|
|
|
95
250
|
* had pre-validation.
|
|
96
251
|
*/
|
|
97
252
|
export declare function getActualPortBindings(runtime: ContainerRuntimeInfo, name: string, exec?: ExecFn): Promise<Map<number, PortBinding[]>>;
|
|
98
|
-
|
|
253
|
+
/**
|
|
254
|
+
* The recreate-requiring half of a live container's effective config, parsed
|
|
255
|
+
* from a single `inspect` call. Mirror of the recreate-requiring fields on
|
|
256
|
+
* `ContainerConfig` after `buildRunArgs` would have rendered them. Resources
|
|
257
|
+
* have their own `getLiveResources` reader and live-update path.
|
|
258
|
+
*
|
|
259
|
+
* `image+tag` come from `.Config.Image` (the as-passed reference like
|
|
260
|
+
* `questdb/questdb:latest`), not `.Image` (the resolved sha256 digest) —
|
|
261
|
+
* digest-drift detection is the update service's job (`src/updates/`).
|
|
262
|
+
*/
|
|
263
|
+
export interface LiveContainerConfig {
|
|
264
|
+
image: string;
|
|
265
|
+
tag: string;
|
|
266
|
+
command: string[] | null;
|
|
267
|
+
networkMode: string;
|
|
268
|
+
env: Map<string, string>;
|
|
269
|
+
binds: Array<{
|
|
270
|
+
host: string;
|
|
271
|
+
container: string;
|
|
272
|
+
}>;
|
|
273
|
+
portBindings: Map<string, PortBinding[]>;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Read the live equivalent of `ContainerConfig`'s recreate-requiring fields
|
|
277
|
+
* for an already-running container. Returns `null` on inspect failure (the
|
|
278
|
+
* caller treats that as "can't diff, fall back to early-return" — fail-safe).
|
|
279
|
+
*
|
|
280
|
+
* Used by `ensureRunning` to detect drift between the requested config and
|
|
281
|
+
* what the container was actually created with, so a recreate can fire
|
|
282
|
+
* automatically instead of silently ignoring the new config until restart.
|
|
283
|
+
*/
|
|
284
|
+
export declare function getLiveContainerConfig(runtime: ContainerRuntimeInfo, name: string, exec?: ExecFn): Promise<LiveContainerConfig | null>;
|
|
285
|
+
/**
|
|
286
|
+
* Compare a requested `ContainerConfig` against the live container's
|
|
287
|
+
* effective config and return the list of fields that have drifted.
|
|
288
|
+
*
|
|
289
|
+
* Pure function — no I/O. The caller (`ensureRunning`) decides what to do
|
|
290
|
+
* with a non-empty drift list (today: log + remove + recreate).
|
|
291
|
+
*
|
|
292
|
+
* Field semantics:
|
|
293
|
+
* - image+tag: tag-string equality only, never digest. Update detection
|
|
294
|
+
* for floating tags (`:latest` digest drift) is the update service's job.
|
|
295
|
+
* - command: explicit drift when `requested.command` is set and differs
|
|
296
|
+
* from `live.command`. When `requested.command` is undefined, drift is
|
|
297
|
+
* reported only if a `prior.command` was set (i.e. the user is now
|
|
298
|
+
* unsetting it). Without a `prior`, an undefined `requested.command`
|
|
299
|
+
* can't be told apart from "image's baked CMD" so we skip — the
|
|
300
|
+
* wrapper's prior-config cache (`lastConfigs`) closes that loop on the
|
|
301
|
+
* second-and-later calls within a single signalk-container lifetime.
|
|
302
|
+
* - networkMode: runtime defaults (`bridge`, `slirp4netns`, etc.) are
|
|
303
|
+
* normalized to `""` and compared as equivalent to requested undefined.
|
|
304
|
+
* - env: requested keys must match live values. Additionally, any key
|
|
305
|
+
* present in `prior.env` but absent from `requested.env` is treated
|
|
306
|
+
* as drift (the user is unsetting it). Image-baked env keys not in
|
|
307
|
+
* either `requested.env` or `prior.env` are ignored — they were never
|
|
308
|
+
* ours.
|
|
309
|
+
* - volumes: trailing slashes stripped on both sides; `(host, container)`
|
|
310
|
+
* tuples compared as a Map keyed by container path. Live binds have
|
|
311
|
+
* their `:Z`/`:ro` flags already stripped by `getLiveContainerConfig`.
|
|
312
|
+
* - ports: container-port key compared as runtime-emitted (`9000/tcp`).
|
|
313
|
+
* Multiple host bindings per container port compared as a sorted set.
|
|
314
|
+
*/
|
|
315
|
+
export declare function diffContainerConfig(requested: ContainerConfig, live: LiveContainerConfig, runtime: ContainerRuntimeInfo, prior?: ContainerConfig): {
|
|
316
|
+
drifted: string[];
|
|
317
|
+
};
|
|
318
|
+
export declare function ensureRunning(runtime: ContainerRuntimeInfo, name: string, config: ContainerConfig, debug: (msg: string) => void, options?: HealthCheckOptions, exec?: ExecFn,
|
|
319
|
+
/**
|
|
320
|
+
* Prior `ContainerConfig` from the previous `ensureRunning` call within
|
|
321
|
+
* this signalk-container lifetime, if any. Used to detect "unset" drift
|
|
322
|
+
* — env keys removed, `command` previously set and now undefined. The
|
|
323
|
+
* wrapper in `index.ts` reads from its `lastConfigs` cache before
|
|
324
|
+
* overwriting it; on the first call (or after a Signal K restart) this
|
|
325
|
+
* will be undefined and only positive drift is detected.
|
|
326
|
+
*/
|
|
327
|
+
prior?: ContainerConfig, _postRecreate?: boolean): Promise<void>;
|
|
99
328
|
export declare function startContainer(runtime: ContainerRuntimeInfo, name: string): Promise<void>;
|
|
100
329
|
export declare function stopContainer(runtime: ContainerRuntimeInfo, name: string): Promise<void>;
|
|
101
|
-
export declare function removeContainer(runtime: ContainerRuntimeInfo, name: string): Promise<void>;
|
|
330
|
+
export declare function removeContainer(runtime: ContainerRuntimeInfo, name: string, exec?: ExecFn): Promise<void>;
|
|
102
331
|
export declare function listContainers(runtime: ContainerRuntimeInfo): Promise<ContainerInfo[]>;
|
|
103
332
|
export declare function pruneImages(runtime: ContainerRuntimeInfo): Promise<{
|
|
104
333
|
imagesRemoved: number;
|
package/dist/containers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"containers.d.ts","sourceRoot":"","sources":["../src/containers.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,kBAAkB,
|
|
1
|
+
{"version":3,"file":"containers.d.ts","sourceRoot":"","sources":["../src/containers.ts"],"names":[],"mappings":"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"}
|