@cloudflare/sandbox 0.0.0-1be7d53 → 0.0.0-1bf3576

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.
Files changed (74) hide show
  1. package/CHANGELOG.md +91 -6
  2. package/Dockerfile +91 -51
  3. package/README.md +87 -825
  4. package/dist/index.d.ts +1907 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +3159 -0
  7. package/dist/index.js.map +1 -0
  8. package/package.json +16 -8
  9. package/src/clients/base-client.ts +295 -0
  10. package/src/clients/command-client.ts +115 -0
  11. package/src/clients/file-client.ts +300 -0
  12. package/src/clients/git-client.ts +91 -0
  13. package/src/clients/index.ts +60 -0
  14. package/src/clients/interpreter-client.ts +333 -0
  15. package/src/clients/port-client.ts +105 -0
  16. package/src/clients/process-client.ts +180 -0
  17. package/src/clients/sandbox-client.ts +39 -0
  18. package/src/clients/types.ts +88 -0
  19. package/src/clients/utility-client.ts +123 -0
  20. package/src/errors/adapter.ts +238 -0
  21. package/src/errors/classes.ts +594 -0
  22. package/src/errors/index.ts +109 -0
  23. package/src/file-stream.ts +123 -116
  24. package/src/index.ts +85 -66
  25. package/src/interpreter.ts +58 -40
  26. package/src/request-handler.ts +94 -55
  27. package/src/sandbox.ts +989 -498
  28. package/src/security.ts +34 -28
  29. package/src/sse-parser.ts +8 -11
  30. package/src/version.ts +6 -0
  31. package/startup.sh +3 -0
  32. package/tests/base-client.test.ts +364 -0
  33. package/tests/command-client.test.ts +444 -0
  34. package/tests/file-client.test.ts +831 -0
  35. package/tests/file-stream.test.ts +310 -0
  36. package/tests/get-sandbox.test.ts +149 -0
  37. package/tests/git-client.test.ts +415 -0
  38. package/tests/port-client.test.ts +293 -0
  39. package/tests/process-client.test.ts +683 -0
  40. package/tests/request-handler.test.ts +292 -0
  41. package/tests/sandbox.test.ts +702 -0
  42. package/tests/sse-parser.test.ts +291 -0
  43. package/tests/utility-client.test.ts +339 -0
  44. package/tests/version.test.ts +16 -0
  45. package/tests/wrangler.jsonc +35 -0
  46. package/tsconfig.json +9 -1
  47. package/tsdown.config.ts +12 -0
  48. package/vitest.config.ts +31 -0
  49. package/container_src/bun.lock +0 -76
  50. package/container_src/circuit-breaker.ts +0 -121
  51. package/container_src/control-process.ts +0 -784
  52. package/container_src/handler/exec.ts +0 -185
  53. package/container_src/handler/file.ts +0 -457
  54. package/container_src/handler/git.ts +0 -130
  55. package/container_src/handler/ports.ts +0 -314
  56. package/container_src/handler/process.ts +0 -568
  57. package/container_src/handler/session.ts +0 -92
  58. package/container_src/index.ts +0 -601
  59. package/container_src/interpreter-service.ts +0 -276
  60. package/container_src/isolation.ts +0 -1213
  61. package/container_src/mime-processor.ts +0 -255
  62. package/container_src/package.json +0 -18
  63. package/container_src/runtime/executors/javascript/node_executor.ts +0 -123
  64. package/container_src/runtime/executors/python/ipython_executor.py +0 -338
  65. package/container_src/runtime/executors/typescript/ts_executor.ts +0 -138
  66. package/container_src/runtime/process-pool.ts +0 -464
  67. package/container_src/shell-escape.ts +0 -42
  68. package/container_src/startup.sh +0 -11
  69. package/container_src/types.ts +0 -131
  70. package/src/client.ts +0 -1048
  71. package/src/errors.ts +0 -219
  72. package/src/interpreter-client.ts +0 -352
  73. package/src/interpreter-types.ts +0 -390
  74. package/src/types.ts +0 -571
package/CHANGELOG.md CHANGED
@@ -1,22 +1,107 @@
1
1
  # @cloudflare/sandbox
