@nimbus-sh/worker 0.1.0

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 (408) hide show
  1. package/README.md +219 -0
  2. package/dist/_shared/bytes.d.ts +18 -0
  3. package/dist/_shared/bytes.d.ts.map +1 -0
  4. package/dist/_shared/bytes.js +17 -0
  5. package/dist/_shared/cache-stats.d.ts +146 -0
  6. package/dist/_shared/cache-stats.d.ts.map +1 -0
  7. package/dist/_shared/cache-stats.js +162 -0
  8. package/dist/_shared/exports-resolver.d.ts +76 -0
  9. package/dist/_shared/exports-resolver.d.ts.map +1 -0
  10. package/dist/_shared/exports-resolver.js +284 -0
  11. package/dist/_shared/install-phase.d.ts +47 -0
  12. package/dist/_shared/install-phase.d.ts.map +1 -0
  13. package/dist/_shared/install-phase.js +1 -0
  14. package/dist/_shared/real-node-imports.d.ts +38 -0
  15. package/dist/_shared/real-node-imports.d.ts.map +1 -0
  16. package/dist/_shared/real-node-imports.js +46 -0
  17. package/dist/_shared/retry.d.ts +93 -0
  18. package/dist/_shared/retry.d.ts.map +1 -0
  19. package/dist/_shared/retry.js +161 -0
  20. package/dist/_shared/session-id.d.ts +39 -0
  21. package/dist/_shared/session-id.d.ts.map +1 -0
  22. package/dist/_shared/session-id.js +127 -0
  23. package/dist/_shared/session-router.d.ts +104 -0
  24. package/dist/_shared/session-router.d.ts.map +1 -0
  25. package/dist/_shared/session-router.js +165 -0
  26. package/dist/_shared/w7-frame.d.ts +93 -0
  27. package/dist/_shared/w7-frame.d.ts.map +1 -0
  28. package/dist/_shared/w7-frame.js +402 -0
  29. package/dist/auth/index.d.ts +16 -0
  30. package/dist/auth/index.d.ts.map +1 -0
  31. package/dist/auth/index.js +15 -0
  32. package/dist/auth/middleware.d.ts +85 -0
  33. package/dist/auth/middleware.d.ts.map +1 -0
  34. package/dist/auth/middleware.js +150 -0
  35. package/dist/auth/token.d.ts +96 -0
  36. package/dist/auth/token.d.ts.map +1 -0
  37. package/dist/auth/token.js +226 -0
  38. package/dist/auth/types.d.ts +141 -0
  39. package/dist/auth/types.d.ts.map +1 -0
  40. package/dist/auth/types.js +114 -0
  41. package/dist/bindings/d1.d.ts +102 -0
  42. package/dist/bindings/d1.d.ts.map +1 -0
  43. package/dist/bindings/d1.js +549 -0
  44. package/dist/bindings/kv.d.ts +82 -0
  45. package/dist/bindings/kv.d.ts.map +1 -0
  46. package/dist/bindings/kv.js +290 -0
  47. package/dist/bindings/r2.d.ts +137 -0
  48. package/dist/bindings/r2.d.ts.map +1 -0
  49. package/dist/bindings/r2.js +379 -0
  50. package/dist/cirrus-npm-cjs.generated.d.ts +17 -0
  51. package/dist/cirrus-npm-cjs.generated.d.ts.map +1 -0
  52. package/dist/cirrus-npm-cjs.generated.js +41 -0
  53. package/dist/cirrus-plugin-react.generated.d.ts +34 -0
  54. package/dist/cirrus-plugin-react.generated.d.ts.map +1 -0
  55. package/dist/cirrus-plugin-react.generated.js +33 -0
  56. package/dist/constants.d.ts +34 -0
  57. package/dist/constants.d.ts.map +1 -0
  58. package/dist/constants.js +116 -0
  59. package/dist/esbuild-wasm-bundle.generated.d.ts +41 -0
  60. package/dist/esbuild-wasm-bundle.generated.d.ts.map +1 -0
  61. package/dist/esbuild-wasm-bundle.generated.js +40 -0
  62. package/dist/facets/cirrus-real.d.ts +147 -0
  63. package/dist/facets/cirrus-real.d.ts.map +1 -0
  64. package/dist/facets/cirrus-real.js +981 -0
  65. package/dist/facets/inner-do-registry.d.ts +41 -0
  66. package/dist/facets/inner-do-registry.d.ts.map +1 -0
  67. package/dist/facets/inner-do-registry.js +51 -0
  68. package/dist/facets/manager.d.ts +314 -0
  69. package/dist/facets/manager.d.ts.map +1 -0
  70. package/dist/facets/manager.js +2681 -0
  71. package/dist/facets/process.d.ts +318 -0
  72. package/dist/facets/process.d.ts.map +1 -0
  73. package/dist/facets/process.js +567 -0
  74. package/dist/facets/real-vite-fs-shim.d.ts +151 -0
  75. package/dist/facets/real-vite-fs-shim.d.ts.map +1 -0
  76. package/dist/facets/real-vite-fs-shim.js +1279 -0
  77. package/dist/facets/real-vite-hmr.d.ts +142 -0
  78. package/dist/facets/real-vite-hmr.d.ts.map +1 -0
  79. package/dist/facets/real-vite-hmr.js +476 -0
  80. package/dist/facets/vite-dev-server.d.ts +293 -0
  81. package/dist/facets/vite-dev-server.d.ts.map +1 -0
  82. package/dist/facets/vite-dev-server.js +2580 -0
  83. package/dist/facets/wasm-swap-registry.d.ts +261 -0
  84. package/dist/facets/wasm-swap-registry.d.ts.map +1 -0
  85. package/dist/facets/wasm-swap-registry.js +551 -0
  86. package/dist/facets/ws-terminal.d.ts +107 -0
  87. package/dist/facets/ws-terminal.d.ts.map +1 -0
  88. package/dist/facets/ws-terminal.js +207 -0
  89. package/dist/git/commands.d.ts +13 -0
  90. package/dist/git/commands.d.ts.map +1 -0
  91. package/dist/git/commands.js +633 -0
  92. package/dist/git/network-facet.d.ts +61 -0
  93. package/dist/git/network-facet.d.ts.map +1 -0
  94. package/dist/git/network-facet.js +700 -0
  95. package/dist/git-bundle.generated.d.ts +16 -0
  96. package/dist/git-bundle.generated.d.ts.map +1 -0
  97. package/dist/git-bundle.generated.js +15 -0
  98. package/dist/index.d.ts +41 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +73 -0
  101. package/dist/loaders/child-process/spawn-facet.d.ts +90 -0
  102. package/dist/loaders/child-process/spawn-facet.d.ts.map +1 -0
  103. package/dist/loaders/child-process/spawn-facet.js +103 -0
  104. package/dist/loaders/child-process/spawn-pool.d.ts +110 -0
  105. package/dist/loaders/child-process/spawn-pool.d.ts.map +1 -0
  106. package/dist/loaders/child-process/spawn-pool.js +161 -0
  107. package/dist/loaders/fanout-pool.d.ts +195 -0
  108. package/dist/loaders/fanout-pool.d.ts.map +1 -0
  109. package/dist/loaders/fanout-pool.js +326 -0
  110. package/dist/loaders/generated-workers.d.ts +26 -0
  111. package/dist/loaders/generated-workers.d.ts.map +1 -0
  112. package/dist/loaders/generated-workers.js +25 -0
  113. package/dist/loaders/index.d.ts +15 -0
  114. package/dist/loaders/index.d.ts.map +1 -0
  115. package/dist/loaders/index.js +13 -0
  116. package/dist/loaders/loader-pool.d.ts +273 -0
  117. package/dist/loaders/loader-pool.d.ts.map +1 -0
  118. package/dist/loaders/loader-pool.js +624 -0
  119. package/dist/loaders/npm-resolve-preamble.d.ts +34 -0
  120. package/dist/loaders/npm-resolve-preamble.d.ts.map +1 -0
  121. package/dist/loaders/npm-resolve-preamble.js +237 -0
  122. package/dist/loaders/pre-bundle-preamble.d.ts +41 -0
  123. package/dist/loaders/pre-bundle-preamble.d.ts.map +1 -0
  124. package/dist/loaders/pre-bundle-preamble.js +114 -0
  125. package/dist/loaders/vendor/codegen.d.ts +24 -0
  126. package/dist/loaders/vendor/codegen.d.ts.map +1 -0
  127. package/dist/loaders/vendor/codegen.js +44 -0
  128. package/dist/loaders/vendor/errors.d.ts +24 -0
  129. package/dist/loaders/vendor/errors.d.ts.map +1 -0
  130. package/dist/loaders/vendor/errors.js +46 -0
  131. package/dist/loaders/vendor/index.d.ts +16 -0
  132. package/dist/loaders/vendor/index.d.ts.map +1 -0
  133. package/dist/loaders/vendor/index.js +11 -0
  134. package/dist/loaders/vendor/pool.d.ts +88 -0
  135. package/dist/loaders/vendor/pool.d.ts.map +1 -0
  136. package/dist/loaders/vendor/pool.js +353 -0
  137. package/dist/loaders/vendor/primitives.d.ts +11 -0
  138. package/dist/loaders/vendor/primitives.d.ts.map +1 -0
  139. package/dist/loaders/vendor/primitives.js +33 -0
  140. package/dist/loaders/vendor/serialize.d.ts +3 -0
  141. package/dist/loaders/vendor/serialize.d.ts.map +1 -0
  142. package/dist/loaders/vendor/serialize.js +25 -0
  143. package/dist/loaders/vendor/types.d.ts +60 -0
  144. package/dist/loaders/vendor/types.d.ts.map +1 -0
  145. package/dist/loaders/vendor/types.js +4 -0
  146. package/dist/npm/cache.d.ts +136 -0
  147. package/dist/npm/cache.d.ts.map +1 -0
  148. package/dist/npm/cache.js +429 -0
  149. package/dist/npm/install-batch-facet.d.ts +129 -0
  150. package/dist/npm/install-batch-facet.d.ts.map +1 -0
  151. package/dist/npm/install-batch-facet.js +598 -0
  152. package/dist/npm/install-facet.d.ts +29 -0
  153. package/dist/npm/install-facet.d.ts.map +1 -0
  154. package/dist/npm/install-facet.js +9 -0
  155. package/dist/npm/installer.d.ts +239 -0
  156. package/dist/npm/installer.d.ts.map +1 -0
  157. package/dist/npm/installer.js +2022 -0
  158. package/dist/npm/npx-install.d.ts +74 -0
  159. package/dist/npm/npx-install.d.ts.map +1 -0
  160. package/dist/npm/npx-install.js +302 -0
  161. package/dist/npm/pre-bundle-facet.d.ts +168 -0
  162. package/dist/npm/pre-bundle-facet.d.ts.map +1 -0
  163. package/dist/npm/pre-bundle-facet.js +653 -0
  164. package/dist/npm/r2-cache.d.ts +286 -0
  165. package/dist/npm/r2-cache.d.ts.map +1 -0
  166. package/dist/npm/r2-cache.js +506 -0
  167. package/dist/npm/resolve-facet.d.ts +202 -0
  168. package/dist/npm/resolve-facet.d.ts.map +1 -0
  169. package/dist/npm/resolve-facet.js +833 -0
  170. package/dist/npm/resolve-one-facet.d.ts +204 -0
  171. package/dist/npm/resolve-one-facet.d.ts.map +1 -0
  172. package/dist/npm/resolve-one-facet.js +437 -0
  173. package/dist/npm/resolver.d.ts +109 -0
  174. package/dist/npm/resolver.d.ts.map +1 -0
  175. package/dist/npm/resolver.js +899 -0
  176. package/dist/npm/tarball-stream.d.ts +85 -0
  177. package/dist/npm/tarball-stream.d.ts.map +1 -0
  178. package/dist/npm/tarball-stream.js +205 -0
  179. package/dist/npm/tarball.d.ts +51 -0
  180. package/dist/npm/tarball.d.ts.map +1 -0
  181. package/dist/npm/tarball.js +185 -0
  182. package/dist/observability/diag-counters.d.ts +292 -0
  183. package/dist/observability/diag-counters.d.ts.map +1 -0
  184. package/dist/observability/diag-counters.js +302 -0
  185. package/dist/observability/heap-estimate.d.ts +166 -0
  186. package/dist/observability/heap-estimate.d.ts.map +1 -0
  187. package/dist/observability/heap-estimate.js +192 -0
  188. package/dist/observability/heavy-alloc-coord.d.ts +95 -0
  189. package/dist/observability/heavy-alloc-coord.d.ts.map +1 -0
  190. package/dist/observability/heavy-alloc-coord.js +149 -0
  191. package/dist/observability/oom-classify.d.ts +56 -0
  192. package/dist/observability/oom-classify.d.ts.map +1 -0
  193. package/dist/observability/oom-classify.js +118 -0
  194. package/dist/observability/oom-discriminator.d.ts +192 -0
  195. package/dist/observability/oom-discriminator.d.ts.map +1 -0
  196. package/dist/observability/oom-discriminator.js +233 -0
  197. package/dist/real-vite-bundle.generated.d.ts +46 -0
  198. package/dist/real-vite-bundle.generated.d.ts.map +1 -0
  199. package/dist/real-vite-bundle.generated.js +53 -0
  200. package/dist/replica/routing.d.ts +171 -0
  201. package/dist/replica/routing.d.ts.map +1 -0
  202. package/dist/replica/routing.js +288 -0
  203. package/dist/replica/suspension.d.ts +36 -0
  204. package/dist/replica/suspension.d.ts.map +1 -0
  205. package/dist/replica/suspension.js +49 -0
  206. package/dist/router/index.d.ts +156 -0
  207. package/dist/router/index.d.ts.map +1 -0
  208. package/dist/router/index.js +220 -0
  209. package/dist/runtime/assets-loader.d.ts +71 -0
  210. package/dist/runtime/assets-loader.d.ts.map +1 -0
  211. package/dist/runtime/assets-loader.js +128 -0
  212. package/dist/runtime/barrel-detect.d.ts +46 -0
  213. package/dist/runtime/barrel-detect.d.ts.map +1 -0
  214. package/dist/runtime/barrel-detect.js +73 -0
  215. package/dist/runtime/barrel-synthesizer.d.ts +181 -0
  216. package/dist/runtime/barrel-synthesizer.d.ts.map +1 -0
  217. package/dist/runtime/barrel-synthesizer.js +541 -0
  218. package/dist/runtime/bun-repl.d.ts +46 -0
  219. package/dist/runtime/bun-repl.d.ts.map +1 -0
  220. package/dist/runtime/bun-repl.js +326 -0
  221. package/dist/runtime/bun-runner.d.ts +66 -0
  222. package/dist/runtime/bun-runner.d.ts.map +1 -0
  223. package/dist/runtime/bun-runner.js +219 -0
  224. package/dist/runtime/clang-runner.d.ts +38 -0
  225. package/dist/runtime/clang-runner.d.ts.map +1 -0
  226. package/dist/runtime/clang-runner.js +1033 -0
  227. package/dist/runtime/comment-strip.d.ts +37 -0
  228. package/dist/runtime/comment-strip.d.ts.map +1 -0
  229. package/dist/runtime/comment-strip.js +74 -0
  230. package/dist/runtime/esbuild-service.d.ts +201 -0
  231. package/dist/runtime/esbuild-service.d.ts.map +1 -0
  232. package/dist/runtime/esbuild-service.js +1444 -0
  233. package/dist/runtime/esbuild-wasm-bytes.d.ts +87 -0
  234. package/dist/runtime/esbuild-wasm-bytes.d.ts.map +1 -0
  235. package/dist/runtime/esbuild-wasm-bytes.js +131 -0
  236. package/dist/runtime/framework-detect.d.ts +71 -0
  237. package/dist/runtime/framework-detect.d.ts.map +1 -0
  238. package/dist/runtime/framework-detect.js +178 -0
  239. package/dist/runtime/long-running-handle.d.ts +133 -0
  240. package/dist/runtime/long-running-handle.d.ts.map +1 -0
  241. package/dist/runtime/long-running-handle.js +192 -0
  242. package/dist/runtime/node-repl.d.ts +36 -0
  243. package/dist/runtime/node-repl.d.ts.map +1 -0
  244. package/dist/runtime/node-repl.js +293 -0
  245. package/dist/runtime/node-runner.d.ts +111 -0
  246. package/dist/runtime/node-runner.d.ts.map +1 -0
  247. package/dist/runtime/node-runner.js +194 -0
  248. package/dist/runtime/node-shims.d.ts +24 -0
  249. package/dist/runtime/node-shims.d.ts.map +1 -0
  250. package/dist/runtime/node-shims.js +3019 -0
  251. package/dist/runtime/package-manager.d.ts +118 -0
  252. package/dist/runtime/package-manager.d.ts.map +1 -0
  253. package/dist/runtime/package-manager.js +420 -0
  254. package/dist/runtime/port-registry.d.ts +80 -0
  255. package/dist/runtime/port-registry.d.ts.map +1 -0
  256. package/dist/runtime/port-registry.js +166 -0
  257. package/dist/runtime/process-logs-api.d.ts +102 -0
  258. package/dist/runtime/process-logs-api.d.ts.map +1 -0
  259. package/dist/runtime/process-logs-api.js +253 -0
  260. package/dist/runtime/process-logs.d.ts +311 -0
  261. package/dist/runtime/process-logs.d.ts.map +1 -0
  262. package/dist/runtime/process-logs.js +656 -0
  263. package/dist/runtime/process-table.d.ts +65 -0
  264. package/dist/runtime/process-table.d.ts.map +1 -0
  265. package/dist/runtime/process-table.js +107 -0
  266. package/dist/runtime/project-detect.d.ts +21 -0
  267. package/dist/runtime/project-detect.d.ts.map +1 -0
  268. package/dist/runtime/project-detect.js +46 -0
  269. package/dist/runtime/python-repl.d.ts +66 -0
  270. package/dist/runtime/python-repl.d.ts.map +1 -0
  271. package/dist/runtime/python-repl.js +563 -0
  272. package/dist/runtime/python-runner.d.ts +50 -0
  273. package/dist/runtime/python-runner.d.ts.map +1 -0
  274. package/dist/runtime/python-runner.js +870 -0
  275. package/dist/runtime/repl-session.d.ts +160 -0
  276. package/dist/runtime/repl-session.d.ts.map +1 -0
  277. package/dist/runtime/repl-session.js +393 -0
  278. package/dist/runtime/require-resolver.d.ts +52 -0
  279. package/dist/runtime/require-resolver.d.ts.map +1 -0
  280. package/dist/runtime/require-resolver.js +690 -0
  281. package/dist/runtime/router-basename.d.ts +36 -0
  282. package/dist/runtime/router-basename.d.ts.map +1 -0
  283. package/dist/runtime/router-basename.js +310 -0
  284. package/dist/runtime/ruby-repl.d.ts +43 -0
  285. package/dist/runtime/ruby-repl.d.ts.map +1 -0
  286. package/dist/runtime/ruby-repl.js +229 -0
  287. package/dist/runtime/ruby-runner.d.ts +62 -0
  288. package/dist/runtime/ruby-runner.d.ts.map +1 -0
  289. package/dist/runtime/ruby-runner.js +737 -0
  290. package/dist/runtime/runtime-catalog.d.ts +99 -0
  291. package/dist/runtime/runtime-catalog.d.ts.map +1 -0
  292. package/dist/runtime/runtime-catalog.js +183 -0
  293. package/dist/runtime/runtime-registry.d.ts +136 -0
  294. package/dist/runtime/runtime-registry.d.ts.map +1 -0
  295. package/dist/runtime/runtime-registry.js +318 -0
  296. package/dist/runtime/streams.d.ts +13 -0
  297. package/dist/runtime/streams.d.ts.map +1 -0
  298. package/dist/runtime/streams.js +402 -0
  299. package/dist/runtime/wasi-instance.d.ts +190 -0
  300. package/dist/runtime/wasi-instance.d.ts.map +1 -0
  301. package/dist/runtime/wasi-instance.js +2044 -0
  302. package/dist/runtime/wasm-runner.d.ts +117 -0
  303. package/dist/runtime/wasm-runner.d.ts.map +1 -0
  304. package/dist/runtime/wasm-runner.js +705 -0
  305. package/dist/session/bindings.d.ts +168 -0
  306. package/dist/session/bindings.d.ts.map +1 -0
  307. package/dist/session/bindings.js +524 -0
  308. package/dist/session/ctx-exports.d.ts +16 -0
  309. package/dist/session/ctx-exports.d.ts.map +1 -0
  310. package/dist/session/ctx-exports.js +22 -0
  311. package/dist/session/diag.d.ts +62 -0
  312. package/dist/session/diag.d.ts.map +1 -0
  313. package/dist/session/diag.js +118 -0
  314. package/dist/session/fs-watch.d.ts +132 -0
  315. package/dist/session/fs-watch.d.ts.map +1 -0
  316. package/dist/session/fs-watch.js +255 -0
  317. package/dist/session/helpers.d.ts +150 -0
  318. package/dist/session/helpers.d.ts.map +1 -0
  319. package/dist/session/helpers.js +472 -0
  320. package/dist/session/hibernation.d.ts +145 -0
  321. package/dist/session/hibernation.d.ts.map +1 -0
  322. package/dist/session/hibernation.js +385 -0
  323. package/dist/session/init-phases.d.ts +87 -0
  324. package/dist/session/init-phases.d.ts.map +1 -0
  325. package/dist/session/init-phases.js +137 -0
  326. package/dist/session/init.d.ts +46 -0
  327. package/dist/session/init.d.ts.map +1 -0
  328. package/dist/session/init.js +3579 -0
  329. package/dist/session/keys.d.ts +56 -0
  330. package/dist/session/keys.d.ts.map +1 -0
  331. package/dist/session/keys.js +55 -0
  332. package/dist/session/nimbus-session.d.ts +434 -0
  333. package/dist/session/nimbus-session.d.ts.map +1 -0
  334. package/dist/session/nimbus-session.js +1084 -0
  335. package/dist/session/programmatic.d.ts +105 -0
  336. package/dist/session/programmatic.d.ts.map +1 -0
  337. package/dist/session/programmatic.js +326 -0
  338. package/dist/session/replica-routes.d.ts +68 -0
  339. package/dist/session/replica-routes.d.ts.map +1 -0
  340. package/dist/session/replica-routes.js +77 -0
  341. package/dist/session/routes.d.ts +29 -0
  342. package/dist/session/routes.d.ts.map +1 -0
  343. package/dist/session/routes.js +1331 -0
  344. package/dist/session/rpc.d.ts +323 -0
  345. package/dist/session/rpc.d.ts.map +1 -0
  346. package/dist/session/rpc.js +808 -0
  347. package/dist/session/state-store.d.ts +210 -0
  348. package/dist/session/state-store.d.ts.map +1 -0
  349. package/dist/session/state-store.js +459 -0
  350. package/dist/session/supervisor-rpc.d.ts +269 -0
  351. package/dist/session/supervisor-rpc.d.ts.map +1 -0
  352. package/dist/session/supervisor-rpc.js +437 -0
  353. package/dist/session/ws-hibernation-config.d.ts +64 -0
  354. package/dist/session/ws-hibernation-config.d.ts.map +1 -0
  355. package/dist/session/ws-hibernation-config.js +89 -0
  356. package/dist/session/ws.d.ts +95 -0
  357. package/dist/session/ws.d.ts.map +1 -0
  358. package/dist/session/ws.js +395 -0
  359. package/dist/shell/features.d.ts +410 -0
  360. package/dist/shell/features.d.ts.map +1 -0
  361. package/dist/shell/features.js +1885 -0
  362. package/dist/shell/unix-commands.d.ts +15 -0
  363. package/dist/shell/unix-commands.d.ts.map +1 -0
  364. package/dist/shell/unix-commands.js +3703 -0
  365. package/dist/stubs/lifo-ui.d.ts +10 -0
  366. package/dist/stubs/lifo-ui.d.ts.map +1 -0
  367. package/dist/stubs/lifo-ui.js +1 -0
  368. package/dist/tailwind-play.generated.d.ts +19 -0
  369. package/dist/tailwind-play.generated.d.ts.map +1 -0
  370. package/dist/tailwind-play.generated.js +18 -0
  371. package/dist/vfs/dev-provider.d.ts +64 -0
  372. package/dist/vfs/dev-provider.d.ts.map +1 -0
  373. package/dist/vfs/dev-provider.js +191 -0
  374. package/dist/vfs/events.d.ts +51 -0
  375. package/dist/vfs/events.d.ts.map +1 -0
  376. package/dist/vfs/events.js +127 -0
  377. package/dist/vfs/path.d.ts +30 -0
  378. package/dist/vfs/path.d.ts.map +1 -0
  379. package/dist/vfs/path.js +41 -0
  380. package/dist/vfs/seed-project.d.ts +62 -0
  381. package/dist/vfs/seed-project.d.ts.map +1 -0
  382. package/dist/vfs/seed-project.js +1045 -0
  383. package/dist/vfs/sqlite-vfs.d.ts +435 -0
  384. package/dist/vfs/sqlite-vfs.d.ts.map +1 -0
  385. package/dist/vfs/sqlite-vfs.js +1670 -0
  386. package/dist/vfs/symlink-registry.d.ts +64 -0
  387. package/dist/vfs/symlink-registry.d.ts.map +1 -0
  388. package/dist/vfs/symlink-registry.js +137 -0
  389. package/dist/wrangler/nimbus-wrangler.d.ts +157 -0
  390. package/dist/wrangler/nimbus-wrangler.d.ts.map +1 -0
  391. package/dist/wrangler/nimbus-wrangler.js +931 -0
  392. package/package.json +77 -0
  393. package/public/_assets/cirrus-plugin-react.bundle.js +70740 -0
  394. package/public/_assets/esbuild-0.24.2.wasm +0 -0
  395. package/public/_assets/real-vite-bundle.js +101478 -0
  396. package/public/_assets/rollup.wasm +0 -0
  397. package/public/favicon.svg +8 -0
  398. package/public/index.html +565 -0
  399. package/public/s/index.html +2379 -0
  400. package/scripts/bundle-esbuild-wasm.mjs +244 -0
  401. package/scripts/bundle-facet-workers.mjs +137 -0
  402. package/scripts/bundle-git.mjs +118 -0
  403. package/scripts/bundle-npm-cjs.mjs +363 -0
  404. package/scripts/bundle-plugin-react.mjs +480 -0
  405. package/scripts/bundle-real-vite.mjs +959 -0
  406. package/scripts/bundle-runtime.mjs +600 -0
  407. package/scripts/bundle-tailwind-play.mjs +130 -0
  408. package/scripts/patch-lifo-ui.mjs +131 -0
