@ricsam/isolate 0.0.1 → 0.1.1

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 (299) hide show
  1. package/README.md +243 -34
  2. package/dist/cjs/bridge/diagnostics.cjs +58 -0
  3. package/dist/cjs/bridge/diagnostics.cjs.map +10 -0
  4. package/dist/cjs/bridge/legacy-adapters.cjs +242 -0
  5. package/dist/cjs/bridge/legacy-adapters.cjs.map +10 -0
  6. package/dist/cjs/bridge/request-context.cjs +59 -0
  7. package/dist/cjs/bridge/request-context.cjs.map +10 -0
  8. package/dist/cjs/bridge/runtime-bindings.cjs +367 -0
  9. package/dist/cjs/bridge/runtime-bindings.cjs.map +10 -0
  10. package/dist/cjs/browser/browser-runtime.cjs +157 -0
  11. package/dist/cjs/browser/browser-runtime.cjs.map +10 -0
  12. package/dist/cjs/daemon.cjs +91 -0
  13. package/dist/cjs/daemon.cjs.map +10 -0
  14. package/dist/cjs/files/index.cjs +140 -0
  15. package/dist/cjs/files/index.cjs.map +10 -0
  16. package/dist/cjs/host/create-isolate-host.cjs +235 -0
  17. package/dist/cjs/host/create-isolate-host.cjs.map +10 -0
  18. package/dist/cjs/host/index.cjs +47 -0
  19. package/dist/cjs/host/index.cjs.map +10 -0
  20. package/dist/cjs/index.cjs +55 -0
  21. package/dist/cjs/index.cjs.map +10 -0
  22. package/dist/cjs/internal/client/connection.cjs +1919 -0
  23. package/dist/cjs/internal/client/connection.cjs.map +10 -0
  24. package/dist/cjs/internal/client/index.cjs +48 -0
  25. package/dist/cjs/internal/client/index.cjs.map +10 -0
  26. package/dist/cjs/internal/client/types.cjs +30 -0
  27. package/dist/cjs/internal/client/types.cjs.map +9 -0
  28. package/dist/cjs/internal/console/index.cjs +506 -0
  29. package/dist/cjs/internal/console/index.cjs.map +10 -0
  30. package/dist/cjs/internal/console/utils.cjs +70 -0
  31. package/dist/cjs/internal/console/utils.cjs.map +10 -0
  32. package/dist/cjs/internal/core/index.cjs +2745 -0
  33. package/dist/cjs/internal/core/index.cjs.map +10 -0
  34. package/dist/cjs/internal/crypto/index.cjs +470 -0
  35. package/dist/cjs/internal/crypto/index.cjs.map +10 -0
  36. package/dist/cjs/internal/daemon/callback-fs-handler.cjs +355 -0
  37. package/dist/cjs/internal/daemon/callback-fs-handler.cjs.map +10 -0
  38. package/dist/cjs/internal/daemon/connection.cjs +1952 -0
  39. package/dist/cjs/internal/daemon/connection.cjs.map +10 -0
  40. package/dist/cjs/internal/daemon/daemon.cjs +98 -0
  41. package/dist/cjs/internal/daemon/daemon.cjs.map +10 -0
  42. package/dist/cjs/internal/daemon/index.cjs +145 -0
  43. package/dist/cjs/internal/daemon/index.cjs.map +10 -0
  44. package/dist/cjs/internal/daemon/runtime-pool.cjs +106 -0
  45. package/dist/cjs/internal/daemon/runtime-pool.cjs.map +10 -0
  46. package/dist/cjs/internal/daemon/types.cjs +30 -0
  47. package/dist/cjs/internal/daemon/types.cjs.map +9 -0
  48. package/dist/cjs/internal/encoding/index.cjs +419 -0
  49. package/dist/cjs/internal/encoding/index.cjs.map +10 -0
  50. package/dist/cjs/internal/fetch/consistency/origins.cjs +598 -0
  51. package/dist/cjs/internal/fetch/consistency/origins.cjs.map +10 -0
  52. package/dist/cjs/internal/fetch/index.cjs +2640 -0
  53. package/dist/cjs/internal/fetch/index.cjs.map +10 -0
  54. package/dist/cjs/internal/fetch/stream-state.cjs +256 -0
  55. package/dist/cjs/internal/fetch/stream-state.cjs.map +10 -0
  56. package/dist/cjs/internal/fs/index.cjs +847 -0
  57. package/dist/cjs/internal/fs/index.cjs.map +10 -0
  58. package/dist/cjs/internal/fs/node-adapter.cjs +254 -0
  59. package/dist/cjs/internal/fs/node-adapter.cjs.map +10 -0
  60. package/dist/cjs/internal/module-loader/bundle.cjs +482 -0
  61. package/dist/cjs/internal/module-loader/bundle.cjs.map +10 -0
  62. package/dist/cjs/internal/module-loader/index.cjs +240 -0
  63. package/dist/cjs/internal/module-loader/index.cjs.map +10 -0
  64. package/dist/cjs/internal/module-loader/mappings.cjs +120 -0
  65. package/dist/cjs/internal/module-loader/mappings.cjs.map +10 -0
  66. package/dist/cjs/internal/module-loader/resolve.cjs +177 -0
  67. package/dist/cjs/internal/module-loader/resolve.cjs.map +10 -0
  68. package/dist/cjs/internal/module-loader/strip-types.cjs +236 -0
  69. package/dist/cjs/internal/module-loader/strip-types.cjs.map +10 -0
  70. package/dist/cjs/internal/path/index.cjs +503 -0
  71. package/dist/cjs/internal/path/index.cjs.map +10 -0
  72. package/dist/cjs/internal/playwright/client.cjs +49 -0
  73. package/dist/cjs/internal/playwright/client.cjs.map +10 -0
  74. package/dist/cjs/internal/playwright/handler.cjs +1416 -0
  75. package/dist/cjs/internal/playwright/handler.cjs.map +10 -0
  76. package/dist/cjs/internal/playwright/index.cjs +1289 -0
  77. package/dist/cjs/internal/playwright/index.cjs.map +10 -0
  78. package/dist/cjs/internal/playwright/types.cjs +47 -0
  79. package/dist/cjs/internal/playwright/types.cjs.map +10 -0
  80. package/dist/cjs/internal/protocol/codec.cjs +510 -0
  81. package/dist/cjs/internal/protocol/codec.cjs.map +10 -0
  82. package/dist/cjs/internal/protocol/framing.cjs +141 -0
  83. package/dist/cjs/internal/protocol/framing.cjs.map +10 -0
  84. package/dist/cjs/internal/protocol/index.cjs +110 -0
  85. package/dist/cjs/internal/protocol/index.cjs.map +10 -0
  86. package/dist/cjs/internal/protocol/marshalValue.cjs +518 -0
  87. package/dist/cjs/internal/protocol/marshalValue.cjs.map +10 -0
  88. package/dist/cjs/internal/protocol/serialization.cjs +109 -0
  89. package/dist/cjs/internal/protocol/serialization.cjs.map +10 -0
  90. package/dist/cjs/internal/protocol/types.cjs +181 -0
  91. package/dist/cjs/internal/protocol/types.cjs.map +10 -0
  92. package/dist/cjs/internal/runtime/index.cjs +1235 -0
  93. package/dist/cjs/internal/runtime/index.cjs.map +10 -0
  94. package/dist/cjs/internal/server/index.cjs +223 -0
  95. package/dist/cjs/internal/server/index.cjs.map +10 -0
  96. package/dist/cjs/internal/test-environment/index.cjs +1415 -0
  97. package/dist/cjs/internal/test-environment/index.cjs.map +10 -0
  98. package/dist/cjs/internal/timers/index.cjs +200 -0
  99. package/dist/cjs/internal/timers/index.cjs.map +10 -0
  100. package/dist/cjs/internal/transform/index.cjs +361 -0
  101. package/dist/cjs/internal/transform/index.cjs.map +10 -0
  102. package/dist/cjs/internal/typecheck/index.cjs +60 -0
  103. package/dist/cjs/internal/typecheck/index.cjs.map +10 -0
  104. package/dist/cjs/internal/typecheck/isolate-types.cjs +2614 -0
  105. package/dist/cjs/internal/typecheck/isolate-types.cjs.map +10 -0
  106. package/dist/cjs/internal/typecheck/typecheck.cjs +131 -0
  107. package/dist/cjs/internal/typecheck/typecheck.cjs.map +10 -0
  108. package/dist/cjs/modules/index.cjs +160 -0
  109. package/dist/cjs/modules/index.cjs.map +10 -0
  110. package/dist/cjs/package.json +5 -0
  111. package/dist/cjs/runtime/script-runtime.cjs +97 -0
  112. package/dist/cjs/runtime/script-runtime.cjs.map +10 -0
  113. package/dist/cjs/server/app-server.cjs +158 -0
  114. package/dist/cjs/server/app-server.cjs.map +10 -0
  115. package/dist/cjs/testing/integration-helpers.cjs +127 -0
  116. package/dist/cjs/testing/integration-helpers.cjs.map +10 -0
  117. package/dist/cjs/typecheck/index.cjs +96 -0
  118. package/dist/cjs/typecheck/index.cjs.map +10 -0
  119. package/dist/cjs/types.cjs +30 -0
  120. package/dist/cjs/types.cjs.map +9 -0
  121. package/dist/mjs/bridge/diagnostics.mjs +18 -0
  122. package/dist/mjs/bridge/diagnostics.mjs.map +10 -0
  123. package/dist/mjs/bridge/legacy-adapters.mjs +178 -0
  124. package/dist/mjs/bridge/legacy-adapters.mjs.map +10 -0
  125. package/dist/mjs/bridge/request-context.mjs +19 -0
  126. package/dist/mjs/bridge/request-context.mjs.map +10 -0
  127. package/dist/mjs/bridge/runtime-bindings.mjs +303 -0
  128. package/dist/mjs/bridge/runtime-bindings.mjs.map +10 -0
  129. package/dist/mjs/browser/browser-runtime.mjs +93 -0
  130. package/dist/mjs/browser/browser-runtime.mjs.map +10 -0
  131. package/dist/mjs/daemon.mjs +91 -0
  132. package/dist/mjs/daemon.mjs.map +10 -0
  133. package/dist/mjs/files/index.mjs +76 -0
  134. package/dist/mjs/files/index.mjs.map +10 -0
  135. package/dist/mjs/host/create-isolate-host.mjs +171 -0
  136. package/dist/mjs/host/create-isolate-host.mjs.map +10 -0
  137. package/dist/mjs/host/index.mjs +7 -0
  138. package/dist/mjs/host/index.mjs.map +10 -0
  139. package/dist/mjs/index.mjs +15 -0
  140. package/dist/mjs/index.mjs.map +10 -0
  141. package/dist/mjs/internal/client/connection.mjs +1872 -0
  142. package/dist/mjs/internal/client/connection.mjs.map +10 -0
  143. package/dist/mjs/internal/client/index.mjs +8 -0
  144. package/dist/mjs/internal/client/index.mjs.map +10 -0
  145. package/dist/mjs/internal/client/types.mjs +2 -0
  146. package/dist/mjs/internal/client/types.mjs.map +9 -0
  147. package/dist/mjs/internal/console/index.mjs +442 -0
  148. package/dist/mjs/internal/console/index.mjs.map +10 -0
  149. package/dist/mjs/internal/console/utils.mjs +30 -0
  150. package/dist/mjs/internal/console/utils.mjs.map +10 -0
  151. package/dist/mjs/internal/core/index.mjs +2681 -0
  152. package/dist/mjs/internal/core/index.mjs.map +10 -0
  153. package/dist/mjs/internal/crypto/index.mjs +406 -0
  154. package/dist/mjs/internal/crypto/index.mjs.map +10 -0
  155. package/dist/mjs/internal/daemon/callback-fs-handler.mjs +315 -0
  156. package/dist/mjs/internal/daemon/callback-fs-handler.mjs.map +10 -0
  157. package/dist/mjs/internal/daemon/connection.mjs +1931 -0
  158. package/dist/mjs/internal/daemon/connection.mjs.map +10 -0
  159. package/dist/mjs/internal/daemon/daemon.mjs +98 -0
  160. package/dist/mjs/internal/daemon/daemon.mjs.map +10 -0
  161. package/dist/mjs/internal/daemon/index.mjs +105 -0
  162. package/dist/mjs/internal/daemon/index.mjs.map +10 -0
  163. package/dist/mjs/internal/daemon/runtime-pool.mjs +66 -0
  164. package/dist/mjs/internal/daemon/runtime-pool.mjs.map +10 -0
  165. package/dist/mjs/internal/daemon/types.mjs +2 -0
  166. package/dist/mjs/internal/daemon/types.mjs.map +9 -0
  167. package/dist/mjs/internal/encoding/index.mjs +379 -0
  168. package/dist/mjs/internal/encoding/index.mjs.map +10 -0
  169. package/dist/mjs/internal/fetch/consistency/origins.mjs +558 -0
  170. package/dist/mjs/internal/fetch/consistency/origins.mjs.map +10 -0
  171. package/dist/mjs/internal/fetch/index.mjs +2580 -0
  172. package/dist/mjs/internal/fetch/index.mjs.map +10 -0
  173. package/dist/mjs/internal/fetch/stream-state.mjs +216 -0
  174. package/dist/mjs/internal/fetch/stream-state.mjs.map +10 -0
  175. package/dist/mjs/internal/fs/index.mjs +783 -0
  176. package/dist/mjs/internal/fs/index.mjs.map +10 -0
  177. package/dist/mjs/internal/fs/node-adapter.mjs +190 -0
  178. package/dist/mjs/internal/fs/node-adapter.mjs.map +10 -0
  179. package/dist/mjs/internal/module-loader/bundle.mjs +418 -0
  180. package/dist/mjs/internal/module-loader/bundle.mjs.map +10 -0
  181. package/dist/mjs/internal/module-loader/index.mjs +185 -0
  182. package/dist/mjs/internal/module-loader/index.mjs.map +10 -0
  183. package/dist/mjs/internal/module-loader/mappings.mjs +80 -0
  184. package/dist/mjs/internal/module-loader/mappings.mjs.map +10 -0
  185. package/dist/mjs/internal/module-loader/resolve.mjs +113 -0
  186. package/dist/mjs/internal/module-loader/resolve.mjs.map +10 -0
  187. package/dist/mjs/internal/module-loader/strip-types.mjs +172 -0
  188. package/dist/mjs/internal/module-loader/strip-types.mjs.map +10 -0
  189. package/dist/mjs/internal/path/index.mjs +463 -0
  190. package/dist/mjs/internal/path/index.mjs.map +10 -0
  191. package/dist/mjs/internal/playwright/client.mjs +13 -0
  192. package/dist/mjs/internal/playwright/client.mjs.map +10 -0
  193. package/dist/mjs/internal/playwright/handler.mjs +1378 -0
  194. package/dist/mjs/internal/playwright/handler.mjs.map +10 -0
  195. package/dist/mjs/internal/playwright/index.mjs +1234 -0
  196. package/dist/mjs/internal/playwright/index.mjs.map +10 -0
  197. package/dist/mjs/internal/playwright/types.mjs +7 -0
  198. package/dist/mjs/internal/playwright/types.mjs.map +10 -0
  199. package/dist/mjs/internal/protocol/codec.mjs +470 -0
  200. package/dist/mjs/internal/protocol/codec.mjs.map +10 -0
  201. package/dist/mjs/internal/protocol/framing.mjs +101 -0
  202. package/dist/mjs/internal/protocol/framing.mjs.map +10 -0
  203. package/dist/mjs/internal/protocol/index.mjs +98 -0
  204. package/dist/mjs/internal/protocol/index.mjs.map +10 -0
  205. package/dist/mjs/internal/protocol/marshalValue.mjs +494 -0
  206. package/dist/mjs/internal/protocol/marshalValue.mjs.map +10 -0
  207. package/dist/mjs/internal/protocol/serialization.mjs +69 -0
  208. package/dist/mjs/internal/protocol/serialization.mjs.map +10 -0
  209. package/dist/mjs/internal/protocol/types.mjs +141 -0
  210. package/dist/mjs/internal/protocol/types.mjs.map +10 -0
  211. package/dist/mjs/internal/runtime/index.mjs +1198 -0
  212. package/dist/mjs/internal/runtime/index.mjs.map +10 -0
  213. package/dist/mjs/internal/server/index.mjs +183 -0
  214. package/dist/mjs/internal/server/index.mjs.map +10 -0
  215. package/dist/mjs/internal/test-environment/index.mjs +1351 -0
  216. package/dist/mjs/internal/test-environment/index.mjs.map +10 -0
  217. package/dist/mjs/internal/timers/index.mjs +136 -0
  218. package/dist/mjs/internal/timers/index.mjs.map +10 -0
  219. package/dist/mjs/internal/transform/index.mjs +321 -0
  220. package/dist/mjs/internal/transform/index.mjs.map +10 -0
  221. package/dist/mjs/internal/typecheck/index.mjs +35 -0
  222. package/dist/mjs/internal/typecheck/index.mjs.map +10 -0
  223. package/dist/mjs/internal/typecheck/isolate-types.mjs +2574 -0
  224. package/dist/mjs/internal/typecheck/isolate-types.mjs.map +10 -0
  225. package/dist/mjs/internal/typecheck/typecheck.mjs +91 -0
  226. package/dist/mjs/internal/typecheck/typecheck.mjs.map +10 -0
  227. package/dist/mjs/modules/index.mjs +96 -0
  228. package/dist/mjs/modules/index.mjs.map +10 -0
  229. package/dist/mjs/package.json +5 -0
  230. package/dist/mjs/runtime/script-runtime.mjs +57 -0
  231. package/dist/mjs/runtime/script-runtime.mjs.map +10 -0
  232. package/dist/mjs/server/app-server.mjs +118 -0
  233. package/dist/mjs/server/app-server.mjs.map +10 -0
  234. package/dist/mjs/testing/integration-helpers.mjs +63 -0
  235. package/dist/mjs/testing/integration-helpers.mjs.map +10 -0
  236. package/dist/mjs/typecheck/index.mjs +56 -0
  237. package/dist/mjs/typecheck/index.mjs.map +10 -0
  238. package/dist/mjs/types.mjs +2 -0
  239. package/dist/mjs/types.mjs.map +9 -0
  240. package/dist/types/bridge/diagnostics.d.ts +12 -0
  241. package/dist/types/bridge/legacy-adapters.d.ts +14 -0
  242. package/dist/types/bridge/request-context.d.ts +10 -0
  243. package/dist/types/bridge/runtime-bindings.d.ts +14 -0
  244. package/dist/types/browser/browser-runtime.d.ts +3 -0
  245. package/dist/types/daemon.d.ts +2 -0
  246. package/dist/types/files/index.d.ts +5 -0
  247. package/dist/types/host/create-isolate-host.d.ts +2 -0
  248. package/dist/types/host/index.d.ts +1 -0
  249. package/dist/types/index.d.ts +5 -0
  250. package/dist/types/internal/client/connection.d.ts +9 -0
  251. package/dist/types/internal/client/index.d.ts +8 -0
  252. package/dist/types/internal/client/types.d.ts +198 -0
  253. package/dist/types/internal/console/index.d.ts +108 -0
  254. package/dist/types/internal/console/utils.d.ts +27 -0
  255. package/dist/types/internal/core/index.d.ts +119 -0
  256. package/dist/types/internal/crypto/index.d.ts +18 -0
  257. package/dist/types/internal/daemon/callback-fs-handler.d.ts +28 -0
  258. package/dist/types/internal/daemon/connection.d.ts +9 -0
  259. package/dist/types/internal/daemon/daemon.d.ts +2 -0
  260. package/dist/types/internal/daemon/index.d.ts +14 -0
  261. package/dist/types/internal/daemon/runtime-pool.d.ts +16 -0
  262. package/dist/types/internal/daemon/types.d.ts +211 -0
  263. package/dist/types/internal/encoding/index.d.ts +21 -0
  264. package/dist/types/internal/fetch/consistency/origins.d.ts +179 -0
  265. package/dist/types/internal/fetch/index.d.ts +93 -0
  266. package/dist/types/internal/fetch/stream-state.d.ts +65 -0
  267. package/dist/types/internal/fs/index.d.ts +70 -0
  268. package/dist/types/internal/fs/node-adapter.d.ts +24 -0
  269. package/dist/types/internal/module-loader/bundle.d.ts +33 -0
  270. package/dist/types/internal/module-loader/index.d.ts +30 -0
  271. package/dist/types/internal/module-loader/mappings.d.ts +47 -0
  272. package/dist/types/internal/module-loader/resolve.d.ts +26 -0
  273. package/dist/types/internal/module-loader/strip-types.d.ts +19 -0
  274. package/dist/types/internal/path/index.d.ts +23 -0
  275. package/dist/types/internal/playwright/client.d.ts +7 -0
  276. package/dist/types/internal/playwright/handler.d.ts +44 -0
  277. package/dist/types/internal/playwright/index.d.ts +14 -0
  278. package/dist/types/internal/playwright/types.d.ts +145 -0
  279. package/dist/types/internal/protocol/codec.d.ts +242 -0
  280. package/dist/types/internal/protocol/framing.d.ts +89 -0
  281. package/dist/types/internal/protocol/index.d.ts +10 -0
  282. package/dist/types/internal/protocol/marshalValue.d.ts +79 -0
  283. package/dist/types/internal/protocol/serialization.d.ts +23 -0
  284. package/dist/types/internal/protocol/types.d.ts +996 -0
  285. package/dist/types/internal/runtime/index.d.ts +200 -0
  286. package/dist/types/internal/server/index.d.ts +42 -0
  287. package/dist/types/internal/test-environment/index.d.ts +112 -0
  288. package/dist/types/internal/timers/index.d.ts +22 -0
  289. package/dist/types/internal/transform/index.d.ts +36 -0
  290. package/dist/types/internal/typecheck/index.d.ts +7 -0
  291. package/dist/types/internal/typecheck/isolate-types.d.ts +94 -0
  292. package/dist/types/internal/typecheck/typecheck.d.ts +148 -0
  293. package/dist/types/modules/index.d.ts +2 -0
  294. package/dist/types/runtime/script-runtime.d.ts +6 -0
  295. package/dist/types/server/app-server.d.ts +3 -0
  296. package/dist/types/testing/integration-helpers.d.ts +9 -0
  297. package/dist/types/typecheck/index.d.ts +8 -0
  298. package/dist/types/types.d.ts +233 -0
  299. package/package.json +82 -6