2
2
 
3
- ## 0.3.6
3
+ ## 0.4.13
4
4
 
5
5
  ### Patch Changes
6
6
 
7
- - [#90](https://github.com/cloudflare/sandbox-sdk/pull/90) [`66cc85b`](https://github.com/cloudflare/sandbox-sdk/commit/66cc85b679b466b3ffb1f00fbd697670fc186f06) Thanks [@eastlondoner](https://github.com/eastlondoner)! - set bun idletimeout
7
+ - [#168](https://github.com/cloudflare/sandbox-sdk/pull/168) [`6b08f02`](https://github.com/cloudflare/sandbox-sdk/commit/6b08f02c061aef07cc98188abef2973ac92365f8) Thanks [@threepointone](https://github.com/threepointone)! - Fix type generation
8
8
 
9
- ## 0.3.5
9
+ We inline types from `@repo/shared` so that it includes the types we reexport. Fixes #165
10
+
11
+ - [#162](https://github.com/cloudflare/sandbox-sdk/pull/162) [`c4db459`](https://github.com/cloudflare/sandbox-sdk/commit/c4db459389a7b86048a03410d67d4dd7bf4a6085) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - Add WebSocket support via connect() method for routing client WebSocket connections directly to container services
12
+
13
+ ## 0.4.12
14
+
15
+ ### Patch Changes
16
+
17
+ - [#137](https://github.com/cloudflare/sandbox-sdk/pull/137) [`7f4442b`](https://github.com/cloudflare/sandbox-sdk/commit/7f4442b7a097587d8f8e8f9ff2f887df6943a3db) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - add keepAlive flag to prevent containers from shutting down
18
+
19
+ ## 0.4.11
20
+
21
+ ### Patch Changes
22
+
23
+ - [#159](https://github.com/cloudflare/sandbox-sdk/pull/159) [`e16659a`](https://github.com/cloudflare/sandbox-sdk/commit/e16659a1815923f1cd1176f51a052725d820ee16) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Use latest containers package version
24
+
25
+ ## 0.4.10
26
+
27
+ ### Patch Changes
28
+
29
+ - [#156](https://github.com/cloudflare/sandbox-sdk/pull/156) [`b61841c`](https://github.com/cloudflare/sandbox-sdk/commit/b61841cfb3248022ee8136311e54955ed9faa1ee) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix WebSocket upgrade requests through exposed ports
30
+
31
+ ## 0.4.9
10
32
 
11
33
  ### Patch Changes
12
34
 
13
- - [#88](https://github.com/cloudflare/sandbox-sdk/pull/88) [`46eb4e6`](https://github.com/cloudflare/sandbox-sdk/commit/46eb4e6b6c671b682fc74f83563ccf5f316011cb) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Add binary file support with automatic MIME detection and streaming
35
+ - [#152](https://github.com/cloudflare/sandbox-sdk/pull/152) [`8e7773e`](https://github.com/cloudflare/sandbox-sdk/commit/8e7773ec9571a5f968cbbc5f48e38e01d7d13b77) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Add exists() method to check if a file or directory exists
36
+
37
+ This adds a new `exists()` method to the SDK that checks whether a file or directory exists at a given path. The method returns a boolean indicating existence, similar to Python's `os.path.exists()` and JavaScript's `fs.existsSync()`.
38
+
39
+ The implementation is end-to-end:
40
+
41
+ - New `FileExistsResult` and `FileExistsRequest` types in shared package
42
+ - Handler endpoint at `/api/exists` in container layer
43
+ - Client method in `FileClient` and `Sandbox` classes
44
+ - Full test coverage (unit tests and E2E tests)
45
+
46
+ ## 0.4.8
47
+
48
+ ### Patch Changes
49
+
50
+ - [#153](https://github.com/cloudflare/sandbox-sdk/pull/153) [`f6a5c3e`](https://github.com/cloudflare/sandbox-sdk/commit/f6a5c3e1607fce5fc26f816e9206ae437898d5af) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix token extraction regex causing Invalid token errors
51
+
52
+ ## 0.4.7
53
+
54
+ ### Patch Changes
55
+
56
+ - [#141](https://github.com/cloudflare/sandbox-sdk/pull/141) [`c39674b`](https://github.com/cloudflare/sandbox-sdk/commit/c39674b8fe2e986e59a794b6bb3a5f51a87bae89) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix commands hanging when reading stdin by redirecting stdin to /dev/null
57
+
58
+ - [#143](https://github.com/cloudflare/sandbox-sdk/pull/143) [`276efc0`](https://github.com/cloudflare/sandbox-sdk/commit/276efc0ca8776bcc8de79e7e58dd24d9f418cc5c) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Remove unnecessary existing session check
59
+
60
+ ## 0.4.6
61
+
62
+ ### Patch Changes
63
+
64
+ - [#133](https://github.com/cloudflare/sandbox-sdk/pull/133) [`da2cfb8`](https://github.com/cloudflare/sandbox-sdk/commit/da2cfb876675eb3445970c90b4d70d00288a7c74) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - feat: Add version sync detection between npm package and Docker image
65
+
66
+ ## 0.4.5
67
+
68
+ ### Patch Changes
69
+
70
+ - [#127](https://github.com/cloudflare/sandbox-sdk/pull/127) [`e79ac80`](https://github.com/cloudflare/sandbox-sdk/commit/e79ac80bc855a3ec527d44cc14585794b23cb129) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - configurable sleepAfter
71
+
72
+ ## 0.4.4
73
+
74
+ ### Patch Changes
75
+
76
+ - [#125](https://github.com/cloudflare/sandbox-sdk/pull/125) [`fddccfd`](https://github.com/cloudflare/sandbox-sdk/commit/fddccfdce8204ce2aa7dadc0ad9fb2acbdeaec51) Thanks [@whoiskatrin](https://github.com/whoiskatrin)! - add docker image to pkg workflow
77
+
78
+ ## 0.4.3
79
+
80
+ ### Patch Changes
81
+
82
+ - [#114](https://github.com/cloudflare/sandbox-sdk/pull/114) [`8c1f440`](https://github.com/cloudflare/sandbox-sdk/commit/8c1f440ad6fd89a5c69f9ca9d055ad9b183dd1c3) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Debloat base docker image (2.63GB → 1.03GB)
83
+
84
+ ## 0.4.2
85
+
86
+ ### Patch Changes
87
+
88
+ - [`e53d7e7`](https://github.com/cloudflare/sandbox-sdk/commit/e53d7e7ce185f79bdd899029bb532e9651ae7ba5) Thanks [@threepointone](https://github.com/threepointone)! - fix build by inlining repo/shared
89
+
90
+ ## 0.4.1
91
+
92
+ ### Patch Changes
93
+
94
+ - [#111](https://github.com/cloudflare/sandbox-sdk/pull/111) [`1b5496b`](https://github.com/cloudflare/sandbox-sdk/commit/1b5496bfceaee53c31911b409476ea87bebffe4c) Thanks [@threepointone](https://github.com/threepointone)! - trigger a release
95
+
96
+ ## 0.4.0
97
+
98
+ ### Minor Changes
14
99
 
15
- ## 0.3.4
100
+ - [#95](https://github.com/cloudflare/sandbox-sdk/pull/95) [`7aee736`](https://github.com/cloudflare/sandbox-sdk/commit/7aee736bf07a4bf9020e2109bdaaa70214d52a01) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Rewrite SDK with cleaner design patterns and tests. Remove the unnecessary isolation cruft and fix foundational issues with streaming, sessions, validations and error handling. Cover the SDK with unit & e2e tests.
16
101
 
17
102
  ### Patch Changes
18
103
 
19
- - [#86](https://github.com/cloudflare/sandbox-sdk/pull/86) [`feafd32`](https://github.com/cloudflare/sandbox-sdk/commit/feafd32a51f50dfaf4994bddcbfb56d46cada622) Thanks [@ghostwriternr](https://github.com/ghostwriternr)! - Fix session reuse to reuse existing healthy session
104
+ - [#106](https://github.com/cloudflare/sandbox-sdk/pull/106) [`da947cd`](https://github.com/cloudflare/sandbox-sdk/commit/da947cd9543fc99831eefb1e8741fc905cb8fa42) Thanks [@jahands](https://github.com/jahands)! - fix examples failing to deploy and prevent committing node_modules
20
105
 
21
106
  ## 0.3.3
22
107
 
package/Dockerfile CHANGED
@@ -1,43 +1,88 @@
1
- # Sandbox base image with development tools, Python, Node.js, and Bun
2
- FROM oven/bun:latest AS bun-source
3
- FROM ubuntu:22.04
1
+ # Sandbox container image with full development environment
2
+ # Multi-stage build optimized for Turborepo monorepo
3
+
4
+ # ============================================================================
5
+ # Stage 1: Prune monorepo to only include necessary packages
6
+ # ============================================================================
7
+ FROM node:20-alpine AS pruner
8
+
9
+ WORKDIR /app
10
+
11
+ # Install Turborepo globally
12
+ RUN npm install -g turbo
13
+
14
+ # Copy entire monorepo
15
+ COPY . .
16
+
17
+ # Prune to only @repo/sandbox-container and its dependencies (@repo/shared)
18
+ # The --docker flag generates out/json and out/full directories
19
+ RUN turbo prune @repo/sandbox-container --docker
20
+
21
+ # ============================================================================
22
+ # Stage 2: Install dependencies and build packages
23
+ # ============================================================================
24
+ FROM node:20-alpine AS builder
25
+
26
+ WORKDIR /app
27
+
28
+ # Copy pruned lockfile and package.json files (for Docker layer caching)
29
+ COPY --from=pruner /app/out/json/ .
30
+ COPY --from=pruner /app/out/package-lock.json ./package-lock.json
31
+
32
+ # Install ALL dependencies (including devDependencies for build)
33
+ RUN npm ci
34
+
35
+ # Copy pruned source code
36
+ COPY --from=pruner /app/out/full/ .
37
+
38
+ # Build all packages (Turborepo handles dependency order automatically)
39
+ # This builds @repo/shared first, then @repo/sandbox-container
40
+ RUN npx turbo run build
41
+
42
+ # ============================================================================
43
+ # Stage 3: Install production-only dependencies
44
+ # ============================================================================
45
+ FROM node:20-alpine AS prod-deps
46
+
47
+ WORKDIR /app
48
+
49
+ # Copy package files from builder
50
+ COPY --from=builder /app/package.json ./package.json
51
+ COPY --from=builder /app/package-lock.json ./package-lock.json
52
+ COPY --from=builder /app/packages ./packages
53
+ COPY --from=builder /app/tooling ./tooling
54
+
55
+ # Install ONLY production dependencies (excludes typescript, @types/*, etc.)
56
+ RUN npm ci --production
57
+
58
+ # ============================================================================
59
+ # Stage 4: Runtime - Ubuntu 22.04 with only runtime dependencies
60
+ # ============================================================================
61
+ FROM ubuntu:22.04 AS runtime
62
+
63
+ # Accept version as build argument (passed from npm_package_version)
64
+ ARG SANDBOX_VERSION=unknown
4
65
 
5
66
  # Prevent interactive prompts during package installation
6
67
  ENV DEBIAN_FRONTEND=noninteractive
7
68
 
8
- # Install essential system packages and development tools
9
- RUN apt-get update && apt-get install -y \
10
- # Basic utilities
69
+ # Set the sandbox version as an environment variable for version checking
70
+ ENV SANDBOX_VERSION=${SANDBOX_VERSION}
71
+
72
+ # Install essential runtime packages
73
+ RUN apt-get update && apt-get install -y --no-install-recommends \
11
74
  curl \
12
75
  wget \
76
+ ca-certificates \
77
+ python3.11 \
78
+ python3-pip \
79
+ python3.11-venv \
80
+ procps \
13
81
  git \
14
82
  unzip \
15
83
  zip \
16
- file \
17
- # Process management
18
- procps \
19
- htop \
20
- # Build tools
21
- build-essential \
22
- pkg-config \
23
- # Network tools
24
- net-tools \
25
- iputils-ping \
26
- dnsutils \
27
- # Text processing
28
84
  jq \
29
- vim \
30
- nano \
31
- # Python dependencies
32
- python3.11 \
33
- python3.11-dev \
34
- python3-pip \
35
- python3.11-venv \
36
- # Other useful tools
37
- ca-certificates \
38
- gnupg \
39
- lsb-release \
40
- strace \
85
+ file \
41
86
  && rm -rf /var/lib/apt/lists/*
42
87
 
43
88
  # Set Python 3.11 as default python3
@@ -48,9 +93,8 @@ RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
48
93
  && apt-get install -y nodejs \
49
94
  && rm -rf /var/lib/apt/lists/*
50
95
 
51
- # Install Bun from official image (avoids architecture compatibility issues)
52
- COPY --from=bun-source /usr/local/bin/bun /usr/local/bin/bun
53
- COPY --from=bun-source /usr/local/bin/bunx /usr/local/bin/bunx
96
+ # Install Bun runtime from official image
97
+ COPY --from=oven/bun:1 /usr/local/bin/bun /usr/local/bin/bun
54
98
 
55
99
  # Install essential Python packages for code execution
56
100
  RUN pip3 install --no-cache-dir \
@@ -59,25 +103,23 @@ RUN pip3 install --no-cache-dir \
59
103
  pandas \
60
104
  ipython
61
105
 
62
- # Set up container server directory
106
+ # Set up runtime container server directory
63
107
  WORKDIR /container-server
64
108
 
65
- # Verify installations
66
- RUN python3 --version && \
67
- node --version && \
68
- npm --version && \
69
- bun --version
109
+ # Copy built sandbox-container package
110
+ COPY --from=builder /app/packages/sandbox-container/dist ./dist
111
+ COPY --from=builder /app/packages/sandbox-container/package.json ./package.json
70
112
 
71
- # Copy container source files to server directory
72
- COPY container_src/package.json container_src/bun.lock ./
73
- RUN bun install --frozen-lockfile
113
+ # Copy Python executor to runtime location
114
+ COPY --from=builder /app/packages/sandbox-container/src/runtime/executors/python/ipython_executor.py ./dist/runtime/executors/python/
74
115
 
75
- COPY container_src/ ./
116
+ # Copy production-only node_modules (excludes typescript, @types/*, etc.)
117
+ # Includes: @repo/shared, zod, esbuild (runtime dependencies)
118
+ COPY --from=prod-deps /app/node_modules ./node_modules
76
119
 
77
- # Compile TypeScript files using the locally installed TypeScript
78
- RUN npx tsc control-process.ts --outDir . --module commonjs --target es2020 --esModuleInterop --skipLibCheck
79
- RUN cd runtime/executors/javascript && npx tsc node_executor.ts --module commonjs --target es2020 --esModuleInterop --skipLibCheck
80
- RUN cd runtime/executors/typescript && npx tsc ts_executor.ts --module commonjs --target es2020 --esModuleInterop --skipLibCheck
120
+ # Copy workspace packages
121
+ COPY --from=prod-deps /app/packages/shared/dist ./packages/shared/dist
122
+ COPY --from=prod-deps /app/packages/shared/package.json ./packages/shared/package.json
81
123
 
82
124
  # Configure process pool sizes (can be overridden at runtime)
83
125
  ENV PYTHON_POOL_MIN_SIZE=3
@@ -88,15 +130,13 @@ ENV TYPESCRIPT_POOL_MIN_SIZE=3
88
130
  ENV TYPESCRIPT_POOL_MAX_SIZE=10
89
131
 
90
132
  # Create clean workspace directory for user code
91
- # Architecture:
92
- # /container-server/ - SDK infrastructure (server, executors, dependencies)
93
- # /workspace/ - User's clean workspace for their code
94
133
  RUN mkdir -p /workspace
95
134
 
96
135
  # Expose the application port (3000 for control)
97
136
  EXPOSE 3000
98
137
 
99
- # Make startup script executable
138
+ # Copy and make startup script executable
139
+ COPY packages/sandbox/startup.sh ./
100
140
  RUN chmod +x startup.sh
101
141
 
102
142
  # Use startup script