rightsize 0.7.10 → 0.7.12
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/README.md +6 -4
- package/dist/backend-docker/backend.d.ts +25 -2
- package/dist/backend-docker/backend.d.ts.map +1 -1
- package/dist/backend-docker/backend.js +26 -3
- package/dist/backend-docker/backend.js.map +1 -1
- package/dist/backend-msb/backend.d.ts +39 -15
- package/dist/backend-msb/backend.d.ts.map +1 -1
- package/dist/backend-msb/backend.js +83 -16
- package/dist/backend-msb/backend.js.map +1 -1
- package/dist/backend-msb/commands.d.ts +7 -5
- package/dist/backend-msb/commands.d.ts.map +1 -1
- package/dist/backend-msb/commands.js +37 -7
- package/dist/backend-msb/commands.js.map +1 -1
- package/dist/backend-msb/network-links.d.ts +86 -1
- package/dist/backend-msb/network-links.d.ts.map +1 -1
- package/dist/backend-msb/network-links.js +119 -4
- package/dist/backend-msb/network-links.js.map +1 -1
- package/dist/core/backend.d.ts +15 -1
- package/dist/core/backend.d.ts.map +1 -1
- package/dist/core/checkpoint/registry.d.ts +12 -0
- package/dist/core/checkpoint/registry.d.ts.map +1 -1
- package/dist/core/checkpoint/registry.js +24 -2
- package/dist/core/checkpoint/registry.js.map +1 -1
- package/dist/core/free-ports.d.ts +18 -0
- package/dist/core/free-ports.d.ts.map +1 -1
- package/dist/core/free-ports.js +61 -0
- package/dist/core/free-ports.js.map +1 -1
- package/dist/core/generic-container.d.ts +43 -2
- package/dist/core/generic-container.d.ts.map +1 -1
- package/dist/core/generic-container.js +177 -44
- package/dist/core/generic-container.js.map +1 -1
- package/dist/core/model.d.ts +37 -1
- package/dist/core/model.d.ts.map +1 -1
- package/dist/core/network.d.ts +6 -2
- package/dist/core/network.d.ts.map +1 -1
- package/dist/core/network.js +4 -1
- package/dist/core/network.js.map +1 -1
- package/dist/core/reuse/hash.d.ts +12 -0
- package/dist/core/reuse/hash.d.ts.map +1 -1
- package/dist/core/reuse/hash.js +1 -0
- package/dist/core/reuse/hash.js.map +1 -1
- package/dist/core/reuse/registry.d.ts +10 -1
- package/dist/core/reuse/registry.d.ts.map +1 -1
- package/dist/core/reuse/registry.js +15 -1
- package/dist/core/reuse/registry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/modules/cassandra.d.ts +12 -12
- package/dist/modules/cassandra.js +13 -13
- package/dist/modules/cassandra.js.map +1 -1
- package/dist/modules/postgres.d.ts +2 -2
- package/dist/modules/postgres.d.ts.map +1 -1
- package/dist/modules/postgres.js +11 -9
- package/dist/modules/postgres.js.map +1 -1
- package/package.json +1 -1
package/dist/core/backend.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ContainerSpec, ExecResult } from "./model.js";
|
|
1
|
+
import type { ContainerSpec, ExecResult, PortProtocol } from "./model.js";
|
|
2
2
|
/**
|
|
3
3
|
* One alias a container should be reachable under from a running sibling on
|
|
4
4
|
* the same `Network`, computed by `Network.linksForNewMember()`. A native
|
|
@@ -12,6 +12,20 @@ export interface NetworkLink {
|
|
|
12
12
|
readonly guestPort: number;
|
|
13
13
|
/** The sibling's host-side mapped port to tunnel/route traffic to. */
|
|
14
14
|
readonly targetHostPort: number;
|
|
15
|
+
/**
|
|
16
|
+
* The transport `guestPort` was exposed over. `"tcp"` for every link
|
|
17
|
+
* computed from a sibling's `exposedGuestPorts`/`mappedPort` (unchanged
|
|
18
|
+
* behavior); `"udp"` for one computed from `exposedUdpGuestPorts`/
|
|
19
|
+
* `mappedUdpPort`. Docker ignores this — its native bridge network already
|
|
20
|
+
* carries UDP with no per-link declaration (see `installNetworkLinks`'s
|
|
21
|
+
* own doc); msb has no shared network to carry either transport, so it
|
|
22
|
+
* emulates both, but by different means: a TCP link gets an exec-tunnel
|
|
23
|
+
* relayed through this process (`MsbCliBackend`'s `ExecTunnel`), a UDP
|
|
24
|
+
* link gets an in-guest forwarder dialing `targetHostPort` on the host
|
|
25
|
+
* gateway directly, with no per-connection relay on this side at all (see
|
|
26
|
+
* `MsbCliBackend.installNetworkLinks`).
|
|
27
|
+
*/
|
|
28
|
+
readonly protocol: PortProtocol;
|
|
15
29
|
}
|
|
16
30
|
/**
|
|
17
31
|
* Backend-native opaque container reference. Immutable id + spec; any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/core/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../src/core/backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wCAAwC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B;AAED,2FAA2F;AAC3F,MAAM,WAAW,YAAY;IAC3B,+HAA+H;IAC/H,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,iBAAiB;IAChC,0HAA0H;IAC1H,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,kJAAkJ;IAClJ,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC/C;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B;;;;;;;;OAQG;IACH,QAAQ,CAAC,0BAA0B,EAAE,OAAO,CAAC;CAC9C;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0HAA0H;IAC1H,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC;IACzC,wFAAwF;IACxF,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,8GAA8G;IAC9G,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACpD,iKAAiK;IACjK,KAAK,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,kEAAkE;IAClE,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3C,oGAAoG;IACpG,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtE;;;;;;;;;;;;;;;;;;;OAmBG;IACH,uBAAuB,CAAC,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACnF;;;;;;OAMG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C;;;;;;;;;;;;;;;;;OAiBG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C;;;;;;;;;OASG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D;;;;;;;;;;;;;;;;;OAiBG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE;;;;;;;OAOG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C;;;;;;;;;OASG;IACH,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAAC;IACrE,gGAAgG;IAChG,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAChD,iFAAiF;IACjF,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7E,0EAA0E;IAC1E,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C;;;;;OAKG;IACH,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3F,yDAAyD;IACzD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,mEAAmE;IACnE,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,+FAA+F;IAC/F,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7F;;;;;;;;;;OAUG;IACH,eAAe,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/F,qJAAqJ;IACrJ,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjG,kFAAkF;IAClF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,2FAA2F;IAC3F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2HAA2H;IAC3H,WAAW,IAAI,OAAO,CAAC;IACvB,8GAA8G;IAC9G,iBAAiB,IAAI,MAAM,CAAC;IAC5B,8EAA8E;IAC9E,MAAM,IAAI,cAAc,CAAC;CAC1B"}
|
|
@@ -12,8 +12,20 @@ import type { ContainerSpec } from "../model.js";
|
|
|
12
12
|
export interface CheckpointRegistrySpec {
|
|
13
13
|
readonly env: Record<string, string>;
|
|
14
14
|
readonly command: ReadonlyArray<string> | null;
|
|
15
|
+
/** TCP-exposed guest ports only — unchanged shape/name from before UDP exposure existed. */
|
|
15
16
|
readonly exposedPorts: ReadonlyArray<number>;
|
|
16
17
|
readonly memoryLimitMb: number | null;
|
|
18
|
+
/**
|
|
19
|
+
* UDP-exposed guest ports (`withExposedUdpPorts`), kept as a SEPARATE list
|
|
20
|
+
* from `exposedPorts` so a restore can split them back into the right
|
|
21
|
+
* builder field (`fromCheckpoint` calls `withExposedPorts` for one list and
|
|
22
|
+
* `withExposedUdpPorts` for the other) rather than guessing protocol from a
|
|
23
|
+
* merged list of bare numbers. ADDITIVE and OPTIONAL: absent on every entry
|
|
24
|
+
* written before UDP exposure existed — a deserializer/validator reading an
|
|
25
|
+
* old entry treats a missing value as "no UDP ports were ever exposed"
|
|
26
|
+
* (normalizes to `[]`), never as corrupt.
|
|
27
|
+
*/
|
|
28
|
+
readonly exposedUdpPorts?: ReadonlyArray<number>;
|
|
17
29
|
}
|
|
18
30
|
/**
|
|
19
31
|
* One `checkpoints/<name>.json` record: written atomically only after the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/checkpoint/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;;;;;;;;GASG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/checkpoint/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD;;;;;;;;;GASG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC/C,4FAA4F;IAC5F,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC;;;;;;;;;OASG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAClD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mLAAmL;IACnL,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAClD;AAED,mGAAmG;AACnG,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7E;AAED,wKAAwK;AACxK,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,sBAAsB,CAuCxF;AAyBD,sLAAsL;AACtL,MAAM,MAAM,4BAA4B,GACpC;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAA;CAAE,CAAC;AAExE;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAkBlH;AAED;;;;;;;GAOG;AACH,wBAAsB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjI;AAED,4FAA4F;AAC5F,wBAAsB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhG;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ7E;AAOD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,aAAa,GAAG,sBAAsB,CAgBpF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,uBAAuB,GAAG,aAAa,CA2BzF"}
|
|
@@ -39,6 +39,14 @@ export function isCheckpointRegistrySpec(value) {
|
|
|
39
39
|
if (!Array.isArray(exposedPorts) || !exposedPorts.every((p) => typeof p === "number")) {
|
|
40
40
|
return false;
|
|
41
41
|
}
|
|
42
|
+
// Additive and optional (see CheckpointRegistrySpec's own doc): an entry
|
|
43
|
+
// written before UDP exposure existed simply omits the key, which reads as
|
|
44
|
+
// "no UDP ports" — only a PRESENT-but-malformed value (not an array of
|
|
45
|
+
// numbers) is corrupt.
|
|
46
|
+
const exposedUdpPorts = rec["exposedUdpPorts"];
|
|
47
|
+
if (exposedUdpPorts !== undefined && !(Array.isArray(exposedUdpPorts) && exposedUdpPorts.every((p) => typeof p === "number"))) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
42
50
|
const memoryLimitMb = rec["memoryLimitMb"];
|
|
43
51
|
if (memoryLimitMb !== null && typeof memoryLimitMb !== "number") {
|
|
44
52
|
return false;
|
|
@@ -150,11 +158,16 @@ export function toCheckpointRegistrySpec(spec) {
|
|
|
150
158
|
for (const [key, value] of spec.env) {
|
|
151
159
|
env[key] = value;
|
|
152
160
|
}
|
|
161
|
+
const exposedUdpPorts = spec.ports.filter((p) => p.protocol === "udp").map((p) => p.guestPort);
|
|
153
162
|
return {
|
|
154
163
|
env,
|
|
155
164
|
command: spec.command ?? null,
|
|
156
|
-
exposedPorts: spec.ports.map((p) => p.guestPort),
|
|
165
|
+
exposedPorts: spec.ports.filter((p) => p.protocol === "tcp").map((p) => p.guestPort),
|
|
157
166
|
memoryLimitMb: spec.memoryLimitMb ?? null,
|
|
167
|
+
// Omitted (not an empty array) when there are none — a spec that never
|
|
168
|
+
// exposes a UDP port serializes exactly as it did before this field
|
|
169
|
+
// existed.
|
|
170
|
+
...(exposedUdpPorts.length > 0 ? { exposedUdpPorts } : {}),
|
|
158
171
|
};
|
|
159
172
|
}
|
|
160
173
|
/**
|
|
@@ -189,7 +202,12 @@ export function fromCheckpointRegistryEntry(entry) {
|
|
|
189
202
|
image: entry.ref,
|
|
190
203
|
env: envRecordToPairs(entry.spec.env),
|
|
191
204
|
command: entry.spec.command ?? entry.capturedCommand ?? undefined,
|
|
192
|
-
ports:
|
|
205
|
+
ports: [
|
|
206
|
+
...entry.spec.exposedPorts.map((guestPort) => ({ hostPort: 0, guestPort, protocol: "tcp" })),
|
|
207
|
+
// Absent on an entry written before UDP exposure existed — normalizes
|
|
208
|
+
// to no UDP ports, never a corrupt read (see isCheckpointRegistrySpec).
|
|
209
|
+
...(entry.spec.exposedUdpPorts ?? []).map((guestPort) => ({ hostPort: 0, guestPort, protocol: "udp" })),
|
|
210
|
+
],
|
|
193
211
|
mounts: [],
|
|
194
212
|
networkId: undefined,
|
|
195
213
|
aliases: [],
|
|
@@ -200,6 +218,10 @@ export function fromCheckpointRegistryEntry(entry) {
|
|
|
200
218
|
diskLimitMb: undefined,
|
|
201
219
|
tmpfsRootMb: undefined,
|
|
202
220
|
networkDisabled: false,
|
|
221
|
+
// Per-run wiring, never persisted — same placeholder treatment as
|
|
222
|
+
// networkDisabled/diskLimitMb/tmpfsRootMb above (see ContainerSpec's own
|
|
223
|
+
// doc on why this is never part of a checkpoint's identity).
|
|
224
|
+
hostUdpEgressPorts: [],
|
|
203
225
|
};
|
|
204
226
|
}
|
|
205
227
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/checkpoint/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/core/checkpoint/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,14 +10,32 @@
|
|
|
10
10
|
export declare function allocate(): Promise<number>;
|
|
11
11
|
/** Releases a port back to the pool. Releasing a port never issued by this process is a harmless no-op. */
|
|
12
12
|
export declare function release(port: number): void;
|
|
13
|
+
/**
|
|
14
|
+
* The UDP counterpart of `allocate`: same in-process-uniqueness contract,
|
|
15
|
+
* same retry shape, but proven free by binding a UDP socket (see
|
|
16
|
+
* `bindEphemeralUdpPort`) rather than a TCP listener — a TCP probe cannot
|
|
17
|
+
* stand in for this, since the two transports keep independent OS port
|
|
18
|
+
* tables.
|
|
19
|
+
*/
|
|
20
|
+
export declare function allocateUdp(): Promise<number>;
|
|
21
|
+
/** Releases a UDP port back to its pool — the UDP counterpart of `release`. Releasing a port never issued by this process is a harmless no-op. */
|
|
22
|
+
export declare function releaseUdp(port: number): void;
|
|
13
23
|
/** Test-only observability seam: the ports currently considered issued. */
|
|
14
24
|
export declare function issuedView(): ReadonlySet<number>;
|
|
25
|
+
/** Test-only observability seam for the UDP pool — see `issuedView`. */
|
|
26
|
+
export declare function issuedUdpView(): ReadonlySet<number>;
|
|
15
27
|
export declare const FreePorts: {
|
|
16
28
|
/** Allocates a host port this process has not already handed out — see `allocate` above. */
|
|
17
29
|
allocate: typeof allocate;
|
|
18
30
|
/** Releases a port back to the pool — see `release` above. */
|
|
19
31
|
release: typeof release;
|
|
32
|
+
/** Allocates a UDP host port this process has not already handed out — see `allocateUdp` above. */
|
|
33
|
+
allocateUdp: typeof allocateUdp;
|
|
34
|
+
/** Releases a UDP port back to its pool — see `releaseUdp` above. */
|
|
35
|
+
releaseUdp: typeof releaseUdp;
|
|
20
36
|
/** Test-only observability seam — see `issuedView` above. */
|
|
21
37
|
issuedView: typeof issuedView;
|
|
38
|
+
/** Test-only observability seam for the UDP pool — see `issuedUdpView` above. */
|
|
39
|
+
issuedUdpView: typeof issuedUdpView;
|
|
22
40
|
};
|
|
23
41
|
//# sourceMappingURL=free-ports.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"free-ports.d.ts","sourceRoot":"","sources":["../../src/core/free-ports.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"free-ports.d.ts","sourceRoot":"","sources":["../../src/core/free-ports.ts"],"names":[],"mappings":"AA+DA;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAShD;AAED,2GAA2G;AAC3G,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CASnD;AAED,kJAAkJ;AAClJ,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,IAAI,WAAW,CAAC,MAAM,CAAC,CAEhD;AAED,wEAAwE;AACxE,wBAAgB,aAAa,IAAI,WAAW,CAAC,MAAM,CAAC,CAEnD;AAED,eAAO,MAAM,SAAS;IACpB,4FAA4F;;IAE5F,8DAA8D;;IAE9D,mGAAmG;;IAEnG,qEAAqE;;IAErE,6DAA6D;;IAE7D,iFAAiF;;CAElF,CAAC"}
|
package/dist/core/free-ports.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as net from "node:net";
|
|
2
|
+
import * as dgram from "node:dgram";
|
|
2
3
|
const MAX_ALLOCATE_ATTEMPTS = 100;
|
|
3
4
|
// Binds are loopback-only (127.0.0.1), not wildcard — the same conservative
|
|
4
5
|
// choice used everywhere else a host port is touched (publishing, wait
|
|
@@ -24,7 +25,36 @@ function bindEphemeralPort() {
|
|
|
24
25
|
});
|
|
25
26
|
});
|
|
26
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* The UDP counterpart of `bindEphemeralPort`: a TCP `listen()` proves
|
|
30
|
+
* nothing about UDP's independent OS port table (and vice versa) — a port
|
|
31
|
+
* free on one transport can easily be bound on the other — so a UDP host
|
|
32
|
+
* port must be proven free by binding an actual UDP socket, not inferred
|
|
33
|
+
* from the TCP probe. Same shape as the TCP path: bind ephemeral, read the
|
|
34
|
+
* assigned port back, close, hand the number to the caller.
|
|
35
|
+
*/
|
|
36
|
+
function bindEphemeralUdpPort() {
|
|
37
|
+
return new Promise((resolvePort, rejectPort) => {
|
|
38
|
+
const socket = dgram.createSocket("udp4");
|
|
39
|
+
socket.once("error", (err) => {
|
|
40
|
+
rejectPort(err);
|
|
41
|
+
});
|
|
42
|
+
socket.bind(0, BIND_HOST, () => {
|
|
43
|
+
const address = socket.address();
|
|
44
|
+
const port = address.port;
|
|
45
|
+
socket.close(() => {
|
|
46
|
+
resolvePort(port);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
27
51
|
const issued = new Set();
|
|
52
|
+
// A separate issued set for UDP: TCP and UDP each have their own OS-level
|
|
53
|
+
// port table, so the two pools track uniqueness independently — a port
|
|
54
|
+
// issued on one transport says nothing about the other, and a container may
|
|
55
|
+
// legitimately be handed the same numeric port on both (see `PortBinding`'s
|
|
56
|
+
// own doc on the DNS-53 case).
|
|
57
|
+
const issuedUdp = new Set();
|
|
28
58
|
/**
|
|
29
59
|
* Allocates a host port this process has not already handed out. Binding
|
|
30
60
|
* `127.0.0.1:0` and immediately closing the socket leaves a window where
|
|
@@ -48,16 +78,47 @@ export async function allocate() {
|
|
|
48
78
|
export function release(port) {
|
|
49
79
|
issued.delete(port);
|
|
50
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* The UDP counterpart of `allocate`: same in-process-uniqueness contract,
|
|
83
|
+
* same retry shape, but proven free by binding a UDP socket (see
|
|
84
|
+
* `bindEphemeralUdpPort`) rather than a TCP listener — a TCP probe cannot
|
|
85
|
+
* stand in for this, since the two transports keep independent OS port
|
|
86
|
+
* tables.
|
|
87
|
+
*/
|
|
88
|
+
export async function allocateUdp() {
|
|
89
|
+
for (let attempt = 0; attempt < MAX_ALLOCATE_ATTEMPTS; attempt++) {
|
|
90
|
+
const port = await bindEphemeralUdpPort();
|
|
91
|
+
if (!issuedUdp.has(port)) {
|
|
92
|
+
issuedUdp.add(port);
|
|
93
|
+
return port;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
throw new Error(`could not allocate a unique free UDP port after ${MAX_ALLOCATE_ATTEMPTS} attempts`);
|
|
97
|
+
}
|
|
98
|
+
/** Releases a UDP port back to its pool — the UDP counterpart of `release`. Releasing a port never issued by this process is a harmless no-op. */
|
|
99
|
+
export function releaseUdp(port) {
|
|
100
|
+
issuedUdp.delete(port);
|
|
101
|
+
}
|
|
51
102
|
/** Test-only observability seam: the ports currently considered issued. */
|
|
52
103
|
export function issuedView() {
|
|
53
104
|
return new Set(issued);
|
|
54
105
|
}
|
|
106
|
+
/** Test-only observability seam for the UDP pool — see `issuedView`. */
|
|
107
|
+
export function issuedUdpView() {
|
|
108
|
+
return new Set(issuedUdp);
|
|
109
|
+
}
|
|
55
110
|
export const FreePorts = {
|
|
56
111
|
/** Allocates a host port this process has not already handed out — see `allocate` above. */
|
|
57
112
|
allocate,
|
|
58
113
|
/** Releases a port back to the pool — see `release` above. */
|
|
59
114
|
release,
|
|
115
|
+
/** Allocates a UDP host port this process has not already handed out — see `allocateUdp` above. */
|
|
116
|
+
allocateUdp,
|
|
117
|
+
/** Releases a UDP port back to its pool — see `releaseUdp` above. */
|
|
118
|
+
releaseUdp,
|
|
60
119
|
/** Test-only observability seam — see `issuedView` above. */
|
|
61
120
|
issuedView,
|
|
121
|
+
/** Test-only observability seam for the UDP pool — see `issuedUdpView` above. */
|
|
122
|
+
issuedUdpView,
|
|
62
123
|
};
|
|
63
124
|
//# sourceMappingURL=free-ports.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"free-ports.js","sourceRoot":"","sources":["../../src/core/free-ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"free-ports.js","sourceRoot":"","sources":["../../src/core/free-ports.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,8 @@ export declare class GenericContainer implements AsyncDisposable, NetworkMember
|
|
|
26
26
|
private readonly image;
|
|
27
27
|
private envPairs;
|
|
28
28
|
private exposedPorts;
|
|
29
|
+
/** UDP counterpart of `exposedPorts` (`withExposedUdpPorts`) — a separate field, never merged with the TCP list; see `PortBinding`'s own doc on why the same guest port can appear in both. */
|
|
30
|
+
private exposedUdpPorts;
|
|
29
31
|
private command;
|
|
30
32
|
private network;
|
|
31
33
|
private aliasNames;
|
|
@@ -52,6 +54,8 @@ export declare class GenericContainer implements AsyncDisposable, NetworkMember
|
|
|
52
54
|
private handle;
|
|
53
55
|
private backend;
|
|
54
56
|
private mappedPorts;
|
|
57
|
+
/** UDP counterpart of `mappedPorts` — a SEPARATE per-protocol store, never a shared bare-int-keyed map (see `getMappedUdpPort`). */
|
|
58
|
+
private mappedUdpPorts;
|
|
55
59
|
private running;
|
|
56
60
|
private installedNetworkLinks;
|
|
57
61
|
/** Builds against `image` (e.g. `"redis:8.6-alpine"`); no I/O happens until `start()`. */
|
|
@@ -84,8 +88,28 @@ export declare class GenericContainer implements AsyncDisposable, NetworkMember
|
|
|
84
88
|
static fromCheckpoint(cp: Checkpoint): GenericContainer;
|
|
85
89
|
/** Sets an environment variable visible to the workload. Last-write-wins if called again with the same key; insertion order is otherwise preserved. */
|
|
86
90
|
withEnv(key: string, value: string): this;
|
|
87
|
-
/** Publishes these guest ports to pre-allocated host ports (see `FreePorts`); read back with `getMappedPort`. */
|
|
91
|
+
/** Publishes these guest ports to pre-allocated host ports (see `FreePorts`); read back with `getMappedPort`. TCP only — see `withExposedUdpPorts` for UDP. */
|
|
88
92
|
withExposedPorts(...ports: number[]): this;
|
|
93
|
+
/**
|
|
94
|
+
* Publishes these guest ports over UDP to pre-allocated host ports (see
|
|
95
|
+
* `FreePorts.allocateUdp`); read back with `getMappedUdpPort`. A separate
|
|
96
|
+
* list from `withExposedPorts` — the same numeric guest port may be
|
|
97
|
+
* exposed on both protocols (DNS's 53, say), and each gets its own
|
|
98
|
+
* independent host-port mapping.
|
|
99
|
+
*
|
|
100
|
+
* UDP exposure is deliberately invisible to the default wait strategies:
|
|
101
|
+
* `Wait.forListeningPort()`/`Wait.forHttp()` only ever probe
|
|
102
|
+
* `withExposedPorts`' TCP guest ports, so a container exposing ONLY UDP
|
|
103
|
+
* ports is vacuously ready under the default wait — prefer
|
|
104
|
+
* `Wait.forLogMessage(...)` for a UDP-only service.
|
|
105
|
+
*
|
|
106
|
+
* A UDP-exposed container can be a link target on a `Network` on both
|
|
107
|
+
* backends. On microsandbox the consumer gets an in-guest forwarder per UDP
|
|
108
|
+
* link, which needs a busybox-style `nc` (with `-u`/`-e`) and `timeout` in
|
|
109
|
+
* the consumer image; a datagram over 1472 bytes of payload breaks the
|
|
110
|
+
* receiving sandbox's inbound networking there (see the networking guide).
|
|
111
|
+
*/
|
|
112
|
+
withExposedUdpPorts(...ports: number[]): this;
|
|
89
113
|
/** Overrides the image's default ENTRYPOINT/CMD. Omit this call entirely to run the image unmodified. */
|
|
90
114
|
withCommand(...cmd: string[]): this;
|
|
91
115
|
/** Joins a `Network`, making this container reachable from (and to) its running siblings by alias. */
|
|
@@ -178,6 +202,7 @@ export declare class GenericContainer implements AsyncDisposable, NetworkMember
|
|
|
178
202
|
*/
|
|
179
203
|
protected currentBackend(): SandboxBackend;
|
|
180
204
|
private resolveBackend;
|
|
205
|
+
/** `hostUdpEgressPorts` is precomputed by `start()` from the SAME `linksForNewMember()` call `installNetworkLinks` is later given — never recomputed here, so the argv a networked boot builds from and the links actually installed after it always agree. */
|
|
181
206
|
private buildSpec;
|
|
182
207
|
/** The reuse-active counterpart of `buildSpec`: always `keepAlive: true`, named `rz-reuse-<hash12>` rather than the run-scoped `rz-<runId>-<seq>`, and never joined to a `Network` (rejected earlier in `start()`). */
|
|
183
208
|
private buildReuseSpec;
|
|
@@ -193,6 +218,8 @@ export declare class GenericContainer implements AsyncDisposable, NetworkMember
|
|
|
193
218
|
private computeReuseHash;
|
|
194
219
|
private allocatePorts;
|
|
195
220
|
private releasePorts;
|
|
221
|
+
/** Builds the `ContainerSpec.ports` array from this builder's TCP and UDP exposed-port lists plus their allocated host ports — shared by `buildSpec` and `buildReuseSpec`. */
|
|
222
|
+
private buildPortBindings;
|
|
196
223
|
/**
|
|
197
224
|
* Fails fast — before any backend call — on the combinations
|
|
198
225
|
* `withDiskLimit`, `withTmpfsRoot`, and `withNetworkDisabled` make
|
|
@@ -285,8 +312,10 @@ export declare class GenericContainer implements AsyncDisposable, NetworkMember
|
|
|
285
312
|
get host(): string;
|
|
286
313
|
/** Names this container answers to on its network (set via `withNetworkAliases`). Part of the `NetworkMember` contract `Network` uses to compute links. */
|
|
287
314
|
get aliases(): ReadonlyArray<string>;
|
|
288
|
-
/** Every guest port this container published (set via `withExposedPorts`). Part of the `NetworkMember` contract `Network` uses to compute links. */
|
|
315
|
+
/** Every guest port this container published over TCP (set via `withExposedPorts`). Part of the `NetworkMember` contract `Network` uses to compute links; also what the default wait strategies probe — see `withExposedUdpPorts`' own doc on why UDP ports never appear here. */
|
|
289
316
|
get exposedGuestPorts(): ReadonlyArray<number>;
|
|
317
|
+
/** Every guest port this container published over UDP (set via `withExposedUdpPorts`) — a separate list from `exposedGuestPorts`, never merged with it. Part of the `NetworkMember` contract `Network` uses to compute links. */
|
|
318
|
+
get exposedUdpGuestPorts(): ReadonlyArray<number>;
|
|
290
319
|
/**
|
|
291
320
|
* The host port bound to `guestPort`. Throws distinct messages for the
|
|
292
321
|
* two ways this can be wrong: not running at all ("call start() first"),
|
|
@@ -296,6 +325,18 @@ export declare class GenericContainer implements AsyncDisposable, NetworkMember
|
|
|
296
325
|
getMappedPort(guestPort: number): number;
|
|
297
326
|
/** Alias for `getMappedPort`, satisfying the `NetworkMember`/`WaitTarget` shape (which name this method `mappedPort`). */
|
|
298
327
|
mappedPort(guestPort: number): number;
|
|
328
|
+
/**
|
|
329
|
+
* The UDP counterpart of `getMappedPort` — reads from a SEPARATE
|
|
330
|
+
* per-protocol mapping store (`withExposedUdpPorts`), so exposing the same
|
|
331
|
+
* numeric guest port on both protocols (DNS's 53, say) never collides:
|
|
332
|
+
* `getMappedPort(53)` and `getMappedUdpPort(53)` can return two entirely
|
|
333
|
+
* different host ports. Throws the same two distinct-message shape as
|
|
334
|
+
* `getMappedPort`: not running at all, versus running but never exposed
|
|
335
|
+
* via `withExposedUdpPorts`.
|
|
336
|
+
*/
|
|
337
|
+
getMappedUdpPort(guestPort: number): number;
|
|
338
|
+
/** Alias for `getMappedUdpPort`, satisfying the `NetworkMember` shape (which names this method `mappedUdpPort`). */
|
|
339
|
+
mappedUdpPort(guestPort: number): number;
|
|
299
340
|
private requireHandle;
|
|
300
341
|
/**
|
|
301
342
|
* Captures this running container's state and returns a `Checkpoint` — a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generic-container.d.ts","sourceRoot":"","sources":["../../src/core/generic-container.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAoBlD,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,WAAW,CAAC;AAE1D,OAAO,KAAK,EAAE,cAAc,EAAiB,YAAY,EAAe,MAAM,cAAc,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAa,UAAU,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"generic-container.d.ts","sourceRoot":"","sources":["../../src/core/generic-container.ts"],"names":[],"mappings":"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"}
|