@alchemy.run/archil 0.0.0 → 2.0.0-beta.86
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 +57 -4
- package/lib/AWS/S3Disk.d.ts +68 -0
- package/lib/AWS/S3Disk.d.ts.map +1 -0
- package/lib/AWS/S3Disk.js +100 -0
- package/lib/AWS/S3Disk.js.map +1 -0
- package/lib/AWS/index.d.ts +2 -0
- package/lib/AWS/index.d.ts.map +1 -0
- package/lib/AWS/index.js +2 -0
- package/lib/AWS/index.js.map +1 -0
- package/lib/ApiToken.d.ts +63 -0
- package/lib/ApiToken.d.ts.map +1 -0
- package/lib/ApiToken.js +121 -0
- package/lib/ApiToken.js.map +1 -0
- package/lib/ArchilBindings.d.ts +65 -0
- package/lib/ArchilBindings.d.ts.map +1 -0
- package/lib/ArchilBindings.js +128 -0
- package/lib/ArchilBindings.js.map +1 -0
- package/lib/AuthProvider.d.ts +40 -0
- package/lib/AuthProvider.d.ts.map +1 -0
- package/lib/AuthProvider.js +87 -0
- package/lib/AuthProvider.js.map +1 -0
- package/lib/Bootstrap.d.ts +8 -0
- package/lib/Bootstrap.d.ts.map +1 -0
- package/lib/Bootstrap.js +27 -0
- package/lib/Bootstrap.js.map +1 -0
- package/lib/Branch.d.ts +101 -0
- package/lib/Branch.d.ts.map +1 -0
- package/lib/Branch.js +117 -0
- package/lib/Branch.js.map +1 -0
- package/lib/BranchDisk.d.ts +42 -0
- package/lib/BranchDisk.d.ts.map +1 -0
- package/lib/BranchDisk.js +14 -0
- package/lib/BranchDisk.js.map +1 -0
- package/lib/Checkpoint.d.ts +78 -0
- package/lib/Checkpoint.d.ts.map +1 -0
- package/lib/Checkpoint.js +95 -0
- package/lib/Checkpoint.js.map +1 -0
- package/lib/Clients.d.ts +369 -0
- package/lib/Clients.d.ts.map +1 -0
- package/lib/Clients.js +334 -0
- package/lib/Clients.js.map +1 -0
- package/lib/ConnectSandbox.d.ts +69 -0
- package/lib/ConnectSandbox.d.ts.map +1 -0
- package/lib/ConnectSandbox.js +21 -0
- package/lib/ConnectSandbox.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/CreateDisk.d.ts +90 -0
- package/lib/CreateDisk.d.ts.map +1 -0
- package/lib/CreateDisk.js +47 -0
- package/lib/CreateDisk.js.map +1 -0
- package/lib/CreateImage.d.ts +42 -0
- package/lib/CreateImage.d.ts.map +1 -0
- package/lib/CreateImage.js +19 -0
- package/lib/CreateImage.js.map +1 -0
- package/lib/CreateSandbox.d.ts +104 -0
- package/lib/CreateSandbox.d.ts.map +1 -0
- package/lib/CreateSandbox.js +98 -0
- package/lib/CreateSandbox.js.map +1 -0
- package/lib/Credentials.d.ts +44 -0
- package/lib/Credentials.d.ts.map +1 -0
- package/lib/Credentials.js +57 -0
- package/lib/Credentials.js.map +1 -0
- package/lib/Disk.d.ts +283 -0
- package/lib/Disk.d.ts.map +1 -0
- package/lib/Disk.js +294 -0
- package/lib/Disk.js.map +1 -0
- package/lib/DiskObjectsHttp.d.ts +20 -0
- package/lib/DiskObjectsHttp.d.ts.map +1 -0
- package/lib/DiskObjectsHttp.js +51 -0
- package/lib/DiskObjectsHttp.js.map +1 -0
- package/lib/DiskUser.d.ts +189 -0
- package/lib/DiskUser.d.ts.map +1 -0
- package/lib/DiskUser.js +243 -0
- package/lib/DiskUser.js.map +1 -0
- package/lib/ExecDisk.d.ts +57 -0
- package/lib/ExecDisk.d.ts.map +1 -0
- package/lib/ExecDisk.js +3 -0
- package/lib/ExecDisk.js.map +1 -0
- package/lib/ExecDiskHttp.d.ts +5 -0
- package/lib/ExecDiskHttp.d.ts.map +1 -0
- package/lib/ExecDiskHttp.js +18 -0
- package/lib/ExecDiskHttp.js.map +1 -0
- package/lib/ExecDisks.d.ts +54 -0
- package/lib/ExecDisks.d.ts.map +1 -0
- package/lib/ExecDisks.js +37 -0
- package/lib/ExecDisks.js.map +1 -0
- package/lib/Image.d.ts +188 -0
- package/lib/Image.d.ts.map +1 -0
- package/lib/Image.js +191 -0
- package/lib/Image.js.map +1 -0
- package/lib/InferEnv.d.ts +26 -0
- package/lib/InferEnv.d.ts.map +1 -0
- package/lib/InferEnv.js +1 -0
- package/lib/InferEnv.js.map +1 -0
- package/lib/MountDisk.d.ts +190 -0
- package/lib/MountDisk.d.ts.map +1 -0
- package/lib/MountDisk.js +227 -0
- package/lib/MountDisk.js.map +1 -0
- package/lib/Providers.d.ts +25 -0
- package/lib/Providers.d.ts.map +1 -0
- package/lib/Providers.js +48 -0
- package/lib/Providers.js.map +1 -0
- package/lib/ReadDisk.d.ts +55 -0
- package/lib/ReadDisk.d.ts.map +1 -0
- package/lib/ReadDisk.js +3 -0
- package/lib/ReadDisk.js.map +1 -0
- package/lib/ReadWriteDisk.d.ts +26 -0
- package/lib/ReadWriteDisk.d.ts.map +1 -0
- package/lib/ReadWriteDisk.js +3 -0
- package/lib/ReadWriteDisk.js.map +1 -0
- package/lib/Sandbox.d.ts +507 -0
- package/lib/Sandbox.d.ts.map +1 -0
- package/lib/Sandbox.js +729 -0
- package/lib/Sandbox.js.map +1 -0
- package/lib/SandboxOptions.d.ts +185 -0
- package/lib/SandboxOptions.d.ts.map +1 -0
- package/lib/SandboxOptions.js +102 -0
- package/lib/SandboxOptions.js.map +1 -0
- package/lib/SandboxPortToken.d.ts +64 -0
- package/lib/SandboxPortToken.d.ts.map +1 -0
- package/lib/SandboxPortToken.js +77 -0
- package/lib/SandboxPortToken.js.map +1 -0
- package/lib/WriteDisk.d.ts +37 -0
- package/lib/WriteDisk.d.ts.map +1 -0
- package/lib/WriteDisk.js +3 -0
- package/lib/WriteDisk.js.map +1 -0
- package/lib/index.d.ts +29 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +28 -0
- package/lib/index.js.map +1 -0
- package/lib/internal/DeployerKey.d.ts +21 -0
- package/lib/internal/DeployerKey.d.ts.map +1 -0
- package/lib/internal/DeployerKey.js +34 -0
- package/lib/internal/DeployerKey.js.map +1 -0
- package/lib/internal/archil.d.ts +87 -0
- package/lib/internal/archil.d.ts.map +1 -0
- package/lib/internal/archil.js +154 -0
- package/lib/internal/archil.js.map +1 -0
- package/lib/internal/hosted.d.ts +90 -0
- package/lib/internal/hosted.d.ts.map +1 -0
- package/lib/internal/hosted.js +291 -0
- package/lib/internal/hosted.js.map +1 -0
- package/package.json +79 -3
- package/src/AWS/S3Disk.ts +125 -0
- package/src/AWS/index.ts +1 -0
- package/src/ApiToken.ts +168 -0
- package/src/ArchilBindings.ts +179 -0
- package/src/AuthProvider.ts +122 -0
- package/src/Bootstrap.ts +54 -0
- package/src/Branch.ts +199 -0
- package/src/BranchDisk.ts +57 -0
- package/src/Checkpoint.ts +145 -0
- package/src/Clients.ts +954 -0
- package/src/ConnectSandbox.ts +91 -0
- package/src/Contributions.ts +9 -0
- package/src/CreateDisk.ts +165 -0
- package/src/CreateImage.ts +73 -0
- package/src/CreateSandbox.ts +258 -0
- package/src/Credentials.ts +101 -0
- package/src/Disk.ts +468 -0
- package/src/DiskObjectsHttp.ts +64 -0
- package/src/DiskUser.ts +369 -0
- package/src/ExecDisk.ts +62 -0
- package/src/ExecDiskHttp.ts +25 -0
- package/src/ExecDisks.ts +100 -0
- package/src/Image.ts +316 -0
- package/src/InferEnv.ts +27 -0
- package/src/MountDisk.ts +466 -0
- package/src/Providers.ts +75 -0
- package/src/ReadDisk.ts +61 -0
- package/src/ReadWriteDisk.ts +31 -0
- package/src/Sandbox.ts +1064 -0
- package/src/SandboxOptions.ts +230 -0
- package/src/SandboxPortToken.ts +125 -0
- package/src/WriteDisk.ts +42 -0
- package/src/globals.d.ts +2 -0
- package/src/index.ts +59 -0
- package/src/internal/DeployerKey.ts +63 -0
- package/src/internal/archil.ts +273 -0
- package/src/internal/hosted.ts +402 -0
package/lib/Clients.js
ADDED
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run-time handles Archil bindings return. A disk or sandbox handle is
|
|
3
|
+
* the same shape whether it came from a deploy-time resource
|
|
4
|
+
* (`ExecDisk(Dataset)`, `ConnectSandbox(Preview)`) or was created at run
|
|
5
|
+
* time (`CreateDisk`, `CreateSandbox`), and takes Archil's own parameters.
|
|
6
|
+
*/
|
|
7
|
+
import * as archil from "@distilled.cloud/archil";
|
|
8
|
+
import * as Objects from "@distilled.cloud/archil/Objects";
|
|
9
|
+
import * as Process from "@distilled.cloud/archil/Process";
|
|
10
|
+
import * as SandboxBase from "alchemy/Sandbox";
|
|
11
|
+
import * as Data from "effect/Data";
|
|
12
|
+
import * as Duration from "effect/Duration";
|
|
13
|
+
import * as Effect from "effect/Effect";
|
|
14
|
+
import * as FetchHttpClient from "effect/http/FetchHttpClient";
|
|
15
|
+
import * as HttpClient from "effect/http/HttpClient";
|
|
16
|
+
import * as HttpClientRequest from "effect/http/HttpClientRequest";
|
|
17
|
+
import * as Option from "effect/Option";
|
|
18
|
+
import * as Redacted from "effect/Redacted";
|
|
19
|
+
import * as Stream from "effect/Stream";
|
|
20
|
+
import { ensureBranch, toBranchAttributes } from "./Branch.js";
|
|
21
|
+
import { addDiskUser, removeDiskUser, } from "./DiskUser.js";
|
|
22
|
+
import { deleteSandbox, observeSandbox } from "./Sandbox.js";
|
|
23
|
+
import { toEgressPolicy } from "./SandboxOptions.js";
|
|
24
|
+
import { createPortToken, revokePortToken } from "./SandboxPortToken.js";
|
|
25
|
+
/** The sandbox doesn't serve this port publicly (`exposePort` it first). */
|
|
26
|
+
export class SandboxPortNotExposed extends Data.TaggedError("Archil.SandboxPortNotExposed") {
|
|
27
|
+
}
|
|
28
|
+
const toExecResult = (data) => ({
|
|
29
|
+
exitCode: data.exitCode,
|
|
30
|
+
stdout: data.stdout,
|
|
31
|
+
stderr: data.stderr,
|
|
32
|
+
timing: data.timing,
|
|
33
|
+
});
|
|
34
|
+
const unwrapToken = (value) => typeof value === "string" ? Redacted.make(value) : value;
|
|
35
|
+
/** Serverless exec + grep on a disk whose id resolves at run time. */
|
|
36
|
+
export const makeExecDiskClient = (diskId, authorize) => ({
|
|
37
|
+
exec: (command) => authorize(Effect.gen(function* () {
|
|
38
|
+
const id = yield* diskId;
|
|
39
|
+
const { data } = yield* archil.execDisk({ id, command });
|
|
40
|
+
return toExecResult(data);
|
|
41
|
+
})),
|
|
42
|
+
grep: (options) => authorize(Effect.gen(function* () {
|
|
43
|
+
const { data } = yield* archil.grepDisk({
|
|
44
|
+
id: yield* diskId,
|
|
45
|
+
directory: options.directory ?? "/",
|
|
46
|
+
pattern: options.pattern,
|
|
47
|
+
recursive: options.recursive,
|
|
48
|
+
maxDurationSeconds: options.maxDurationSeconds,
|
|
49
|
+
concurrency: options.concurrency,
|
|
50
|
+
maxResults: options.maxResults,
|
|
51
|
+
});
|
|
52
|
+
return data;
|
|
53
|
+
})),
|
|
54
|
+
});
|
|
55
|
+
/** Share URLs presigned with the client's own S3 user keys. */
|
|
56
|
+
export const presignedShare = (run) => (ref, key, expiresInSeconds) => run(Objects.presignGetObject(ref, key, expiresInSeconds)).pipe(Effect.map(Redacted.make));
|
|
57
|
+
/** Share URLs from Archil's control plane (needs the API key). */
|
|
58
|
+
export const controlPlaneShare = (authorize) => (ref, key, expiresInSeconds) => authorize(Effect.gen(function* () {
|
|
59
|
+
const { data } = yield* archil.createShareUrl({
|
|
60
|
+
id: ref.disk,
|
|
61
|
+
key,
|
|
62
|
+
expiresIn: expiresInSeconds,
|
|
63
|
+
});
|
|
64
|
+
return unwrapToken(data.url);
|
|
65
|
+
}));
|
|
66
|
+
/** Object reads on a disk (or branch) whose id resolves at run time. */
|
|
67
|
+
export const makeReadDiskClient = (ref, run, share) => ({
|
|
68
|
+
get: (key, options) => run(Effect.flatMap(ref, (r) => Objects.getObject(r, key, options))),
|
|
69
|
+
getText: (key) => run(Effect.flatMap(ref, (r) => Objects.getObjectText(r, key))),
|
|
70
|
+
getStream: (key) => run.stream(Stream.unwrap(Effect.map(ref, (r) => Objects.getObjectStream(r, key)))),
|
|
71
|
+
head: (key) => run(Effect.flatMap(ref, (r) => Objects.headObject(r, key))),
|
|
72
|
+
list: (prefix, options) => run.stream(Stream.unwrap(Effect.map(ref, (r) => Objects.listObjects(r, prefix, { recursive: options?.recursive })))),
|
|
73
|
+
share: (key, expiresInSeconds = 3600) => Effect.flatMap(ref, (r) => share(r, key, expiresInSeconds)),
|
|
74
|
+
});
|
|
75
|
+
const PART_SIZE = 8 * 1024 * 1024;
|
|
76
|
+
const concatBytes = (chunks) => {
|
|
77
|
+
const out = new Uint8Array(chunks.reduce((n, c) => n + c.byteLength, 0));
|
|
78
|
+
let offset = 0;
|
|
79
|
+
for (const chunk of chunks) {
|
|
80
|
+
out.set(chunk, offset);
|
|
81
|
+
offset += chunk.byteLength;
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
};
|
|
85
|
+
/** Object writes on a disk (or branch) whose id resolves at run time. */
|
|
86
|
+
export const makeWriteDiskClient = (ref, run) => ({
|
|
87
|
+
put: (key, body, options) => run(Effect.flatMap(ref, (r) => Objects.putObject(r, key, body, options))),
|
|
88
|
+
append: (key, body) => run(Effect.flatMap(ref, (r) => Objects.appendObject(r, key, body))),
|
|
89
|
+
delete: (key) => run(Effect.flatMap(ref, (r) => Objects.deleteObject(r, key))),
|
|
90
|
+
deleteMany: (keys) => run(Effect.flatMap(ref, (r) => Objects.deleteObjects(r, keys))),
|
|
91
|
+
copy: (sourceKey, key) => run(Effect.flatMap(ref, (r) => Objects.copyObject(r, sourceKey, key)).pipe(Effect.map(({ etag }) => ({ etag })))),
|
|
92
|
+
upload: (key, body, options) => run(Effect.gen(function* () {
|
|
93
|
+
const r = yield* ref;
|
|
94
|
+
const { uploadId } = yield* Objects.createMultipartUpload(r, key, options);
|
|
95
|
+
const parts = [];
|
|
96
|
+
const sendPart = (bytes) => Objects.uploadPart(r, key, uploadId, parts.length + 1, bytes).pipe(Effect.map((part) => void parts.push(part)));
|
|
97
|
+
return yield* Effect.gen(function* () {
|
|
98
|
+
const rest = yield* Stream.runFoldEffect(body, () => [], (pending, chunk) => {
|
|
99
|
+
const next = [...pending, chunk];
|
|
100
|
+
const size = next.reduce((n, c) => n + c.byteLength, 0);
|
|
101
|
+
if (size < PART_SIZE)
|
|
102
|
+
return Effect.succeed(next);
|
|
103
|
+
const bytes = concatBytes(next);
|
|
104
|
+
return Effect.as(sendPart(bytes.subarray(0, PART_SIZE)), [bytes.subarray(PART_SIZE)]);
|
|
105
|
+
});
|
|
106
|
+
const last = concatBytes(rest);
|
|
107
|
+
// S3 needs at least one part; an empty body is one empty part.
|
|
108
|
+
if (last.byteLength > 0 || parts.length === 0)
|
|
109
|
+
yield* sendPart(last);
|
|
110
|
+
return yield* Objects.completeMultipartUpload(r, key, uploadId, parts);
|
|
111
|
+
}).pipe(Effect.onError(() => Objects.abortMultipartUpload(r, key, uploadId).pipe(Effect.ignore)), Effect.map(({ etag }) => ({ etag })));
|
|
112
|
+
})),
|
|
113
|
+
});
|
|
114
|
+
/** Write delegations on a disk whose id resolves at run time (needs the API key). */
|
|
115
|
+
export const makeDiskDelegationsClient = (ref, authorize) => ({
|
|
116
|
+
delegations: () => authorize(Effect.gen(function* () {
|
|
117
|
+
const { disk } = yield* ref;
|
|
118
|
+
const { data } = yield* archil.listDelegations({ id: disk });
|
|
119
|
+
return data.delegations;
|
|
120
|
+
})),
|
|
121
|
+
revokeDelegation: (delegation) => authorize(Effect.gen(function* () {
|
|
122
|
+
const { disk } = yield* ref;
|
|
123
|
+
yield* archil.revokeDelegation({
|
|
124
|
+
id: disk,
|
|
125
|
+
clientId: delegation.clientId,
|
|
126
|
+
inodeId: delegation.inodeId,
|
|
127
|
+
});
|
|
128
|
+
})),
|
|
129
|
+
});
|
|
130
|
+
/** Branches of a disk whose id resolves at run time. */
|
|
131
|
+
export const makeBranchDiskClient = (diskId, authorize) => ({
|
|
132
|
+
branch: (options) => authorize(Effect.gen(function* () {
|
|
133
|
+
const id = yield* diskId;
|
|
134
|
+
return yield* ensureBranch({
|
|
135
|
+
disk: id,
|
|
136
|
+
name: options.name,
|
|
137
|
+
fromCheckpoint: options.fromCheckpoint,
|
|
138
|
+
fromBranch: options.fromBranch,
|
|
139
|
+
});
|
|
140
|
+
})),
|
|
141
|
+
getBranch: (name) => authorize(Effect.gen(function* () {
|
|
142
|
+
const id = yield* diskId;
|
|
143
|
+
return yield* archil.getBranch({ id, name }).pipe(Effect.map(({ data }) => toBranchAttributes(data)), Effect.catchTag("NotFound", () => Effect.undefined));
|
|
144
|
+
})),
|
|
145
|
+
listBranches: () => authorize(Effect.gen(function* () {
|
|
146
|
+
const id = yield* diskId;
|
|
147
|
+
const { data } = yield* archil.listBranches({ id });
|
|
148
|
+
return data.map(toBranchAttributes);
|
|
149
|
+
})),
|
|
150
|
+
});
|
|
151
|
+
/** A full handle on a disk known by id and name. */
|
|
152
|
+
export const makeDiskHandle = (disk, authorize) => {
|
|
153
|
+
const diskId = Effect.succeed(disk.diskId);
|
|
154
|
+
const ref = Effect.succeed({ disk: disk.diskId });
|
|
155
|
+
return {
|
|
156
|
+
diskId: disk.diskId,
|
|
157
|
+
name: disk.name,
|
|
158
|
+
...makeExecDiskClient(diskId, authorize),
|
|
159
|
+
...makeReadDiskClient(ref, authorize.objects, controlPlaneShare(authorize)),
|
|
160
|
+
...makeWriteDiskClient(ref, authorize.objects),
|
|
161
|
+
...makeDiskDelegationsClient(ref, authorize),
|
|
162
|
+
...makeBranchDiskClient(diskId, authorize),
|
|
163
|
+
createToken: (nickname, options) => authorize(addDiskUser(disk.diskId, { nickname, ...options })),
|
|
164
|
+
removeToken: (identifier) => authorize(removeDiskUser({ diskId: disk.diskId, type: "token", identifier })),
|
|
165
|
+
};
|
|
166
|
+
};
|
|
167
|
+
/** Single-quote a value for `sh`. */
|
|
168
|
+
const shellQuote = (value) => `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
169
|
+
const commandLine = (command) => typeof command === "string" ? command : command.map(shellQuote).join(" ");
|
|
170
|
+
const runOptions = (options) => ({
|
|
171
|
+
cwd: options?.cwd,
|
|
172
|
+
env: options?.env === undefined ? undefined : { ...options.env },
|
|
173
|
+
timeoutSeconds: options?.timeout === undefined ? undefined : Math.ceil(Duration.toSeconds(options.timeout)),
|
|
174
|
+
});
|
|
175
|
+
const utf8 = new TextDecoder();
|
|
176
|
+
const toExit = (exit) => ({
|
|
177
|
+
exitCode: exit.exitCode ?? -1,
|
|
178
|
+
status: exit.status,
|
|
179
|
+
exitReason: exit.exitReason,
|
|
180
|
+
cursor: exit.cursor,
|
|
181
|
+
});
|
|
182
|
+
const entryType = (kind) => kind.includes("directory")
|
|
183
|
+
? "directory"
|
|
184
|
+
: kind.includes("symbolic link")
|
|
185
|
+
? "symlink"
|
|
186
|
+
: kind.includes("regular")
|
|
187
|
+
? "file"
|
|
188
|
+
: "other";
|
|
189
|
+
/** Parse `stat -c '%F\t%s\t%n'` lines; names are joined to `dir` when given. */
|
|
190
|
+
const parseEntries = (out, dir) => out
|
|
191
|
+
.split("\n")
|
|
192
|
+
.filter((line) => line.length > 0)
|
|
193
|
+
.map((line) => {
|
|
194
|
+
const [kind = "", size = "0", ...name] = line.split("\t");
|
|
195
|
+
const base = name.join("\t");
|
|
196
|
+
return {
|
|
197
|
+
path: dir === undefined ? base : `${dir.replace(/\/+$/, "")}/${base}`,
|
|
198
|
+
type: entryType(kind),
|
|
199
|
+
size: Number(size),
|
|
200
|
+
};
|
|
201
|
+
});
|
|
202
|
+
/**
|
|
203
|
+
* Everything a run-time client can do to the sandbox `sid` resolves to.
|
|
204
|
+
* `forkName` maps a fork's name (a binding puts its owner prefix on it,
|
|
205
|
+
* like on the sandboxes it creates).
|
|
206
|
+
*/
|
|
207
|
+
export const makeSandboxOps = (sid, authorize, forkName = Effect.succeed) => {
|
|
208
|
+
// A paused sandbox (idle TTL) refuses process connections with
|
|
209
|
+
// `sandbox_terminated`; resume it and try once more.
|
|
210
|
+
const awake = (use) => authorize(Effect.flatMap(sid, (id) => use(id).pipe(Effect.catchIf((e) => e._tag === "SandboxTerminated", (e) => archil
|
|
211
|
+
.getSandbox({ sid: id })
|
|
212
|
+
.pipe(Effect.flatMap(({ data }) => data.status === "paused"
|
|
213
|
+
? archil.resumeSandbox({ sid: id, wait: true }).pipe(Effect.andThen(use(id)))
|
|
214
|
+
: Effect.fail(e)))))));
|
|
215
|
+
const call = (use) => authorize(Effect.flatMap(sid, use));
|
|
216
|
+
const attrs = (use) => call((id) => use(id).pipe(Effect.flatMap(({ data }) => observeSandbox(data))));
|
|
217
|
+
const toProcess = (process) => ({
|
|
218
|
+
id: process.id,
|
|
219
|
+
output: process.output.pipe(Stream.map((chunk) => ({ fd: chunk.stream, data: chunk.data, offset: chunk.offset }))),
|
|
220
|
+
write: (data) => process.write(data),
|
|
221
|
+
closeStdin: process.closeStdin,
|
|
222
|
+
kill: () => awake((id) => Process.kill(id, process.id)),
|
|
223
|
+
wait: Effect.map(process.exit, toExit),
|
|
224
|
+
});
|
|
225
|
+
// A shell command whose non-zero exit is a failure with its stderr.
|
|
226
|
+
const sh = (command, what) => awake((id) => Process.exec(id, command)).pipe(Effect.flatMap((result) => result.exitCode === 0
|
|
227
|
+
? Effect.succeed(result.stdout)
|
|
228
|
+
: Effect.fail(Process.ProcessError.make({
|
|
229
|
+
message: `${what} failed (exit ${result.exitCode ?? result.status}): ${result.stderr.trim()}`,
|
|
230
|
+
}))));
|
|
231
|
+
const files = {
|
|
232
|
+
read: (path) => awake((id) => Process.downloadFile(id, path)),
|
|
233
|
+
readText: (path) => awake((id) => Process.downloadFile(id, path)).pipe(Effect.map((bytes) => utf8.decode(bytes))),
|
|
234
|
+
write: (path, data, options) => awake((id) => Process.uploadFile(id, path, data, options)),
|
|
235
|
+
list: (path) => sh(`cd ${shellQuote(path)} && for f in * .[!.]* ..?*; do [ -e "$f" ] || [ -L "$f" ] || continue; stat -c '%F\t%s\t%n' -- "$f"; done`, `list ${path}`).pipe(Effect.map((out) => parseEntries(out, path))),
|
|
236
|
+
stat: (path) => sh(`stat -c '%F\t%s\t%n' -- ${shellQuote(path)}`, `stat ${path}`).pipe(Effect.map((out) => ({ ...parseEntries(out, undefined)[0], path }))),
|
|
237
|
+
remove: (path) => sh(`rm -rf -- ${shellQuote(path)}`, `remove ${path}`).pipe(Effect.asVoid),
|
|
238
|
+
makeDir: (path) => sh(`mkdir -p -- ${shellQuote(path)}`, `makeDir ${path}`).pipe(Effect.asVoid),
|
|
239
|
+
};
|
|
240
|
+
const ops = {
|
|
241
|
+
refresh: () => attrs((id) => archil.getSandbox({ sid: id })),
|
|
242
|
+
exec: (command, options) => options?.stdin === undefined
|
|
243
|
+
? awake((id) => Process.exec(id, commandLine(command), runOptions(options)))
|
|
244
|
+
: awake((id) => Effect.scoped(Effect.gen(function* () {
|
|
245
|
+
const process = yield* Process.run(id, commandLine(command), runOptions(options));
|
|
246
|
+
yield* process.write(options.stdin);
|
|
247
|
+
yield* process.closeStdin;
|
|
248
|
+
const out = new TextDecoder();
|
|
249
|
+
const err = new TextDecoder();
|
|
250
|
+
let stdout = "";
|
|
251
|
+
let stderr = "";
|
|
252
|
+
yield* process.output.pipe(Stream.runForEach((chunk) => Effect.sync(() => {
|
|
253
|
+
if (chunk.stream === "stdout")
|
|
254
|
+
stdout += out.decode(chunk.data, { stream: true });
|
|
255
|
+
else
|
|
256
|
+
stderr += err.decode(chunk.data, { stream: true });
|
|
257
|
+
})));
|
|
258
|
+
const exit = yield* process.exit;
|
|
259
|
+
return {
|
|
260
|
+
...exit,
|
|
261
|
+
stdout: stdout + out.decode(),
|
|
262
|
+
stderr: stderr + err.decode(),
|
|
263
|
+
};
|
|
264
|
+
}))),
|
|
265
|
+
start: (command, options) => awake((id) => Process.run(id, commandLine(command), runOptions(options))).pipe(Effect.map(toProcess)),
|
|
266
|
+
attach: (processId, offset) => awake((id) => Process.attach(id, processId, offset)).pipe(Effect.map(toProcess)),
|
|
267
|
+
files,
|
|
268
|
+
pty: {
|
|
269
|
+
open: (options) => awake((id) => Process.run(id, commandLine(options.command ?? "bash"), {
|
|
270
|
+
cwd: options.cwd,
|
|
271
|
+
env: options.env === undefined ? undefined : { ...options.env },
|
|
272
|
+
terminal: { cols: options.cols, rows: options.rows },
|
|
273
|
+
})).pipe(Effect.map((process) => ({
|
|
274
|
+
id: process.id,
|
|
275
|
+
output: process.output.pipe(Stream.map((chunk) => chunk.data)),
|
|
276
|
+
write: (data) => process.write(data),
|
|
277
|
+
resize: (size) => awake((id) => Process.resize(id, process.id, size)),
|
|
278
|
+
kill: () => awake((id) => Process.kill(id, process.id)),
|
|
279
|
+
wait: Effect.map(process.exit, toExit),
|
|
280
|
+
}))),
|
|
281
|
+
},
|
|
282
|
+
getTcpPort: (port) => call((id) => Effect.gen(function* () {
|
|
283
|
+
const { data } = yield* archil.listSandboxPorts({ sid: id });
|
|
284
|
+
const endpoint = (data.ports ?? []).find((p) => p.port === port);
|
|
285
|
+
if (endpoint === undefined) {
|
|
286
|
+
return yield* new SandboxPortNotExposed({
|
|
287
|
+
port,
|
|
288
|
+
message: `Port ${port} isn't served publicly; call exposePort(${port}) first.`,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
const url = `https://${endpoint.hostname}`;
|
|
292
|
+
// Archil's edge routes by hostname, so the caller's Host header
|
|
293
|
+
// (a Worker's own, when proxying) is replaced by the port's.
|
|
294
|
+
const send = (request) => {
|
|
295
|
+
const source = new URL(request.url, "http://sandbox");
|
|
296
|
+
return HttpClient.HttpClient.pipe(Effect.flatMap((client) => client.execute(request.pipe(HttpClientRequest.setUrl(`${url}${source.pathname}${source.search}`), HttpClientRequest.removeHeader("host")))), Effect.provide(FetchHttpClient.layer));
|
|
297
|
+
};
|
|
298
|
+
return {
|
|
299
|
+
port,
|
|
300
|
+
hostname: endpoint.hostname,
|
|
301
|
+
url,
|
|
302
|
+
fetch: SandboxBase.portFetch(send),
|
|
303
|
+
};
|
|
304
|
+
})),
|
|
305
|
+
boot: () => attrs((id) => archil.startSandbox({ sid: id, wait: true })),
|
|
306
|
+
stop: () => attrs((id) => archil.stopSandbox({ sid: id })),
|
|
307
|
+
pause: () => attrs((id) => archil.pauseSandbox({ sid: id })),
|
|
308
|
+
resume: () => attrs((id) => archil.resumeSandbox({ sid: id })),
|
|
309
|
+
fork: (options) => call((id) => forkName(options?.name).pipe(Effect.flatMap((name) => archil.forkSandbox({ sid: id, wait: true, name, checkpoint: options?.checkpoint })))).pipe(Effect.map(({ data }) => makeSandboxHandle({ sandboxId: data.sandbox_id, name: data.name }, authorize, forkName))),
|
|
310
|
+
setTimeout: (options) => attrs((id) => archil.setSandboxTimeout({
|
|
311
|
+
sid: id,
|
|
312
|
+
timeout: options.timeoutSeconds,
|
|
313
|
+
idle_ttl_seconds: options.idleTtlSeconds,
|
|
314
|
+
})),
|
|
315
|
+
exposePort: (port) => call((id) => archil.exposeSandboxPort({ sid: id, port })).pipe(Effect.map(({ data }) => ({ port: data.port, hostname: data.hostname }))),
|
|
316
|
+
unexposePort: (port) => call((id) => archil.deleteSandboxPort({ sid: id, port })).pipe(Effect.asVoid),
|
|
317
|
+
ports: () => call((id) => archil.listSandboxPorts({ sid: id })).pipe(Effect.map(({ data }) => (data.ports ?? []).map((p) => ({ port: p.port, hostname: p.hostname })))),
|
|
318
|
+
createPortToken: (port, ttl) => call((id) => createPortToken(id, port, ttl)),
|
|
319
|
+
revokePortToken: (tokenId) => call((id) => revokePortToken(id, tokenId)),
|
|
320
|
+
listPortTokens: () => authorize.stream(Stream.unwrap(Effect.map(sid, (id) => Stream.paginate(undefined, (cursor) => archil
|
|
321
|
+
.listSandboxPortTokens({ sid: id, cursor })
|
|
322
|
+
.pipe(Effect.map(({ data, nextCursor }) => [data.tokens, Option.fromNullishOr(nextCursor)])))))),
|
|
323
|
+
setEgress: (egress) => call((id) => archil.updateSandboxNetwork({ sid: id, egress: toEgressPolicy(egress) })).pipe(Effect.asVoid),
|
|
324
|
+
delete: () => call((id) => deleteSandbox(id)),
|
|
325
|
+
};
|
|
326
|
+
return ops;
|
|
327
|
+
};
|
|
328
|
+
/** A full handle on a sandbox known by id and name. */
|
|
329
|
+
export const makeSandboxHandle = (sandbox, authorize, forkName) => ({
|
|
330
|
+
sandboxId: sandbox.sandboxId,
|
|
331
|
+
name: sandbox.name,
|
|
332
|
+
...makeSandboxOps(Effect.succeed(sandbox.sandboxId), authorize, forkName),
|
|
333
|
+
});
|
|
334
|
+
//# sourceMappingURL=Clients.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Clients.js","sources":["../src/Clients.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as Binding from "alchemy/Binding";
|
|
2
|
+
import type { RuntimeContext } from "alchemy/RuntimeContext";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Layer from "effect/Layer";
|
|
5
|
+
import { type SandboxOps } from "./Clients.ts";
|
|
6
|
+
import type { Sandbox } from "./Sandbox.ts";
|
|
7
|
+
/**
|
|
8
|
+
* The handle on a deploy-time sandbox: a {@link SandboxHandle} whose id and
|
|
9
|
+
* name resolve at run time.
|
|
10
|
+
*/
|
|
11
|
+
export interface ConnectSandboxClient extends SandboxOps {
|
|
12
|
+
readonly sandboxId: Effect.Effect<string, never, RuntimeContext>;
|
|
13
|
+
readonly name: Effect.Effect<string, never, RuntimeContext>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Act on a sandbox declared at deploy time from a Worker, Lambda, or any
|
|
17
|
+
* other host: run commands, start background processes and terminals,
|
|
18
|
+
* move files, pause and resume, fork it into a new sandbox, open ports,
|
|
19
|
+
* and change its network policy. A program sandbox (`Archil.Sandbox` with
|
|
20
|
+
* `main`) is a sandbox too.
|
|
21
|
+
*
|
|
22
|
+
* ### Driving a Dev Box
|
|
23
|
+
* **Example:** Build on the dev box, fork a preview per pull request
|
|
24
|
+
* ```typescript
|
|
25
|
+
* export default class Api extends Cloudflare.Worker<Api>()(
|
|
26
|
+
* "Api",
|
|
27
|
+
* { main: import.meta.url },
|
|
28
|
+
* Effect.gen(function* () {
|
|
29
|
+
* const devbox = yield* Archil.ConnectSandbox(DevBox);
|
|
30
|
+
* return {
|
|
31
|
+
* fetch: Effect.gen(function* () {
|
|
32
|
+
* yield* devbox.exec("git pull && pnpm build", { cwd: "/workspace" });
|
|
33
|
+
* yield* devbox.files.write("/workspace/.env", "PREVIEW=1\n");
|
|
34
|
+
* const preview = yield* devbox.fork({ name: "pr-42" });
|
|
35
|
+
* const port = yield* preview.exposePort(3000);
|
|
36
|
+
* return HttpServerResponse.text(`https://${port.hostname}`);
|
|
37
|
+
* }),
|
|
38
|
+
* };
|
|
39
|
+
* }).pipe(Effect.provide(Archil.ConnectSandboxHttp)),
|
|
40
|
+
* ) {}
|
|
41
|
+
* ```
|
|
42
|
+
*
|
|
43
|
+
* ### Proxying to a Port
|
|
44
|
+
* **Example:** A Worker in front of the dev box's server
|
|
45
|
+
* ```typescript
|
|
46
|
+
* export default class Api extends Cloudflare.Worker<Api>()(
|
|
47
|
+
* "Api",
|
|
48
|
+
* { main: import.meta.url },
|
|
49
|
+
* Effect.gen(function* () {
|
|
50
|
+
* const devbox = yield* Archil.ConnectSandbox(DevBox);
|
|
51
|
+
* return {
|
|
52
|
+
* fetch: Effect.gen(function* () {
|
|
53
|
+
* const port = yield* devbox.getTcpPort(3000);
|
|
54
|
+
* return yield* port.fetch(yield* HttpServerRequest);
|
|
55
|
+
* }),
|
|
56
|
+
* };
|
|
57
|
+
* }).pipe(Effect.provide(Archil.ConnectSandboxHttp)),
|
|
58
|
+
* ) {}
|
|
59
|
+
* ```
|
|
60
|
+
*
|
|
61
|
+
* @binding
|
|
62
|
+
* @product Sandbox
|
|
63
|
+
*/
|
|
64
|
+
export interface ConnectSandbox extends Binding.Service<ConnectSandbox, "Archil.ConnectSandbox", (sandbox: Sandbox) => Effect.Effect<ConnectSandboxClient>> {
|
|
65
|
+
}
|
|
66
|
+
export declare const ConnectSandbox: ConnectSandbox;
|
|
67
|
+
/** {@link ConnectSandbox} over Archil's HTTP API, usable from any host. */
|
|
68
|
+
export declare const ConnectSandboxHttp: Layer.Layer<ConnectSandbox, never, never>;
|
|
69
|
+
//# sourceMappingURL=ConnectSandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectSandbox.d.ts","sources":["../src/ConnectSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;;GAGG;AACH,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;CAC7D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,MAAM,WAAW,cAAe,SAAQ,OAAO,CAAC,OAAO,CACrD,cAAc,EACd,uBAAuB,EACvB,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAC1D;CAAG;AAEJ,eAAO,MAAM,cAAc,gBAA2D,CAAC;AAEvF,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,2CAe9B,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as Binding from "alchemy/Binding";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as Layer from "effect/Layer";
|
|
4
|
+
import { ApiAccess } from "./ArchilBindings.js";
|
|
5
|
+
import { makeSandboxOps } from "./Clients.js";
|
|
6
|
+
export const ConnectSandbox = Binding.Service("Archil.ConnectSandbox");
|
|
7
|
+
/** {@link ConnectSandbox} over Archil's HTTP API, usable from any host. */
|
|
8
|
+
export const ConnectSandboxHttp = Layer.effect(ConnectSandbox, Effect.gen(function* () {
|
|
9
|
+
const access = yield* ApiAccess;
|
|
10
|
+
return Effect.fn(function* (sandbox) {
|
|
11
|
+
const authorize = yield* access();
|
|
12
|
+
const sandboxId = yield* sandbox.sandboxId;
|
|
13
|
+
const name = yield* sandbox.name;
|
|
14
|
+
return {
|
|
15
|
+
sandboxId,
|
|
16
|
+
name,
|
|
17
|
+
...makeSandboxOps(sandboxId, authorize),
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
}));
|
|
21
|
+
//# sourceMappingURL=ConnectSandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectSandbox.js","sources":["../src/ConnectSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAE3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAmB,MAAM,cAAc,CAAC;AAmE/D,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAiB,uBAAuB,CAAC,CAAC;AAEvF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAC5C,cAAc,EACd,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC;IAChC,OAAO,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAgB;QAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACjC,OAAO;YACL,SAAS;YACT,IAAI;YACJ,GAAG,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC;SACT,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as Contributions from "alchemy/Contributions";
|
|
2
|
+
declare const _default: {
|
|
3
|
+
readonly name: "archil";
|
|
4
|
+
readonly auth: Contributions.Lazy<import("effect/Layer").Layer<never, never, import("alchemy").AuthProviders | import("effect/FileSystem").FileSystem | import("effect/Path").Path | import("effect/crypto/SecureRandom").SecureRandom>>;
|
|
5
|
+
};
|
|
6
|
+
export default _default;
|
|
7
|
+
//# sourceMappingURL=Contributions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Contributions.d.ts","sources":["../src/Contributions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,uBAAuB,CAAC;;;;;AAEvD,wBAMG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Contributions.js","sources":["../src/Contributions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,uBAAuB,CAAC;AAEvD,eAAe,aAAa,CAAC,IAAI,CAAC;IAChC,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,aAAa,CAAC,IAAI,CACtB,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,EACjC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAC9B;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import * as archil from "@distilled.cloud/archil";
|
|
2
|
+
import * as Binding from "alchemy/Binding";
|
|
3
|
+
import type { RuntimeContext } from "alchemy/RuntimeContext";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import * as Layer from "effect/Layer";
|
|
6
|
+
import { type DiskHandle } from "./Clients.ts";
|
|
7
|
+
import { deleteDisk, type DiskStorage } from "./Disk.ts";
|
|
8
|
+
import type { ArchilFailed, ArchilNotReady } from "./internal/archil.ts";
|
|
9
|
+
export interface CreateDiskOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Where disks created by this client keep their files. Omit for
|
|
12
|
+
* Archil-managed storage. A run-time `create` can override it.
|
|
13
|
+
*/
|
|
14
|
+
storage?: DiskStorage;
|
|
15
|
+
}
|
|
16
|
+
export type CreateDiskError = archil.CreateDiskError | archil.GetDiskError | archil.ListDisksError | ArchilFailed | ArchilNotReady;
|
|
17
|
+
export interface CreateDiskClient {
|
|
18
|
+
/**
|
|
19
|
+
* The name prefix this client puts on everything it creates,
|
|
20
|
+
* `alc-<id>-<hash of stack/stage/id>`.
|
|
21
|
+
*/
|
|
22
|
+
readonly prefix: string;
|
|
23
|
+
/**
|
|
24
|
+
* Create a disk (or return the one that already has this name). Names
|
|
25
|
+
* are stamped with this binding's prefix, so `create({ name: "user-1" })`
|
|
26
|
+
* is the same disk on every call.
|
|
27
|
+
*/
|
|
28
|
+
create(name: string, options?: {
|
|
29
|
+
readonly storage?: DiskStorage;
|
|
30
|
+
}): Effect.Effect<DiskHandle, CreateDiskError, RuntimeContext>;
|
|
31
|
+
/** A disk this client created, or `undefined`. */
|
|
32
|
+
get(name: string): Effect.Effect<DiskHandle | undefined, archil.ListDisksError, RuntimeContext>;
|
|
33
|
+
/** Every disk this client created. */
|
|
34
|
+
list(): Effect.Effect<DiskHandle[], archil.ListDisksError, RuntimeContext>;
|
|
35
|
+
/** Delete a disk this client created. Deleting a missing disk succeeds. */
|
|
36
|
+
delete(name: string): Effect.Effect<void, archil.ListDisksError | Effect.Error<ReturnType<typeof deleteDisk>>, RuntimeContext>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Create disks at run time, one per user, session, or task, by name. This
|
|
40
|
+
* is how most apps use Archil: a disk mounts in about 50 ms, so it can
|
|
41
|
+
* belong to a single request. The client returns full disk handles (exec,
|
|
42
|
+
* grep, objects, branches, disk tokens), the same shape the deploy-time
|
|
43
|
+
* bindings return.
|
|
44
|
+
*
|
|
45
|
+
* Objects created at run time are tagged with the stack, stage and binding
|
|
46
|
+
* (`alchemy::stack`, `alchemy::stage`, `alchemy::id`) and are not deleted
|
|
47
|
+
* when the stack is destroyed. List them by those tags to clean them up.
|
|
48
|
+
* Archil has no tags, labels or descriptions, so the tags are a name
|
|
49
|
+
* prefix, `alc-<id>-<hash of stack/stage/id>`: every name this client
|
|
50
|
+
* creates is `<prefix>-<name>`, and `prefix` on the client is the value.
|
|
51
|
+
*
|
|
52
|
+
* ### Disks per User
|
|
53
|
+
* **Example:** A home disk for each user
|
|
54
|
+
* ```typescript
|
|
55
|
+
* export default class Api extends Cloudflare.Worker<Api>()(
|
|
56
|
+
* "Api",
|
|
57
|
+
* { main: import.meta.url },
|
|
58
|
+
* Effect.gen(function* () {
|
|
59
|
+
* const disks = yield* Archil.CreateDisk();
|
|
60
|
+
* return {
|
|
61
|
+
* fetch: Effect.gen(function* () {
|
|
62
|
+
* const request = yield* HttpServerRequest;
|
|
63
|
+
* const user = request.headers["x-user"] ?? "anonymous";
|
|
64
|
+
* const home = yield* disks.create(`user-${user}`);
|
|
65
|
+
* const result = yield* home.exec("ls -la /mnt/archil");
|
|
66
|
+
* return HttpServerResponse.text(result.stdout);
|
|
67
|
+
* }),
|
|
68
|
+
* };
|
|
69
|
+
* }).pipe(Effect.provide(Archil.CreateDiskHttp)),
|
|
70
|
+
* ) {}
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* ### Cleaning Up
|
|
74
|
+
* **Example:** Delete the disks one binding created
|
|
75
|
+
* ```typescript
|
|
76
|
+
* const disks = yield* Archil.CreateDisk();
|
|
77
|
+
* for (const disk of yield* disks.list()) {
|
|
78
|
+
* yield* disks.delete(disk.name.slice(disks.prefix.length + 1));
|
|
79
|
+
* }
|
|
80
|
+
* ```
|
|
81
|
+
*
|
|
82
|
+
* @binding
|
|
83
|
+
* @product Disk
|
|
84
|
+
*/
|
|
85
|
+
export interface CreateDisk extends Binding.Service<CreateDisk, "Archil.CreateDisk", (options?: CreateDiskOptions) => Effect.Effect<CreateDiskClient>> {
|
|
86
|
+
}
|
|
87
|
+
export declare const CreateDisk: CreateDisk;
|
|
88
|
+
/** {@link CreateDisk} over Archil's HTTP API, usable from any host. */
|
|
89
|
+
export declare const CreateDiskHttp: Layer.Layer<CreateDisk, never, never>;
|
|
90
|
+
//# sourceMappingURL=CreateDisk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateDisk.d.ts","sources":["../src/CreateDisk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,yBAAyB,CAAC;AAClD,OAAO,KAAK,OAAO,MAAM,iBAAiB,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAc,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGzE,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GACvB,MAAM,CAAC,eAAe,GACtB,MAAM,CAAC,YAAY,GACnB,MAAM,CAAC,cAAc,GACrB,YAAY,GACZ,cAAc,CAAC;AAEnB,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,MAAM,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAA;KAAE,GAC3C,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;IAC9D,kDAAkD;IAClD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,GAAG,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAChG,sCAAsC;IACtC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IAC3E,2EAA2E;IAC3E,MAAM,CACJ,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,MAAM,CACd,IAAI,EACJ,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,EACnE,cAAc,CACf,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,WAAW,UAAW,SAAQ,OAAO,CAAC,OAAO,CACjD,UAAU,EACV,mBAAmB,EACnB,CAAC,OAAO,CAAC,EAAE,iBAAiB,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CACjE;CAAG;AAEJ,eAAO,MAAM,UAAU,YAAmD,CAAC;AAE3E,uEAAuE;AACvE,eAAO,MAAM,cAAc,uCAoD1B,CAAC"}
|