@multiplayer-app/sandbox 7.0.1 → 7.0.2
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 +7 -0
- package/dist/cli.js +504 -105
- package/dist/cli.js.map +4 -4
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/console-relays.d.ts +4 -4
- package/dist/console-relays.d.ts.map +1 -1
- package/dist/executor/index.d.ts +12 -1
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/lambda-microvm-executor.d.ts +13 -3
- package/dist/executor/lambda-microvm-executor.d.ts.map +1 -1
- package/dist/executor/types.d.ts +16 -2
- package/dist/executor/types.d.ts.map +1 -1
- package/dist/images.d.ts.map +1 -1
- package/dist/index.js +409 -53
- package/dist/index.js.map +4 -4
- package/dist/services/serial-relay.d.ts +11 -0
- package/dist/services/serial-relay.d.ts.map +1 -1
- package/dist/socket-client.d.ts.map +1 -1
- package/dist/vendor/builder-types/events.d.ts +10 -0
- package/dist/vendor/builder-types/events.d.ts.map +1 -1
- package/dist/vendor/builder-types/index.d.ts +1 -0
- package/dist/vendor/builder-types/index.d.ts.map +1 -1
- package/dist/vendor/builder-types/release.d.ts +5 -5
- package/dist/vendor/builder-types/release.d.ts.map +1 -1
- package/dist/vendor/builder-types/vm-cost.d.ts +88 -0
- package/dist/vendor/builder-types/vm-cost.d.ts.map +1 -0
- package/dist/vendor/builder-types/vm.d.ts +5 -0
- package/dist/vendor/builder-types/vm.d.ts.map +1 -1
- package/dist/worker-identity.d.ts +11 -0
- package/dist/worker-identity.d.ts.map +1 -0
- package/package.json +8 -4
|
@@ -6,11 +6,22 @@ export declare class SerialRelay {
|
|
|
6
6
|
private readonly source;
|
|
7
7
|
private readonly socket;
|
|
8
8
|
private conn;
|
|
9
|
+
private webSocket;
|
|
10
|
+
private reconnectTimer;
|
|
11
|
+
private connecting;
|
|
12
|
+
private browserCount;
|
|
13
|
+
private pendingInput;
|
|
14
|
+
private destroyed;
|
|
9
15
|
private inputHandler;
|
|
16
|
+
private attachHandler;
|
|
17
|
+
private detachHandler;
|
|
10
18
|
constructor(vmId: string, source: SerialSource, socket: Socket);
|
|
11
19
|
connect(): void;
|
|
12
20
|
private connectTcp;
|
|
13
21
|
private connectPipe;
|
|
22
|
+
private connectWebSocket;
|
|
23
|
+
private scheduleWebSocketReconnect;
|
|
24
|
+
private disconnectWebSocket;
|
|
14
25
|
destroy(): void;
|
|
15
26
|
}
|
|
16
27
|
//# sourceMappingURL=serial-relay.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serial-relay.d.ts","sourceRoot":"","sources":["../../src/services/serial-relay.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"serial-relay.d.ts","sourceRoot":"","sources":["../../src/services/serial-relay.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAI9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,oEAAoE;AACpE,qBAAa,WAAW;IAapB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAdzB,OAAO,CAAC,IAAI,CAA0B;IACtC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,YAAY,CAAmD;IACvE,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,aAAa,CAA+C;gBAGjD,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM;IAGjC,OAAO,IAAI,IAAI;IA8Cf,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,WAAW;YAUL,gBAAgB;IA8C9B,OAAO,CAAC,0BAA0B;IAQlC,OAAO,CAAC,mBAAmB;IAS3B,OAAO,IAAI,IAAI;CAYhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket-client.d.ts","sourceRoot":"","sources":["../src/socket-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"socket-client.d.ts","sourceRoot":"","sources":["../src/socket-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAalD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAE5C,OAAO,KAAK,EAAE,mBAAmB,EAAU,MAAM,YAAY,CAAA;AAoJ7D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,GAAG,MAAM,CA2J5F"}
|
|
@@ -3,6 +3,8 @@ import type { VmAction, VmRunResult } from './vm';
|
|
|
3
3
|
export declare const WorkerEvent: {
|
|
4
4
|
readonly HEARTBEAT: "worker:heartbeat";
|
|
5
5
|
readonly VM_RUN_EXITED: "vm:run-exited";
|
|
6
|
+
readonly VM_CREATE_RESULT: "vm:create-result";
|
|
7
|
+
readonly VM_EXTERNALLY_TERMINATED: "vm:externally-terminated";
|
|
6
8
|
readonly ASSIGNED_ID: "worker:assigned-id";
|
|
7
9
|
readonly REATTACH: "worker:reattach";
|
|
8
10
|
readonly VM_CREATE: "vm:create";
|
|
@@ -20,6 +22,8 @@ export declare const WorkerEvent: {
|
|
|
20
22
|
readonly TERMINAL_DATA: "terminal:data";
|
|
21
23
|
readonly VNC_MOUSE: "vnc:mouse";
|
|
22
24
|
readonly VNC_KEYBOARD: "vnc:keyboard";
|
|
25
|
+
readonly TERMINAL_ATTACH: "terminal:attach";
|
|
26
|
+
readonly TERMINAL_DETACH: "terminal:detach";
|
|
23
27
|
readonly TERMINAL_INPUT: "terminal:input";
|
|
24
28
|
};
|
|
25
29
|
export type WorkerEventName = (typeof WorkerEvent)[keyof typeof WorkerEvent];
|
|
@@ -82,4 +86,10 @@ export interface TerminalInputPayload {
|
|
|
82
86
|
export interface VmRunExitedPayload extends VmRunResult {
|
|
83
87
|
vmId: string;
|
|
84
88
|
}
|
|
89
|
+
export interface VmCreateResultPayload {
|
|
90
|
+
vmId: string;
|
|
91
|
+
ok: boolean;
|
|
92
|
+
metadata?: Record<string, unknown>;
|
|
93
|
+
error?: string;
|
|
94
|
+
}
|
|
85
95
|
//# sourceMappingURL=events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAIjD,wGAAwG;AACxG,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAIjD,wGAAwG;AACxG,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;CAsDd,CAAA;AAEV,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAA;AAE5E,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAKrD,CAAA;AAID,sFAAsF;AACtF,eAAO,MAAM,YAAY;;;;;;;;CAaf,CAAA;AAIV,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,KAAK,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,OAAO,CAAA;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,OAAO,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,cAAc,UAAU,CAAA;AACxB,cAAc,MAAM,CAAA;AACpB,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,OAAO,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,cAAc,UAAU,CAAA;AACxB,cAAc,MAAM,CAAA;AACpB,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA"}
|
|
@@ -7,14 +7,14 @@ import type { GatewayAccessConfig } from './access';
|
|
|
7
7
|
*/
|
|
8
8
|
export interface ReleaseRecord {
|
|
9
9
|
releaseId: string;
|
|
10
|
-
|
|
10
|
+
accountId: string;
|
|
11
11
|
name: string;
|
|
12
12
|
stack: VmStack;
|
|
13
13
|
/** Object key of the artifact zip inside the releases bucket. */
|
|
14
14
|
artifactKey: string;
|
|
15
15
|
/**
|
|
16
16
|
* True once the artifact has been extracted into individual objects under
|
|
17
|
-
* releasePrefix(
|
|
17
|
+
* releasePrefix(accountId, releaseId) — only meaningful for stack "static", where the
|
|
18
18
|
* gateway serves those objects directly, with no VM involved.
|
|
19
19
|
*/
|
|
20
20
|
published: boolean;
|
|
@@ -25,7 +25,7 @@ export interface ReleaseRecord {
|
|
|
25
25
|
updatedAt: string;
|
|
26
26
|
}
|
|
27
27
|
/** S3 object key for a release archive. S3 keys intentionally do not start with "/". */
|
|
28
|
-
export declare function releaseArtifactKey(
|
|
28
|
+
export declare function releaseArtifactKey(accountId: string, releaseId: string): string;
|
|
29
29
|
export interface ReleaseCreateRequest {
|
|
30
30
|
name: string;
|
|
31
31
|
stack: VmStack;
|
|
@@ -41,11 +41,11 @@ export interface ReleaseCreateResponse {
|
|
|
41
41
|
uploadUrl?: string;
|
|
42
42
|
}
|
|
43
43
|
/** S3 key prefix (no trailing slash) shared by a release archive and its extracted files. */
|
|
44
|
-
export declare function releasePrefix(
|
|
44
|
+
export declare function releasePrefix(accountId: string, releaseId: string): string;
|
|
45
45
|
export declare const RELEASE_REDIS_KEY_PREFIX = "release:";
|
|
46
46
|
/** Mirrored into Redis on publish so the gateway can serve static releases without touching Mongo. */
|
|
47
47
|
export interface ReleaseRegistryEntry {
|
|
48
|
-
|
|
48
|
+
accountId: string;
|
|
49
49
|
stack: VmStack;
|
|
50
50
|
published: boolean;
|
|
51
51
|
access?: GatewayAccessConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../src/release.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAEnD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../src/release.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACnC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAEnD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;IACd,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,aAAa,CAAA;IACtB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,6FAA6F;AAC7F,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,eAAO,MAAM,wBAAwB,aAAa,CAAA;AAElD,sGAAsG;AACtG,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,OAAO,CAAA;IACd,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,mBAAmB,CAAA;CAC7B"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { VmEngine, VmResources, VmState } from './vm';
|
|
2
|
+
/**
|
|
3
|
+
* Per-second compute rates plus (where applicable) snapshot storage/operation rates. Only
|
|
4
|
+
* lambda-microvm and fargate have real, metered AWS pricing — everything else runs on
|
|
5
|
+
* self-hosted hardware with no per-VM AWS bill. Their rates below are a nominal, clearly
|
|
6
|
+
* NOT-billing-grade estimate (~$0.02/vCPU-hr, ~$0.005/GB-hr, a rough amortized-hardware
|
|
7
|
+
* guess) purely so every VM has some comparable cost figure, not a real invoice input.
|
|
8
|
+
*/
|
|
9
|
+
export interface VmCostRates {
|
|
10
|
+
vcpuPerSecond: number;
|
|
11
|
+
gbPerSecond: number;
|
|
12
|
+
/** Storage cost while suspended (state preserved). Lambda MicroVM only. */
|
|
13
|
+
snapshotGbMonth?: number;
|
|
14
|
+
/** One-time cost per resume (snapshot read). Lambda MicroVM only. */
|
|
15
|
+
snapshotReadPerGb?: number;
|
|
16
|
+
/** One-time cost per suspend (snapshot write). Lambda MicroVM only. */
|
|
17
|
+
snapshotWritePerGb?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Sourced from AWS's published pricing (see aws.amazon.com/lambda/pricing and
|
|
21
|
+
* aws.amazon.com/fargate/pricing, checked 2026-09) for us-east-1 ARM/Graviton — matches
|
|
22
|
+
* this repo's base images (see scripts/base-images, built for aarch64).
|
|
23
|
+
*/
|
|
24
|
+
export declare const VM_ENGINE_COST_RATES: Record<VmEngine, VmCostRates>;
|
|
25
|
+
export declare function costRatesFor(engine: VmEngine | undefined): VmCostRates;
|
|
26
|
+
/** Compute cost for `seconds` spent actively running, at this engine's baseline resources. */
|
|
27
|
+
export declare function estimateComputeCostUsd(engine: VmEngine | undefined, resources: {
|
|
28
|
+
vcpuCount: number;
|
|
29
|
+
memMib: number;
|
|
30
|
+
}, seconds: number): number;
|
|
31
|
+
/** Storage-only cost for `seconds` spent suspended (state preserved, no compute billed). */
|
|
32
|
+
export declare function estimateSuspendedStorageCostUsd(engine: VmEngine | undefined, resources: {
|
|
33
|
+
memMib: number;
|
|
34
|
+
}, seconds: number): number;
|
|
35
|
+
/** One-time cost of a single suspend (snapshot write). $0 for engines with no snapshot billing. */
|
|
36
|
+
export declare function estimateSuspendOpCostUsd(engine: VmEngine | undefined, resources: {
|
|
37
|
+
memMib: number;
|
|
38
|
+
}): number;
|
|
39
|
+
/** One-time cost of a single resume (snapshot read). $0 for engines with no snapshot billing. */
|
|
40
|
+
export declare function estimateResumeOpCostUsd(engine: VmEngine | undefined, resources: {
|
|
41
|
+
memMib: number;
|
|
42
|
+
}): number;
|
|
43
|
+
/** Cumulative usage/cost tracking on a VM or deployment record, updated on every state transition. */
|
|
44
|
+
export interface VmUsage {
|
|
45
|
+
/** Total seconds spent actively 'running' (billable compute) across this VM's lifetime. */
|
|
46
|
+
runningSeconds: number;
|
|
47
|
+
/** Total seconds spent 'paused'/'stopped' (suspended — near-zero cost, tracked for completeness). */
|
|
48
|
+
suspendedSeconds: number;
|
|
49
|
+
/** Number of pause/suspend transitions — lambda-microvm bills a per-GB snapshot-write fee per suspend. */
|
|
50
|
+
suspendCount: number;
|
|
51
|
+
/** Number of resume transitions — lambda-microvm bills a per-GB snapshot-read fee per resume. */
|
|
52
|
+
resumeCount: number;
|
|
53
|
+
/** Wall-clock time of the last accrual — the next one adds the interval since this. */
|
|
54
|
+
lastTransitionAt: string;
|
|
55
|
+
/**
|
|
56
|
+
* Running total in USD. Billing-accurate for lambda-microvm; a rough, clearly-labeled
|
|
57
|
+
* estimate for every other engine (see VM_ENGINE_COST_RATES).
|
|
58
|
+
*/
|
|
59
|
+
estimatedCostUsd: number;
|
|
60
|
+
}
|
|
61
|
+
export declare function initialUsage(at?: Date): VmUsage;
|
|
62
|
+
/**
|
|
63
|
+
* Closes out the interval since `record.usage.lastTransitionAt` under `record.state` (the
|
|
64
|
+
* state being LEFT), attributes its cost, then folds in any one-time suspend/resume
|
|
65
|
+
* operation cost triggered by the transition to `newState`. Call this with the record's
|
|
66
|
+
* state BEFORE persisting `newState` — it reads what's being left, not what's being entered.
|
|
67
|
+
*/
|
|
68
|
+
export declare function accrueUsage(record: {
|
|
69
|
+
engine?: VmEngine;
|
|
70
|
+
resources: VmResources;
|
|
71
|
+
state: VmState;
|
|
72
|
+
usage?: VmUsage;
|
|
73
|
+
}, newState: VmState, now?: Date): VmUsage;
|
|
74
|
+
/**
|
|
75
|
+
* Live cost as of right now — NOT persisted, compute at read/response time only (same
|
|
76
|
+
* pattern as vm.service.ts's withVmUrl: derived, never stored). The stored `usage` is only
|
|
77
|
+
* a checkpoint as of the last state transition, so a VM that's been running continuously
|
|
78
|
+
* for hours without pausing would otherwise show a frozen, understated cost until its next
|
|
79
|
+
* transition. Passing `record.state` as both the leaving and entering state accrues the
|
|
80
|
+
* elapsed interval without triggering a (spurious) one-time suspend/resume fee.
|
|
81
|
+
*/
|
|
82
|
+
export declare function currentUsage(record: {
|
|
83
|
+
engine?: VmEngine;
|
|
84
|
+
resources: VmResources;
|
|
85
|
+
state: VmState;
|
|
86
|
+
usage?: VmUsage;
|
|
87
|
+
}, now?: Date): VmUsage;
|
|
88
|
+
//# sourceMappingURL=vm-cost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vm-cost.d.ts","sourceRoot":"","sources":["../src/vm-cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAE1D;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAQD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAmB9D,CAAA;AAMD,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAEtE;AAED,8FAA8F;AAC9F,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,SAAS,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAChD,OAAO,EAAE,MAAM,GACd,MAAM,CAMR;AAED,4FAA4F;AAC5F,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,SAAS,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAC7B,OAAO,EAAE,MAAM,GACd,MAAM,CAMR;AAED,mGAAmG;AACnG,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,SAAS,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5B,MAAM,CAGR;AAED,iGAAiG;AACjG,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,SAAS,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5B,MAAM,CAGR;AAED,sGAAsG;AACtG,MAAM,WAAW,OAAO;IACtB,2FAA2F;IAC3F,cAAc,EAAE,MAAM,CAAA;IACtB,qGAAqG;IACrG,gBAAgB,EAAE,MAAM,CAAA;IACxB,0GAA0G;IAC1G,YAAY,EAAE,MAAM,CAAA;IACpB,iGAAiG;IACjG,WAAW,EAAE,MAAM,CAAA;IACnB,uFAAuF;IACvF,gBAAgB,EAAE,MAAM,CAAA;IACxB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,YAAY,CAAC,EAAE,GAAE,IAAiB,GAAG,OAAO,CAS3D;AAUD;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EACtF,QAAQ,EAAE,OAAO,EACjB,GAAG,GAAE,IAAiB,GACrB,OAAO,CAyCT;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EACtF,GAAG,GAAE,IAAiB,GACrB,OAAO,CAET"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { GatewayAccessConfig } from './access';
|
|
2
|
+
import type { VmUsage } from './vm-cost';
|
|
2
3
|
export declare const VM_STACKS: readonly ["generic", "node", "python", "static"];
|
|
3
4
|
export type VmStack = (typeof VM_STACKS)[number];
|
|
4
5
|
export declare const VM_ENGINES: readonly ["mock", "qemu", "firecracker", "docker", "docker-sandbox", "remote", "lambda-microvm", "fargate"];
|
|
@@ -19,6 +20,8 @@ export interface VmResources {
|
|
|
19
20
|
}
|
|
20
21
|
export interface VmRecord {
|
|
21
22
|
vmId: string;
|
|
23
|
+
/** Account that created this VM — same convention as ReleaseRecord.accountId (req.accountId, never client-supplied). */
|
|
24
|
+
accountId: string;
|
|
22
25
|
/** Builder session this VM belongs to; optional for VMs not tied to a session. */
|
|
23
26
|
sessionId?: string;
|
|
24
27
|
workerId: string;
|
|
@@ -43,6 +46,8 @@ export interface VmRecord {
|
|
|
43
46
|
* never interprets it — only the executor that created it knows the shape.
|
|
44
47
|
*/
|
|
45
48
|
runtimeMetadata?: Record<string, unknown>;
|
|
49
|
+
/** Cumulative running-time/cost tracking, updated on every state transition. See vm-cost.ts. */
|
|
50
|
+
usage?: VmUsage;
|
|
46
51
|
createdAt: string;
|
|
47
52
|
updatedAt: string;
|
|
48
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vm.d.ts","sourceRoot":"","sources":["../src/vm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"vm.d.ts","sourceRoot":"","sources":["../src/vm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,eAAO,MAAM,SAAS,kDAAmD,CAAA;AACzE,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAEhD,eAAO,MAAM,UAAU,6GASb,CAAA;AACV,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAElD,yGAAyG;AACzG,eAAO,MAAM,YAAY,6BAA8B,CAAA;AACvD,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAErD,MAAM,MAAM,OAAO,GACf,UAAU,GACV,SAAS,GACT,SAAS,GACT,QAAQ,GACR,UAAU,GACV,UAAU,GACV,SAAS,GACT,WAAW,GACX,YAAY,GACZ,OAAO;AACT,uEAAuE;GACrE,WAAW;AACb,gHAAgH;GAC9G,WAAW,CAAA;AAEf,eAAO,MAAM,UAAU,iDAAkD,CAAA;AACzE,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAElD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,wHAAwH;IACxH,SAAS,EAAE,MAAM,CAAA;IACjB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,wFAAwF;IACxF,MAAM,CAAC,EAAE,QAAQ,CAAA;IACjB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B,SAAS,EAAE,WAAW,CAAA;IACtB,KAAK,EAAE,OAAO,CAAA;IACd,yFAAyF;IACzF,OAAO,EAAE,SAAS,CAAA;IAClB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,qFAAqF;IACrF,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzC,gGAAgG;IAChG,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,uFAAuF;IACvF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,OAAO,CAAA;IACd,oFAAoF;IACpF,MAAM,CAAC,EAAE,QAAQ,CAAA;IACjB,0GAA0G;IAC1G,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kGAAkG;IAClG,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAA;IAClB,uDAAuD;IACvD,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAA;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAChD;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,aAAa;IAC5D,MAAM,CAAC,EAAE,CAAC,CAAA;CACX;AAED,eAAO,MAAM,mBAAmB,QAAQ,CAAA;AAExC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,mBAAmB,CAAA;CAC7B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads back the gateway-assigned runtime routing ID (WorkerEvent.ASSIGNED_ID) this
|
|
3
|
+
* process persisted on a previous boot, if any — lets a restarted worker present the same
|
|
4
|
+
* identity it had before, so REATTACH's `findByWorkerId` still finds its VMs. Missing file,
|
|
5
|
+
* unreadable, or empty all just mean "no prior identity" (first boot, fresh volume, etc.) —
|
|
6
|
+
* not an error; the worker falls back to letting the gateway mint a new one, same as today.
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadPersistedWorkerId(filePath: string): string | undefined;
|
|
9
|
+
/** Best-effort — a failed write only costs the next restart's reattach, not this session. */
|
|
10
|
+
export declare function savePersistedWorkerId(filePath: string, workerId: string): void;
|
|
11
|
+
//# sourceMappingURL=worker-identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-identity.d.ts","sourceRoot":"","sources":["../src/worker-identity.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO1E;AAED,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAU9E"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiplayer-app/sandbox",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.2",
|
|
4
4
|
"description": "Sandbox worker library and CLI (Docker, QEMU, Firecracker, AWS Lambda MicroVM, Fargate)",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -30,15 +30,17 @@
|
|
|
30
30
|
"commander": "^14.0.0",
|
|
31
31
|
"dotenv": "^17.2.3",
|
|
32
32
|
"rfb2": "^0.2.2",
|
|
33
|
-
"socket.io-client": "4.8.3"
|
|
33
|
+
"socket.io-client": "4.8.3",
|
|
34
|
+
"ws": "^8.18.3"
|
|
34
35
|
},
|
|
35
36
|
"devDependencies": {
|
|
36
37
|
"@types/node": "^25.8.0",
|
|
38
|
+
"@types/ws": "^8.18.1",
|
|
37
39
|
"esbuild": "^0.25.12",
|
|
38
40
|
"nodemon": "3.1.14",
|
|
39
41
|
"typescript": "^6.0.3",
|
|
40
|
-
"@multiplayer-app/
|
|
41
|
-
"@multiplayer-app/
|
|
42
|
+
"@multiplayer-app/builder-types": "0.0.1",
|
|
43
|
+
"@multiplayer-app/logger": "0.0.1"
|
|
42
44
|
},
|
|
43
45
|
"scripts": {
|
|
44
46
|
"build": "tsc --build --force && node scripts/bundle.mjs",
|
|
@@ -49,6 +51,8 @@
|
|
|
49
51
|
"images:build": "bash scripts/build-base-images.sh",
|
|
50
52
|
"images:publish:local": "bash scripts/publish-base-images-local.sh",
|
|
51
53
|
"images:upload:local": "SKIP_BUILD=1 bash scripts/publish-base-images-local.sh",
|
|
54
|
+
"images:microvm:create": "node scripts/create-microvm-images.mjs",
|
|
55
|
+
"images:microvm:list-base-images": "node scripts/create-microvm-images.mjs --list-base-images",
|
|
52
56
|
"docker:build": "docker build -f Dockerfile -t multiplayer-sandbox-worker:local ../..",
|
|
53
57
|
"start": "node dist/cli.js",
|
|
54
58
|
"worker:start": "node dist/cli.js start",
|