@boxd-sh/convex 0.1.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/LICENSE +21 -0
- package/README.md +264 -0
- package/dist/client/_generated/_ignore.d.ts +1 -0
- package/dist/client/_generated/_ignore.d.ts.map +1 -0
- package/dist/client/_generated/_ignore.js +3 -0
- package/dist/client/_generated/_ignore.js.map +1 -0
- package/dist/client/index.d.ts +327 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +126 -0
- package/dist/client/index.js.map +1 -0
- package/dist/component/_generated/api.d.ts +52 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +357 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +135 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +80 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/boxd.d.ts +35 -0
- package/dist/component/boxd.d.ts.map +1 -0
- package/dist/component/boxd.js +144 -0
- package/dist/component/boxd.js.map +1 -0
- package/dist/component/convex.config.d.ts +6 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +9 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/errors.d.ts +25 -0
- package/dist/component/errors.d.ts.map +1 -0
- package/dist/component/errors.js +75 -0
- package/dist/component/errors.js.map +1 -0
- package/dist/component/exec.d.ts +25 -0
- package/dist/component/exec.d.ts.map +1 -0
- package/dist/component/exec.js +100 -0
- package/dist/component/exec.js.map +1 -0
- package/dist/component/executions.d.ts +70 -0
- package/dist/component/executions.d.ts.map +1 -0
- package/dist/component/executions.js +106 -0
- package/dist/component/executions.js.map +1 -0
- package/dist/component/files.d.ts +44 -0
- package/dist/component/files.d.ts.map +1 -0
- package/dist/component/files.js +105 -0
- package/dist/component/files.js.map +1 -0
- package/dist/component/limits.d.ts +33 -0
- package/dist/component/limits.d.ts.map +1 -0
- package/dist/component/limits.js +44 -0
- package/dist/component/limits.js.map +1 -0
- package/dist/component/machines.d.ts +337 -0
- package/dist/component/machines.d.ts.map +1 -0
- package/dist/component/machines.js +411 -0
- package/dist/component/machines.js.map +1 -0
- package/dist/component/records.d.ts +87 -0
- package/dist/component/records.d.ts.map +1 -0
- package/dist/component/records.js +51 -0
- package/dist/component/records.js.map +1 -0
- package/dist/component/schema.d.ts +138 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +70 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/component/sessions.d.ts +21 -0
- package/dist/component/sessions.d.ts.map +1 -0
- package/dist/component/sessions.js +59 -0
- package/dist/component/sessions.js.map +1 -0
- package/dist/component/validate.d.ts +15 -0
- package/dist/component/validate.d.ts.map +1 -0
- package/dist/component/validate.js +44 -0
- package/dist/component/validate.js.map +1 -0
- package/package.json +99 -0
- package/src/client/_generated/_ignore.ts +1 -0
- package/src/client/index.ts +199 -0
- package/src/component/_generated/api.ts +68 -0
- package/src/component/_generated/component.ts +430 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +171 -0
- package/src/component/boxd.ts +188 -0
- package/src/component/convex.config.ts +9 -0
- package/src/component/errors.ts +105 -0
- package/src/component/exec.ts +134 -0
- package/src/component/executions.ts +115 -0
- package/src/component/files.ts +128 -0
- package/src/component/limits.ts +48 -0
- package/src/component/machines.ts +500 -0
- package/src/component/records.ts +71 -0
- package/src/component/schema.ts +77 -0
- package/src/component/sessions.ts +61 -0
- package/src/component/validate.ts +58 -0
- package/src/test.ts +28 -0
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Machines: reactive queries over the `machines` table, the bookkeeping
|
|
3
|
+
* mutations behind them, and the lifecycle actions that call boxd and write
|
|
4
|
+
* back what they observed.
|
|
5
|
+
*/
|
|
6
|
+
import { ConvexError, v } from "convex/values";
|
|
7
|
+
import { internal } from "./_generated/api.js";
|
|
8
|
+
import { action, internalMutation, internalQuery, query, } from "./_generated/server.js";
|
|
9
|
+
import { withBoxd } from "./boxd.js";
|
|
10
|
+
import { boxdError, errorMessage, isNotFound, toConvexError, } from "./errors.js";
|
|
11
|
+
import { DEFAULT_READY_TIMEOUT_MS, MAX_READY_TIMEOUT_MS, clampLimit, } from "./limits.js";
|
|
12
|
+
import { machineDoc, observed, recordFailure, requireMachine, } from "./records.js";
|
|
13
|
+
import { boundedTimeout, requireNonEmpty, requirePort, requireSubdomainLabel, } from "./validate.js";
|
|
14
|
+
// ---- Reactive reads -------------------------------------------------------
|
|
15
|
+
export const get = query({
|
|
16
|
+
args: { machineId: v.string(), ownerId: v.optional(v.string()) },
|
|
17
|
+
returns: v.union(v.null(), machineDoc),
|
|
18
|
+
handler: async (ctx, { machineId, ownerId }) => {
|
|
19
|
+
const row = await ctx.db
|
|
20
|
+
.query("machines")
|
|
21
|
+
.withIndex("by_machine_id", (q) => q.eq("machineId", machineId))
|
|
22
|
+
.unique();
|
|
23
|
+
return row && row.ownerId === ownerId ? row : null;
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
/** The owner's machines, newest first. Destroyed machines stay listed. */
|
|
27
|
+
export const list = query({
|
|
28
|
+
args: { ownerId: v.optional(v.string()), limit: v.optional(v.number()) },
|
|
29
|
+
returns: v.array(machineDoc),
|
|
30
|
+
handler: async (ctx, { ownerId, limit }) => {
|
|
31
|
+
return await ctx.db
|
|
32
|
+
.query("machines")
|
|
33
|
+
.withIndex("by_owner", (q) => q.eq("ownerId", ownerId))
|
|
34
|
+
.order("desc")
|
|
35
|
+
.take(clampLimit(limit));
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
// ---- Bookkeeping ----------------------------------------------------------
|
|
39
|
+
export const record = internalQuery({
|
|
40
|
+
args: { machineId: v.string() },
|
|
41
|
+
returns: v.union(v.null(), machineDoc),
|
|
42
|
+
handler: async (ctx, { machineId }) => {
|
|
43
|
+
return await ctx.db
|
|
44
|
+
.query("machines")
|
|
45
|
+
.withIndex("by_machine_id", (q) => q.eq("machineId", machineId))
|
|
46
|
+
.unique();
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
/**
|
|
50
|
+
* Insert a machine's row or refresh it with what boxd reported. `ownerId`
|
|
51
|
+
* and `forkedFrom` are set once, on insert. A success clears `lastError`.
|
|
52
|
+
* "destroyed" is final: an action that read the machine before a concurrent
|
|
53
|
+
* destroy finished must not bring the row back to life.
|
|
54
|
+
*/
|
|
55
|
+
export const upsert = internalMutation({
|
|
56
|
+
args: {
|
|
57
|
+
machineId: v.string(),
|
|
58
|
+
name: v.string(),
|
|
59
|
+
status: v.string(),
|
|
60
|
+
image: v.optional(v.string()),
|
|
61
|
+
url: v.optional(v.string()),
|
|
62
|
+
vcpu: v.optional(v.number()),
|
|
63
|
+
memoryBytes: v.optional(v.number()),
|
|
64
|
+
ownerId: v.optional(v.string()),
|
|
65
|
+
forkedFrom: v.optional(v.string()),
|
|
66
|
+
},
|
|
67
|
+
returns: machineDoc,
|
|
68
|
+
handler: async (ctx, { ownerId, forkedFrom, ...fields }) => {
|
|
69
|
+
const row = await ctx.db
|
|
70
|
+
.query("machines")
|
|
71
|
+
.withIndex("by_machine_id", (q) => q.eq("machineId", fields.machineId))
|
|
72
|
+
.unique();
|
|
73
|
+
const updatedAt = Date.now();
|
|
74
|
+
if (row?.status === "destroyed")
|
|
75
|
+
return row;
|
|
76
|
+
if (row) {
|
|
77
|
+
await ctx.db.patch("machines", row._id, {
|
|
78
|
+
...fields,
|
|
79
|
+
lastError: undefined,
|
|
80
|
+
updatedAt,
|
|
81
|
+
});
|
|
82
|
+
return { ...row, ...fields, lastError: undefined, updatedAt };
|
|
83
|
+
}
|
|
84
|
+
const doc = { ...fields, ownerId, forkedFrom, updatedAt };
|
|
85
|
+
const id = await ctx.db.insert("machines", doc);
|
|
86
|
+
return (await ctx.db.get("machines", id));
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
export const setError = internalMutation({
|
|
90
|
+
args: { machineId: v.string(), error: v.string() },
|
|
91
|
+
returns: v.null(),
|
|
92
|
+
handler: async (ctx, { machineId, error }) => {
|
|
93
|
+
const row = await ctx.db
|
|
94
|
+
.query("machines")
|
|
95
|
+
.withIndex("by_machine_id", (q) => q.eq("machineId", machineId))
|
|
96
|
+
.unique();
|
|
97
|
+
if (row) {
|
|
98
|
+
await ctx.db.patch("machines", row._id, {
|
|
99
|
+
lastError: error,
|
|
100
|
+
updatedAt: Date.now(),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
/** Keep the row, and with it the execution history, as a record. */
|
|
107
|
+
export const markDestroyed = internalMutation({
|
|
108
|
+
args: { machineId: v.string() },
|
|
109
|
+
returns: v.union(v.null(), machineDoc),
|
|
110
|
+
handler: async (ctx, { machineId }) => {
|
|
111
|
+
const row = await ctx.db
|
|
112
|
+
.query("machines")
|
|
113
|
+
.withIndex("by_machine_id", (q) => q.eq("machineId", machineId))
|
|
114
|
+
.unique();
|
|
115
|
+
if (!row)
|
|
116
|
+
return null;
|
|
117
|
+
const patch = {
|
|
118
|
+
status: "destroyed",
|
|
119
|
+
lastError: undefined,
|
|
120
|
+
updatedAt: Date.now(),
|
|
121
|
+
};
|
|
122
|
+
await ctx.db.patch("machines", row._id, patch);
|
|
123
|
+
return { ...row, ...patch };
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
// ---- Actions --------------------------------------------------------------
|
|
127
|
+
const target = { machineId: v.string(), ownerId: v.optional(v.string()) };
|
|
128
|
+
const readiness = {
|
|
129
|
+
/** Wait until the machine accepts an exec. Default true. */
|
|
130
|
+
waitUntilReady: v.optional(v.boolean()),
|
|
131
|
+
/** How long to wait, in ms. Default 120s, capped at 480s. */
|
|
132
|
+
readyTimeoutMs: v.optional(v.number()),
|
|
133
|
+
};
|
|
134
|
+
function readyTimeout(args) {
|
|
135
|
+
if (args.waitUntilReady === false)
|
|
136
|
+
return undefined;
|
|
137
|
+
return boundedTimeout(args.readyTimeoutMs, DEFAULT_READY_TIMEOUT_MS, MAX_READY_TIMEOUT_MS, "readyTimeoutMs");
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Run a boxd operation that ends in a fresh `Machine`, and store it. A
|
|
141
|
+
* failure lands on the row; a machine boxd no longer knows is marked
|
|
142
|
+
* destroyed.
|
|
143
|
+
*/
|
|
144
|
+
async function settle(ctx, machineId, operation) {
|
|
145
|
+
let machine;
|
|
146
|
+
try {
|
|
147
|
+
machine = await withBoxd(ctx, operation);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (isNotFound(error)) {
|
|
151
|
+
await ctx.runMutation(internal.machines.markDestroyed, { machineId });
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
return await recordFailure(ctx, machineId, error);
|
|
155
|
+
}
|
|
156
|
+
return await ctx.runMutation(internal.machines.upsert, observed(machine));
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Store a machine boxd just created. If the row can't be written, destroy
|
|
160
|
+
* the machine: a machine no row tracks would run, and bill, unseen.
|
|
161
|
+
*/
|
|
162
|
+
async function adopt(ctx, machine, extra) {
|
|
163
|
+
try {
|
|
164
|
+
return await ctx.runMutation(internal.machines.upsert, {
|
|
165
|
+
...observed(machine),
|
|
166
|
+
...extra,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
await withBoxd(ctx, (boxd) => boxd.machines.delete(machine.id)).catch((cleanup) => console.error(`boxd: could not destroy untracked machine ${machine.id}: ${errorMessage(cleanup)}`));
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Wait for a machine `create` or `fork` just made. On failure the machine
|
|
176
|
+
* still exists and bills, so the error carries its `machineId`: the caller
|
|
177
|
+
* can destroy it, or wait longer, instead of creating another one.
|
|
178
|
+
*/
|
|
179
|
+
async function ready(ctx, row, timeout) {
|
|
180
|
+
if (timeout === undefined)
|
|
181
|
+
return row;
|
|
182
|
+
try {
|
|
183
|
+
return await settle(ctx, row.machineId, (boxd) => boxd.machines.waitUntilReady(row.machineId, { timeout }));
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
const { data } = toConvexError(error);
|
|
187
|
+
throw new ConvexError({ ...data, machineId: row.machineId });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export const create = action({
|
|
191
|
+
args: {
|
|
192
|
+
ownerId: v.optional(v.string()),
|
|
193
|
+
/** Unique in the key's org. Omit for a generated name. */
|
|
194
|
+
name: v.optional(v.string()),
|
|
195
|
+
/** OCI image. Omit for the boxd default image. */
|
|
196
|
+
image: v.optional(v.string()),
|
|
197
|
+
/** Environment variables for the machine. Not stored by the component. */
|
|
198
|
+
env: v.optional(v.record(v.string(), v.string())),
|
|
199
|
+
/** Size class: 1, 2 or 4 vCPU. The memory follows (4, 8 or 16 GiB). */
|
|
200
|
+
vcpu: v.optional(v.number()),
|
|
201
|
+
/** Size class by memory: "4G", "8G" or "16G". */
|
|
202
|
+
memory: v.optional(v.string()),
|
|
203
|
+
/** Idle seconds before boxd suspends the machine. 0 disables. */
|
|
204
|
+
autoSuspendSeconds: v.optional(v.number()),
|
|
205
|
+
/** Idle seconds before boxd destroys the machine. 0 disables. */
|
|
206
|
+
autoDestroySeconds: v.optional(v.number()),
|
|
207
|
+
/** Reachable only through explicit networks; no in-VM boxd CLI. */
|
|
208
|
+
isolated: v.optional(v.boolean()),
|
|
209
|
+
...readiness,
|
|
210
|
+
},
|
|
211
|
+
returns: machineDoc,
|
|
212
|
+
handler: async (ctx, args) => {
|
|
213
|
+
const timeout = readyTimeout(args);
|
|
214
|
+
if (args.name !== undefined)
|
|
215
|
+
requireNonEmpty(args.name, "name");
|
|
216
|
+
const machine = await withBoxd(ctx, (boxd) => boxd.machines.create({
|
|
217
|
+
name: args.name,
|
|
218
|
+
image: args.image,
|
|
219
|
+
env: args.env,
|
|
220
|
+
isolated: args.isolated,
|
|
221
|
+
config: {
|
|
222
|
+
vcpu: args.vcpu,
|
|
223
|
+
memory: args.memory,
|
|
224
|
+
autoSuspendTimeout: args.autoSuspendSeconds,
|
|
225
|
+
autoDestroyTimeout: args.autoDestroySeconds,
|
|
226
|
+
},
|
|
227
|
+
}));
|
|
228
|
+
const row = await adopt(ctx, machine, { ownerId: args.ownerId });
|
|
229
|
+
return await ready(ctx, row, timeout);
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
/**
|
|
233
|
+
* Fork a running machine: a copy of its disk and memory, booted as a new
|
|
234
|
+
* machine. The fork has the source's owner and records `forkedFrom`.
|
|
235
|
+
*/
|
|
236
|
+
export const fork = action({
|
|
237
|
+
args: { ...target, name: v.optional(v.string()), ...readiness },
|
|
238
|
+
returns: machineDoc,
|
|
239
|
+
handler: async (ctx, args) => {
|
|
240
|
+
const timeout = readyTimeout(args);
|
|
241
|
+
if (args.name !== undefined)
|
|
242
|
+
requireNonEmpty(args.name, "name");
|
|
243
|
+
const source = await requireMachine(ctx, args.machineId, args.ownerId);
|
|
244
|
+
let machine;
|
|
245
|
+
try {
|
|
246
|
+
machine = await withBoxd(ctx, (boxd) => boxd.machines.fork(source.machineId, { name: args.name }));
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
return await recordFailure(ctx, source.machineId, error);
|
|
250
|
+
}
|
|
251
|
+
const row = await adopt(ctx, machine, {
|
|
252
|
+
ownerId: source.ownerId,
|
|
253
|
+
forkedFrom: source.machineId,
|
|
254
|
+
});
|
|
255
|
+
return await ready(ctx, row, timeout);
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
/** Re-read the machine from boxd into its row. */
|
|
259
|
+
export const refresh = action({
|
|
260
|
+
args: target,
|
|
261
|
+
returns: machineDoc,
|
|
262
|
+
handler: async (ctx, { machineId, ownerId }) => {
|
|
263
|
+
await requireMachine(ctx, machineId, ownerId);
|
|
264
|
+
return await settle(ctx, machineId, (boxd) => boxd.machines.get(machineId));
|
|
265
|
+
},
|
|
266
|
+
});
|
|
267
|
+
/** The status each transition ends in. */
|
|
268
|
+
const TARGET = {
|
|
269
|
+
start: "running",
|
|
270
|
+
resume: "running",
|
|
271
|
+
wake: "running",
|
|
272
|
+
stop: "stopped",
|
|
273
|
+
pause: "suspended",
|
|
274
|
+
hibernate: "hibernated",
|
|
275
|
+
};
|
|
276
|
+
/** How long a sleeping transition polls for its target status. */
|
|
277
|
+
const SETTLE_TIMEOUT_MS = 60_000;
|
|
278
|
+
const SETTLE_POLL_MS = 500;
|
|
279
|
+
/**
|
|
280
|
+
* Ask boxd for `verb`. A machine already in the target status is not an
|
|
281
|
+
* error: boxd refuses `resume` on a running machine with a conflict, but
|
|
282
|
+
* the caller's goal is reached.
|
|
283
|
+
*/
|
|
284
|
+
async function request(boxd, machineId, verb) {
|
|
285
|
+
try {
|
|
286
|
+
await boxd.machines[verb](machineId);
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
if (toConvexError(error).data.code !== "CONFLICT")
|
|
290
|
+
throw error;
|
|
291
|
+
const machine = await boxd.machines.get(machineId);
|
|
292
|
+
if (machine.status !== TARGET[verb])
|
|
293
|
+
throw error;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Poll until the machine reports `status`, or return the last observed
|
|
298
|
+
* machine after `timeoutMs`: a transition still in progress is not a
|
|
299
|
+
* failure, and the row shows exactly what boxd reported.
|
|
300
|
+
*/
|
|
301
|
+
async function reach(boxd, machineId, status, timeoutMs) {
|
|
302
|
+
const deadline = Date.now() + timeoutMs;
|
|
303
|
+
let machine = await boxd.machines.get(machineId);
|
|
304
|
+
while (machine.status !== status && Date.now() < deadline) {
|
|
305
|
+
await new Promise((resolve) => setTimeout(resolve, SETTLE_POLL_MS));
|
|
306
|
+
machine = await boxd.machines.get(machineId);
|
|
307
|
+
}
|
|
308
|
+
return machine;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* A transition that ends with the machine asleep or off. Returns once boxd
|
|
312
|
+
* reports the target status, or after 60 seconds with the status it reports
|
|
313
|
+
* then.
|
|
314
|
+
*/
|
|
315
|
+
function sleeping(verb) {
|
|
316
|
+
return action({
|
|
317
|
+
args: target,
|
|
318
|
+
returns: machineDoc,
|
|
319
|
+
handler: async (ctx, { machineId, ownerId }) => {
|
|
320
|
+
await requireMachine(ctx, machineId, ownerId);
|
|
321
|
+
return await settle(ctx, machineId, async (boxd) => {
|
|
322
|
+
await request(boxd, machineId, verb);
|
|
323
|
+
return await reach(boxd, machineId, TARGET[verb], SETTLE_TIMEOUT_MS);
|
|
324
|
+
});
|
|
325
|
+
},
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* A transition that ends with the machine running. By default it returns
|
|
330
|
+
* once the machine accepts an exec.
|
|
331
|
+
*/
|
|
332
|
+
function waking(verb) {
|
|
333
|
+
return action({
|
|
334
|
+
args: { ...target, ...readiness },
|
|
335
|
+
returns: machineDoc,
|
|
336
|
+
handler: async (ctx, args) => {
|
|
337
|
+
const timeout = readyTimeout(args);
|
|
338
|
+
await requireMachine(ctx, args.machineId, args.ownerId);
|
|
339
|
+
return await settle(ctx, args.machineId, async (boxd) => {
|
|
340
|
+
await request(boxd, args.machineId, verb);
|
|
341
|
+
return timeout === undefined
|
|
342
|
+
? await boxd.machines.get(args.machineId)
|
|
343
|
+
: await boxd.machines.waitUntilReady(args.machineId, { timeout });
|
|
344
|
+
});
|
|
345
|
+
},
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
/** Boot a stopped machine (cold boot: disk kept, memory not). */
|
|
349
|
+
export const start = waking("start");
|
|
350
|
+
/** Shut the machine down. The disk is kept. */
|
|
351
|
+
export const stop = sleeping("stop");
|
|
352
|
+
/** Suspend to RAM: frozen in place, resumes in milliseconds. */
|
|
353
|
+
export const pause = sleeping("pause");
|
|
354
|
+
/** Resume a paused machine. */
|
|
355
|
+
export const resume = waking("resume");
|
|
356
|
+
/** Suspend to disk: frees the host's memory, `wake` restores it. */
|
|
357
|
+
export const hibernate = sleeping("hibernate");
|
|
358
|
+
/** Restore a hibernated machine, memory included. */
|
|
359
|
+
export const wake = waking("wake");
|
|
360
|
+
/** Destroy the machine. Its row stays, with status "destroyed". */
|
|
361
|
+
export const destroy = action({
|
|
362
|
+
args: target,
|
|
363
|
+
returns: machineDoc,
|
|
364
|
+
handler: async (ctx, { machineId, ownerId }) => {
|
|
365
|
+
await requireMachine(ctx, machineId, ownerId);
|
|
366
|
+
try {
|
|
367
|
+
await withBoxd(ctx, (boxd) => boxd.machines.delete(machineId));
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
// Already gone on boxd: the goal is reached.
|
|
371
|
+
if (!isNotFound(error))
|
|
372
|
+
return await recordFailure(ctx, machineId, error);
|
|
373
|
+
}
|
|
374
|
+
const row = await ctx.runMutation(internal.machines.markDestroyed, { machineId });
|
|
375
|
+
return row;
|
|
376
|
+
},
|
|
377
|
+
});
|
|
378
|
+
/**
|
|
379
|
+
* Route public HTTPS to a port inside the machine. Without `name`, this
|
|
380
|
+
* points the machine's default URL (`https://<machine>.<zone>`) at `port`.
|
|
381
|
+
* With `name`, it adds `https://<name>.<machine>.<zone>` beside it.
|
|
382
|
+
*/
|
|
383
|
+
export const expose = action({
|
|
384
|
+
args: { ...target, port: v.number(), name: v.optional(v.string()) },
|
|
385
|
+
returns: v.object({ url: v.string(), port: v.number() }),
|
|
386
|
+
handler: async (ctx, { machineId, ownerId, port, name }) => {
|
|
387
|
+
requirePort(port);
|
|
388
|
+
if (name !== undefined)
|
|
389
|
+
requireSubdomainLabel(name);
|
|
390
|
+
const row = await requireMachine(ctx, machineId, ownerId);
|
|
391
|
+
try {
|
|
392
|
+
return await withBoxd(ctx, async (boxd) => {
|
|
393
|
+
const base = row.url ?? (await boxd.machines.get(machineId)).access.url;
|
|
394
|
+
if (!base) {
|
|
395
|
+
throw boxdError("BOXD_ERROR", `machine ${machineId} has no HTTPS URL to route`);
|
|
396
|
+
}
|
|
397
|
+
if (name === undefined) {
|
|
398
|
+
await boxd.machines.proxies.setPort(machineId, port);
|
|
399
|
+
return { url: base, port };
|
|
400
|
+
}
|
|
401
|
+
const created = await boxd.machines.proxies.create(machineId, name, port);
|
|
402
|
+
const host = new URL(base).host;
|
|
403
|
+
return { url: `https://${created.name}.${host}`, port: created.port };
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
return await recordFailure(ctx, machineId, error);
|
|
408
|
+
}
|
|
409
|
+
},
|
|
410
|
+
});
|
|
411
|
+
//# sourceMappingURL=machines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machines.js","sourceRoot":"","sources":["../../src/component/machines.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers shared by the action modules: turning an SDK `Machine` into row
|
|
3
|
+
* fields, the tenant check, and failure bookkeeping.
|
|
4
|
+
*/
|
|
5
|
+
import type { Machine } from "@boxd-sh/sdk/web";
|
|
6
|
+
import type { Infer } from "convex/values";
|
|
7
|
+
import type { ActionCtx } from "./_generated/server.js";
|
|
8
|
+
export declare const machineDoc: import("convex/values").VObject<{
|
|
9
|
+
ownerId?: string | undefined;
|
|
10
|
+
image?: string | undefined;
|
|
11
|
+
vcpu?: number | undefined;
|
|
12
|
+
url?: string | undefined;
|
|
13
|
+
memoryBytes?: number | undefined;
|
|
14
|
+
forkedFrom?: string | undefined;
|
|
15
|
+
lastError?: string | undefined;
|
|
16
|
+
machineId: string;
|
|
17
|
+
name: string;
|
|
18
|
+
status: string;
|
|
19
|
+
updatedAt: number;
|
|
20
|
+
_creationTime: number;
|
|
21
|
+
_id: import("convex/values").GenericId<"machines">;
|
|
22
|
+
}, {
|
|
23
|
+
machineId: import("convex/values").VString<string, "required">;
|
|
24
|
+
name: import("convex/values").VString<string, "required">;
|
|
25
|
+
ownerId: import("convex/values").VString<string | undefined, "optional">;
|
|
26
|
+
status: import("convex/values").VString<string, "required">;
|
|
27
|
+
image: import("convex/values").VString<string | undefined, "optional">;
|
|
28
|
+
url: import("convex/values").VString<string | undefined, "optional">;
|
|
29
|
+
vcpu: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
30
|
+
memoryBytes: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
31
|
+
forkedFrom: import("convex/values").VString<string | undefined, "optional">;
|
|
32
|
+
lastError: import("convex/values").VString<string | undefined, "optional">;
|
|
33
|
+
updatedAt: import("convex/values").VFloat64<number, "required">;
|
|
34
|
+
_id: import("convex/values").VId<import("convex/values").GenericId<"machines">, "required">;
|
|
35
|
+
_creationTime: import("convex/values").VFloat64<number, "required">;
|
|
36
|
+
}, "required", "machineId" | "ownerId" | "image" | "name" | "vcpu" | "status" | "url" | "memoryBytes" | "forkedFrom" | "lastError" | "updatedAt" | "_creationTime" | "_id">;
|
|
37
|
+
export type MachineDoc = Infer<typeof machineDoc>;
|
|
38
|
+
export declare const executionDoc: import("convex/values").VObject<{
|
|
39
|
+
cwd?: string | undefined;
|
|
40
|
+
ownerId?: string | undefined;
|
|
41
|
+
exitCode?: number | undefined;
|
|
42
|
+
stdout?: string | undefined;
|
|
43
|
+
stderr?: string | undefined;
|
|
44
|
+
error?: string | undefined;
|
|
45
|
+
finishedAt?: number | undefined;
|
|
46
|
+
command: string;
|
|
47
|
+
machineId: string;
|
|
48
|
+
status: "running" | "completed" | "failed";
|
|
49
|
+
startedAt: number;
|
|
50
|
+
_creationTime: number;
|
|
51
|
+
_id: import("convex/values").GenericId<"executions">;
|
|
52
|
+
}, {
|
|
53
|
+
machineId: import("convex/values").VString<string, "required">;
|
|
54
|
+
ownerId: import("convex/values").VString<string | undefined, "optional">;
|
|
55
|
+
command: import("convex/values").VString<string, "required">;
|
|
56
|
+
cwd: import("convex/values").VString<string | undefined, "optional">;
|
|
57
|
+
status: import("convex/values").VUnion<"running" | "completed" | "failed", [import("convex/values").VLiteral<"running", "required">, import("convex/values").VLiteral<"completed", "required">, import("convex/values").VLiteral<"failed", "required">], "required", never>;
|
|
58
|
+
exitCode: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
59
|
+
stdout: import("convex/values").VString<string | undefined, "optional">;
|
|
60
|
+
stderr: import("convex/values").VString<string | undefined, "optional">;
|
|
61
|
+
error: import("convex/values").VString<string | undefined, "optional">;
|
|
62
|
+
startedAt: import("convex/values").VFloat64<number, "required">;
|
|
63
|
+
finishedAt: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
64
|
+
_id: import("convex/values").VId<import("convex/values").GenericId<"executions">, "required">;
|
|
65
|
+
_creationTime: import("convex/values").VFloat64<number, "required">;
|
|
66
|
+
}, "required", "command" | "cwd" | "machineId" | "ownerId" | "status" | "_creationTime" | "exitCode" | "stdout" | "stderr" | "error" | "startedAt" | "finishedAt" | "_id">;
|
|
67
|
+
/** The row fields boxd owns, read off an SDK `Machine`. */
|
|
68
|
+
export declare function observed(machine: Machine): {
|
|
69
|
+
machineId: string;
|
|
70
|
+
name: string;
|
|
71
|
+
status: import("@boxd-sh/sdk/web").MachineStatus;
|
|
72
|
+
image: string | undefined;
|
|
73
|
+
url: string | undefined;
|
|
74
|
+
vcpu: number | undefined;
|
|
75
|
+
memoryBytes: number | undefined;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* The machine's row, if it exists and belongs to `ownerId`.
|
|
79
|
+
*
|
|
80
|
+
* `ownerId` must match exactly: a machine created without one is only
|
|
81
|
+
* reachable without one. A mismatch reads as NOT_FOUND, so a caller can't
|
|
82
|
+
* probe for other tenants' machines.
|
|
83
|
+
*/
|
|
84
|
+
export declare function requireMachine(ctx: ActionCtx, machineId: string, ownerId: string | undefined): Promise<MachineDoc>;
|
|
85
|
+
/** Store the failure on the machine's row, then rethrow it. */
|
|
86
|
+
export declare function recordFailure(ctx: ActionCtx, machineId: string, error: unknown): Promise<never>;
|
|
87
|
+
//# sourceMappingURL=records.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/component/records.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIxD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;2KAGrB,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAElD,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;0KAGvB,CAAC;AAEH,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO;;;;;;;;EAUxC;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,OAAO,CAAC,UAAU,CAAC,CASrB;AAED,+DAA+D;AAC/D,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,CAAC,CAMhB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers shared by the action modules: turning an SDK `Machine` into row
|
|
3
|
+
* fields, the tenant check, and failure bookkeeping.
|
|
4
|
+
*/
|
|
5
|
+
import { v } from "convex/values";
|
|
6
|
+
import { internal } from "./_generated/api.js";
|
|
7
|
+
import { boxdError, errorMessage } from "./errors.js";
|
|
8
|
+
import schema from "./schema.js";
|
|
9
|
+
export const machineDoc = schema.tables.machines.validator.extend({
|
|
10
|
+
_id: v.id("machines"),
|
|
11
|
+
_creationTime: v.number(),
|
|
12
|
+
});
|
|
13
|
+
export const executionDoc = schema.tables.executions.validator.extend({
|
|
14
|
+
_id: v.id("executions"),
|
|
15
|
+
_creationTime: v.number(),
|
|
16
|
+
});
|
|
17
|
+
/** The row fields boxd owns, read off an SDK `Machine`. */
|
|
18
|
+
export function observed(machine) {
|
|
19
|
+
return {
|
|
20
|
+
machineId: machine.id,
|
|
21
|
+
name: machine.name,
|
|
22
|
+
status: machine.status,
|
|
23
|
+
image: machine.imageRef || undefined,
|
|
24
|
+
url: machine.access.url || undefined,
|
|
25
|
+
vcpu: machine.resources.vcpu || undefined,
|
|
26
|
+
memoryBytes: machine.resources.memoryBytes || undefined,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The machine's row, if it exists and belongs to `ownerId`.
|
|
31
|
+
*
|
|
32
|
+
* `ownerId` must match exactly: a machine created without one is only
|
|
33
|
+
* reachable without one. A mismatch reads as NOT_FOUND, so a caller can't
|
|
34
|
+
* probe for other tenants' machines.
|
|
35
|
+
*/
|
|
36
|
+
export async function requireMachine(ctx, machineId, ownerId) {
|
|
37
|
+
const row = await ctx.runQuery(internal.machines.record, { machineId });
|
|
38
|
+
if (!row || row.ownerId !== ownerId) {
|
|
39
|
+
throw boxdError("NOT_FOUND", `no machine ${machineId} is managed by this component for this owner`);
|
|
40
|
+
}
|
|
41
|
+
return row;
|
|
42
|
+
}
|
|
43
|
+
/** Store the failure on the machine's row, then rethrow it. */
|
|
44
|
+
export async function recordFailure(ctx, machineId, error) {
|
|
45
|
+
await ctx.runMutation(internal.machines.setError, {
|
|
46
|
+
machineId,
|
|
47
|
+
error: errorMessage(error),
|
|
48
|
+
});
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=records.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/component/records.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC;IAChE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC;IACrB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC;IACpE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC;IACvB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;CAC1B,CAAC,CAAC;AAEH,2DAA2D;AAC3D,MAAM,UAAU,QAAQ,CAAC,OAAgB;IACvC,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS;QACpC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,SAAS;QACpC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,SAAS;QACzC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,IAAI,SAAS;KACxD,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAc,EACd,SAAiB,EACjB,OAA2B;IAE3B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QACpC,MAAM,SAAS,CACb,WAAW,EACX,cAAc,SAAS,8CAA8C,CACtE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAc,EACd,SAAiB,EACjB,KAAc;IAEd,MAAM,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE;QAChD,SAAS;QACT,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;KAC3B,CAAC,CAAC;IACH,MAAM,KAAK,CAAC;AACd,CAAC"}
|