little-durable-objects 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.md +9 -0
- package/README.md +49 -0
- package/dist/host/actorModule.d.ts +4 -0
- package/dist/host/actorModule.d.ts.map +1 -0
- package/dist/host/actorModule.js +54 -0
- package/dist/host/actorModule.js.map +1 -0
- package/dist/host/session.d.ts +20 -0
- package/dist/host/session.d.ts.map +1 -0
- package/dist/host/session.js +220 -0
- package/dist/host/session.js.map +1 -0
- package/dist/host/worker/entrypoint.d.ts +2 -0
- package/dist/host/worker/entrypoint.d.ts.map +1 -0
- package/dist/host/worker/entrypoint.js +26 -0
- package/dist/host/worker/entrypoint.js.map +1 -0
- package/dist/host/worker/runtime.d.ts +14 -0
- package/dist/host/worker/runtime.d.ts.map +1 -0
- package/dist/host/worker/runtime.js +77 -0
- package/dist/host/worker/runtime.js.map +1 -0
- package/dist/host/worker/supervisor.d.ts +21 -0
- package/dist/host/worker/supervisor.d.ts.map +1 -0
- package/dist/host/worker/supervisor.js +190 -0
- package/dist/host/worker/supervisor.js.map +1 -0
- package/dist/host.d.ts +2 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +2 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/modal.d.ts +29 -0
- package/dist/providers/modal.d.ts.map +1 -0
- package/dist/providers/modal.js +193 -0
- package/dist/providers/modal.js.map +1 -0
- package/dist/providers/modalCli.d.ts +3 -0
- package/dist/providers/modalCli.d.ts.map +1 -0
- package/dist/providers/modalCli.js +18 -0
- package/dist/providers/modalCli.js.map +1 -0
- package/dist/providers/types.d.ts +31 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/regions.d.ts +59 -0
- package/dist/regions.d.ts.map +1 -0
- package/dist/regions.js +46 -0
- package/dist/regions.js.map +1 -0
- package/dist/shared/actor.d.ts +28 -0
- package/dist/shared/actor.d.ts.map +1 -0
- package/dist/shared/actor.js +105 -0
- package/dist/shared/actor.js.map +1 -0
- package/dist/shared/errors.d.ts +25 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +48 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/invocationContext.d.ts +4 -0
- package/dist/shared/invocationContext.d.ts.map +1 -0
- package/dist/shared/invocationContext.js +10 -0
- package/dist/shared/invocationContext.js.map +1 -0
- package/dist/shared/types.d.ts +123 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +111 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/workflow/client.d.ts +23 -0
- package/dist/workflow/client.d.ts.map +1 -0
- package/dist/workflow/client.js +49 -0
- package/dist/workflow/client.js.map +1 -0
- package/dist/workflow/remoteClient.d.ts +26 -0
- package/dist/workflow/remoteClient.d.ts.map +1 -0
- package/dist/workflow/remoteClient.js +136 -0
- package/dist/workflow/remoteClient.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { Worker } from "node:worker_threads";
|
|
2
|
+
import { findActorDefinition } from "../../shared/actor.js";
|
|
3
|
+
import { errorMessage, failedReply } from "../../shared/types.js";
|
|
4
|
+
const DEFAULT_ACTOR_IDLE_TIMEOUT_MS = 60_000;
|
|
5
|
+
const MAX_RESIDENT_ACTORS = 32;
|
|
6
|
+
class ActorWorkerSupervisor {
|
|
7
|
+
actorEntrypointUrl;
|
|
8
|
+
actorIdleTimeoutMs;
|
|
9
|
+
actors = new Map();
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.actorEntrypointUrl = options.actorEntrypointUrl;
|
|
12
|
+
this.actorIdleTimeoutMs = options.actorIdleTimeoutMs ?? DEFAULT_ACTOR_IDLE_TIMEOUT_MS;
|
|
13
|
+
if (!Number.isInteger(this.actorIdleTimeoutMs) || this.actorIdleTimeoutMs <= 0) {
|
|
14
|
+
throw new Error("actor idle timeout must be a positive integer");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
async handle(command) {
|
|
18
|
+
switch (command.type) {
|
|
19
|
+
case "invoke":
|
|
20
|
+
return this.invoke(command);
|
|
21
|
+
case "evict":
|
|
22
|
+
return this.evict(command);
|
|
23
|
+
default:
|
|
24
|
+
throw command;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
invoke(command) {
|
|
28
|
+
const definition = findActorDefinition(command.actor.actor_type);
|
|
29
|
+
if (definition === undefined) {
|
|
30
|
+
return Promise.resolve(failedReply("actor_type_not_found", `actor type ${command.actor.actor_type} is not loaded in this customer process`));
|
|
31
|
+
}
|
|
32
|
+
const key = actorKey(command);
|
|
33
|
+
let actor = this.actors.get(key);
|
|
34
|
+
if (actor === undefined) {
|
|
35
|
+
if (!this.makeRoomForActor()) {
|
|
36
|
+
return Promise.resolve(failedReply("resource_exhausted", `actor host already has ${MAX_RESIDENT_ACTORS} active actor Workers`));
|
|
37
|
+
}
|
|
38
|
+
actor = new ResidentActorWorker({
|
|
39
|
+
actorType: definition.actorType,
|
|
40
|
+
moduleUrl: this.actorEntrypointUrl,
|
|
41
|
+
idleTimeoutMs: this.actorIdleTimeoutMs,
|
|
42
|
+
onIdle: candidate => this.removeIfCurrent(key, candidate)
|
|
43
|
+
});
|
|
44
|
+
this.actors.set(key, actor);
|
|
45
|
+
}
|
|
46
|
+
return actor.invoke(command);
|
|
47
|
+
}
|
|
48
|
+
evict(command) {
|
|
49
|
+
const key = actorKey(command);
|
|
50
|
+
const actor = this.actors.get(key);
|
|
51
|
+
if (actor !== undefined) {
|
|
52
|
+
this.actors.delete(key);
|
|
53
|
+
actor.terminate("resident actor was evicted by the Rust host");
|
|
54
|
+
}
|
|
55
|
+
return { type: "evicted" };
|
|
56
|
+
}
|
|
57
|
+
makeRoomForActor() {
|
|
58
|
+
if (this.actors.size < MAX_RESIDENT_ACTORS)
|
|
59
|
+
return true;
|
|
60
|
+
const idle = [...this.actors.entries()].filter(([, actor]) => actor.isIdle()).sort((left, right) => left[1].lastCompletedAt - right[1].lastCompletedAt)[0];
|
|
61
|
+
if (idle === undefined)
|
|
62
|
+
return false;
|
|
63
|
+
this.actors.delete(idle[0]);
|
|
64
|
+
idle[1].terminate("resident actor was evicted by the LRU capacity limit");
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
removeIfCurrent(key, actor) {
|
|
68
|
+
if (this.actors.get(key) !== actor || !actor.isIdle())
|
|
69
|
+
return;
|
|
70
|
+
this.actors.delete(key);
|
|
71
|
+
actor.terminate(`resident actor was idle for ${this.actorIdleTimeoutMs}ms`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
class ResidentActorWorker {
|
|
75
|
+
actorType;
|
|
76
|
+
moduleUrl;
|
|
77
|
+
idleTimeoutMs;
|
|
78
|
+
onIdle;
|
|
79
|
+
lastCompletedAt = Date.now();
|
|
80
|
+
worker;
|
|
81
|
+
idleTimer;
|
|
82
|
+
constructor(options) {
|
|
83
|
+
this.actorType = options.actorType;
|
|
84
|
+
this.moduleUrl = options.moduleUrl;
|
|
85
|
+
this.idleTimeoutMs = options.idleTimeoutMs;
|
|
86
|
+
this.onIdle = options.onIdle;
|
|
87
|
+
}
|
|
88
|
+
async invoke(command) {
|
|
89
|
+
if (this.idleTimer !== undefined)
|
|
90
|
+
clearTimeout(this.idleTimer);
|
|
91
|
+
this.idleTimer = undefined;
|
|
92
|
+
this.worker ??= new ActorWorker({ actorType: this.actorType, moduleUrl: this.moduleUrl });
|
|
93
|
+
let reply;
|
|
94
|
+
try {
|
|
95
|
+
reply = await this.worker.invoke(command);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
reply = failedReply(error instanceof ActorWorkerTerminatedError ? "actor_worker_terminated" : "actor_worker_failed", errorMessage(error));
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
this.lastCompletedAt = Date.now();
|
|
102
|
+
}
|
|
103
|
+
if (reply.type === "failed") {
|
|
104
|
+
this.worker.terminate("actor invocation failed");
|
|
105
|
+
this.worker = undefined;
|
|
106
|
+
}
|
|
107
|
+
this.idleTimer = setTimeout(() => this.onIdle(this), this.idleTimeoutMs);
|
|
108
|
+
this.idleTimer.unref();
|
|
109
|
+
return reply;
|
|
110
|
+
}
|
|
111
|
+
isIdle() {
|
|
112
|
+
return this.idleTimer !== undefined;
|
|
113
|
+
}
|
|
114
|
+
terminate(reason) {
|
|
115
|
+
if (this.idleTimer !== undefined)
|
|
116
|
+
clearTimeout(this.idleTimer);
|
|
117
|
+
this.idleTimer = undefined;
|
|
118
|
+
this.worker?.terminate(reason);
|
|
119
|
+
this.worker = undefined;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
class ActorWorker {
|
|
123
|
+
worker;
|
|
124
|
+
replyResolve;
|
|
125
|
+
replyReject;
|
|
126
|
+
terminalError;
|
|
127
|
+
constructor(data) {
|
|
128
|
+
this.worker = new Worker(new URL("./entrypoint.js", import.meta.url), { workerData: data });
|
|
129
|
+
this.worker.on("message", (reply) => this.reply(reply));
|
|
130
|
+
this.worker.once("error", error => this.fail(error));
|
|
131
|
+
this.worker.once("exit", code => this.fail(new Error(`actor Worker exited with code ${code}`)));
|
|
132
|
+
this.worker.unref();
|
|
133
|
+
}
|
|
134
|
+
async invoke(command) {
|
|
135
|
+
if (this.terminalError !== undefined)
|
|
136
|
+
throw this.terminalError;
|
|
137
|
+
this.worker.ref();
|
|
138
|
+
try {
|
|
139
|
+
return await new Promise((resolve, reject) => {
|
|
140
|
+
this.replyResolve = resolve;
|
|
141
|
+
this.replyReject = reject;
|
|
142
|
+
this.post({ type: "invoke", command });
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
if (this.replyResolve === undefined)
|
|
147
|
+
this.worker.unref();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
terminate(reason) {
|
|
151
|
+
if (this.terminalError !== undefined)
|
|
152
|
+
return;
|
|
153
|
+
const error = new ActorWorkerTerminatedError(reason);
|
|
154
|
+
this.fail(error);
|
|
155
|
+
void this.worker.terminate();
|
|
156
|
+
}
|
|
157
|
+
reply(reply) {
|
|
158
|
+
const resolve = this.replyResolve;
|
|
159
|
+
if (resolve === undefined)
|
|
160
|
+
return;
|
|
161
|
+
this.replyResolve = undefined;
|
|
162
|
+
this.replyReject = undefined;
|
|
163
|
+
resolve(reply);
|
|
164
|
+
this.worker.unref();
|
|
165
|
+
}
|
|
166
|
+
post(message) {
|
|
167
|
+
this.worker.postMessage(message);
|
|
168
|
+
}
|
|
169
|
+
fail(error) {
|
|
170
|
+
if (this.terminalError !== undefined)
|
|
171
|
+
return;
|
|
172
|
+
this.terminalError = error;
|
|
173
|
+
this.replyReject?.(error);
|
|
174
|
+
this.replyResolve = undefined;
|
|
175
|
+
this.replyReject = undefined;
|
|
176
|
+
this.worker.unref();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
class ActorWorkerTerminatedError extends Error {
|
|
180
|
+
constructor(message) {
|
|
181
|
+
super(message);
|
|
182
|
+
this.name = "ActorWorkerTerminatedError";
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function actorKey(command) {
|
|
186
|
+
const actor = command.actor;
|
|
187
|
+
return `${actor.namespace_id}\u001f${actor.actor_type}\u001f${actor.actor_id}`;
|
|
188
|
+
}
|
|
189
|
+
export { ActorWorkerSupervisor, DEFAULT_ACTOR_IDLE_TIMEOUT_MS, MAX_RESIDENT_ACTORS };
|
|
190
|
+
//# sourceMappingURL=supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../../host/worker/supervisor.ts"],"names":[],"mappings":"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"}
|
package/dist/host.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/host.js
ADDED
package/dist/host.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ModalClient } from "modal";
|
|
2
|
+
import type { CanonicalRegionCatalog } from "../regions.js";
|
|
3
|
+
import type { ActorHostHandle, EnsureHostRequest, SandboxProvider } from "./types.js";
|
|
4
|
+
interface ModalSandboxProviderOptions {
|
|
5
|
+
readonly appName?: string;
|
|
6
|
+
readonly binaryPath?: string;
|
|
7
|
+
readonly catalog?: CanonicalRegionCatalog;
|
|
8
|
+
readonly client?: ModalClient;
|
|
9
|
+
}
|
|
10
|
+
declare class ModalSandboxProvider implements SandboxProvider {
|
|
11
|
+
private readonly options;
|
|
12
|
+
private readonly modal;
|
|
13
|
+
private readonly appName;
|
|
14
|
+
private readonly binaryPath;
|
|
15
|
+
private readonly activations;
|
|
16
|
+
constructor(options?: ModalSandboxProviderOptions);
|
|
17
|
+
ensureHost(request: EnsureHostRequest): Promise<ActorHostHandle>;
|
|
18
|
+
private ensureHostOnce;
|
|
19
|
+
private reuseExisting;
|
|
20
|
+
private createSandbox;
|
|
21
|
+
private activate;
|
|
22
|
+
private existing;
|
|
23
|
+
private readHandle;
|
|
24
|
+
private validatePlacement;
|
|
25
|
+
private start;
|
|
26
|
+
}
|
|
27
|
+
export { ModalSandboxProvider };
|
|
28
|
+
export type { ModalSandboxProviderOptions };
|
|
29
|
+
//# sourceMappingURL=modal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal.d.ts","sourceRoot":"","sources":["../../providers/modal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,WAAW,EAAiB,MAAM,OAAO,CAAA;AAKtE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAE3D,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AASrF,UAAU,2BAA2B;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,sBAAsB,CAAA;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAChC;AAID,cAAM,oBAAqB,YAAW,eAAe;IAMrC,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8C;gBAE7C,OAAO,GAAE,2BAAgC;IAMhE,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC;YASxD,cAAc;YAWd,aAAa;YAWb,aAAa;YA+Bb,QAAQ;YAOR,QAAQ;YAUR,UAAU;YAYV,iBAAiB;YASjB,KAAK;CAgBtB;AA0DD,OAAO,EAAE,oBAAoB,EAAE,CAAA;AAC/B,YAAY,EAAE,2BAA2B,EAAE,CAAA"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { AlreadyExistsError, ModalClient, NotFoundError } from "modal";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { canonicalRegionForModal, modalPlacement } from "../regions.js";
|
|
4
|
+
const hostPort = 7101;
|
|
5
|
+
const hostRouteFile = "/tmp/durable-object-route";
|
|
6
|
+
const readyFile = "/tmp/durable-object-ready";
|
|
7
|
+
const hostStderrFile = "/tmp/durable-object-host.stderr";
|
|
8
|
+
const hostExitedFile = "/tmp/durable-object-host-exited";
|
|
9
|
+
const maximumSandboxLifetimeMs = 24 * 60 * 60 * 1000;
|
|
10
|
+
class ModalSandboxProvider {
|
|
11
|
+
options;
|
|
12
|
+
modal;
|
|
13
|
+
appName;
|
|
14
|
+
binaryPath;
|
|
15
|
+
activations = new Map();
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
this.options = options;
|
|
18
|
+
this.modal = options.client ?? new ModalClient();
|
|
19
|
+
this.appName = options.appName ?? "durable-object-hosts";
|
|
20
|
+
this.binaryPath = options.binaryPath ?? "/usr/local/bin/little-durable-objects";
|
|
21
|
+
}
|
|
22
|
+
async ensureHost(request) {
|
|
23
|
+
const key = resourceName("host", request);
|
|
24
|
+
const current = this.activations.get(key);
|
|
25
|
+
if (current)
|
|
26
|
+
return current;
|
|
27
|
+
const activation = this.ensureHostOnce(request, key).finally(() => this.activations.delete(key));
|
|
28
|
+
this.activations.set(key, activation);
|
|
29
|
+
return activation;
|
|
30
|
+
}
|
|
31
|
+
async ensureHostOnce(request, name) {
|
|
32
|
+
validateEnsureRequest(request);
|
|
33
|
+
const placement = modalPlacement(request.canonicalRegion, this.options.catalog);
|
|
34
|
+
const [app, image] = await Promise.all([this.modal.apps.fromName(this.appName, { createIfMissing: true }), this.modal.images.fromId(request.imageRef)]);
|
|
35
|
+
const existing = await this.reuseExisting(app, name, request.canonicalRegion);
|
|
36
|
+
if (existing)
|
|
37
|
+
return existing;
|
|
38
|
+
const acquired = await this.createSandbox(request, name, app, image, placement);
|
|
39
|
+
if ("handle" in acquired)
|
|
40
|
+
return acquired.handle;
|
|
41
|
+
return this.activate(acquired.sandbox, request);
|
|
42
|
+
}
|
|
43
|
+
async reuseExisting(app, name, canonicalRegion) {
|
|
44
|
+
const existing = await this.existing(app, name);
|
|
45
|
+
if (!existing)
|
|
46
|
+
return undefined;
|
|
47
|
+
try {
|
|
48
|
+
return await this.readHandle(existing, canonicalRegion);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
await existing.terminate();
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async createSandbox(request, name, app, image, placement) {
|
|
56
|
+
try {
|
|
57
|
+
const sandbox = await this.modal.sandboxes.create(app, image, {
|
|
58
|
+
name,
|
|
59
|
+
timeoutMs: maximumSandboxLifetimeMs,
|
|
60
|
+
idleTimeoutMs: request.hostIdleTimeoutMs,
|
|
61
|
+
command: [
|
|
62
|
+
"sh",
|
|
63
|
+
"-c",
|
|
64
|
+
'until test -s "$1"; do sleep 0.05; done; export DURABLE_OBJECT_HOST_ROUTE="$(cat "$1")"; "$2" 2>"$3"; status=$?; printf \'%s\n\' "$status" >"$4"; if ! test -f "$5"; then sleep 60; fi; exit "$status"',
|
|
65
|
+
"durable-object-host-bootstrap",
|
|
66
|
+
hostRouteFile,
|
|
67
|
+
this.binaryPath,
|
|
68
|
+
hostStderrFile,
|
|
69
|
+
hostExitedFile,
|
|
70
|
+
readyFile
|
|
71
|
+
],
|
|
72
|
+
workdir: request.workingDirectory,
|
|
73
|
+
env: hostEnvironment(request),
|
|
74
|
+
h2Ports: [hostPort],
|
|
75
|
+
regions: [...placement.regions],
|
|
76
|
+
cloud: placement.cloud
|
|
77
|
+
});
|
|
78
|
+
return { sandbox };
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (!(error instanceof AlreadyExistsError))
|
|
82
|
+
throw error;
|
|
83
|
+
const raced = (await this.existing(app, name)) ?? (await this.modal.sandboxes.fromName(this.appName, name));
|
|
84
|
+
return { handle: await this.readHandle(raced, request.canonicalRegion) };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async activate(sandbox, request) {
|
|
88
|
+
await this.validatePlacement(sandbox, request.canonicalRegion);
|
|
89
|
+
const handle = await this.start(sandbox, request);
|
|
90
|
+
await writeMetadata(sandbox, handle);
|
|
91
|
+
return handle;
|
|
92
|
+
}
|
|
93
|
+
async existing(app, name) {
|
|
94
|
+
try {
|
|
95
|
+
const sandbox = await this.modal.sandboxes.fromName(app.name ?? this.appName, name);
|
|
96
|
+
return (await sandbox.poll()) === null ? sandbox : undefined;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (error instanceof NotFoundError)
|
|
100
|
+
return undefined;
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async readHandle(sandbox, canonicalRegion) {
|
|
105
|
+
const process = await sandbox.exec(["sh", "-c", "for i in $(seq 1 1200); do test -s /tmp/durable-object-host.json && exec cat /tmp/durable-object-host.json; sleep 0.05; done; exit 1"], {
|
|
106
|
+
stdout: "pipe",
|
|
107
|
+
stderr: "pipe"
|
|
108
|
+
});
|
|
109
|
+
const [document, exitCode] = await Promise.all([process.stdout.readText(), process.wait()]);
|
|
110
|
+
if (exitCode !== 0)
|
|
111
|
+
throw new Error("existing Modal host has no ready metadata");
|
|
112
|
+
const handle = JSON.parse(document);
|
|
113
|
+
if (handle.canonicalRegion !== canonicalRegion)
|
|
114
|
+
throw new Error("existing Modal host has the wrong canonical region");
|
|
115
|
+
return handle;
|
|
116
|
+
}
|
|
117
|
+
async validatePlacement(sandbox, expectedRegion) {
|
|
118
|
+
const observed = await runtimePlacement(sandbox);
|
|
119
|
+
const observedCanonical = canonicalRegionForModal(observed.cloud, observed.region, this.options.catalog);
|
|
120
|
+
if (observedCanonical !== expectedRegion) {
|
|
121
|
+
await sandbox.terminate();
|
|
122
|
+
throw new Error(`Modal placed host in ${observedCanonical ?? "an unknown region"}; expected ${expectedRegion}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async start(sandbox, request) {
|
|
126
|
+
const route = (await sandbox.tunnels())[hostPort]?.url;
|
|
127
|
+
if (!route)
|
|
128
|
+
throw new Error("Modal did not create the durable-object HTTP/2 tunnel");
|
|
129
|
+
await writeFile(sandbox, hostRouteFile, route);
|
|
130
|
+
const ready = await sandbox.exec(["sh", "-c", `for i in $(seq 1 1200); do test -f ${readyFile} && exit 0; if test -f ${hostExitedFile}; then cat ${hostStderrFile} >&2; exit 1; fi; sleep 0.05; done; exit 1`], { stdout: "pipe", stderr: "pipe" });
|
|
131
|
+
const [detail, exitCode] = await Promise.all([ready.stderr.readText(), ready.wait()]);
|
|
132
|
+
if (exitCode !== 0) {
|
|
133
|
+
await sandbox.terminate().catch(() => undefined);
|
|
134
|
+
const message = detail.trim();
|
|
135
|
+
throw new Error(`durable-object host did not become ready${message ? `: ${message}` : ""}`);
|
|
136
|
+
}
|
|
137
|
+
return { hostId: request.hostId, route, canonicalRegion: request.canonicalRegion };
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function hostEnvironment(request) {
|
|
141
|
+
return {
|
|
142
|
+
DURABLE_OBJECT_PROCESS_ROLE: "host",
|
|
143
|
+
DURABLE_OBJECT_HOST_TOKEN: request.hostToken,
|
|
144
|
+
DURABLE_OBJECT_JWT_PUBLIC_KEYS: request.jwtPublicKeys,
|
|
145
|
+
DURABLE_OBJECT_NAMESPACE_ID: request.namespaceId,
|
|
146
|
+
DURABLE_OBJECT_CONTROL_PLANE_URL: request.controlPlaneUrl,
|
|
147
|
+
DURABLE_OBJECT_JWT_ISSUER: request.jwtIssuer,
|
|
148
|
+
DURABLE_OBJECT_INVOKE_JWT_AUDIENCE: request.invocationJwtAudience,
|
|
149
|
+
DURABLE_OBJECT_HOST_ID: request.hostId,
|
|
150
|
+
DURABLE_OBJECT_SESSION_ID: request.sessionId,
|
|
151
|
+
DURABLE_OBJECT_REGION: request.canonicalRegion,
|
|
152
|
+
DURABLE_OBJECT_CODE_REVISION: request.codeRevision,
|
|
153
|
+
DURABLE_OBJECT_EXECUTOR_SOCKET: "/tmp/durable-object-executor.sock",
|
|
154
|
+
DURABLE_OBJECT_HOST_READY_FILE: readyFile,
|
|
155
|
+
DURABLE_OBJECT_HOST_BIND: `0.0.0.0:${hostPort}`,
|
|
156
|
+
DURABLE_OBJECT_ACTOR_IDLE_TIMEOUT_MS: String(request.actorIdleTimeoutMs),
|
|
157
|
+
DURABLE_OBJECT_HOST_IDLE_TIMEOUT_MS: String(request.hostIdleTimeoutMs),
|
|
158
|
+
...(request.actorEntrypoint ? { DURABLE_OBJECT_ENTRYPOINT: request.actorEntrypoint } : {})
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function validateEnsureRequest(request) {
|
|
162
|
+
if (!request.hostId.startsWith(`host.v1.${request.namespaceId}.`))
|
|
163
|
+
throw new Error("host ID does not belong to its namespace");
|
|
164
|
+
if (!Number.isInteger(request.actorIdleTimeoutMs) || request.actorIdleTimeoutMs <= 0 || request.actorIdleTimeoutMs > maximumSandboxLifetimeMs) {
|
|
165
|
+
throw new Error("actor idle timeout is invalid");
|
|
166
|
+
}
|
|
167
|
+
if (!Number.isInteger(request.hostIdleTimeoutMs) || request.hostIdleTimeoutMs <= 0 || request.hostIdleTimeoutMs > maximumSandboxLifetimeMs) {
|
|
168
|
+
throw new Error("host idle timeout is invalid");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
function resourceName(kind, request) {
|
|
172
|
+
const digest = createHash("sha256").update(request.namespaceId).update("\0").update(request.codeRevision).update("\0").update(request.canonicalRegion).digest("hex").slice(0, 32);
|
|
173
|
+
return `do-${kind}-${digest}`;
|
|
174
|
+
}
|
|
175
|
+
async function runtimePlacement(sandbox) {
|
|
176
|
+
const process = await sandbox.exec(["sh", "-c", 'printf \'%s\\n%s\\n\' "${MODAL_CLOUD_PROVIDER:-}" "${MODAL_REGION:-}"'], { stdout: "pipe", stderr: "pipe" });
|
|
177
|
+
const [stdout, exitCode] = await Promise.all([process.stdout.readText(), process.wait()]);
|
|
178
|
+
if (exitCode !== 0)
|
|
179
|
+
throw new Error("could not inspect Modal host placement");
|
|
180
|
+
const [cloud, region] = stdout.split("\n").map(value => value.trim());
|
|
181
|
+
return { ...(cloud ? { cloud } : {}), ...(region ? { region } : {}) };
|
|
182
|
+
}
|
|
183
|
+
async function writeMetadata(sandbox, handle) {
|
|
184
|
+
await writeFile(sandbox, "/tmp/durable-object-host.json", JSON.stringify(handle));
|
|
185
|
+
}
|
|
186
|
+
async function writeFile(sandbox, path, contents) {
|
|
187
|
+
const file = await sandbox.open(path, "w");
|
|
188
|
+
await file.write(new TextEncoder().encode(contents));
|
|
189
|
+
await file.flush();
|
|
190
|
+
await file.close();
|
|
191
|
+
}
|
|
192
|
+
export { ModalSandboxProvider };
|
|
193
|
+
//# sourceMappingURL=modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal.js","sourceRoot":"","sources":["../../providers/modal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modalCli.d.ts","sourceRoot":"","sources":["../../providers/modalCli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { stdin, stdout } from "node:process";
|
|
3
|
+
import { ModalSandboxProvider } from "./modal.js";
|
|
4
|
+
async function main() {
|
|
5
|
+
const chunks = [];
|
|
6
|
+
for await (const chunk of stdin)
|
|
7
|
+
chunks.push(Buffer.from(chunk));
|
|
8
|
+
const command = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
9
|
+
const provider = new ModalSandboxProvider();
|
|
10
|
+
if (command.operation !== "ensure_host")
|
|
11
|
+
throw new Error(`unsupported sandbox operation ${String(command.operation)}`);
|
|
12
|
+
stdout.write(JSON.stringify(await provider.ensureHost(command.request)));
|
|
13
|
+
}
|
|
14
|
+
main().catch(error => {
|
|
15
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
16
|
+
process.exitCode = 1;
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=modalCli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modalCli.js","sourceRoot":"","sources":["../../providers/modalCli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAGjD,KAAK,UAAU,IAAI;IACf,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA2B,CAAA;IAC5F,MAAM,QAAQ,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC3C,IAAI,OAAO,CAAC,SAAS,KAAK,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IACtH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AAC5E,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACnF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;AACxB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
interface EnsureHostRequest {
|
|
2
|
+
readonly namespaceId: string;
|
|
3
|
+
readonly codeRevision: string;
|
|
4
|
+
readonly canonicalRegion: string;
|
|
5
|
+
readonly hostId: string;
|
|
6
|
+
readonly sessionId: string;
|
|
7
|
+
readonly hostToken: string;
|
|
8
|
+
readonly jwtPublicKeys: string;
|
|
9
|
+
readonly controlPlaneUrl: string;
|
|
10
|
+
readonly jwtIssuer: string;
|
|
11
|
+
readonly invocationJwtAudience: string;
|
|
12
|
+
readonly imageRef: string;
|
|
13
|
+
readonly workingDirectory: string;
|
|
14
|
+
readonly actorEntrypoint?: string;
|
|
15
|
+
readonly actorIdleTimeoutMs: number;
|
|
16
|
+
readonly hostIdleTimeoutMs: number;
|
|
17
|
+
}
|
|
18
|
+
interface ActorHostHandle {
|
|
19
|
+
readonly hostId: string;
|
|
20
|
+
readonly route: string;
|
|
21
|
+
readonly canonicalRegion: string;
|
|
22
|
+
}
|
|
23
|
+
interface SandboxProvider {
|
|
24
|
+
ensureHost(request: EnsureHostRequest): Promise<ActorHostHandle>;
|
|
25
|
+
}
|
|
26
|
+
type SandboxProviderCommand = {
|
|
27
|
+
readonly operation: "ensure_host";
|
|
28
|
+
readonly request: EnsureHostRequest;
|
|
29
|
+
};
|
|
30
|
+
export type { ActorHostHandle, EnsureHostRequest, SandboxProvider, SandboxProviderCommand };
|
|
31
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../providers/types.ts"],"names":[],"mappings":"AAAA,UAAU,iBAAiB;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;IAC7B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAA;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;CACrC;AAED,UAAU,eAAe;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CACnC;AAED,UAAU,eAAe;IACrB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;CACnE;AAED,KAAK,sBAAsB,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAAA;AAExG,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,sBAAsB,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../providers/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
interface ModalPlacement {
|
|
2
|
+
readonly regions: readonly string[];
|
|
3
|
+
readonly cloud?: string;
|
|
4
|
+
readonly observedPlacements: readonly string[];
|
|
5
|
+
}
|
|
6
|
+
interface RegionDefinition {
|
|
7
|
+
readonly modal: ModalPlacement;
|
|
8
|
+
}
|
|
9
|
+
type CanonicalRegionCatalog = Readonly<Record<string, RegionDefinition>>;
|
|
10
|
+
declare const recommendedRegionCatalog: {
|
|
11
|
+
readonly "north-america-east": {
|
|
12
|
+
readonly modal: {
|
|
13
|
+
readonly regions: readonly ["us-east"];
|
|
14
|
+
readonly cloud: "gcp";
|
|
15
|
+
readonly observedPlacements: readonly ["gcp:us-east*"];
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
readonly "north-america-central": {
|
|
19
|
+
readonly modal: {
|
|
20
|
+
readonly regions: readonly ["us-central"];
|
|
21
|
+
readonly cloud: "gcp";
|
|
22
|
+
readonly observedPlacements: readonly ["gcp:us-central*"];
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
readonly "north-america-south": {
|
|
26
|
+
readonly modal: {
|
|
27
|
+
readonly regions: readonly ["us-south"];
|
|
28
|
+
readonly cloud: "gcp";
|
|
29
|
+
readonly observedPlacements: readonly ["gcp:us-south*"];
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
readonly "north-america-west": {
|
|
33
|
+
readonly modal: {
|
|
34
|
+
readonly regions: readonly ["us-west"];
|
|
35
|
+
readonly cloud: "gcp";
|
|
36
|
+
readonly observedPlacements: readonly ["gcp:us-west*"];
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
readonly "europe-west": {
|
|
40
|
+
readonly modal: {
|
|
41
|
+
readonly regions: readonly ["eu-west"];
|
|
42
|
+
readonly cloud: "gcp";
|
|
43
|
+
readonly observedPlacements: readonly ["gcp:europe-west*"];
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
readonly "asia-southeast": {
|
|
47
|
+
readonly modal: {
|
|
48
|
+
readonly regions: readonly ["ap-southeast"];
|
|
49
|
+
readonly cloud: "gcp";
|
|
50
|
+
readonly observedPlacements: readonly ["gcp:asia-southeast*"];
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
declare function modalPlacement(region: string, catalog?: CanonicalRegionCatalog): ModalPlacement;
|
|
55
|
+
declare function canonicalRegionForModal(cloud: string | undefined, region: string | undefined, catalog?: CanonicalRegionCatalog): string | undefined;
|
|
56
|
+
declare function validateCanonicalRegion(value: string): string;
|
|
57
|
+
export { canonicalRegionForModal, modalPlacement, recommendedRegionCatalog, validateCanonicalRegion };
|
|
58
|
+
export type { CanonicalRegionCatalog, ModalPlacement, RegionDefinition };
|
|
59
|
+
//# sourceMappingURL=regions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"regions.d.ts","sourceRoot":"","sources":["../regions.ts"],"names":[],"mappings":"AAEA,UAAU,cAAc;IACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAA;CACjD;AAED,UAAU,gBAAgB;IACtB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;CACjC;AAED,KAAK,sBAAsB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAA;AAExE,QAAA,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmBa,CAAA;AAE3C,iBAAS,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,sBAAiD,GAAG,cAAc,CAIlH;AAED,iBAAS,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,GAAE,sBAAiD,GAAG,MAAM,GAAG,SAAS,CAMtK;AAED,iBAAS,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGtD;AAOD,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,CAAA;AACrG,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAA"}
|