@alchemy.run/boat 0.0.0 → 2.0.0-beta.87
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 +201 -0
- package/README.md +66 -4
- package/lib/AiProxy.d.ts +89 -0
- package/lib/AiProxy.d.ts.map +1 -0
- package/lib/AiProxy.js +125 -0
- package/lib/AiProxy.js.map +1 -0
- package/lib/ApiKey.d.ts +105 -0
- package/lib/ApiKey.d.ts.map +1 -0
- package/lib/ApiKey.js +134 -0
- package/lib/ApiKey.js.map +1 -0
- package/lib/AuthProvider.d.ts +71 -0
- package/lib/AuthProvider.d.ts.map +1 -0
- package/lib/AuthProvider.js +322 -0
- package/lib/AuthProvider.js.map +1 -0
- package/lib/BoatBindings.d.ts +52 -0
- package/lib/BoatBindings.d.ts.map +1 -0
- package/lib/BoatBindings.js +104 -0
- package/lib/BoatBindings.js.map +1 -0
- package/lib/Bootstrap.d.ts +8 -0
- package/lib/Bootstrap.d.ts.map +1 -0
- package/lib/Bootstrap.js +28 -0
- package/lib/Bootstrap.js.map +1 -0
- package/lib/ConnectSandbox.d.ts +56 -0
- package/lib/ConnectSandbox.d.ts.map +1 -0
- package/lib/ConnectSandbox.js +3 -0
- package/lib/ConnectSandbox.js.map +1 -0
- package/lib/ConnectSandboxHttp.d.ts +21 -0
- package/lib/ConnectSandboxHttp.d.ts.map +1 -0
- package/lib/ConnectSandboxHttp.js +46 -0
- package/lib/ConnectSandboxHttp.js.map +1 -0
- package/lib/Contributions.d.ts +7 -0
- package/lib/Contributions.d.ts.map +1 -0
- package/lib/Contributions.js +6 -0
- package/lib/Contributions.js.map +1 -0
- package/lib/CreateSandbox.d.ts +134 -0
- package/lib/CreateSandbox.d.ts.map +1 -0
- package/lib/CreateSandbox.js +3 -0
- package/lib/CreateSandbox.js.map +1 -0
- package/lib/CreateSandboxHttp.d.ts +21 -0
- package/lib/CreateSandboxHttp.d.ts.map +1 -0
- package/lib/CreateSandboxHttp.js +93 -0
- package/lib/CreateSandboxHttp.js.map +1 -0
- package/lib/CredentialProfile.d.ts +157 -0
- package/lib/CredentialProfile.d.ts.map +1 -0
- package/lib/CredentialProfile.js +245 -0
- package/lib/CredentialProfile.js.map +1 -0
- package/lib/Credentials.d.ts +15 -0
- package/lib/Credentials.d.ts.map +1 -0
- package/lib/Credentials.js +23 -0
- package/lib/Credentials.js.map +1 -0
- package/lib/Environment.d.ts +219 -0
- package/lib/Environment.d.ts.map +1 -0
- package/lib/Environment.js +273 -0
- package/lib/Environment.js.map +1 -0
- package/lib/Errors.d.ts +50 -0
- package/lib/Errors.d.ts.map +1 -0
- package/lib/Errors.js +17 -0
- package/lib/Errors.js.map +1 -0
- package/lib/Providers.d.ts +33 -0
- package/lib/Providers.d.ts.map +1 -0
- package/lib/Providers.js +47 -0
- package/lib/Providers.js.map +1 -0
- package/lib/Sandbox.d.ts +205 -0
- package/lib/Sandbox.d.ts.map +1 -0
- package/lib/Sandbox.js +368 -0
- package/lib/Sandbox.js.map +1 -0
- package/lib/SandboxClient.d.ts +159 -0
- package/lib/SandboxClient.d.ts.map +1 -0
- package/lib/SandboxClient.js +1 -0
- package/lib/SandboxClient.js.map +1 -0
- package/lib/SandboxEvents.d.ts +111 -0
- package/lib/SandboxEvents.d.ts.map +1 -0
- package/lib/SandboxEvents.js +60 -0
- package/lib/SandboxEvents.js.map +1 -0
- package/lib/SandboxEventsLive.d.ts +13 -0
- package/lib/SandboxEventsLive.d.ts.map +1 -0
- package/lib/SandboxEventsLive.js +63 -0
- package/lib/SandboxEventsLive.js.map +1 -0
- package/lib/Snapshot.d.ts +123 -0
- package/lib/Snapshot.d.ts.map +1 -0
- package/lib/Snapshot.js +173 -0
- package/lib/Snapshot.js.map +1 -0
- package/lib/Webhook.d.ts +56 -0
- package/lib/Webhook.d.ts.map +1 -0
- package/lib/Webhook.js +98 -0
- package/lib/Webhook.js.map +1 -0
- package/lib/index.d.ts +19 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +19 -0
- package/lib/index.js.map +1 -0
- package/lib/internal/Declared.d.ts +34 -0
- package/lib/internal/Declared.d.ts.map +1 -0
- package/lib/internal/Declared.js +38 -0
- package/lib/internal/Declared.js.map +1 -0
- package/lib/internal/Org.d.ts +22 -0
- package/lib/internal/Org.d.ts.map +1 -0
- package/lib/internal/Org.js +23 -0
- package/lib/internal/Org.js.map +1 -0
- package/lib/internal/Ownership.d.ts +29 -0
- package/lib/internal/Ownership.d.ts.map +1 -0
- package/lib/internal/Ownership.js +50 -0
- package/lib/internal/Ownership.js.map +1 -0
- package/lib/internal/Program.d.ts +69 -0
- package/lib/internal/Program.d.ts.map +1 -0
- package/lib/internal/Program.js +178 -0
- package/lib/internal/Program.js.map +1 -0
- package/lib/internal/Ref.d.ts +14 -0
- package/lib/internal/Ref.d.ts.map +1 -0
- package/lib/internal/Ref.js +7 -0
- package/lib/internal/Ref.js.map +1 -0
- package/lib/internal/SandboxHandle.d.ts +17 -0
- package/lib/internal/SandboxHandle.d.ts.map +1 -0
- package/lib/internal/SandboxHandle.js +238 -0
- package/lib/internal/SandboxHandle.js.map +1 -0
- package/lib/internal/SavedSnapshot.d.ts +10 -0
- package/lib/internal/SavedSnapshot.d.ts.map +1 -0
- package/lib/internal/SavedSnapshot.js +22 -0
- package/lib/internal/SavedSnapshot.js.map +1 -0
- package/lib/internal/WebhookDelivery.d.ts +16 -0
- package/lib/internal/WebhookDelivery.d.ts.map +1 -0
- package/lib/internal/WebhookDelivery.js +109 -0
- package/lib/internal/WebhookDelivery.js.map +1 -0
- package/package.json +67 -3
- package/src/AiProxy.ts +171 -0
- package/src/ApiKey.ts +250 -0
- package/src/AuthProvider.ts +472 -0
- package/src/BoatBindings.ts +136 -0
- package/src/Bootstrap.ts +55 -0
- package/src/ConnectSandbox.ts +60 -0
- package/src/ConnectSandboxHttp.ts +59 -0
- package/src/Contributions.ts +9 -0
- package/src/CreateSandbox.ts +143 -0
- package/src/CreateSandboxHttp.ts +115 -0
- package/src/CredentialProfile.ts +350 -0
- package/src/Credentials.ts +33 -0
- package/src/Environment.ts +416 -0
- package/src/Errors.ts +34 -0
- package/src/Providers.ts +71 -0
- package/src/Sandbox.ts +647 -0
- package/src/SandboxClient.ts +200 -0
- package/src/SandboxEvents.ts +125 -0
- package/src/SandboxEventsLive.ts +88 -0
- package/src/Snapshot.ts +264 -0
- package/src/Webhook.ts +163 -0
- package/src/globals.d.ts +2 -0
- package/src/index.ts +18 -0
- package/src/internal/Declared.ts +87 -0
- package/src/internal/Org.ts +31 -0
- package/src/internal/Ownership.ts +75 -0
- package/src/internal/Program.ts +250 -0
- package/src/internal/Ref.ts +15 -0
- package/src/internal/SandboxHandle.ts +407 -0
- package/src/internal/SavedSnapshot.ts +34 -0
- package/src/internal/WebhookDelivery.ts +179 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Ownership.js","sources":["../../src/internal/Ownership.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as boat from "@distilled.cloud/boat-dev/boat";
|
|
2
|
+
import * as Bundle from "alchemy/Bundle/Bundle";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
declare const ProgramStartFailed_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
5
|
+
readonly _tag: "Boat.ProgramStartFailed";
|
|
6
|
+
} & Readonly<A>;
|
|
7
|
+
/**
|
|
8
|
+
* INTERNAL — the program a `Boat.Sandbox` with `main` runs: bundled with
|
|
9
|
+
* rolldown, uploaded into the sandbox, and run with Node as a background
|
|
10
|
+
* command.
|
|
11
|
+
*/
|
|
12
|
+
/** The program didn't come up: it exited, or never listened on its port. */
|
|
13
|
+
export declare class ProgramStartFailed extends ProgramStartFailed_base<{
|
|
14
|
+
readonly message: string;
|
|
15
|
+
readonly stdout: string;
|
|
16
|
+
readonly stderr: string;
|
|
17
|
+
}> {
|
|
18
|
+
}
|
|
19
|
+
/** What a sandbox's program is: the props that shape its bundle. */
|
|
20
|
+
export interface ProgramSource {
|
|
21
|
+
readonly main: string;
|
|
22
|
+
readonly handler?: string;
|
|
23
|
+
readonly isExternal?: boolean;
|
|
24
|
+
readonly build?: Bundle.BundleConfig;
|
|
25
|
+
}
|
|
26
|
+
/** The running program, as recorded in the sandbox's attributes. */
|
|
27
|
+
export interface ProgramState {
|
|
28
|
+
/** Port the program listens on. */
|
|
29
|
+
readonly port: number;
|
|
30
|
+
/** Boat's process id for the background command running it. */
|
|
31
|
+
readonly processId: number;
|
|
32
|
+
/** Content hash of the bundled program. */
|
|
33
|
+
readonly codeHash: string;
|
|
34
|
+
/** Hash of the process environment. */
|
|
35
|
+
readonly envHash: string;
|
|
36
|
+
}
|
|
37
|
+
export declare const DEFAULT_PORT = 3000;
|
|
38
|
+
/** The process environment as a shell file, sorted so its hash is stable. */
|
|
39
|
+
export declare const renderEnv: (env: Record<string, unknown>) => string;
|
|
40
|
+
/** Bundle `main` for Node, with the Boat bootstrap around an Effect program. */
|
|
41
|
+
export declare const bundleProgram: (source: ProgramSource) => Effect.Effect<{
|
|
42
|
+
files: {
|
|
43
|
+
path: string;
|
|
44
|
+
content: Uint8Array<ArrayBufferLike>;
|
|
45
|
+
}[];
|
|
46
|
+
hash: string;
|
|
47
|
+
}, Bundle.BundleError | import("effect/PlatformError").PlatformError, import("effect/FileSystem").FileSystem | import("effect/Path").Path>;
|
|
48
|
+
/** The hash of a process environment. */
|
|
49
|
+
export declare const envHashOf: (env: Record<string, unknown>) => Effect.Effect<string, never, never>;
|
|
50
|
+
/**
|
|
51
|
+
* Whether the program's process still runs. A stopped or deleted sandbox,
|
|
52
|
+
* or a process Boat no longer knows, is not running.
|
|
53
|
+
*/
|
|
54
|
+
export declare const isProgramRunning: (sandboxId: string, state: ProgramState) => Effect.Effect<boolean, never, boat.BoatOpContext>;
|
|
55
|
+
/**
|
|
56
|
+
* Upload the bundle and (re)start the process, unless the same bundle and
|
|
57
|
+
* environment already run. Returns the program's state.
|
|
58
|
+
*/
|
|
59
|
+
export declare const deployProgram: (input: {
|
|
60
|
+
readonly id: string;
|
|
61
|
+
readonly sandboxId: string;
|
|
62
|
+
readonly source: ProgramSource;
|
|
63
|
+
readonly port: number;
|
|
64
|
+
readonly env: Record<string, unknown>;
|
|
65
|
+
readonly previous: ProgramState | undefined;
|
|
66
|
+
readonly note: (message: string) => Effect.Effect<void>;
|
|
67
|
+
}) => Effect.Effect<ProgramState, import("@distilled.cloud/boat-dev").BadGateway | import("@distilled.cloud/core/errors").BadRequest | boat.BadRequest | import("@distilled.cloud/boat-dev").BoatParseError | Bundle.BundleError | import("@distilled.cloud/boat-dev").ConfigError | import("@distilled.cloud/core/errors").Conflict | boat.Conflict | boat.FileNotFound | import("@distilled.cloud/core/errors").Forbidden | import("@distilled.cloud/boat-dev").GatewayTimeout | import("effect/http/HttpClientError").HttpClientError | import("@distilled.cloud/boat-dev").InternalServerError | import("@distilled.cloud/core/protocol-http").InvalidInput | import("@distilled.cloud/boat-dev").Locked | import("@distilled.cloud/core/errors").NotFound | boat.NotFound | import("effect/PlatformError").PlatformError | ProgramStartFailed | boat.SandboxNotRunning | import("@distilled.cloud/core/sdk-error").SdkError | import("@distilled.cloud/boat-dev").ServiceUnavailable | import("@distilled.cloud/boat-dev").TooManyRequests | import("@distilled.cloud/boat-dev").Unauthorized | import("@distilled.cloud/boat-dev").UnknownBoatError | import("@distilled.cloud/boat-dev").UnprocessableEntity, import("effect/FileSystem").FileSystem | import("effect/Path").Path | boat.BoatOpContext>;
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=Program.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Program.d.ts","sources":["../../src/internal/Program.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,gCAAgC,CAAC;AACvD,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAIhD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;;;;AAOxC;;;;GAIG;AAEH,4EAA4E;AAC5E,qBAAa,kBAAmB,SAAQ,wBAA4C;IAClF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;CAAG;AAEL,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC;CACtC;AAED,oEAAoE;AACpE,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2CAA2C;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uCAAuC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,YAAY,OAAO,CAAC;AAsBjC,6EAA6E;AAC7E,eAAO,MAAM,SAAS,QAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAQhC,CAAC;AAEvB,gFAAgF;AAChF,eAAO,MAAM,aAAa;;;;;;0IAkCxB,CAAC;AAEH,yCAAyC;AACzC,eAAO,MAAM,SAAS,QAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,wCAC0B,CAAC;AAEjF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,cAAe,MAAM,SAAS,YAAY,sDAIpE,CAAC;AA0BJ;;;GAGG;AACH,eAAO,MAAM,aAAa;iBACX,MAAM;wBACC,MAAM;qBACT,aAAa;mBACf,MAAM;kBACP,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;uBAClB,YAAY,GAAG,SAAS;mBAC5B,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;8uCAqFvD,CAAC"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import * as boat from "@distilled.cloud/boat-dev/boat";
|
|
2
|
+
import * as Bundle from "alchemy/Bundle/Bundle";
|
|
3
|
+
import { findCwdForBundle, resolveMainPath } from "alchemy/Bundle/TempRoot";
|
|
4
|
+
import { sha256Object } from "alchemy/Util/sha256";
|
|
5
|
+
import * as Data from "effect/Data";
|
|
6
|
+
import * as Effect from "effect/Effect";
|
|
7
|
+
import * as HttpClient from "effect/http/HttpClient";
|
|
8
|
+
import * as HttpClientRequest from "effect/http/HttpClientRequest";
|
|
9
|
+
import * as Redacted from "effect/Redacted";
|
|
10
|
+
import * as Schedule from "effect/Schedule";
|
|
11
|
+
/**
|
|
12
|
+
* INTERNAL — the program a `Boat.Sandbox` with `main` runs: bundled with
|
|
13
|
+
* rolldown, uploaded into the sandbox, and run with Node as a background
|
|
14
|
+
* command.
|
|
15
|
+
*/
|
|
16
|
+
/** The program didn't come up: it exited, or never listened on its port. */
|
|
17
|
+
export class ProgramStartFailed extends Data.TaggedError("Boat.ProgramStartFailed") {
|
|
18
|
+
}
|
|
19
|
+
export const DEFAULT_PORT = 3000;
|
|
20
|
+
const DIR = "/home/user/.alchemy/program";
|
|
21
|
+
/** Boat writes files up to 5 MiB in one call; larger ones go through a signed upload URL. */
|
|
22
|
+
const MAX_INLINE_BYTES = 4 * 1024 * 1024;
|
|
23
|
+
/** The generated entry: a shim importing only the bootstrap and `main`. */
|
|
24
|
+
const makeBootstrap = (handler) => (importPath) => `
|
|
25
|
+
import { bootstrap } from "@alchemy.run/boat/Bootstrap";
|
|
26
|
+
import { ${handler} as entrypoint } from ${JSON.stringify(importPath)};
|
|
27
|
+
|
|
28
|
+
await bootstrap(entrypoint);
|
|
29
|
+
`;
|
|
30
|
+
const shellQuote = (value) => {
|
|
31
|
+
const text = typeof value === "string" ? value : JSON.stringify(value ?? null);
|
|
32
|
+
return `'${text.replaceAll("'", `'\\''`)}'`;
|
|
33
|
+
};
|
|
34
|
+
/** The process environment as a shell file, sorted so its hash is stable. */
|
|
35
|
+
export const renderEnv = (env) => Object.entries(env)
|
|
36
|
+
.filter(([, value]) => value !== undefined)
|
|
37
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
38
|
+
.map(([key, value]) => `${key}=${shellQuote(Redacted.isRedacted(value) ? Redacted.value(value) : value)}`)
|
|
39
|
+
.join("\n") + "\n";
|
|
40
|
+
/** Bundle `main` for Node, with the Boat bootstrap around an Effect program. */
|
|
41
|
+
export const bundleProgram = Effect.fn(function* (source) {
|
|
42
|
+
const virtualEntryPlugin = yield* Bundle.virtualEntryPlugin;
|
|
43
|
+
const realMain = yield* resolveMainPath(source.main);
|
|
44
|
+
const cwd = yield* findCwdForBundle(realMain);
|
|
45
|
+
const plugins = source.isExternal
|
|
46
|
+
? undefined
|
|
47
|
+
: virtualEntryPlugin(makeBootstrap(source.handler ?? "default"));
|
|
48
|
+
const output = yield* Bundle.build({
|
|
49
|
+
...source.build?.input,
|
|
50
|
+
input: realMain,
|
|
51
|
+
cwd,
|
|
52
|
+
platform: "node",
|
|
53
|
+
resolve: {
|
|
54
|
+
conditionNames: [...Bundle.NODE_CONDITION_NAMES],
|
|
55
|
+
...source.build?.input?.resolve,
|
|
56
|
+
},
|
|
57
|
+
plugins: [source.build?.input?.plugins, plugins],
|
|
58
|
+
}, {
|
|
59
|
+
...source.build?.output,
|
|
60
|
+
format: "esm",
|
|
61
|
+
sourcemap: source.build?.output?.sourcemap ?? false,
|
|
62
|
+
minify: source.build?.output?.minify ?? false,
|
|
63
|
+
entryFileNames: "index.mjs",
|
|
64
|
+
}, source.build);
|
|
65
|
+
const files = output.files.map((file) => ({
|
|
66
|
+
path: file.path,
|
|
67
|
+
content: typeof file.content === "string" ? new TextEncoder().encode(file.content) : file.content,
|
|
68
|
+
}));
|
|
69
|
+
return { files, hash: (yield* sha256Object({ bundle: output.hash })).slice(0, 16) };
|
|
70
|
+
});
|
|
71
|
+
/** The hash of a process environment. */
|
|
72
|
+
export const envHashOf = (env) => Effect.map(sha256Object({ env: renderEnv(env) }), (hash) => hash.slice(0, 16));
|
|
73
|
+
/**
|
|
74
|
+
* Whether the program's process still runs. A stopped or deleted sandbox,
|
|
75
|
+
* or a process Boat no longer knows, is not running.
|
|
76
|
+
*/
|
|
77
|
+
export const isProgramRunning = (sandboxId, state) => boat.getCommandStatus({ sandboxId, processId: state.processId, tailBytes: 0 }).pipe(Effect.map((status) => status.running), Effect.orElseSucceed(() => false));
|
|
78
|
+
const toBase64 = (bytes) => {
|
|
79
|
+
let binary = "";
|
|
80
|
+
for (const byte of bytes)
|
|
81
|
+
binary += String.fromCharCode(byte);
|
|
82
|
+
return btoa(binary);
|
|
83
|
+
};
|
|
84
|
+
/** Write one file into the sandbox, through a signed URL when it is too large for one call. */
|
|
85
|
+
const upload = Effect.fn(function* (sandboxId, path, content) {
|
|
86
|
+
if (content.byteLength <= MAX_INLINE_BYTES) {
|
|
87
|
+
yield* boat.writeSandboxFile({
|
|
88
|
+
sandboxId,
|
|
89
|
+
path,
|
|
90
|
+
content: toBase64(content),
|
|
91
|
+
encoding: "base64",
|
|
92
|
+
});
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const signed = yield* boat.createUploadUrl({ sandboxId, path, ttlSeconds: 600 });
|
|
96
|
+
const client = HttpClient.filterStatusOk(yield* HttpClient.HttpClient);
|
|
97
|
+
yield* client.execute(HttpClientRequest.put(signed.url).pipe(HttpClientRequest.bodyUint8Array(content)));
|
|
98
|
+
});
|
|
99
|
+
/**
|
|
100
|
+
* Upload the bundle and (re)start the process, unless the same bundle and
|
|
101
|
+
* environment already run. Returns the program's state.
|
|
102
|
+
*/
|
|
103
|
+
export const deployProgram = Effect.fn(function* (input) {
|
|
104
|
+
const { id, sandboxId, port } = input;
|
|
105
|
+
const envFile = renderEnv(input.env);
|
|
106
|
+
const envHash = yield* envHashOf(input.env);
|
|
107
|
+
const { files, hash } = yield* bundleProgram(input.source);
|
|
108
|
+
const previous = input.previous;
|
|
109
|
+
const running = previous !== undefined &&
|
|
110
|
+
previous.codeHash === hash &&
|
|
111
|
+
previous.envHash === envHash &&
|
|
112
|
+
previous.port === port &&
|
|
113
|
+
(yield* isProgramRunning(sandboxId, previous));
|
|
114
|
+
if (running)
|
|
115
|
+
return previous;
|
|
116
|
+
const dir = `${DIR}/${hash}`;
|
|
117
|
+
yield* input.note(`Uploading ${id}'s program...`);
|
|
118
|
+
// Rolldown's entry chunk is `index.mjs`; other chunks keep their names.
|
|
119
|
+
yield* Effect.forEach(files, (file, i) => upload(sandboxId, `${dir}/${i === 0 ? "index.mjs" : file.path}`, file.content), { concurrency: 4, discard: true });
|
|
120
|
+
yield* upload(sandboxId, `${dir}/.env`, new TextEncoder().encode(envFile));
|
|
121
|
+
// Replace the running process.
|
|
122
|
+
if (previous !== undefined) {
|
|
123
|
+
yield* boat.stopCommand({ sandboxId, processId: previous.processId }).pipe(Effect.ignore);
|
|
124
|
+
}
|
|
125
|
+
// Free the port from any earlier copy Boat lost track of (a crashed deploy).
|
|
126
|
+
yield* boat
|
|
127
|
+
.executeSandboxCommand({ sandboxId, command: `fuser -k ${port}/tcp 2>/dev/null; true` })
|
|
128
|
+
.pipe(Effect.ignore);
|
|
129
|
+
const started = yield* boat.executeSandboxCommand({
|
|
130
|
+
sandboxId,
|
|
131
|
+
command: `chmod 600 ${dir}/.env && cd ${dir} && set -a && . ./.env && set +a && exec node index.mjs`,
|
|
132
|
+
detached: true,
|
|
133
|
+
});
|
|
134
|
+
if (!("processId" in started) || typeof started.processId !== "number") {
|
|
135
|
+
return yield* new ProgramStartFailed({
|
|
136
|
+
message: `Boat started ${id}'s program without a process id`,
|
|
137
|
+
stdout: "",
|
|
138
|
+
stderr: "",
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const processId = started.processId;
|
|
142
|
+
// Ready once the port listens; fail with the logs if the process exits.
|
|
143
|
+
yield* input.note(`Starting ${id}'s program on port ${port}...`);
|
|
144
|
+
const ready = yield* Effect.gen(function* () {
|
|
145
|
+
const status = yield* boat.getCommandStatus({ sandboxId, processId, tailBytes: 0 });
|
|
146
|
+
if (!status.running)
|
|
147
|
+
return "exited";
|
|
148
|
+
const probe = yield* boat.executeSandboxCommand({
|
|
149
|
+
sandboxId,
|
|
150
|
+
command: `(exec 3<>/dev/tcp/127.0.0.1/${port}) 2>/dev/null`,
|
|
151
|
+
timeoutSeconds: 5,
|
|
152
|
+
});
|
|
153
|
+
return "exitCode" in probe && probe.exitCode === 0
|
|
154
|
+
? "listening"
|
|
155
|
+
: "starting";
|
|
156
|
+
}).pipe(Effect.repeat({
|
|
157
|
+
schedule: Schedule.spaced("1 second"),
|
|
158
|
+
until: (state) => state !== "starting",
|
|
159
|
+
times: 60,
|
|
160
|
+
}));
|
|
161
|
+
if (ready !== "listening") {
|
|
162
|
+
const logs = yield* boat.getCommandStatus({ sandboxId, processId });
|
|
163
|
+
return yield* new ProgramStartFailed({
|
|
164
|
+
message: ready === "exited"
|
|
165
|
+
? `${id}'s program exited before listening on port ${port}`
|
|
166
|
+
: `${id}'s program did not listen on port ${port} within 60 seconds`,
|
|
167
|
+
stdout: logs.stdout,
|
|
168
|
+
stderr: logs.stderr,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
// Keep only the running bundle.
|
|
172
|
+
yield* boat.executeSandboxCommand({
|
|
173
|
+
sandboxId,
|
|
174
|
+
command: `find ${DIR} -mindepth 1 -maxdepth 1 ! -name ${hash} -exec rm -rf {} +`,
|
|
175
|
+
});
|
|
176
|
+
return { port, processId, codeHash: hash, envHash };
|
|
177
|
+
});
|
|
178
|
+
//# sourceMappingURL=Program.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Program.js","sources":["../../src/internal/Program.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type * as Effect from "effect/Effect";
|
|
2
|
+
import type { Providers } from "../Providers.ts";
|
|
3
|
+
/**
|
|
4
|
+
* A prop that takes another resource, or a stub with the attributes it
|
|
5
|
+
* needs (`{ name }`, `{ volumeId }`). Users pass the declaration itself.
|
|
6
|
+
*/
|
|
7
|
+
export type Ref<T> = T | Effect.Effect<T, never, Providers>;
|
|
8
|
+
/**
|
|
9
|
+
* A `Ref` prop as lifecycle operations see it. The engine resolves
|
|
10
|
+
* resource-valued props to their attributes before `diff`, `reconcile`
|
|
11
|
+
* and the other lifecycle operations run, so the value is always plain.
|
|
12
|
+
*/
|
|
13
|
+
export declare const resolved: <T>(ref: Ref<T>) => T;
|
|
14
|
+
//# sourceMappingURL=Ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Ref.d.ts","sources":["../../src/internal/Ref.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;GAGG;AACH,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAE5D;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,KAAG,CAAa,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `Ref` prop as lifecycle operations see it. The engine resolves
|
|
3
|
+
* resource-valued props to their attributes before `diff`, `reconcile`
|
|
4
|
+
* and the other lifecycle operations run, so the value is always plain.
|
|
5
|
+
*/
|
|
6
|
+
export const resolved = (ref) => ref;
|
|
7
|
+
//# sourceMappingURL=Ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Ref.js","sources":["../../src/internal/Ref.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAI,GAAW,EAAK,EAAE,CAAC,GAAQ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds sandbox handles over Boat's REST API: commands, files, ports and
|
|
3
|
+
* lifecycle all go through `/api/v1` with the binding's key.
|
|
4
|
+
*/
|
|
5
|
+
import * as boat from "@distilled.cloud/boat-dev/boat";
|
|
6
|
+
import type { RuntimeContext } from "alchemy/RuntimeContext";
|
|
7
|
+
import * as Duration from "effect/Duration";
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import type { BoatAuth } from "../BoatBindings.ts";
|
|
10
|
+
import type { BoatSandbox, ConnectedSandbox } from "../SandboxClient.ts";
|
|
11
|
+
/** Boat's `ttlSeconds` for an auto-stop: `null` never stops. */
|
|
12
|
+
export declare const ttlOf: (autoStop: Duration.Input | false) => number | null;
|
|
13
|
+
/** A handle to a sandbox created or connected at runtime, from what Boat returned. */
|
|
14
|
+
export declare const makeSandboxHandle: (auth: BoatAuth, info: boat.Sandbox, ownerLabels: Effect.Effect<Readonly<Record<string, string>>, never, RuntimeContext>) => BoatSandbox;
|
|
15
|
+
/** A handle to a sandbox declared in the stack. */
|
|
16
|
+
export declare const makeConnectedSandbox: (auth: BoatAuth, sandboxIdOf: Effect.Effect<string, never, RuntimeContext>) => ConnectedSandbox;
|
|
17
|
+
//# sourceMappingURL=SandboxHandle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxHandle.d.ts","sources":["../../src/internal/SandboxHandle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,IAAI,MAAM,gCAAgC,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAQxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EACV,WAAW,EAEX,gBAAgB,EASjB,MAAM,qBAAqB,CAAC;AAiB7B,gEAAgE;AAChE,eAAO,MAAM,KAAK,aAAc,QAAQ,CAAC,KAAK,GAAG,KAAK,kBAGqC,CAAC;AAwT5F,sFAAsF;AACtF,eAAO,MAAM,iBAAiB,SACtB,QAAQ,QACR,IAAI,CAAC,OAAO,eACL,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,KAClF,WA6BD,CAAC;AAEH,mDAAmD;AACnD,eAAO,MAAM,oBAAoB,SACzB,QAAQ,eACD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,KACxD,gBAGD,CAAC"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds sandbox handles over Boat's REST API: commands, files, ports and
|
|
3
|
+
* lifecycle all go through `/api/v1` with the binding's key.
|
|
4
|
+
*/
|
|
5
|
+
import * as boat from "@distilled.cloud/boat-dev/boat";
|
|
6
|
+
import * as Sandbox from "alchemy/Sandbox";
|
|
7
|
+
import * as Duration from "effect/Duration";
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import * as FetchHttpClient from "effect/http/FetchHttpClient";
|
|
10
|
+
import * as HttpClient from "effect/http/HttpClient";
|
|
11
|
+
import * as HttpClientRequest from "effect/http/HttpClientRequest";
|
|
12
|
+
import * as Option from "effect/Option";
|
|
13
|
+
import * as Redacted from "effect/Redacted";
|
|
14
|
+
import * as Schedule from "effect/Schedule";
|
|
15
|
+
import * as Stream from "effect/Stream";
|
|
16
|
+
import { BoatUnexpectedResponse, ExecTimedOut } from "../Errors.js";
|
|
17
|
+
import { awaitSaved, whileSaving } from "./SavedSnapshot.js";
|
|
18
|
+
const encoder = new TextEncoder();
|
|
19
|
+
const toBase64 = (data) => {
|
|
20
|
+
const bytes = typeof data === "string" ? encoder.encode(data) : data;
|
|
21
|
+
let binary = "";
|
|
22
|
+
for (const byte of bytes)
|
|
23
|
+
binary += String.fromCharCode(byte);
|
|
24
|
+
return btoa(binary);
|
|
25
|
+
};
|
|
26
|
+
const fromBase64 = (data) => Uint8Array.from(atob(data), (char) => char.charCodeAt(0));
|
|
27
|
+
/** POSIX single quotes: the value verbatim. */
|
|
28
|
+
const quote = (value) => `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
29
|
+
/** Boat's `ttlSeconds` for an auto-stop: `null` never stops. */
|
|
30
|
+
export const ttlOf = (autoStop) => autoStop === false
|
|
31
|
+
? null
|
|
32
|
+
: Math.max(1, Math.round(Duration.toMillis(Duration.fromInputUnsafe(autoStop)) / 1000));
|
|
33
|
+
/** Boat runs commands for at most 10 minutes. */
|
|
34
|
+
const MAX_TIMEOUT_SECONDS = 600;
|
|
35
|
+
const timeoutSeconds = (timeout) => Math.min(MAX_TIMEOUT_SECONDS, Math.max(1, Math.ceil(Duration.toMillis(Duration.fromInputUnsafe(timeout)) / 1000)));
|
|
36
|
+
/**
|
|
37
|
+
* One shell line for Boat's `commands` endpoint, which takes only a line
|
|
38
|
+
* and a working directory: `env` becomes exports, an argument vector is
|
|
39
|
+
* quoted, and `stdin` is piped in from base64.
|
|
40
|
+
*/
|
|
41
|
+
const scriptOf = (command, options) => {
|
|
42
|
+
const line = typeof command === "string" ? command : command.map(quote).join(" ");
|
|
43
|
+
const exports = Object.entries(options?.env ?? {})
|
|
44
|
+
.map(([key, value]) => `export ${key}=${quote(value)}; `)
|
|
45
|
+
.join("");
|
|
46
|
+
const body = exports === "" ? line : `${exports}${line}`;
|
|
47
|
+
return options?.stdin === undefined
|
|
48
|
+
? body
|
|
49
|
+
: `printf %s ${quote(toBase64(options.stdin))} | base64 -d | { ${body}\n}`;
|
|
50
|
+
};
|
|
51
|
+
const entryOf = (entry) => ({
|
|
52
|
+
path: entry.path,
|
|
53
|
+
type: entry.isSymlink ? "symlink" : entry.isDir ? "directory" : "file",
|
|
54
|
+
size: entry.size,
|
|
55
|
+
mode: entry.mode,
|
|
56
|
+
modifiedAt: entry.modifiedAt,
|
|
57
|
+
});
|
|
58
|
+
/**
|
|
59
|
+
* The operations every handle shares. `sandboxIdOf` resolves the id (read
|
|
60
|
+
* at runtime for a declared sandbox).
|
|
61
|
+
*/
|
|
62
|
+
const makeOperations = (auth, sandboxIdOf) => {
|
|
63
|
+
const onSandbox = (call) => Effect.flatMap(sandboxIdOf, (sandboxId) => auth.authorize(call(sandboxId)));
|
|
64
|
+
const status = (processId, offsets) => onSandbox((sandboxId) => boat.getCommandStatus({
|
|
65
|
+
sandboxId,
|
|
66
|
+
processId,
|
|
67
|
+
stdoutOffset: offsets.stdout,
|
|
68
|
+
stderrOffset: offsets.stderr,
|
|
69
|
+
}));
|
|
70
|
+
const makeProcess = (processId, from) => {
|
|
71
|
+
/** Polls the process's logs from `from`, emitting what's new, until it exits. */
|
|
72
|
+
const output = Stream.paginate({ offsets: from, idle: false }, Effect.fnUntraced(function* (state) {
|
|
73
|
+
if (state.idle)
|
|
74
|
+
yield* Effect.sleep("500 millis");
|
|
75
|
+
const current = yield* status(processId, state.offsets);
|
|
76
|
+
const chunks = [];
|
|
77
|
+
if (current.stdout.length > 0) {
|
|
78
|
+
chunks.push({ fd: "stdout", data: encoder.encode(current.stdout) });
|
|
79
|
+
}
|
|
80
|
+
if (current.stderr.length > 0) {
|
|
81
|
+
chunks.push({ fd: "stderr", data: encoder.encode(current.stderr) });
|
|
82
|
+
}
|
|
83
|
+
const offsets = {
|
|
84
|
+
stdout: current.stdoutNextOffset ?? state.offsets.stdout,
|
|
85
|
+
stderr: current.stderrNextOffset ?? state.offsets.stderr,
|
|
86
|
+
};
|
|
87
|
+
const finished = !current.running && current.more !== true;
|
|
88
|
+
return [
|
|
89
|
+
chunks,
|
|
90
|
+
finished
|
|
91
|
+
? Option.none()
|
|
92
|
+
: Option.some({ offsets, idle: chunks.length === 0 && current.more !== true }),
|
|
93
|
+
];
|
|
94
|
+
}));
|
|
95
|
+
const wait = status(processId, { stdout: 0, stderr: 0 }).pipe(Effect.repeat({
|
|
96
|
+
schedule: Schedule.spaced("1 second"),
|
|
97
|
+
until: (current) => !current.running,
|
|
98
|
+
}), Effect.map((current) => ({
|
|
99
|
+
exitCode: current.exitCode ?? -1,
|
|
100
|
+
stdout: current.stdout,
|
|
101
|
+
stderr: current.stderr,
|
|
102
|
+
commandId: undefined,
|
|
103
|
+
})));
|
|
104
|
+
return {
|
|
105
|
+
id: String(processId),
|
|
106
|
+
processId,
|
|
107
|
+
output,
|
|
108
|
+
kill: () => onSandbox((sandboxId) => boat.stopCommand({ sandboxId, processId })).pipe(Effect.asVoid),
|
|
109
|
+
wait,
|
|
110
|
+
};
|
|
111
|
+
};
|
|
112
|
+
const files = {
|
|
113
|
+
read: (path) => onSandbox((sandboxId) => boat.readSandboxFile({ sandboxId, path, encoding: "base64" })).pipe(Effect.map((file) => fromBase64(file.content))),
|
|
114
|
+
readText: (path) => onSandbox((sandboxId) => boat.readSandboxFile({ sandboxId, path, encoding: "utf8" })).pipe(Effect.map((file) => file.content)),
|
|
115
|
+
write: (path, data) => onSandbox((sandboxId) => typeof data === "string"
|
|
116
|
+
? boat.writeSandboxFile({ sandboxId, path, content: data, encoding: "utf8" })
|
|
117
|
+
: boat.writeSandboxFile({ sandboxId, path, content: toBase64(data), encoding: "base64" })).pipe(Effect.asVoid),
|
|
118
|
+
list: (path) => onSandbox((sandboxId) => boat.listFiles({ sandboxId, path })).pipe(Effect.map((listed) => listed.files.map(entryOf))),
|
|
119
|
+
stat: (path) => onSandbox((sandboxId) => boat.getFileInfo({ sandboxId, path })).pipe(Effect.map(entryOf)),
|
|
120
|
+
remove: (path) => onSandbox((sandboxId) => boat.deleteFile({ sandboxId, path, recursive: true })).pipe(Effect.asVoid),
|
|
121
|
+
makeDir: (path) => onSandbox((sandboxId) => boat.createFolder({ sandboxId, path })).pipe(Effect.asVoid),
|
|
122
|
+
exists: (path) => onSandbox((sandboxId) => boat.getFileInfo({ sandboxId, path })).pipe(Effect.as(true), Effect.catchTag("FileNotFound", () => Effect.succeed(false))),
|
|
123
|
+
move: (source, destination, options) => onSandbox((sandboxId) => boat.moveFile({
|
|
124
|
+
sandboxId,
|
|
125
|
+
source,
|
|
126
|
+
destination,
|
|
127
|
+
...(options?.overwrite === undefined ? {} : { overwrite: options.overwrite }),
|
|
128
|
+
})).pipe(Effect.asVoid),
|
|
129
|
+
};
|
|
130
|
+
return {
|
|
131
|
+
exec: (command, options) => onSandbox((sandboxId) => boat.executeSandboxCommand({
|
|
132
|
+
sandboxId,
|
|
133
|
+
command: scriptOf(command, options),
|
|
134
|
+
...(options?.cwd === undefined ? {} : { cwd: options.cwd }),
|
|
135
|
+
...(options?.timeout === undefined
|
|
136
|
+
? {}
|
|
137
|
+
: { timeoutSeconds: timeoutSeconds(options.timeout) }),
|
|
138
|
+
})).pipe(Effect.flatMap((response) => {
|
|
139
|
+
if (!("exitCode" in response)) {
|
|
140
|
+
return Effect.fail(new BoatUnexpectedResponse({
|
|
141
|
+
message: "Boat started the command in the background",
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
if (response.timedOut === true) {
|
|
145
|
+
return Effect.fail(new ExecTimedOut({
|
|
146
|
+
message: "The command ran past its timeout and Boat stopped it",
|
|
147
|
+
stdout: response.stdout,
|
|
148
|
+
stderr: response.stderr,
|
|
149
|
+
}));
|
|
150
|
+
}
|
|
151
|
+
return Effect.succeed({
|
|
152
|
+
exitCode: response.exitCode ?? -1,
|
|
153
|
+
stdout: response.stdout,
|
|
154
|
+
stderr: response.stderr,
|
|
155
|
+
commandId: response.commandId,
|
|
156
|
+
});
|
|
157
|
+
})),
|
|
158
|
+
start: (command, options) => onSandbox((sandboxId) => boat.executeSandboxCommand({
|
|
159
|
+
sandboxId,
|
|
160
|
+
command: scriptOf(command, options),
|
|
161
|
+
detached: true,
|
|
162
|
+
...(options?.cwd === undefined ? {} : { cwd: options.cwd }),
|
|
163
|
+
})).pipe(Effect.flatMap((response) => "processId" in response && typeof response.processId === "number"
|
|
164
|
+
? Effect.succeed(makeProcess(response.processId, { stdout: 0, stderr: 0 }))
|
|
165
|
+
: Effect.fail(new BoatUnexpectedResponse({ message: "Boat returned no process for the command" })))),
|
|
166
|
+
processes: {
|
|
167
|
+
attach: (processId) => status(processId, { stdout: 0, stderr: 0 }).pipe(Effect.map((current) => makeProcess(processId, {
|
|
168
|
+
stdout: current.stdoutNextOffset ?? 0,
|
|
169
|
+
stderr: current.stderrNextOffset ?? 0,
|
|
170
|
+
}))),
|
|
171
|
+
},
|
|
172
|
+
files,
|
|
173
|
+
getTcpPort: (port, options) => onSandbox((sandboxId) => boat.hostPort({
|
|
174
|
+
sandboxId,
|
|
175
|
+
port,
|
|
176
|
+
...(options?.public === undefined ? {} : { public: options.public }),
|
|
177
|
+
...(options?.localhost === undefined ? {} : { localhost: options.localhost }),
|
|
178
|
+
})).pipe(Effect.flatMap((hosted) => hosted.url === undefined
|
|
179
|
+
? Effect.fail(new BoatUnexpectedResponse({ message: `Boat hosted port ${port} without a URL` }))
|
|
180
|
+
: Effect.sync(() => {
|
|
181
|
+
const parsed = new URL(hosted.url);
|
|
182
|
+
const raw = parsed.searchParams.get("_token");
|
|
183
|
+
const token = raw === null ? undefined : Redacted.make(raw);
|
|
184
|
+
const base = parsed.origin;
|
|
185
|
+
// A protected port reads its token from the `_port_auth`
|
|
186
|
+
// cookie. The `_token` query answers with a redirect that
|
|
187
|
+
// sets it, which would turn a POST into a GET, so the cookie
|
|
188
|
+
// is sent directly. Boat routes on the host, so only the
|
|
189
|
+
// request's path and query are kept.
|
|
190
|
+
const send = (request) => Effect.gen(function* () {
|
|
191
|
+
const client = yield* HttpClient.HttpClient;
|
|
192
|
+
const target = new URL(request.url, base);
|
|
193
|
+
const cookie = request.headers.cookie;
|
|
194
|
+
return yield* client.execute(request.pipe(HttpClientRequest.setUrl(`${base}${target.pathname}${target.search}`), HttpClientRequest.removeHeader("host"), token === undefined
|
|
195
|
+
? (req) => req
|
|
196
|
+
: HttpClientRequest.setHeader("cookie", [cookie, `_port_auth=${Redacted.value(token)}`]
|
|
197
|
+
.filter((part) => part !== undefined && part !== "")
|
|
198
|
+
.join("; "))));
|
|
199
|
+
}).pipe(Effect.provide(FetchHttpClient.layer));
|
|
200
|
+
return { url: base, token, fetch: Sandbox.portFetch(send) };
|
|
201
|
+
}))),
|
|
202
|
+
describe: () => onSandbox((sandboxId) => boat.getSandbox({ sandboxId })).pipe(Effect.flatMap((got) => got.sandbox === undefined
|
|
203
|
+
? Effect.fail(new BoatUnexpectedResponse({ message: "Boat returned no sandbox" }))
|
|
204
|
+
: Effect.succeed(got.sandbox))),
|
|
205
|
+
stop: () => onSandbox((sandboxId) => boat.stopSandbox({ sandboxId })).pipe(Effect.asVoid, Effect.catchTag("SandboxAlreadyStopped", () => Effect.void)),
|
|
206
|
+
resume: (options) => onSandbox((sandboxId) => boat.resumeSandbox({
|
|
207
|
+
sandboxId,
|
|
208
|
+
...(options?.autoStop === undefined ? {} : { ttlSeconds: ttlOf(options.autoStop) }),
|
|
209
|
+
})).pipe(Effect.asVoid),
|
|
210
|
+
setAutoStop: (autoStop) => onSandbox((sandboxId) => boat.updateSandbox({ sandboxId, ttlSeconds: ttlOf(autoStop) })).pipe(Effect.asVoid),
|
|
211
|
+
snapshot: (name) => onSandbox((sandboxId) => whileSaving(boat.saveSavedSnapshot({ sandboxId, name })).pipe(Effect.andThen(awaitSaved(name)))),
|
|
212
|
+
};
|
|
213
|
+
};
|
|
214
|
+
/** A handle to a sandbox created or connected at runtime, from what Boat returned. */
|
|
215
|
+
export const makeSandboxHandle = (auth, info, ownerLabels) => ({
|
|
216
|
+
...makeOperations(auth, Effect.succeed(info.id)),
|
|
217
|
+
sandboxId: info.id,
|
|
218
|
+
info,
|
|
219
|
+
// Boat never copies labels onto a fork, so it gets the owner's again.
|
|
220
|
+
fork: (forkOptions = {}) => {
|
|
221
|
+
const { autoStop, ...options } = forkOptions;
|
|
222
|
+
return Effect.flatMap(ownerLabels, (owner) => auth.authorize(boat.forkSandbox({
|
|
223
|
+
...options,
|
|
224
|
+
...(autoStop === undefined ? {} : { ttlSeconds: ttlOf(autoStop) }),
|
|
225
|
+
sandboxId: info.id,
|
|
226
|
+
labels: { ...options.labels, ...owner },
|
|
227
|
+
}))).pipe(Effect.flatMap((forked) => forked.sandbox === undefined || forked.sandbox === null
|
|
228
|
+
? Effect.fail(new BoatUnexpectedResponse({ message: "Boat returned no fork" }))
|
|
229
|
+
: Effect.succeed(makeSandboxHandle(auth, forked.sandbox, ownerLabels))));
|
|
230
|
+
},
|
|
231
|
+
delete: () => auth.authorize(boat.deleteSandbox({ sandboxId: info.id, xAsciiConfirmDelete: info.id })).pipe(Effect.asVoid, Effect.catchTag("NotFound", () => Effect.void)),
|
|
232
|
+
});
|
|
233
|
+
/** A handle to a sandbox declared in the stack. */
|
|
234
|
+
export const makeConnectedSandbox = (auth, sandboxIdOf) => ({
|
|
235
|
+
...makeOperations(auth, sandboxIdOf),
|
|
236
|
+
sandboxId: sandboxIdOf,
|
|
237
|
+
});
|
|
238
|
+
//# sourceMappingURL=SandboxHandle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SandboxHandle.js","sources":["../../src/internal/SandboxHandle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as boat from "@distilled.cloud/boat-dev/boat";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import { SnapshotFailed } from "../Errors.ts";
|
|
4
|
+
/** Polls until Boat reports the snapshot `ready` (succeeds) or `failed` (fails). */
|
|
5
|
+
export declare const awaitSaved: (name: string) => Effect.Effect<boat.SavedSnapshot, SnapshotFailed | boat.GetSavedSnapshotError, boat.BoatOpContext>;
|
|
6
|
+
/** Retries a saved-snapshot write while an earlier save under the same name is running. */
|
|
7
|
+
export declare const whileSaving: <A, E extends {
|
|
8
|
+
readonly _tag: string;
|
|
9
|
+
}, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
|
|
10
|
+
//# sourceMappingURL=SavedSnapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SavedSnapshot.d.ts","sources":["../../src/internal/SavedSnapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,gCAAgC,CAAC;AACvD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAS9C,oFAAoF;AACpF,eAAO,MAAM,UAAU,SAAU,MAAM,uGAepC,CAAC;AAEJ,2FAA2F;AAC3F,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,UAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,2BAC8D,CAAC"}
|