@@ -0,0 +1,49 @@
1
+ /**
2
+ * replica-suspension.ts — W12 — global replica-suspension counter.
3
+ *
4
+ * Per [~lambros/Feedback for DO read replication API](https://wiki.cfdata.org/display/~lambros/Feedback+for+DO+read+replication+API+based+on+D1+read+replication+beta)
5
+ * (cited in CF research §G.4), DO read replicas error with "Network
6
+ * connection lost" during high-volume writes. The recommended mitigation
7
+ * is to disable replicas before a write burst (npm install, git clone)
8
+ * and re-enable after.
9
+ *
10
+ * This module exposes a refcount-style suspend/release API. The counter
11
+ * is checked by `shouldDelegateToPrimary` (in `replica-routing.ts`):
12
+ * when `replicasSuspended() === true`, the replica forwards everything
13
+ * to the primary regardless of route policy.
14
+ *
15
+ * Phase 1 of W12 ships the module + the in-DO consultation. Phase 2
16
+ * (W12.5 if measured demand) wires the npm-installer / git-clone hooks.
17
+ * Today's behaviour: counter stays at 0 → replicas serve normally; the
18
+ * SPEC error path is observed as a graceful-degrade (replica's primary
19
+ * stub returns the error and the user sees a 5xx, same as today's
20
+ * single-region behaviour).
21
+ */
22
+ let _suspendCount = 0;
23
+ /**
24
+ * Increment the suspension count. Returns a release function that
25
+ * decrements once (subsequent calls are no-ops). Suspends are nestable;
26
+ * any holder keeping the count > 0 keeps replicas suspended.
27
+ */
28
+ export function suspendReplicas() {
29
+ _suspendCount++;
30
+ let released = false;
31
+ return () => {
32
+ if (released)
33
+ return;
34
+ released = true;
35
+ _suspendCount = Math.max(0, _suspendCount - 1);
36
+ };
37
+ }
38
+ /** Are any holders currently suspending replicas? */
39
+ export function replicasSuspended() {
40
+ return _suspendCount > 0;
41
+ }
42
+ /**
43
+ * Test-only escape hatch. Resets the counter to 0. Production code MUST
44
+ * NOT call this — use only the suspend/release pair to keep semantics
45
+ * tight. Exported under a `_` prefix and namespaced for tests.
46
+ */
47
+ export function _resetSuspensionForTests() {
48
+ _suspendCount = 0;
49
+ }
@@ -0,0 +1,156 @@
1
+ /**
2
+ * router/index.ts — `createNimbusHandler` factory.
3
+ *
4
+ * The Worker entry's `default { fetch }` is now a thin call into this
5
+ * factory. The factory is the **composable surface** an embedder gets via
6
+ * `@nimbus-sh/worker`:
7
+ *
8
+ * import { NimbusSession, createNimbusHandler } from '@nimbus-sh/worker';
9
+ * export { NimbusSession };
10
+ * export default createNimbusHandler({
11
+ * // Optional embedder hooks (all default no-op):
12
+ * hooks: {
13
+ * onSessionStart: async (ctx) => { … },
14
+ * onSessionEnd: async (ctx) => { … },
15
+ * },
16
+ * // Optional embedder routes that run BEFORE the Nimbus router.
17
+ * // Return null to fall through to Nimbus's handling.
18
+ * routes: async (req, env, ctx) => {
19
+ * if (new URL(req.url).pathname === '/healthz') return new Response('ok');
20
+ * return null;
21
+ * },
22
+ * // Optional auth-mode override (default 'auto').
23
+ * auth: { mode: 'auto', legacyPublic: false },
24
+ * });
25
+ *
26
+ * Why a factory + hooks (not a class)?
27
+ * - Closures match the Workers programming model. A factory returns a
28
+ * fresh module-export-shaped object that the Workers runtime calls.
29
+ * - Hooks let embedders observe lifecycle without forking the DO. They
30
+ * run alongside, never block (errors are caught + logged).
31
+ * - The default `createNimbusHandler()` (zero args) is the
32
+ * "ship-Nimbus-as-is" case — exactly what `apps/dogfood/` does.
33
+ */
34
+ /**
35
+ * Lifecycle event a hook receives. Hooks should treat this as read-only.
36
+ */
37
+ export interface NimbusHookContext {
38
+ /** Tenant segment used for the DO instance name. */
39
+ tenantSegment: string;
40
+ /** Session ID portion of the URL. */
41
+ sessionId: string;
42
+ /** The inbound Request (read-only — clone via `request.clone()` to read body). */
43
+ request: Request;
44
+ /** Bindings env. */
45
+ env: any;
46
+ }
47
+ /**
48
+ * Embedder hooks. Every hook is optional and defaults to no-op. Errors
49
+ * thrown from a hook are caught and logged via `console.warn`; they do
50
+ * NOT short-circuit the request.
51
+ *
52
+ * `onSessionStart` fires on the first WebSocket upgrade for a session
53
+ * (not on every HTTP API call). `onSessionEnd` fires when the DO emits a
54
+ * session-end event (not implemented v1; reserved).
55
+ */
56
+ export interface NimbusHooks {
57
+ /**
58
+ * Called when a new session is first attached via WebSocket. Useful
59
+ * for embedder-side audit logging, metrics, or token-binding
60
+ * provenance recording.
61
+ *
62
+ * @param ctx Lifecycle context.
63
+ */
64
+ onSessionStart?(ctx: NimbusHookContext): void | Promise<void>;
65
+ /**
66
+ * Reserved for v0.2. Will fire when a session is destroyed (TTL
67
+ * elapsed, explicit destroy, or DO eviction).
68
+ */
69
+ onSessionEnd?(ctx: NimbusHookContext): void | Promise<void>;
70
+ }
71
+ /**
72
+ * Auth-mode selector for {@link createNimbusHandler}.
73
+ *
74
+ * `'auto'` (default):
75
+ * - If `env.JWT_SECRET` is set AND `env.NIMBUS_LEGACY_PUBLIC !== '1'`:
76
+ * verify every `/s/<id>/` request against the JWT.
77
+ * - Otherwise: legacy-public mode — all `/s/<id>/` requests route to
78
+ * the `legacy:public:_` tenant segment (single shared tenant).
79
+ *
80
+ * `'enforce'`: always require a valid token; fail closed if `JWT_SECRET`
81
+ * is missing.
82
+ *
83
+ * `'legacy'`: always legacy-public; never verify. Use only for the
84
+ * live demo / single-tenant deployments where the URL is the auth.
85
+ */
86
+ export type AuthMode = 'auto' | 'enforce' | 'legacy';
87
+ /** Configuration for the auth surface. */
88
+ export interface NimbusAuthConfig {
89
+ mode?: AuthMode;
90
+ /**
91
+ * Backward-compat opt-in for the legacy single-tenant fallback. Same
92
+ * effect as `mode: 'legacy'`; provided as a named flag for clarity
93
+ * in embedder configs. Ignored when `mode` is set explicitly.
94
+ */
95
+ legacyPublic?: boolean;
96
+ }
97
+ /**
98
+ * Custom-routes hook. Runs BEFORE the Nimbus router. Return a `Response`
99
+ * to short-circuit Nimbus; return `null` to fall through.
100
+ *
101
+ * Embedders use this to mount `/api/auth/nimbus-token` (token mint),
102
+ * `/healthz`, `/metrics`, etc. without proxying through the DO.
103
+ */
104
+ export type CustomRoutes = (request: Request, env: any, ctx: ExecutionContext) => Response | null | Promise<Response | null>;
105
+ /** Options for {@link createNimbusHandler}. */
106
+ export interface CreateNimbusHandlerOptions {
107
+ /** Embedder hooks. All optional. */
108
+ hooks?: NimbusHooks;
109
+ /** Custom routes that run before Nimbus's router. */
110
+ routes?: CustomRoutes;
111
+ /** Auth-mode selector. Default `'auto'`. */
112
+ auth?: NimbusAuthConfig;
113
+ }
114
+ /**
115
+ * The shape every `default export` Workers handler must satisfy.
116
+ * Exported so embedders can type their own composed default export.
117
+ */
118
+ export interface NimbusHandler {
119
+ fetch(request: Request, env: any, ctx: ExecutionContext): Promise<Response>;
120
+ }
121
+ /**
122
+ * Build a Nimbus default-export handler. The returned object is exactly
123
+ * what `export default` expects in a Workers entry module.
124
+ *
125
+ * @example minimal embedder
126
+ * ```ts
127
+ * import { NimbusSession, createNimbusHandler } from '@nimbus-sh/worker';
128
+ * export { NimbusSession };
129
+ * export default createNimbusHandler();
130
+ * ```
131
+ *
132
+ * @example embedder with auth + a custom route
133
+ * ```ts
134
+ * import { NimbusSession, createNimbusHandler } from '@nimbus-sh/worker';
135
+ * import { issueNimbusToken } from '@nimbus-sh/sdk/token';
136
+ *
137
+ * export { NimbusSession };
138
+ * export default createNimbusHandler({
139
+ * auth: { mode: 'enforce' },
140
+ * routes: async (req, env) => {
141
+ * if (new URL(req.url).pathname === '/api/auth/mint' && req.method === 'POST') {
142
+ * const { tenant, sub } = await req.json();
143
+ * const token = await issueNimbusToken(env, { tn: tenant, sub });
144
+ * return Response.json({ token });
145
+ * }
146
+ * return null;
147
+ * },
148
+ * hooks: {
149
+ * onSessionStart: ({ tenantSegment, sessionId }) =>
150
+ * console.log(`session ${sessionId} for ${tenantSegment}`),
151
+ * },
152
+ * });
153
+ * ```
154
+ */
155
+ export declare function createNimbusHandler(options?: CreateNimbusHandlerOptions): NimbusHandler;
156
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/router/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAsBH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB;IACpB,GAAG,EAAE,GAAG,CAAC;CACV;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,cAAc,CAAC,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9D;;;OAGG;IACH,YAAY,CAAC,CAAC,GAAG,EAAE,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAErD,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,gBAAgB,KAClB,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AAEhD,+CAA+C;AAC/C,MAAM,WAAW,0BAA0B;IACzC,oCAAoC;IACpC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,gBAAgB,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC7E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,GAAE,0BAA+B,GACvC,aAAa,CA+Gf"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * router/index.ts — `createNimbusHandler` factory.
3
+ *
4
+ * The Worker entry's `default { fetch }` is now a thin call into this
5
+ * factory. The factory is the **composable surface** an embedder gets via
6
+ * `@nimbus-sh/worker`:
7
+ *
8
+ * import { NimbusSession, createNimbusHandler } from '@nimbus-sh/worker';
9
+ * export { NimbusSession };
10
+ * export default createNimbusHandler({
11
+ * // Optional embedder hooks (all default no-op):
12
+ * hooks: {
13
+ * onSessionStart: async (ctx) => { … },
14
+ * onSessionEnd: async (ctx) => { … },
15
+ * },
16
+ * // Optional embedder routes that run BEFORE the Nimbus router.
17
+ * // Return null to fall through to Nimbus's handling.
18
+ * routes: async (req, env, ctx) => {
19
+ * if (new URL(req.url).pathname === '/healthz') return new Response('ok');
20
+ * return null;
21
+ * },
22
+ * // Optional auth-mode override (default 'auto').
23
+ * auth: { mode: 'auto', legacyPublic: false },
24
+ * });
25
+ *
26
+ * Why a factory + hooks (not a class)?
27
+ * - Closures match the Workers programming model. A factory returns a
28
+ * fresh module-export-shaped object that the Workers runtime calls.
29
+ * - Hooks let embedders observe lifecycle without forking the DO. They
30
+ * run alongside, never block (errors are caught + logged).
31
+ * - The default `createNimbusHandler()` (zero args) is the
32
+ * "ship-Nimbus-as-is" case — exactly what `apps/dogfood/` does.
33
+ */
34
+ import { generateSessionId, isValidSessionId, } from '../_shared/session-id.js';
35
+ import { parseSessionRoute, forwardToSession, renderInvalidSessionHtml, SESSION_ROUTE_PREFIX, LEGACY_PUBLIC_DO_SEGMENT, } from '../_shared/session-router.js';
36
+ import { verifyRequestToken, authErrorResponse, NimbusAuthError, NimbusTokenMalformedError, } from '../auth/index.js';
37
+ import { setCtxExports } from '../session/ctx-exports.js';
38
+ /**
39
+ * Build a Nimbus default-export handler. The returned object is exactly
40
+ * what `export default` expects in a Workers entry module.
41
+ *
42
+ * @example minimal embedder
43
+ * ```ts
44
+ * import { NimbusSession, createNimbusHandler } from '@nimbus-sh/worker';
45
+ * export { NimbusSession };
46
+ * export default createNimbusHandler();
47
+ * ```
48
+ *
49
+ * @example embedder with auth + a custom route
50
+ * ```ts
51
+ * import { NimbusSession, createNimbusHandler } from '@nimbus-sh/worker';
52
+ * import { issueNimbusToken } from '@nimbus-sh/sdk/token';
53
+ *
54
+ * export { NimbusSession };
55
+ * export default createNimbusHandler({
56
+ * auth: { mode: 'enforce' },
57
+ * routes: async (req, env) => {
58
+ * if (new URL(req.url).pathname === '/api/auth/mint' && req.method === 'POST') {
59
+ * const { tenant, sub } = await req.json();
60
+ * const token = await issueNimbusToken(env, { tn: tenant, sub });
61
+ * return Response.json({ token });
62
+ * }
63
+ * return null;
64
+ * },
65
+ * hooks: {
66
+ * onSessionStart: ({ tenantSegment, sessionId }) =>
67
+ * console.log(`session ${sessionId} for ${tenantSegment}`),
68
+ * },
69
+ * });
70
+ * ```
71
+ */
72
+ export function createNimbusHandler(options = {}) {
73
+ const hooks = options.hooks ?? {};
74
+ const customRoutes = options.routes;
75
+ const authConfig = options.auth ?? {};
76
+ // Resolve auth mode at factory-construction time.
77
+ const explicitMode = authConfig.mode
78
+ ?? (authConfig.legacyPublic ? 'legacy' : undefined);
79
+ return {
80
+ async fetch(request, env, ctx) {
81
+ // Capture ctx.exports on first call (loopback bindings for facets).
82
+ if (ctx?.exports)
83
+ setCtxExports(ctx.exports);
84
+ // Embedder custom routes run first.
85
+ if (customRoutes) {
86
+ try {
87
+ const r = await customRoutes(request, env, ctx);
88
+ if (r)
89
+ return r;
90
+ }
91
+ catch (e) {
92
+ console.error('[nimbus] custom route threw:', e?.stack || e);
93
+ return new Response('Internal error in embedder route', { status: 500 });
94
+ }
95
+ }
96
+ const url = new URL(request.url);
97
+ // ── /new — spawn a fresh session and redirect ───────────────────
98
+ if (url.pathname === '/new') {
99
+ if (request.method !== 'POST' && request.method !== 'GET') {
100
+ return new Response('Method not allowed', { status: 405 });
101
+ }
102
+ const sessionId = generateSessionId();
103
+ return new Response(null, {
104
+ status: 302,
105
+ headers: {
106
+ Location: `${SESSION_ROUTE_PREFIX}/${sessionId}/`,
107
+ 'Cache-Control': 'no-store',
108
+ },
109
+ });
110
+ }
111
+ // ── /s/<id>/... — session-scoped routes ─────────────────────────
112
+ const route = parseSessionRoute(url.pathname);
113
+ if (route) {
114
+ if (!isValidSessionId(route.sessionId)) {
115
+ return new Response(renderInvalidSessionHtml(route.sessionId), {
116
+ status: 400,
117
+ headers: {
118
+ 'Content-Type': 'text/html; charset=utf-8',
119
+ 'Cache-Control': 'no-store',
120
+ },
121
+ });
122
+ }
123
+ // Resolve tenant segment per auth mode.
124
+ const tenantSegment = await resolveTenantSegment(request, env, explicitMode);
125
+ if (tenantSegment instanceof Response)
126
+ return tenantSegment;
127
+ // `/s/<id>` and `/s/<id>/` (no inner path) → serve the xterm UI shell.
128
+ if (route.innerPath === '/' || route.innerPath === '') {
129
+ if (env.ASSETS) {
130
+ const shellUrl = new URL('/s/index.html', url.origin);
131
+ return env.ASSETS.fetch(new Request(shellUrl.toString(), {
132
+ method: 'GET',
133
+ headers: request.headers,
134
+ }));
135
+ }
136
+ return new Response('<!DOCTYPE html><meta http-equiv="refresh" content="0; url=/"><title>Nimbus</title>', { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' } });
137
+ }
138
+ // Best-effort fire onSessionStart on WebSocket upgrade. Hooks
139
+ // never block: schedule via ctx.waitUntil.
140
+ if (hooks.onSessionStart && request.headers.get('Upgrade') === 'websocket') {
141
+ try {
142
+ const p = Promise.resolve(hooks.onSessionStart({
143
+ tenantSegment,
144
+ sessionId: route.sessionId,
145
+ request,
146
+ env,
147
+ })).catch((e) => console.warn('[nimbus] onSessionStart hook threw:', e?.stack || e));
148
+ ctx?.waitUntil?.(p);
149
+ }
150
+ catch (e) {
151
+ console.warn('[nimbus] onSessionStart hook threw synchronously:', e);
152
+ }
153
+ }
154
+ return forwardToSession(request, route, env, { tenantSegment });
155
+ }
156
+ // ── Back-compat legacy root paths → landing page ────────────────
157
+ if (isLegacyRootPath(url.pathname)) {
158
+ return new Response(null, {
159
+ status: 302,
160
+ headers: { Location: '/', 'Cache-Control': 'no-store' },
161
+ });
162
+ }
163
+ return new Response('Not found', { status: 404 });
164
+ },
165
+ };
166
+ }
167
+ // ── Internal helpers ─────────────────────────────────────────────────────
168
+ const LEGACY_ROOT_PATHS = ['/ws', '/api/', '/preview', '/worker', '/__nimbus/', '/port/'];
169
+ function isLegacyRootPath(pathname) {
170
+ for (const p of LEGACY_ROOT_PATHS) {
171
+ if (p.endsWith('/')) {
172
+ if (pathname.startsWith(p))
173
+ return true;
174
+ }
175
+ else {
176
+ if (pathname === p || pathname.startsWith(p + '/'))
177
+ return true;
178
+ }
179
+ }
180
+ return false;
181
+ }
182
+ /**
183
+ * Decide which tenant segment to use for DO naming. Returns either the
184
+ * segment string or a short-circuit Response (auth failure).
185
+ *
186
+ * Mode `'auto'`:
187
+ * - If JWT_SECRET is set AND legacy env var not "1" → enforce verify.
188
+ * - Otherwise → legacy public.
189
+ *
190
+ * Mode `'enforce'`: always verify; 401 on missing/invalid token.
191
+ *
192
+ * Mode `'legacy'`: always legacy public.
193
+ */
194
+ async function resolveTenantSegment(request, env, explicitMode) {
195
+ const envLegacyFlag = (env?.NIMBUS_LEGACY_PUBLIC === '1' || env?.NIMBUS_LEGACY_PUBLIC === true);
196
+ const hasSecret = typeof env?.JWT_SECRET === 'string' && env.JWT_SECRET.length > 0;
197
+ const mode = explicitMode
198
+ ?? (hasSecret && !envLegacyFlag ? 'enforce' : 'legacy');
199
+ if (mode === 'legacy')
200
+ return LEGACY_PUBLIC_DO_SEGMENT;
201
+ if (!hasSecret) {
202
+ // Enforce mode but no secret — config error. 500, no info leak.
203
+ console.error('[nimbus] auth.mode="enforce" but JWT_SECRET is missing');
204
+ return new Response(JSON.stringify({ error: 'Server auth misconfigured', code: 'E_AUTH_CONFIG_MISSING' }), { status: 500, headers: { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' } });
205
+ }
206
+ try {
207
+ const verified = await verifyRequestToken(request, env);
208
+ return verified.doInstanceName;
209
+ }
210
+ catch (e) {
211
+ if (e instanceof NimbusAuthError) {
212
+ return authErrorResponse(e);
213
+ }
214
+ if (e instanceof NimbusTokenMalformedError) {
215
+ return authErrorResponse(e);
216
+ }
217
+ console.error('[nimbus] unexpected auth error:', e);
218
+ return new Response(JSON.stringify({ error: 'Internal auth error', code: 'E_AUTH_UNKNOWN' }), { status: 500, headers: { 'Content-Type': 'application/json', 'Cache-Control': 'no-store' } });
219
+ }
220
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * runtime/assets-loader.ts — Lazy fetch of large static blobs from the
3
+ * ASSETS binding.
4
+ *
5
+ * Background: the Worker bundle ships ~9.8 MB of generated TypeScript
6
+ * blobs (cirrus-npm-cjs, cirrus-plugin-react, real-vite-bundle, ...).
7
+ * Inlining them at module-load doubles cold-start parse time and
8
+ * inflates deploy uploads. The ASSETS binding lets us serve them as
9
+ * static files (cached at the edge), fetched on first use, kept in a
10
+ * per-isolate cache for subsequent calls.
11
+ *
12
+ * Same pattern as `esbuild-wasm-bytes.ts` (proven in production —
13
+ * see esbuild-wasm-bundle.generated.ts header for history). We
14
+ * generalize it here so future asset promotions are one-line.
15
+ *
16
+ * @example a bundle script writes the big string to
17
+ * `public/_assets/cirrus-plugin-react.bundle.js` and emits a thin
18
+ * `.generated.ts` that re-exports {@link loadAssetText} bound to that
19
+ * path:
20
+ *
21
+ * ```ts
22
+ * // src/cirrus-plugin-react.generated.ts (post-promotion)
23
+ * import { loadAssetText } from './runtime/assets-loader.js';
24
+ * export const CIRRUS_PLUGIN_REACT_VERSION = "4.3.4";
25
+ * export const CIRRUS_PLUGIN_REACT_BUNDLE_PATH = '/_assets/cirrus-plugin-react.bundle.js';
26
+ * export async function getCirrusPluginReactBundle(env: { ASSETS: Fetcher }): Promise<string> {
27
+ * return loadAssetText(env.ASSETS, CIRRUS_PLUGIN_REACT_BUNDLE_PATH);
28
+ * }
29
+ * ```
30
+ *
31
+ * Cache discipline: keyed by `${path}` (no env or origin in the key)
32
+ * because ASSETS is content-addressed at the deploy level — a redeploy
33
+ * generates new asset bundles and the new isolate sees no stale cache.
34
+ * Within a single isolate's lifetime, the same path always returns the
35
+ * same content.
36
+ */
37
+ /**
38
+ * Asset fetch error. Thrown when ASSETS binding is missing or returns
39
+ * a non-200.
40
+ */
41
+ export declare class NimbusAssetLoadError extends Error {
42
+ readonly code: 'E_ASSETS_BINDING_MISSING' | 'E_ASSET_NOT_FOUND' | 'E_ASSET_FETCH_FAILED';
43
+ readonly status?: number;
44
+ readonly path: string;
45
+ constructor(message: string, code: NimbusAssetLoadError['code'], path: string, status?: number);
46
+ }
47
+ /** Minimal fetcher shape so callers don't need to import a Cloudflare type. */
48
+ export interface AssetsFetcher {
49
+ fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;
50
+ }
51
+ /**
52
+ * Load an asset's bytes by path. Subsequent calls in the same isolate
53
+ * return from cache.
54
+ *
55
+ * @param assets `env.ASSETS` binding.
56
+ * @param path Asset path (e.g. `/_assets/foo.bin`). Leading `/`
57
+ * required.
58
+ * @throws {NimbusAssetLoadError} on binding missing or non-2xx.
59
+ */
60
+ export declare function loadAssetBytes(assets: AssetsFetcher | undefined, path: string): Promise<Uint8Array>;
61
+ /**
62
+ * Load an asset as a UTF-8 string. Same caching discipline as
63
+ * {@link loadAssetBytes}.
64
+ */
65
+ export declare function loadAssetText(assets: AssetsFetcher | undefined, path: string): Promise<string>;
66
+ /**
67
+ * Test-only: drop the per-isolate cache. Real isolates never call this;
68
+ * the cache exists for the isolate's lifetime.
69
+ */
70
+ export declare function _resetAssetsCacheForTests(): void;
71
+ //# sourceMappingURL=assets-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets-loader.d.ts","sourceRoot":"","sources":["../../src/runtime/assets-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAUH;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,EAAE,0BAA0B,GAAG,mBAAmB,GAAG,sBAAsB,CAAC;IACzF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,EAClC,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM;CAQlB;AAED,+EAA+E;AAC/E,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAClE;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CAwCrB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAoCjB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAGhD"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * runtime/assets-loader.ts — Lazy fetch of large static blobs from the
3
+ * ASSETS binding.
4
+ *
5
+ * Background: the Worker bundle ships ~9.8 MB of generated TypeScript
6
+ * blobs (cirrus-npm-cjs, cirrus-plugin-react, real-vite-bundle, ...).
7
+ * Inlining them at module-load doubles cold-start parse time and
8
+ * inflates deploy uploads. The ASSETS binding lets us serve them as
9
+ * static files (cached at the edge), fetched on first use, kept in a
10
+ * per-isolate cache for subsequent calls.
11
+ *
12
+ * Same pattern as `esbuild-wasm-bytes.ts` (proven in production —
13
+ * see esbuild-wasm-bundle.generated.ts header for history). We
14
+ * generalize it here so future asset promotions are one-line.
15
+ *
16
+ * @example a bundle script writes the big string to
17
+ * `public/_assets/cirrus-plugin-react.bundle.js` and emits a thin
18
+ * `.generated.ts` that re-exports {@link loadAssetText} bound to that
19
+ * path:
20
+ *
21
+ * ```ts
22
+ * // src/cirrus-plugin-react.generated.ts (post-promotion)
23
+ * import { loadAssetText } from './runtime/assets-loader.js';
24
+ * export const CIRRUS_PLUGIN_REACT_VERSION = "4.3.4";
25
+ * export const CIRRUS_PLUGIN_REACT_BUNDLE_PATH = '/_assets/cirrus-plugin-react.bundle.js';
26
+ * export async function getCirrusPluginReactBundle(env: { ASSETS: Fetcher }): Promise<string> {
27
+ * return loadAssetText(env.ASSETS, CIRRUS_PLUGIN_REACT_BUNDLE_PATH);
28
+ * }
29
+ * ```
30
+ *
31
+ * Cache discipline: keyed by `${path}` (no env or origin in the key)
32
+ * because ASSETS is content-addressed at the deploy level — a redeploy
33
+ * generates new asset bundles and the new isolate sees no stale cache.
34
+ * Within a single isolate's lifetime, the same path always returns the
35
+ * same content.
36
+ */
37
+ /**
38
+ * Per-isolate cache. Keys are asset paths (e.g. `/_assets/foo.js`).
39
+ * Values are settled promises so concurrent callers share the same
40
+ * fetch.
41
+ */
42
+ const __assetTextCache = new Map();
43
+ const __assetBytesCache = new Map();
44
+ /**
45
+ * Asset fetch error. Thrown when ASSETS binding is missing or returns
46
+ * a non-200.
47
+ */
48
+ export class NimbusAssetLoadError extends Error {
49
+ code;
50
+ status;
51
+ path;
52
+ constructor(message, code, path, status) {
53
+ super(message);
54
+ this.name = 'NimbusAssetLoadError';
55
+ this.code = code;
56
+ this.path = path;
57
+ this.status = status;
58
+ }
59
+ }
60
+ /**
61
+ * Load an asset's bytes by path. Subsequent calls in the same isolate
62
+ * return from cache.
63
+ *
64
+ * @param assets `env.ASSETS` binding.
65
+ * @param path Asset path (e.g. `/_assets/foo.bin`). Leading `/`
66
+ * required.
67
+ * @throws {NimbusAssetLoadError} on binding missing or non-2xx.
68
+ */
69
+ export function loadAssetBytes(assets, path) {
70
+ if (!assets || typeof assets.fetch !== 'function') {
71
+ return Promise.reject(new NimbusAssetLoadError(`ASSETS binding missing — cannot load ${path}. Did you forget the assets.binding=ASSETS in wrangler.jsonc?`, 'E_ASSETS_BINDING_MISSING', path));
72
+ }
73
+ const cached = __assetBytesCache.get(path);
74
+ if (cached)
75
+ return cached;
76
+ const promise = (async () => {
77
+ // ASSETS.fetch requires an absolute URL, but the origin is ignored
78
+ // — it just routes by pathname. Use a stable sentinel origin.
79
+ const url = `https://assets.invalid${path}`;
80
+ const r = await assets.fetch(url);
81
+ if (r.status === 404) {
82
+ throw new NimbusAssetLoadError(`Asset not found: ${path}`, 'E_ASSET_NOT_FOUND', path, 404);
83
+ }
84
+ if (!r.ok) {
85
+ throw new NimbusAssetLoadError(`Asset fetch failed: ${path} → ${r.status}`, 'E_ASSET_FETCH_FAILED', path, r.status);
86
+ }
87
+ const buf = await r.arrayBuffer();
88
+ return new Uint8Array(buf);
89
+ })();
90
+ __assetBytesCache.set(path, promise);
91
+ // Evict on failure so subsequent calls retry.
92
+ promise.catch(() => __assetBytesCache.delete(path));
93
+ return promise;
94
+ }
95
+ /**
96
+ * Load an asset as a UTF-8 string. Same caching discipline as
97
+ * {@link loadAssetBytes}.
98
+ */
99
+ export function loadAssetText(assets, path) {
100
+ if (!assets || typeof assets.fetch !== 'function') {
101
+ return Promise.reject(new NimbusAssetLoadError(`ASSETS binding missing — cannot load ${path}. Did you forget the assets.binding=ASSETS in wrangler.jsonc?`, 'E_ASSETS_BINDING_MISSING', path));
102
+ }
103
+ const cached = __assetTextCache.get(path);
104
+ if (cached)
105
+ return cached;
106
+ const promise = (async () => {
107
+ const url = `https://assets.invalid${path}`;
108
+ const r = await assets.fetch(url);
109
+ if (r.status === 404) {
110
+ throw new NimbusAssetLoadError(`Asset not found: ${path}`, 'E_ASSET_NOT_FOUND', path, 404);
111
+ }
112
+ if (!r.ok) {
113
+ throw new NimbusAssetLoadError(`Asset fetch failed: ${path} → ${r.status}`, 'E_ASSET_FETCH_FAILED', path, r.status);
114
+ }
115
+ return r.text();
116
+ })();
117
+ __assetTextCache.set(path, promise);
118
+ promise.catch(() => __assetTextCache.delete(path));
119
+ return promise;
120
+ }
121
+ /**
122
+ * Test-only: drop the per-isolate cache. Real isolates never call this;
123
+ * the cache exists for the isolate's lifetime.
124
+ */
125
+ export function _resetAssetsCacheForTests() {
126
+ __assetTextCache.clear();
127
+ __assetBytesCache.clear();
128
+ }