@volter/browser-sandboxes 0.1.3 → 0.1.4

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.
@@ -0,0 +1,212 @@
1
+ import { exportBrowserProject, importBrowserProject } from "@volter/browser-runtime";
2
+ /** Directory names that a lockfile or a build reproduces; never archived, never mirrored. */
3
+ export const DEPENDENCY_DIRECTORIES = Object.freeze(["node_modules", ".venv", "venv", "__pycache__", ".pglite", ".cache", ".turbo", ".next"]);
4
+ /** Every dependency directory under `root`, at any depth, as absolute paths. */
5
+ export function dependencyExclusions(filesystem, root, names = DEPENDENCY_DIRECTORIES) {
6
+ const found = new Set();
7
+ const walk = (dir, depth) => {
8
+ if (depth > 12)
9
+ return;
10
+ let entries;
11
+ try {
12
+ entries = filesystem.readdirSync(dir);
13
+ }
14
+ catch {
15
+ return;
16
+ }
17
+ for (const name of entries) {
18
+ const path = dir === "/" ? `/${name}` : `${dir}/${name}`;
19
+ let isDirectory = false;
20
+ try {
21
+ isDirectory = filesystem.statSync(path).isDirectory();
22
+ }
23
+ catch {
24
+ continue;
25
+ }
26
+ if (!isDirectory)
27
+ continue;
28
+ if (names.includes(name)) {
29
+ found.add(path);
30
+ continue;
31
+ }
32
+ if (name === ".git")
33
+ continue;
34
+ walk(path, depth + 1);
35
+ }
36
+ };
37
+ walk(root, 0);
38
+ return found;
39
+ }
40
+ /** The command that reproduces the dependency tree from what the project carries, or undefined. */
41
+ export function installCommand(filesystem, root) {
42
+ const has = (name) => filesystem.existsSync(root === "/" ? `/${name}` : `${root}/${name}`);
43
+ if (has("pnpm-lock.yaml"))
44
+ return "pnpm install --frozen-lockfile";
45
+ if (has("yarn.lock"))
46
+ return "yarn install --immutable";
47
+ if (has("bun.lock") || has("bun.lockb"))
48
+ return "bun install --frozen-lockfile";
49
+ if (has("package-lock.json"))
50
+ return "npm ci";
51
+ if (has("package.json"))
52
+ return "npm install";
53
+ if (has("uv.lock"))
54
+ return "uv sync";
55
+ if (has("requirements.txt"))
56
+ return "pip install -r requirements.txt";
57
+ if (has("pyproject.toml"))
58
+ return "pip install -e .";
59
+ return undefined;
60
+ }
61
+ /** Local to remote: archive everything but dependency trees, import it, and say how to reproduce them. */
62
+ export async function moveWorkspace(local, remote, { root = "/workspace", exclude } = {}) {
63
+ const started = Date.now();
64
+ const excluded = new Set(exclude ?? dependencyExclusions(local, root));
65
+ const archive = await exportBrowserProject(local, { format: "zip", root, excludePaths: excluded });
66
+ const imported = await remote.files.import(archive.bytes, { root, replace: true });
67
+ if (imported.integrity !== archive.integrity)
68
+ throw new Error("the sandbox's import did not match the export");
69
+ return { bytes: archive.bytes.byteLength, entries: archive.entries, fileBytes: archive.fileBytes, integrity: archive.integrity, excluded: [...excluded], install: installCommand(local, root), ms: Date.now() - started };
70
+ }
71
+ /** Remote to local: archive everything but dependency trees and merge it in; the local tree keeps its own dependencies. */
72
+ export async function returnWorkspace(remote, local, { root = "/workspace", excludeNames = DEPENDENCY_DIRECTORIES } = {}) {
73
+ const started = Date.now();
74
+ const exclude = excludeNames.map((name) => (root === "/" ? `/${name}` : `${root}/${name}`));
75
+ const archive = await remote.files.export(root, "zip", { exclude });
76
+ const restored = await importBrowserProject(local, archive.bytes, { root, replace: false });
77
+ if (archive.integrity && restored.integrity !== archive.integrity)
78
+ throw new Error("the local import did not match the sandbox's export");
79
+ return { bytes: archive.bytes.byteLength, entries: archive.entries, integrity: restored.integrity, ms: Date.now() - started };
80
+ }
81
+ /**
82
+ * Keeps a local filesystem and a remote sandbox the same while both may
83
+ * change. Writes and deletes on either side are applied to the other; a change
84
+ * that is the echo of something this mirror just applied is recognised by
85
+ * path and content and dropped, so the two sides never ping-pong.
86
+ */
87
+ export function mirrorWorkspace(local, remote, { root = "/workspace", exclude, onEvent } = {}) {
88
+ const excluded = [...(exclude ?? dependencyExclusions(local, root))];
89
+ const stats = { toRemote: 0, toLocal: 0, suppressed: 0 };
90
+ const applied = new Map();
91
+ const digestOf = (bytes) => {
92
+ const data = typeof bytes === "string" ? new TextEncoder().encode(bytes) : bytes;
93
+ let h = 2166136261;
94
+ for (const b of data) {
95
+ h ^= b;
96
+ h = Math.imul(h, 16777619) >>> 0;
97
+ }
98
+ return `${data.byteLength}:${h.toString(16)}`;
99
+ };
100
+ const inScope = (path) => (path === root || path.startsWith(`${root}/`)) && !excluded.some((e) => path === e || path.startsWith(`${e}/`)) && !path.includes("/.git/");
101
+ const isEcho = (path, digest) => {
102
+ const last = applied.get(path);
103
+ if (last && last.digest === digest && Date.now() - last.at < 30_000) {
104
+ stats.suppressed += 1;
105
+ return true;
106
+ }
107
+ return false;
108
+ };
109
+ const remember = (path, digest) => { applied.set(path, { digest, at: Date.now() }); };
110
+ const queue = [];
111
+ let draining = false;
112
+ const enqueue = (work) => {
113
+ queue.push(work);
114
+ if (draining)
115
+ return;
116
+ draining = true;
117
+ void (async () => {
118
+ while (queue.length) {
119
+ const next = queue.shift();
120
+ if (next) {
121
+ try {
122
+ await next();
123
+ }
124
+ catch { /* the other side may be mid-change; the next event corrects it */ }
125
+ }
126
+ }
127
+ draining = false;
128
+ })();
129
+ };
130
+ const onLocalChange = (path) => {
131
+ if (!inScope(path))
132
+ return;
133
+ let bytes;
134
+ try {
135
+ if (!local.statSync(path).isFile())
136
+ return;
137
+ bytes = local.readFileSync(path);
138
+ }
139
+ catch {
140
+ return;
141
+ }
142
+ const digest = digestOf(bytes);
143
+ if (isEcho(path, digest))
144
+ return;
145
+ remember(path, digest);
146
+ enqueue(async () => { await remote.files.write(path, bytes); stats.toRemote += 1; onEvent?.({ direction: "to-remote", kind: "write", path }); });
147
+ };
148
+ const onLocalDelete = (path) => {
149
+ if (!inScope(path))
150
+ return;
151
+ if (isEcho(path, "deleted"))
152
+ return;
153
+ remember(path, "deleted");
154
+ enqueue(async () => { await remote.files.remove(path).catch(() => undefined); stats.toRemote += 1; onEvent?.({ direction: "to-remote", kind: "delete", path }); });
155
+ };
156
+ local.on("change", onLocalChange);
157
+ local.on("delete", onLocalDelete);
158
+ const offChange = remote.on("file-change", (event) => {
159
+ const path = String(event.path);
160
+ if (!inScope(path))
161
+ return;
162
+ enqueue(async () => {
163
+ const bytes = await remote.files.read(path);
164
+ const digest = digestOf(bytes);
165
+ if (isEcho(path, digest))
166
+ return;
167
+ // A write that changes nothing is an echo too: the move that preceded this
168
+ // mirror, or a tool rewriting a file byte for byte.
169
+ try {
170
+ if (local.statSync(path).isFile() && digestOf(local.readFileSync(path)) === digest) {
171
+ stats.suppressed += 1;
172
+ remember(path, digest);
173
+ return;
174
+ }
175
+ }
176
+ catch { /* not there yet */ }
177
+ remember(path, digest);
178
+ const parent = path.slice(0, path.lastIndexOf("/")) || "/";
179
+ if (!local.existsSync(parent))
180
+ local.mkdirSync(parent, { recursive: true });
181
+ local.writeFileSync(path, bytes);
182
+ stats.toLocal += 1;
183
+ onEvent?.({ direction: "to-local", kind: "write", path });
184
+ });
185
+ });
186
+ const offDelete = remote.on("file-delete", (event) => {
187
+ const path = String(event.path);
188
+ if (!inScope(path))
189
+ return;
190
+ if (isEcho(path, "deleted"))
191
+ return;
192
+ remember(path, "deleted");
193
+ enqueue(async () => {
194
+ try {
195
+ if (local.existsSync(path)) {
196
+ if (local.statSync(path).isDirectory())
197
+ local.rmdirSync(path);
198
+ else
199
+ local.unlinkSync(path);
200
+ }
201
+ }
202
+ catch { /* already gone */ }
203
+ stats.toLocal += 1;
204
+ onEvent?.({ direction: "to-local", kind: "delete", path });
205
+ });
206
+ });
207
+ return {
208
+ stop: () => { local.off("change", onLocalChange); local.off("delete", onLocalDelete); offChange(); offDelete(); },
209
+ stats,
210
+ };
211
+ }
212
+ //# sourceMappingURL=transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../src/transfer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volter/browser-sandboxes",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "The hosted backend's control-plane side: a remote runtime client with the in-page runtime's method names, a sandbox manager with Docker and Fly Machines providers, a control plane a page can call, and an MCP server",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -33,13 +33,13 @@
33
33
  }
34
34
  },
35
35
  "bin": {
36
- "browser-substrate-control-plane": "./dist/bin/control-plane.js",
37
- "browser-substrate-mcp": "./dist/bin/mcp.js"
36
+ "browser-substrate-control-plane": "dist/bin/control-plane.js",
37
+ "browser-substrate-mcp": "dist/bin/mcp.js"
38
38
  },
39
39
  "scripts": {
40
40
  "build": "tsc -p tsconfig.build.json"
41
41
  },
42
42
  "dependencies": {
43
- "@volter/browser-runtime": "^0.1.3"
43
+ "@volter/browser-runtime": "^0.1.4"
44
44
  }
45
45
  }