package/README.md CHANGED
@@ -1,45 +1,254 @@
1
1
  # @ricsam/isolate
2
2
 
3
- ## ⚠️ IMPORTANT NOTICE ⚠️
3
+ `@ricsam/isolate` is a runtime-centric JavaScript sandbox built on [`isolated-vm`](https://github.com/nicknisi/isolated-vm). It gives you a single host API for running isolated code with web-style capabilities such as `fetch`, files, streams, server handlers, module loading, and Playwright-backed browser tests.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm add @ricsam/isolate isolated-vm
9
+ ```
10
+
11
+ Install Playwright when you want browser runtimes:
12
+
13
+ ```bash
14
+ npm add playwright
15
+ ```
16
+
17
+ ## What You Get
18
+
19
+ `@ricsam/isolate` exports a small top-level API:
20
+
21
+ - `createIsolateHost()` to start, connect to, and manage isolate-backed runtimes
22
+ - `createModuleResolver()` to provide virtual modules, source trees, mounted `node_modules`, and fallback resolution
23
+ - `createFileBindings()` to expose a rooted file API to sandboxed code
24
+ - `getTypeProfile()`, `typecheck()`, and `formatTypecheckErrors()` for sandbox-aware TypeScript tooling
25
+
26
+ The host can create three runtime styles:
27
+
28
+ - `host.createRuntime()` for scripts, agents, and ad hoc execution
29
+ - `host.createAppServer()` for `serve()`-based request handlers
30
+ - `host.createBrowserRuntime()` for Playwright-backed execution
31
+
32
+ ## Host Bindings
33
+
34
+ Each runtime is configured through `bindings`, which describe how sandboxed code talks to the host:
35
+
36
+ - `console` forwards runtime and browser console output
37
+ - `fetch` handles outbound HTTP requests from the sandbox
38
+ - `files` exposes a safe, root-scoped filesystem
39
+ - `modules` resolves virtual modules, source trees, and mounted packages
40
+ - `tools` exposes async host functions and async iterators
41
+
42
+ Every host callback receives a `HostCallContext` with an `AbortSignal`, runtime identity, resource identity, and request metadata.
43
+
44
+ ## Quick Start
45
+
46
+ ```ts
47
+ import {
48
+ createFileBindings,
49
+ createIsolateHost,
50
+ createModuleResolver,
51
+ } from "@ricsam/isolate";
52
+
53
+ const host = await createIsolateHost({
54
+ daemon: {
55
+ socketPath: "/tmp/isolate.sock",
56
+ },
57
+ });
58
+
59
+ const runtime = await host.createRuntime({
60
+ bindings: {
61
+ console: {
62
+ onEntry(entry) {
63
+ if (entry.type === "output") {
64
+ console.log(entry.stdout);
65
+ }
66
+ },
67
+ },
68
+ fetch: async (request) => await fetch(request),
69
+ files: createFileBindings({
70
+ root: process.cwd(),
71
+ allowWrite: true,
72
+ }),
73
+ modules: createModuleResolver()
74
+ .virtual(
75
+ "@/env",
76
+ `export const mode = "sandbox";`,
77
+ { filename: "env.ts", resolveDir: "/app" },
78
+ )
79
+ .virtual(
80
+ "/app/main.ts",
81
+ `
82
+ import { mode } from "@/env";
83
+
84
+ const response = await fetch("https://example.com");
85
+ console.log("mode:", mode);
86
+ console.log("status:", response.status);
87
+ console.log(await greet("isolate"));
88
+ `,
89
+ { filename: "main.ts", resolveDir: "/app" },
90
+ ),
91
+ tools: {
92
+ greet: async (name: string) => `hello ${name}`,
93
+ },
94
+ },
95
+ });
96
+
97
+ try {
98
+ await runtime.eval(`import "/app/main.ts";`, { filename: "/app/entry.ts" });
99
+ } finally {
100
+ await runtime.dispose();
101
+ await host.close();
102
+ }
103
+ ```
104
+
105
+ ## App Servers
106
+
107
+ `createAppServer()` is the long-lived server-oriented API. It boots a runtime around an entry module that calls `serve()` and then lets the host dispatch requests into it.
108
+
109
+ ```ts
110
+ import { createIsolateHost, createModuleResolver } from "@ricsam/isolate";
111
+
112
+ const host = await createIsolateHost();
113
+ const server = await host.createAppServer({
114
+ key: "example/server",
115
+ entry: "/server.ts",
116
+ bindings: {
117
+ modules: createModuleResolver().virtual(
118
+ "/server.ts",
119
+ `
120
+ serve({
121
+ fetch(request) {
122
+ return Response.json({
123
+ pathname: new URL(request.url).pathname,
124
+ });
125
+ },
126
+ });
127
+ `,
128
+ ),
129
+ },
130
+ });
131
+
132
+ const result = await server.handle(new Request("http://localhost/hello"));
133
+ if (result.type === "response") {
134
+ console.log(await result.response.json());
135
+ }
136
+
137
+ await server.dispose();
138
+ await host.close();
139
+ ```
140
+
141
+ `server.handle()` returns either a normal HTTP response or WebSocket upgrade metadata. The `server.ws` helpers let the host continue an upgraded connection by sending open, message, close, and error events back into the runtime.
142
+
143
+ ## Browser Runtimes
144
+
145
+ `createBrowserRuntime()` runs sandboxed code against a Playwright page while keeping the host in control of file access, diagnostics, and browser event collection.
146
+
147
+ ```ts
148
+ import { chromium } from "playwright";
149
+ import { createIsolateHost } from "@ricsam/isolate";
150
+
151
+ const browser = await chromium.launch();
152
+ const context = await browser.newContext();
153
+ const page = await context.newPage();
154
+
155
+ const host = await createIsolateHost();
156
+ const runtime = await host.createBrowserRuntime({
157
+ key: "example/browser",
158
+ bindings: {},
159
+ features: { tests: true },
160
+ browser: {
161
+ page,
162
+ captureConsole: true,
163
+ },
164
+ });
165
+
166
+ const result = await runtime.run(
167
+ `
168
+ test("loads a page", async () => {
169
+ await page.goto("https://example.com");
170
+ await expect(page).toHaveTitle(/Example Domain/);
171
+ });
172
+ `,
173
+ {
174
+ filename: "/browser-test.ts",
175
+ asTestSuite: true,
176
+ timeoutMs: 10_000,
177
+ },
178
+ );
179
+
180
+ console.log(result.tests);
181
+
182
+ await runtime.dispose();
183
+ await context.close();
184
+ await browser.close();
185
+ await host.close();
186
+ ```
187
+
188
+ ## Module Resolution
189
+
190
+ `createModuleResolver()` is a fluent builder. You can mix and match:
191
+
192
+ - `virtual(specifier, source, options)` for inline modules
193
+ - `virtualFile(specifier, filePath, options)` for a host file mapped to a virtual specifier
194
+ - `sourceTree(prefix, loader)` for lazy source loading under a virtual path
195
+ - `mountNodeModules(virtualMount, hostPath)` for package resolution from a real `node_modules`
196
+ - `fallback(loader)` for custom last-resort resolution
197
+
198
+ ## File Bindings
199
+
200
+ `createFileBindings({ root, allowWrite })` creates a filesystem bridge that stays inside the configured root directory. Attempts to escape that root are rejected, and write operations are disabled unless `allowWrite` is set to `true`.
201
+
202
+ ## Typechecking
203
+
204
+ The typecheck helpers let you validate sandbox code against supported capability profiles before executing it.
205
+
206
+ ```ts
207
+ import {
208
+ formatTypecheckErrors,
209
+ getTypeProfile,
210
+ typecheck,
211
+ } from "@ricsam/isolate";
212
+
213
+ const profile = getTypeProfile({
214
+ profile: "browser-test",
215
+ capabilities: ["files"],
216
+ });
217
+
218
+ console.log(profile.include);
219
+
220
+ const result = typecheck({
221
+ code: "page.goto('/')",
222
+ profile: "browser-test",
223
+ });
4
224
 
5
- **This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
225
+ if (!result.success) {
226
+ console.error(formatTypecheckErrors(result.errors));
227
+ }
228
+ ```
6
229
 
7
- This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
230
+ Built-in profiles:
8
231
 
9
- ## Purpose
232
+ - `backend`
233
+ - `agent`
234
+ - `browser-test`
10
235
 
11
- This package exists to:
12
- 1. Configure OIDC trusted publishing for the package name `@ricsam/isolate`
13
- 2. Enable secure, token-less publishing from CI/CD workflows
14
- 3. Establish provenance for packages published under this name
236
+ Capabilities can extend a profile with `fetch`, `files`, `tests`, `browser`, `tools`, `console`, `encoding`, and `timers`.
15
237
 
16
- ## What is OIDC Trusted Publishing?
238
+ ## Daemon CLI
17
239
 
18
- OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
240
+ The package also exposes an `isolate-daemon` binary:
19
241
 
20
- ## Setup Instructions
242
+ ```bash
243
+ isolate-daemon --socket /tmp/isolate.sock
244
+ ```
21
245
 
22
- To properly configure OIDC trusted publishing for this package:
246
+ By default, `createIsolateHost()` will auto-start a daemon when needed. You can also point the host at an already-running daemon with `daemon.socketPath`, or disable auto-start with `daemon.autoStart: false`.
247
+
248
+ ## Development
23
249
 
24
- 1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
25
- 2. Configure the trusted publisher (e.g., GitHub Actions)
26
- 3. Specify the repository and workflow that should be allowed to publish
27
- 4. Use the configured workflow to publish your actual package
28
-
29
- ## DO NOT USE THIS PACKAGE
30
-
31
- This package is a placeholder for OIDC configuration only. It:
32
- - Contains no executable code
33
- - Provides no functionality
34
- - Should not be installed as a dependency
35
- - Exists only for administrative purposes
36
-
37
- ## More Information
38
-
39
- For more details about npm's trusted publishing feature, see:
40
- - [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
41
- - [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
42
-
43
- ---
44
-
45
- **Maintained for OIDC setup purposes only**
250
+ ```bash
251
+ npm run build
252
+ npm run typecheck
253
+ npm test
254
+ ```
@@ -0,0 +1,58 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ function __accessProp(key) {
6
+ return this[key];
7
+ }
8
+ var __toCommonJS = (from) => {
9
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
10
+ if (entry)
11
+ return entry;
12
+ entry = __defProp({}, "__esModule", { value: true });
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (var key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(entry, key))
16
+ __defProp(entry, key, {
17
+ get: __accessProp.bind(from, key),
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
21
+ __moduleCache.set(from, entry);
22
+ return entry;
23
+ };
24
+ var __moduleCache;
25
+ var __returnValue = (v) => v;
26
+ function __exportSetter(name, newValue) {
27
+ this[name] = __returnValue.bind(null, newValue);
28
+ }
29
+ var __export = (target, all) => {
30
+ for (var name in all)
31
+ __defProp(target, name, {
32
+ get: all[name],
33
+ enumerable: true,
34
+ configurable: true,
35
+ set: __exportSetter.bind(all, name)
36
+ });
37
+ };
38
+
39
+ // src/bridge/diagnostics.ts
40
+ var exports_diagnostics = {};
41
+ __export(exports_diagnostics, {
42
+ createRuntimeDiagnostics: () => createRuntimeDiagnostics
43
+ });
44
+ module.exports = __toCommonJS(exports_diagnostics);
45
+ function createRuntimeDiagnostics() {
46
+ return {
47
+ activeRequests: 0,
48
+ activeResources: 0,
49
+ pendingFiles: 0,
50
+ pendingFetches: 0,
51
+ pendingModules: 0,
52
+ pendingTools: 0,
53
+ streamCount: 0,
54
+ lifecycleState: "idle"
55
+ };
56
+ }
57
+
58
+ //# debugId=40FF8D24B6369A0D64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bridge/diagnostics.ts"],
4
+ "sourcesContent": [
5
+ "import type { RuntimeDiagnostics } from \"../types.cjs\";\n\nexport interface MutableRuntimeDiagnostics extends RuntimeDiagnostics {\n activeRequests: number;\n activeResources: number;\n pendingFiles: number;\n pendingFetches: number;\n pendingModules: number;\n pendingTools: number;\n streamCount: number;\n lifecycleState: \"idle\" | \"active\" | \"reloading\" | \"disposing\";\n}\n\nexport function createRuntimeDiagnostics(): MutableRuntimeDiagnostics {\n return {\n activeRequests: 0,\n activeResources: 0,\n pendingFiles: 0,\n pendingFetches: 0,\n pendingModules: 0,\n pendingTools: 0,\n streamCount: 0,\n lifecycleState: \"idle\",\n };\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,SAAS,wBAAwB,GAA8B;AAAA,EACpE,OAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,aAAa;AAAA,IACb,gBAAgB;AAAA,EAClB;AAAA;",
8
+ "debugId": "40FF8D24B6369A0D64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,242 @@
1
+ var __create = Object.create;
2
+ var __getProtoOf = Object.getPrototypeOf;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ function __accessProp(key) {
8
+ return this[key];
9
+ }
10
+ var __toESMCache_node;
11
+ var __toESMCache_esm;
12
+ var __toESM = (mod, isNodeMode, target) => {
13
+ var canCache = mod != null && typeof mod === "object";
14
+ if (canCache) {
15
+ var cache = isNodeMode ? __toESMCache_node ??= new WeakMap : __toESMCache_esm ??= new WeakMap;
16
+ var cached = cache.get(mod);
17
+ if (cached)
18
+ return cached;
19
+ }
20
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
21
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
22
+ for (let key of __getOwnPropNames(mod))
23
+ if (!__hasOwnProp.call(to, key))
24
+ __defProp(to, key, {
25
+ get: __accessProp.bind(mod, key),
26
+ enumerable: true
27
+ });
28
+ if (canCache)
29
+ cache.set(mod, to);
30
+ return to;
31
+ };
32
+ var __toCommonJS = (from) => {
33
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
34
+ if (entry)
35
+ return entry;
36
+ entry = __defProp({}, "__esModule", { value: true });
37
+ if (from && typeof from === "object" || typeof from === "function") {
38
+ for (var key of __getOwnPropNames(from))
39
+ if (!__hasOwnProp.call(entry, key))
40
+ __defProp(entry, key, {
41
+ get: __accessProp.bind(from, key),
42
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
43
+ });
44
+ }
45
+ __moduleCache.set(from, entry);
46
+ return entry;
47
+ };
48
+ var __moduleCache;
49
+ var __returnValue = (v) => v;
50
+ function __exportSetter(name, newValue) {
51
+ this[name] = __returnValue.bind(null, newValue);
52
+ }
53
+ var __export = (target, all) => {
54
+ for (var name in all)
55
+ __defProp(target, name, {
56
+ get: all[name],
57
+ enumerable: true,
58
+ configurable: true,
59
+ set: __exportSetter.bind(all, name)
60
+ });
61
+ };
62
+
63
+ // src/bridge/legacy-adapters.ts
64
+ var exports_legacy_adapters = {};
65
+ __export(exports_legacy_adapters, {
66
+ tryResolveModule: () => tryResolveModule,
67
+ normalizeExplicitModuleResult: () => normalizeExplicitModuleResult,
68
+ createMappedNodeModulesLoader: () => createMappedNodeModulesLoader,
69
+ createLegacyRuntimeOptions: () => createLegacyRuntimeOptions
70
+ });
71
+ module.exports = __toCommonJS(exports_legacy_adapters);
72
+ var import_node_path = __toESM(require("node:path"));
73
+ var import_request_context = require("./request-context.cjs");
74
+ function createHostCallContext(runtimeId, signal, resourceId) {
75
+ const requestContext = import_request_context.getRequestContext();
76
+ return {
77
+ signal,
78
+ runtimeId,
79
+ requestId: requestContext.requestId,
80
+ resourceId,
81
+ metadata: requestContext.metadata
82
+ };
83
+ }
84
+ async function normalizeModuleResolveResult(specifier, result, fallbackResolveDir) {
85
+ const resolved = await result;
86
+ if (resolved == null) {
87
+ return null;
88
+ }
89
+ if (typeof resolved === "string") {
90
+ const filename = import_node_path.default.posix.basename(specifier) || "__virtual_module__.js";
91
+ const resolveDir = specifier.startsWith("/") ? import_node_path.default.posix.dirname(specifier) : fallbackResolveDir ?? "/";
92
+ return {
93
+ code: resolved,
94
+ filename,
95
+ resolveDir
96
+ };
97
+ }
98
+ return {
99
+ static: resolved.static,
100
+ filename: resolved.filename,
101
+ resolveDir: resolved.resolveDir,
102
+ code: resolved.code
103
+ };
104
+ }
105
+ function isAsyncGeneratorFunction(handler) {
106
+ return handler.constructor.name === "AsyncGeneratorFunction";
107
+ }
108
+ function createLegacyRuntimeOptions(bindings, getRuntimeId, diagnostics) {
109
+ const moduleLoader = createLegacyModuleLoader(bindings.modules, getRuntimeId, diagnostics);
110
+ return {
111
+ console: bindings.console?.onEntry ? {
112
+ onEntry: (entry) => {
113
+ const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `console:${crypto.randomUUID()}`);
114
+ bindings.console?.onEntry?.(entry, context);
115
+ }
116
+ } : undefined,
117
+ fetch: bindings.fetch ? async (url, init) => {
118
+ diagnostics.pendingFetches += 1;
119
+ diagnostics.activeResources += 1;
120
+ try {
121
+ const request = new Request(url, {
122
+ method: init.method,
123
+ headers: init.headers,
124
+ body: init.rawBody ? init.rawBody.slice(0) : null
125
+ });
126
+ const context = createHostCallContext(getRuntimeId(), init.signal, `fetch:${crypto.randomUUID()}`);
127
+ return await bindings.fetch(request, context);
128
+ } finally {
129
+ diagnostics.pendingFetches -= 1;
130
+ diagnostics.activeResources -= 1;
131
+ }
132
+ } : undefined,
133
+ fs: bindings.files ? {
134
+ readFile: bindings.files.readFile ? async (filePath) => {
135
+ const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:read:${crypto.randomUUID()}`);
136
+ return await bindings.files.readFile(filePath, context);
137
+ } : undefined,
138
+ writeFile: bindings.files.writeFile ? async (filePath, data) => {
139
+ const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:write:${crypto.randomUUID()}`);
140
+ return await bindings.files.writeFile(filePath, data, context);
141
+ } : undefined,
142
+ unlink: bindings.files.unlink ? async (filePath) => {
143
+ const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:unlink:${crypto.randomUUID()}`);
144
+ return await bindings.files.unlink(filePath, context);
145
+ } : undefined,
146
+ readdir: bindings.files.readdir ? async (dirPath) => {
147
+ const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:readdir:${crypto.randomUUID()}`);
148
+ return await bindings.files.readdir(dirPath, context);
149
+ } : undefined,
150
+ mkdir: bindings.files.mkdir ? async (dirPath, options) => {
151
+ const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:mkdir:${crypto.randomUUID()}`);
152
+ return await bindings.files.mkdir(dirPath, options, context);
153
+ } : undefined,
154
+ rmdir: bindings.files.rmdir ? async (dirPath) => {
155
+ const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:rmdir:${crypto.randomUUID()}`);
156
+ return await bindings.files.rmdir(dirPath, context);
157
+ } : undefined,
158
+ stat: bindings.files.stat ? async (filePath) => {
159
+ const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:stat:${crypto.randomUUID()}`);
160
+ return await bindings.files.stat(filePath, context);
161
+ } : undefined,
162
+ rename: bindings.files.rename ? async (from, to) => {
163
+ const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:rename:${crypto.randomUUID()}`);
164
+ return await bindings.files.rename(from, to, context);
165
+ } : undefined
166
+ } : undefined,
167
+ moduleLoader,
168
+ customFunctions: bindings.tools ? Object.fromEntries(Object.entries(bindings.tools).map(([name, handler]) => {
169
+ if (isAsyncGeneratorFunction(handler)) {
170
+ return [
171
+ name,
172
+ {
173
+ type: "asyncIterator",
174
+ fn: (...args) => {
175
+ diagnostics.pendingTools += 1;
176
+ diagnostics.activeResources += 1;
177
+ const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `tool:${name}:${crypto.randomUUID()}`);
178
+ const iterator = handler(...args, context);
179
+ return async function* () {
180
+ try {
181
+ yield* iterator;
182
+ } finally {
183
+ diagnostics.pendingTools -= 1;
184
+ diagnostics.activeResources -= 1;
185
+ }
186
+ }();
187
+ }
188
+ }
189
+ ];
190
+ }
191
+ return [
192
+ name,
193
+ {
194
+ type: "async",
195
+ fn: async (...args) => {
196
+ diagnostics.pendingTools += 1;
197
+ diagnostics.activeResources += 1;
198
+ try {
199
+ const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `tool:${name}:${crypto.randomUUID()}`);
200
+ return await handler(...args, context);
201
+ } finally {
202
+ diagnostics.pendingTools -= 1;
203
+ diagnostics.activeResources -= 1;
204
+ }
205
+ }
206
+ }
207
+ ];
208
+ })) : undefined
209
+ };
210
+ }
211
+ function createLegacyModuleLoader(resolver, getRuntimeId, diagnostics) {
212
+ if (!resolver) {
213
+ return;
214
+ }
215
+ return async (specifier, importer) => {
216
+ diagnostics.activeResources += 1;
217
+ try {
218
+ const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `module:${crypto.randomUUID()}`);
219
+ const result = await resolver.resolve(specifier, importer, context);
220
+ return result;
221
+ } finally {
222
+ diagnostics.activeResources -= 1;
223
+ }
224
+ };
225
+ }
226
+ function createMappedNodeModulesLoader(mappings) {
227
+ if (mappings.length === 0) {
228
+ return;
229
+ }
230
+ throw new Error("createMappedNodeModulesLoader is no longer used directly; call createModuleResolver().mountNodeModules() instead.");
231
+ }
232
+ async function tryResolveModule(resolver, specifier, importer, context) {
233
+ if (!resolver) {
234
+ return null;
235
+ }
236
+ return normalizeModuleResolveResult(specifier, resolver.resolve(specifier, importer, context), importer.resolveDir);
237
+ }
238
+ async function normalizeExplicitModuleResult(specifier, result, fallbackResolveDir) {
239
+ return normalizeModuleResolveResult(specifier, result, fallbackResolveDir);
240
+ }
241
+
242
+ //# debugId=D5F0F03020F4D4CD64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bridge/legacy-adapters.ts"],
4
+ "sourcesContent": [
5
+ "import path from \"node:path\";\nimport type { RuntimeOptions } from \"../internal/client/index.cjs\";\nimport type { ModuleLoaderCallback } from \"../internal/protocol/index.cjs\";\nimport { getRequestContext } from \"./request-context.cjs\";\nimport type { HostBindings, HostCallContext, ModuleResolveResult, ModuleResolver, ModuleSource, ToolHandler } from \"../types.cjs\";\nimport type { MutableRuntimeDiagnostics } from \"./diagnostics.cjs\";\n\nfunction createHostCallContext(\n runtimeId: string,\n signal: AbortSignal,\n resourceId: string,\n): HostCallContext {\n const requestContext = getRequestContext();\n return {\n signal,\n runtimeId,\n requestId: requestContext.requestId,\n resourceId,\n metadata: requestContext.metadata,\n };\n}\n\nasync function normalizeModuleResolveResult(\n specifier: string,\n result: ModuleResolveResult,\n fallbackResolveDir?: string,\n): Promise<ModuleSource | null> {\n const resolved = await result;\n if (resolved == null) {\n return null;\n }\n\n if (typeof resolved === \"string\") {\n const filename = path.posix.basename(specifier) || \"__virtual_module__.js\";\n const resolveDir = specifier.startsWith(\"/\")\n ? path.posix.dirname(specifier)\n : fallbackResolveDir ?? \"/\";\n return {\n code: resolved,\n filename,\n resolveDir,\n };\n }\n\n return {\n static: resolved.static,\n filename: resolved.filename,\n resolveDir: resolved.resolveDir,\n code: resolved.code,\n };\n}\n\nfunction isAsyncGeneratorFunction(handler: ToolHandler): boolean {\n return handler.constructor.name === \"AsyncGeneratorFunction\";\n}\n\nexport function createLegacyRuntimeOptions(\n bindings: HostBindings,\n getRuntimeId: () => string,\n diagnostics: MutableRuntimeDiagnostics,\n): RuntimeOptions {\n const moduleLoader = createLegacyModuleLoader(bindings.modules, getRuntimeId, diagnostics);\n\n return {\n console: bindings.console?.onEntry\n ? {\n onEntry: (entry) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `console:${crypto.randomUUID()}`);\n bindings.console?.onEntry?.(entry, context);\n },\n }\n : undefined,\n fetch: bindings.fetch\n ? async (url, init) => {\n diagnostics.pendingFetches += 1;\n diagnostics.activeResources += 1;\n try {\n const request = new Request(url, {\n method: init.method,\n headers: init.headers,\n body: init.rawBody ? init.rawBody.slice(0) : null,\n });\n const context = createHostCallContext(getRuntimeId(), init.signal, `fetch:${crypto.randomUUID()}`);\n return await bindings.fetch!(request, context);\n } finally {\n diagnostics.pendingFetches -= 1;\n diagnostics.activeResources -= 1;\n }\n }\n : undefined,\n fs: bindings.files\n ? {\n readFile: bindings.files.readFile\n ? async (filePath: string) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:read:${crypto.randomUUID()}`);\n return await bindings.files!.readFile!(filePath, context);\n }\n : undefined,\n writeFile: bindings.files.writeFile\n ? async (filePath: string, data: ArrayBuffer) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:write:${crypto.randomUUID()}`);\n return await bindings.files!.writeFile!(filePath, data, context);\n }\n : undefined,\n unlink: bindings.files.unlink\n ? async (filePath: string) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:unlink:${crypto.randomUUID()}`);\n return await bindings.files!.unlink!(filePath, context);\n }\n : undefined,\n readdir: bindings.files.readdir\n ? async (dirPath: string) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:readdir:${crypto.randomUUID()}`);\n return await bindings.files!.readdir!(dirPath, context);\n }\n : undefined,\n mkdir: bindings.files.mkdir\n ? async (dirPath: string, options?: { recursive?: boolean }) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:mkdir:${crypto.randomUUID()}`);\n return await bindings.files!.mkdir!(dirPath, options, context);\n }\n : undefined,\n rmdir: bindings.files.rmdir\n ? async (dirPath: string) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:rmdir:${crypto.randomUUID()}`);\n return await bindings.files!.rmdir!(dirPath, context);\n }\n : undefined,\n stat: bindings.files.stat\n ? async (filePath: string) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:stat:${crypto.randomUUID()}`);\n return await bindings.files!.stat!(filePath, context);\n }\n : undefined,\n rename: bindings.files.rename\n ? async (from: string, to: string) => {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `files:rename:${crypto.randomUUID()}`);\n return await bindings.files!.rename!(from, to, context);\n }\n : undefined,\n }\n : undefined,\n moduleLoader,\n customFunctions: bindings.tools\n ? Object.fromEntries(\n Object.entries(bindings.tools).map(([name, handler]) => {\n if (isAsyncGeneratorFunction(handler)) {\n return [\n name,\n {\n type: \"asyncIterator\" as const,\n fn: (...args: unknown[]) => {\n diagnostics.pendingTools += 1;\n diagnostics.activeResources += 1;\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `tool:${name}:${crypto.randomUUID()}`);\n const iterator = handler(...args, context) as AsyncGenerator<unknown, unknown, unknown>;\n return (async function* () {\n try {\n yield* iterator;\n } finally {\n diagnostics.pendingTools -= 1;\n diagnostics.activeResources -= 1;\n }\n })();\n },\n },\n ];\n }\n\n return [\n name,\n {\n type: \"async\" as const,\n fn: async (...args: unknown[]) => {\n diagnostics.pendingTools += 1;\n diagnostics.activeResources += 1;\n try {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `tool:${name}:${crypto.randomUUID()}`);\n return await handler(...args, context);\n } finally {\n diagnostics.pendingTools -= 1;\n diagnostics.activeResources -= 1;\n }\n },\n },\n ];\n }),\n )\n : undefined,\n };\n}\n\nfunction createLegacyModuleLoader(\n resolver: ModuleResolver | undefined,\n getRuntimeId: () => string,\n diagnostics: MutableRuntimeDiagnostics,\n): ModuleLoaderCallback | undefined {\n if (!resolver) {\n return undefined;\n }\n\n return async (specifier, importer) => {\n diagnostics.activeResources += 1;\n try {\n const context = createHostCallContext(getRuntimeId(), AbortSignal.abort(), `module:${crypto.randomUUID()}`);\n const result = await resolver.resolve(specifier, importer, context);\n return result;\n } finally {\n diagnostics.activeResources -= 1;\n }\n };\n}\n\nexport function createMappedNodeModulesLoader(mappings: Array<{ from: string; to: string }>): ModuleLoaderCallback | undefined {\n if (mappings.length === 0) {\n return undefined;\n }\n throw new Error(\"createMappedNodeModulesLoader is no longer used directly; call createModuleResolver().mountNodeModules() instead.\");\n}\n\nexport async function tryResolveModule(\n resolver: ModuleResolver | undefined,\n specifier: string,\n importer: { path: string; resolveDir: string },\n context: HostCallContext,\n): Promise<ModuleSource | null> {\n if (!resolver) {\n return null;\n }\n return normalizeModuleResolveResult(specifier, resolver.resolve(specifier, importer, context), importer.resolveDir);\n}\n\nexport async function normalizeExplicitModuleResult(\n specifier: string,\n result: ModuleResolveResult,\n fallbackResolveDir?: string,\n): Promise<ModuleSource | null> {\n return normalizeModuleResolveResult(specifier, result, fallbackResolveDir);\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "D5F0F03020F4D4CD64756E2164756E21",
9
+ "names": []
10
+ }