@sandbank.dev/boxlite 0.3.2 → 0.3.3
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/README.md +9 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +3 -1
- package/dist/local-client.d.ts.map +1 -1
- package/dist/local-client.js +81 -43
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -63,6 +63,15 @@ const { stdout } = await sandbox.exec('echo hello')
|
|
|
63
63
|
await provider.destroy(sandbox.id)
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
+
### Local OCI rootfs (skip registry pull)
|
|
67
|
+
|
|
68
|
+
If `image` is an absolute path, it is treated as a local OCI layout directory:
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
// Export image: skopeo copy docker-daemon:myimage:latest oci:~/.boxlite/myimage-oci:latest
|
|
72
|
+
const sandbox = await provider.create({ image: '/Users/you/.boxlite/myimage-oci' })
|
|
73
|
+
```
|
|
74
|
+
|
|
66
75
|
### OAuth2 authentication (remote mode)
|
|
67
76
|
|
|
68
77
|
```typescript
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,YAAY,EAGZ,UAAU,EACV,cAAc,EACd,WAAW,EAIZ,MAAM,oBAAoB,CAAA;AAI3B,OAAO,KAAK,EAAE,oBAAoB,EAA6B,MAAM,YAAY,CAAA;AAoKjF,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,IAAI,aAAY;IACzB,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,UAAU,CAAC,CAAA;IAE9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;gBAEtD,MAAM,EAAE,oBAAoB;IAalC,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EACV,YAAY,EAGZ,UAAU,EACV,cAAc,EACd,WAAW,EAIZ,MAAM,oBAAoB,CAAA;AAI3B,OAAO,KAAK,EAAE,oBAAoB,EAA6B,MAAM,YAAY,CAAA;AAoKjF,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,IAAI,aAAY;IACzB,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,UAAU,CAAC,CAAA;IAE9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyC;gBAEtD,MAAM,EAAE,oBAAoB;IAalC,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IAgD5D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAW/C,aAAa,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA0B1D,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU/C,8EAA8E;IACxE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
package/dist/adapter.js
CHANGED
|
@@ -162,8 +162,10 @@ export class BoxLiteAdapter {
|
|
|
162
162
|
}
|
|
163
163
|
async createSandbox(config) {
|
|
164
164
|
try {
|
|
165
|
+
// If image looks like an absolute path, treat it as a local OCI rootfs
|
|
166
|
+
const isLocalPath = config.image.startsWith('/');
|
|
165
167
|
const box = await this.client.createBox({
|
|
166
|
-
image: config.image,
|
|
168
|
+
...(isLocalPath ? { rootfs_path: config.image } : { image: config.image }),
|
|
167
169
|
cpu: config.resources?.cpu,
|
|
168
170
|
memory_mb: config.resources?.memory,
|
|
169
171
|
disk_size_gb: config.resources?.disk,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-client.d.ts","sourceRoot":"","sources":["../src/local-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,aAAa,EAGb,kBAAkB,EAEnB,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"local-client.d.ts","sourceRoot":"","sources":["../src/local-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,aAAa,EAGb,kBAAkB,EAEnB,MAAM,YAAY,CAAA;AA6XnB;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,aAAa,CAsRlF"}
|
package/dist/local-client.js
CHANGED
|
@@ -37,39 +37,28 @@ class Bridge:
|
|
|
37
37
|
if self._runtime is not None:
|
|
38
38
|
return
|
|
39
39
|
|
|
40
|
-
#
|
|
40
|
+
# Create a Boxlite runtime for the custom home_dir, then use SimpleBox
|
|
41
|
+
# with that runtime. SimpleBox's exec is more stable for rapid consecutive
|
|
42
|
+
# calls than Boxlite.create(BoxOptions).exec().
|
|
41
43
|
Options = getattr(boxlite, "Options", None)
|
|
42
44
|
Boxlite = getattr(boxlite, "Boxlite", None)
|
|
43
45
|
if Options and Boxlite:
|
|
44
46
|
try:
|
|
45
47
|
opts = Options(home_dir=self._home)
|
|
46
|
-
|
|
47
|
-
self._runtime = rt
|
|
48
|
-
return
|
|
48
|
+
self._boxlite_rt = Boxlite(opts)
|
|
49
49
|
except Exception:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
for attr in ("BoxliteRuntime", "Runtime", "runtime"):
|
|
54
|
-
cls = getattr(boxlite, attr, None)
|
|
55
|
-
if cls is None:
|
|
56
|
-
continue
|
|
57
|
-
try:
|
|
58
|
-
rt = cls(home=self._home) if callable(cls) else cls
|
|
59
|
-
if asyncio.iscoroutinefunction(getattr(rt, "start", None)):
|
|
60
|
-
await rt.start()
|
|
61
|
-
self._runtime = rt
|
|
62
|
-
return
|
|
63
|
-
except Exception:
|
|
64
|
-
continue
|
|
50
|
+
self._boxlite_rt = None
|
|
51
|
+
else:
|
|
52
|
+
self._boxlite_rt = None
|
|
65
53
|
|
|
66
|
-
#
|
|
54
|
+
# Use SimpleBox with the runtime (handles home_dir correctly)
|
|
67
55
|
self._runtime = "simple_box"
|
|
68
56
|
|
|
69
57
|
async def create(self, params):
|
|
70
58
|
await self._ensure_runtime()
|
|
71
59
|
|
|
72
|
-
image = params
|
|
60
|
+
image = params.get("image", "")
|
|
61
|
+
rootfs = params.get("rootfs_path")
|
|
73
62
|
now = datetime.now(timezone.utc).isoformat()
|
|
74
63
|
|
|
75
64
|
# Normalize env/ports
|
|
@@ -82,7 +71,8 @@ class Bridge:
|
|
|
82
71
|
|
|
83
72
|
if self._runtime == "simple_box":
|
|
84
73
|
# SimpleBox uses: image, memory_mib, cpus, disk_size_gb, env, working_dir
|
|
85
|
-
|
|
74
|
+
# rootfs_path overrides image when provided (local OCI layout directory)
|
|
75
|
+
sb_kwargs = {"rootfs_path": rootfs} if rootfs else {"image": image}
|
|
86
76
|
if params.get("cpu") is not None:
|
|
87
77
|
sb_kwargs["cpus"] = params["cpu"]
|
|
88
78
|
if params.get("memory_mb") is not None:
|
|
@@ -96,6 +86,9 @@ class Bridge:
|
|
|
96
86
|
if ports is not None:
|
|
97
87
|
sb_kwargs["ports"] = ports
|
|
98
88
|
|
|
89
|
+
# Pass the Boxlite runtime to SimpleBox so it uses the correct home_dir
|
|
90
|
+
if getattr(self, "_boxlite_rt", None) is not None:
|
|
91
|
+
sb_kwargs["runtime"] = self._boxlite_rt
|
|
99
92
|
sb = boxlite.SimpleBox(**sb_kwargs)
|
|
100
93
|
box = await sb.__aenter__()
|
|
101
94
|
box_id = str(getattr(box, "id", None)
|
|
@@ -107,21 +100,28 @@ class Bridge:
|
|
|
107
100
|
# Boxlite.create(BoxOptions(...), name=None)
|
|
108
101
|
BoxOptions = getattr(boxlite, "BoxOptions", None)
|
|
109
102
|
if BoxOptions is not None:
|
|
110
|
-
|
|
103
|
+
opt_kwargs = {}
|
|
104
|
+
if rootfs:
|
|
105
|
+
opt_kwargs["rootfs_path"] = rootfs
|
|
106
|
+
else:
|
|
107
|
+
opt_kwargs["image"] = image
|
|
111
108
|
if params.get("cpu") is not None:
|
|
112
|
-
|
|
109
|
+
opt_kwargs["cpus"] = params["cpu"]
|
|
113
110
|
if params.get("memory_mb") is not None:
|
|
114
|
-
|
|
111
|
+
opt_kwargs["memory_mib"] = params["memory_mb"]
|
|
115
112
|
if params.get("disk_size_gb") is not None:
|
|
116
|
-
|
|
113
|
+
opt_kwargs["disk_size_gb"] = params["disk_size_gb"]
|
|
117
114
|
if env is not None:
|
|
118
|
-
|
|
115
|
+
opt_kwargs["env"] = env
|
|
119
116
|
if params.get("working_dir") is not None:
|
|
120
|
-
|
|
117
|
+
opt_kwargs["working_dir"] = params["working_dir"]
|
|
118
|
+
if ports is not None:
|
|
119
|
+
opt_kwargs["ports"] = ports
|
|
120
|
+
opts = BoxOptions(**opt_kwargs)
|
|
121
121
|
box = await self._runtime.create(opts)
|
|
122
122
|
else:
|
|
123
123
|
# Legacy fallback: pass as kwargs
|
|
124
|
-
kwargs = {"image": image}
|
|
124
|
+
kwargs = {"rootfs_path": rootfs} if rootfs else {"image": image}
|
|
125
125
|
for k in ("cpu", "memory_mb", "disk_size_gb", "working_dir"):
|
|
126
126
|
if params.get(k) is not None:
|
|
127
127
|
kwargs[k] = params[k]
|
|
@@ -206,23 +206,61 @@ class Bridge:
|
|
|
206
206
|
if result is None:
|
|
207
207
|
raise RuntimeError(f"All exec strategies failed: {'; '.join(errors)}")
|
|
208
208
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
209
|
+
stdout = ""
|
|
210
|
+
stderr = ""
|
|
211
|
+
exit_code = 0
|
|
212
212
|
|
|
213
|
-
#
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
213
|
+
# Execution object (Boxlite runtime API): collect stdout/stderr streams, then wait
|
|
214
|
+
if hasattr(result, "wait") and callable(result.wait):
|
|
215
|
+
async def _collect(stream_fn):
|
|
216
|
+
try:
|
|
217
|
+
buf = bytearray()
|
|
218
|
+
async for chunk in stream_fn():
|
|
219
|
+
if isinstance(chunk, (bytes, bytearray)):
|
|
220
|
+
buf.extend(chunk)
|
|
221
|
+
else:
|
|
222
|
+
buf.extend(str(chunk).encode("utf-8"))
|
|
223
|
+
return buf.decode("utf-8", errors="replace")
|
|
224
|
+
except Exception:
|
|
225
|
+
return ""
|
|
226
|
+
|
|
227
|
+
# Read stdout/stderr concurrently to avoid pipe deadlocks
|
|
228
|
+
tasks = []
|
|
229
|
+
has_stdout = hasattr(result, "stdout") and callable(result.stdout)
|
|
230
|
+
has_stderr = hasattr(result, "stderr") and callable(result.stderr)
|
|
231
|
+
if has_stdout:
|
|
232
|
+
tasks.append(asyncio.create_task(_collect(result.stdout)))
|
|
233
|
+
if has_stderr:
|
|
234
|
+
tasks.append(asyncio.create_task(_collect(result.stderr)))
|
|
235
|
+
|
|
236
|
+
if tasks:
|
|
237
|
+
collected = await asyncio.gather(*tasks)
|
|
238
|
+
idx = 0
|
|
239
|
+
if has_stdout:
|
|
240
|
+
stdout = collected[idx]; idx += 1
|
|
241
|
+
if has_stderr:
|
|
242
|
+
stderr = collected[idx]
|
|
243
|
+
|
|
244
|
+
exec_result = await result.wait()
|
|
245
|
+
exit_code = int(getattr(exec_result, "exit_code",
|
|
246
|
+
getattr(exec_result, "returncode", 0)) or 0)
|
|
247
|
+
else:
|
|
248
|
+
# SimpleBox / legacy: result already has stdout/stderr as attributes
|
|
249
|
+
raw_stdout = getattr(result, "stdout", "")
|
|
250
|
+
raw_stderr = getattr(result, "stderr", "")
|
|
251
|
+
if callable(raw_stdout):
|
|
252
|
+
raw_stdout = raw_stdout()
|
|
253
|
+
if callable(raw_stderr):
|
|
254
|
+
raw_stderr = raw_stderr()
|
|
255
|
+
stdout = str(raw_stdout or "")
|
|
256
|
+
stderr = str(raw_stderr or "")
|
|
257
|
+
exit_code = int(getattr(result, "exit_code",
|
|
258
|
+
getattr(result, "returncode", 0)) or 0)
|
|
220
259
|
|
|
221
260
|
return {
|
|
222
|
-
"stdout":
|
|
223
|
-
"stderr":
|
|
224
|
-
"exit_code":
|
|
225
|
-
getattr(result, "returncode", 0)) or 0),
|
|
261
|
+
"stdout": stdout,
|
|
262
|
+
"stderr": stderr,
|
|
263
|
+
"exit_code": exit_code,
|
|
226
264
|
}
|
|
227
265
|
|
|
228
266
|
async def destroy(self, box_id):
|
package/dist/types.d.ts
CHANGED
|
@@ -90,7 +90,9 @@ export interface BoxLiteSnapshot {
|
|
|
90
90
|
container_disk_bytes?: number;
|
|
91
91
|
}
|
|
92
92
|
export interface BoxLiteCreateParams {
|
|
93
|
-
image
|
|
93
|
+
image?: string;
|
|
94
|
+
/** Path to a local OCI layout directory. When set, overrides `image` (no registry pull). */
|
|
95
|
+
rootfs_path?: string;
|
|
94
96
|
name?: string;
|
|
95
97
|
cpu?: number;
|
|
96
98
|
memory_mb?: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|