@statewalker/cellb 0.0.0-stage → 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 (365) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +323 -2
  3. package/dist/adapters/files-backup.d.ts +16 -0
  4. package/dist/adapters/files-backup.js +32 -0
  5. package/dist/adapters/files-backup.js.map +1 -0
  6. package/dist/adapters/files-changelog.d.ts +33 -0
  7. package/dist/adapters/files-changelog.js +96 -0
  8. package/dist/adapters/files-changelog.js.map +1 -0
  9. package/dist/adapters/files-ltx.d.ts +35 -0
  10. package/dist/adapters/files-ltx.js +9 -0
  11. package/dist/adapters/files-ltx.js.map +1 -0
  12. package/dist/adapters/ltx-vfs.d.ts +21 -0
  13. package/dist/adapters/ltx-vfs.js +286 -0
  14. package/dist/adapters/ltx-vfs.js.map +1 -0
  15. package/dist/adapters/node-sqlite.d.ts +45 -0
  16. package/dist/adapters/node-sqlite.js +254 -0
  17. package/dist/adapters/node-sqlite.js.map +1 -0
  18. package/dist/adapters/wasm-page-hook.d.ts +26 -0
  19. package/dist/adapters/wasm-page-hook.js +55 -0
  20. package/dist/adapters/wasm-page-hook.js.map +1 -0
  21. package/dist/adapters/wasm-session.d.ts +11 -0
  22. package/dist/adapters/wasm-session.js +76 -0
  23. package/dist/adapters/wasm-session.js.map +1 -0
  24. package/dist/adapters/wasm-sqlite.d.ts +89 -0
  25. package/dist/adapters/wasm-sqlite.js +258 -0
  26. package/dist/adapters/wasm-sqlite.js.map +1 -0
  27. package/dist/bindings/assets.d.ts +26 -0
  28. package/dist/bindings/assets.js +260 -0
  29. package/dist/bindings/assets.js.map +1 -0
  30. package/dist/bindings/cache.d.ts +16 -0
  31. package/dist/bindings/cache.js +34 -0
  32. package/dist/bindings/cache.js.map +1 -0
  33. package/dist/bindings/celld-kv.d.ts +26 -0
  34. package/dist/bindings/celld-kv.js +81 -0
  35. package/dist/bindings/celld-kv.js.map +1 -0
  36. package/dist/bindings/celld-queues.d.ts +56 -0
  37. package/dist/bindings/celld-queues.js +223 -0
  38. package/dist/bindings/celld-queues.js.map +1 -0
  39. package/dist/bindings/celld-workflows.d.ts +22 -0
  40. package/dist/bindings/celld-workflows.js +54 -0
  41. package/dist/bindings/celld-workflows.js.map +1 -0
  42. package/dist/bindings/cron.d.ts +27 -0
  43. package/dist/bindings/cron.js +232 -0
  44. package/dist/bindings/cron.js.map +1 -0
  45. package/dist/bindings/d1-migrations.d.ts +22 -0
  46. package/dist/bindings/d1-migrations.js +32 -0
  47. package/dist/bindings/d1-migrations.js.map +1 -0
  48. package/dist/bindings/html-rewriter.d.ts +8 -0
  49. package/dist/bindings/html-rewriter.js +75 -0
  50. package/dist/bindings/html-rewriter.js.map +1 -0
  51. package/dist/bindings/r2-celld.d.ts +3 -0
  52. package/dist/bindings/r2-celld.js +113 -0
  53. package/dist/bindings/r2-celld.js.map +1 -0
  54. package/dist/bindings/r2.d.ts +236 -0
  55. package/dist/bindings/r2.js +419 -0
  56. package/dist/bindings/r2.js.map +1 -0
  57. package/dist/bindings/worker-loader.d.ts +83 -0
  58. package/dist/bindings/worker-loader.js +183 -0
  59. package/dist/bindings/worker-loader.js.map +1 -0
  60. package/dist/bindings/workers-ai.d.ts +39 -0
  61. package/dist/bindings/workers-ai.js +175 -0
  62. package/dist/bindings/workers-ai.js.map +1 -0
  63. package/dist/browser.d.ts +7 -0
  64. package/dist/browser.js +8 -0
  65. package/dist/browser.js.map +1 -0
  66. package/dist/bucket/celld-cells.d.ts +86 -0
  67. package/dist/bucket/celld-cells.js +273 -0
  68. package/dist/bucket/celld-cells.js.map +1 -0
  69. package/dist/bucket/celld-format.d.ts +10 -0
  70. package/dist/bucket/celld-format.js +27 -0
  71. package/dist/bucket/celld-format.js.map +1 -0
  72. package/dist/bucket/idb-object-store.d.ts +9 -0
  73. package/dist/bucket/idb-object-store.js +73 -0
  74. package/dist/bucket/idb-object-store.js.map +1 -0
  75. package/dist/bucket/ltx-log.d.ts +34 -0
  76. package/dist/bucket/ltx-log.js +289 -0
  77. package/dist/bucket/ltx-log.js.map +1 -0
  78. package/dist/bucket/object-store.d.ts +51 -0
  79. package/dist/bucket/object-store.js +114 -0
  80. package/dist/bucket/object-store.js.map +1 -0
  81. package/dist/bucket/s3-object-store.d.ts +25 -0
  82. package/dist/bucket/s3-object-store.js +151 -0
  83. package/dist/bucket/s3-object-store.js.map +1 -0
  84. package/dist/bucket/sqlite-object-store.d.ts +10 -0
  85. package/dist/bucket/sqlite-object-store.js +107 -0
  86. package/dist/bucket/sqlite-object-store.js.map +1 -0
  87. package/dist/core/alarms.d.ts +27 -0
  88. package/dist/core/alarms.js +88 -0
  89. package/dist/core/alarms.js.map +1 -0
  90. package/dist/core/async-context.d.ts +34 -0
  91. package/dist/core/async-context.js +50 -0
  92. package/dist/core/async-context.js.map +1 -0
  93. package/dist/core/celld-schema.d.ts +14 -0
  94. package/dist/core/celld-schema.js +34 -0
  95. package/dist/core/celld-schema.js.map +1 -0
  96. package/dist/core/durable-object.d.ts +28 -0
  97. package/dist/core/durable-object.js +31 -0
  98. package/dist/core/durable-object.js.map +1 -0
  99. package/dist/core/gates.d.ts +33 -0
  100. package/dist/core/gates.js +89 -0
  101. package/dist/core/gates.js.map +1 -0
  102. package/dist/core/handles.d.ts +90 -0
  103. package/dist/core/handles.js +224 -0
  104. package/dist/core/handles.js.map +1 -0
  105. package/dist/core/id.d.ts +19 -0
  106. package/dist/core/id.js +64 -0
  107. package/dist/core/id.js.map +1 -0
  108. package/dist/core/namespace.d.ts +38 -0
  109. package/dist/core/namespace.js +141 -0
  110. package/dist/core/namespace.js.map +1 -0
  111. package/dist/core/object-host.d.ts +91 -0
  112. package/dist/core/object-host.js +616 -0
  113. package/dist/core/object-host.js.map +1 -0
  114. package/dist/core/request-body.d.ts +9 -0
  115. package/dist/core/request-body.js +55 -0
  116. package/dist/core/request-body.js.map +1 -0
  117. package/dist/core/runtime.d.ts +121 -0
  118. package/dist/core/runtime.js +366 -0
  119. package/dist/core/runtime.js.map +1 -0
  120. package/dist/core/shard.d.ts +7 -0
  121. package/dist/core/shard.js +10 -0
  122. package/dist/core/shard.js.map +1 -0
  123. package/dist/core/sql-split.d.ts +15 -0
  124. package/dist/core/sql-split.js +101 -0
  125. package/dist/core/sql-split.js.map +1 -0
  126. package/dist/core/sql-storage.d.ts +53 -0
  127. package/dist/core/sql-storage.js +407 -0
  128. package/dist/core/sql-storage.js.map +1 -0
  129. package/dist/core/state.d.ts +44 -0
  130. package/dist/core/state.js +93 -0
  131. package/dist/core/state.js.map +1 -0
  132. package/dist/core/storage.d.ts +103 -0
  133. package/dist/core/storage.js +351 -0
  134. package/dist/core/storage.js.map +1 -0
  135. package/dist/core/worker-rejections.d.ts +21 -0
  136. package/dist/core/worker-rejections.js +55 -0
  137. package/dist/core/worker-rejections.js.map +1 -0
  138. package/dist/index.d.ts +22 -0
  139. package/dist/index.js +23 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/isolate/browser.d.ts +16 -0
  142. package/dist/isolate/browser.js +37 -0
  143. package/dist/isolate/browser.js.map +1 -0
  144. package/dist/isolate/host.d.ts +24 -0
  145. package/dist/isolate/host.js +74 -0
  146. package/dist/isolate/host.js.map +1 -0
  147. package/dist/isolate/isolate-worker.d.ts +1 -0
  148. package/dist/isolate/isolate-worker.js +53 -0
  149. package/dist/isolate/isolate-worker.js.map +1 -0
  150. package/dist/isolate/isolate.d.ts +10 -0
  151. package/dist/isolate/isolate.js +169 -0
  152. package/dist/isolate/isolate.js.map +1 -0
  153. package/dist/isolate/node-entry.d.ts +1 -0
  154. package/dist/isolate/node-entry.js +12 -0
  155. package/dist/isolate/node-entry.js.map +1 -0
  156. package/dist/isolate/protocol.d.ts +66 -0
  157. package/dist/isolate/protocol.js +205 -0
  158. package/dist/isolate/protocol.js.map +1 -0
  159. package/dist/ltx/crc64.d.ts +6 -0
  160. package/dist/ltx/crc64.js +46 -0
  161. package/dist/ltx/crc64.js.map +1 -0
  162. package/dist/ltx/ltx-page-server.d.ts +65 -0
  163. package/dist/ltx/ltx-page-server.js +309 -0
  164. package/dist/ltx/ltx-page-server.js.map +1 -0
  165. package/dist/ltx/ltx-pages.d.ts +81 -0
  166. package/dist/ltx/ltx-pages.js +315 -0
  167. package/dist/ltx/ltx-pages.js.map +1 -0
  168. package/dist/ltx/ltx-store-worker.d.ts +1 -0
  169. package/dist/ltx/ltx-store-worker.js +38 -0
  170. package/dist/ltx/ltx-store-worker.js.map +1 -0
  171. package/dist/ltx/ltx.d.ts +45 -0
  172. package/dist/ltx/ltx.js +203 -0
  173. package/dist/ltx/ltx.js.map +1 -0
  174. package/dist/ltx/lz4.d.ts +9 -0
  175. package/dist/ltx/lz4.js +156 -0
  176. package/dist/ltx/lz4.js.map +1 -0
  177. package/dist/ltx/opfs-sync-files.d.ts +23 -0
  178. package/dist/ltx/opfs-sync-files.js +191 -0
  179. package/dist/ltx/opfs-sync-files.js.map +1 -0
  180. package/dist/ltx/xxh32.d.ts +1 -0
  181. package/dist/ltx/xxh32.js +43 -0
  182. package/dist/ltx/xxh32.js.map +1 -0
  183. package/dist/miniflare-compat/blob-service.d.ts +13 -0
  184. package/dist/miniflare-compat/blob-service.js +66 -0
  185. package/dist/miniflare-compat/blob-service.js.map +1 -0
  186. package/dist/miniflare-compat/kv-binding.d.ts +44 -0
  187. package/dist/miniflare-compat/kv-binding.js +99 -0
  188. package/dist/miniflare-compat/kv-binding.js.map +1 -0
  189. package/dist/miniflare-compat/shims/assert.d.ts +15 -0
  190. package/dist/miniflare-compat/shims/assert.js +24 -0
  191. package/dist/miniflare-compat/shims/assert.js.map +1 -0
  192. package/dist/miniflare-compat/shims/workerd-cloudflare.d.ts +7 -0
  193. package/dist/miniflare-compat/shims/workerd-cloudflare.js +6 -0
  194. package/dist/miniflare-compat/shims/workerd-cloudflare.js.map +1 -0
  195. package/dist/miniflare-compat/shims/workerd-globals.d.ts +1 -0
  196. package/dist/miniflare-compat/shims/workerd-globals.js +30 -0
  197. package/dist/miniflare-compat/shims/workerd-globals.js.map +1 -0
  198. package/dist/miniflare-compat/shims/workerd-internal.d.ts +20 -0
  199. package/dist/miniflare-compat/shims/workerd-internal.js +23 -0
  200. package/dist/miniflare-compat/shims/workerd-internal.js.map +1 -0
  201. package/dist/miniflare-compat/shims/workerd-performance.d.ts +4 -0
  202. package/dist/miniflare-compat/shims/workerd-performance.js +17 -0
  203. package/dist/miniflare-compat/shims/workerd-performance.js.map +1 -0
  204. package/dist/miniflare-compat/simulator-fetcher.d.ts +9 -0
  205. package/dist/miniflare-compat/simulator-fetcher.js +14 -0
  206. package/dist/miniflare-compat/simulator-fetcher.js.map +1 -0
  207. package/dist/miniflare-compat/vendored.d.ts +15 -0
  208. package/dist/miniflare-compat/vendored.js +27 -0
  209. package/dist/miniflare-compat/vendored.js.map +1 -0
  210. package/dist/node-compat/async_hooks.d.ts +22 -0
  211. package/dist/node-compat/async_hooks.js +176 -0
  212. package/dist/node-compat/async_hooks.js.map +1 -0
  213. package/dist/node-compat/browser-registry.d.ts +3 -0
  214. package/dist/node-compat/browser-registry.js +39 -0
  215. package/dist/node-compat/browser-registry.js.map +1 -0
  216. package/dist/node-compat/crypto.d.ts +60 -0
  217. package/dist/node-compat/crypto.js +143 -0
  218. package/dist/node-compat/crypto.js.map +1 -0
  219. package/dist/node-compat/diagnostics_channel.d.ts +27 -0
  220. package/dist/node-compat/diagnostics_channel.js +46 -0
  221. package/dist/node-compat/diagnostics_channel.js.map +1 -0
  222. package/dist/node-compat/fs.d.ts +35 -0
  223. package/dist/node-compat/fs.js +40 -0
  224. package/dist/node-compat/fs.js.map +1 -0
  225. package/dist/node-compat/globals.d.ts +3 -0
  226. package/dist/node-compat/globals.js +4 -0
  227. package/dist/node-compat/globals.js.map +1 -0
  228. package/dist/node-compat/install.d.ts +5 -0
  229. package/dist/node-compat/install.js +12 -0
  230. package/dist/node-compat/install.js.map +1 -0
  231. package/dist/node-compat/module.d.ts +12 -0
  232. package/dist/node-compat/module.js +36 -0
  233. package/dist/node-compat/module.js.map +1 -0
  234. package/dist/node-compat/modules.d.ts +8 -0
  235. package/dist/node-compat/modules.js +23 -0
  236. package/dist/node-compat/modules.js.map +1 -0
  237. package/dist/node-compat/os.d.ts +36 -0
  238. package/dist/node-compat/os.js +36 -0
  239. package/dist/node-compat/os.js.map +1 -0
  240. package/dist/node-compat/process.d.ts +14 -0
  241. package/dist/node-compat/process.js +16 -0
  242. package/dist/node-compat/process.js.map +1 -0
  243. package/dist/node-compat/shims.d.ts +4 -0
  244. package/dist/node.d.ts +5 -0
  245. package/dist/node.js +6 -0
  246. package/dist/node.js.map +1 -0
  247. package/dist/peer/celld-peer.d.ts +53 -0
  248. package/dist/peer/celld-peer.js +555 -0
  249. package/dist/peer/celld-peer.js.map +1 -0
  250. package/dist/ports.d.ts +183 -0
  251. package/dist/ports.js +10 -0
  252. package/dist/ports.js.map +1 -0
  253. package/dist/project/browser-bundle.d.ts +17 -0
  254. package/dist/project/browser-bundle.js +125 -0
  255. package/dist/project/browser-bundle.js.map +1 -0
  256. package/dist/project/browser-cookies.d.ts +12 -0
  257. package/dist/project/browser-cookies.js +90 -0
  258. package/dist/project/browser-cookies.js.map +1 -0
  259. package/dist/project/browser-host.d.ts +173 -0
  260. package/dist/project/browser-host.js +200 -0
  261. package/dist/project/browser-host.js.map +1 -0
  262. package/dist/project/browser-modules.d.ts +17 -0
  263. package/dist/project/browser-modules.js +89 -0
  264. package/dist/project/browser-modules.js.map +1 -0
  265. package/dist/project/browser-shards.d.ts +62 -0
  266. package/dist/project/browser-shards.js +210 -0
  267. package/dist/project/browser-shards.js.map +1 -0
  268. package/dist/project/browser-tabs.d.ts +103 -0
  269. package/dist/project/browser-tabs.js +418 -0
  270. package/dist/project/browser-tabs.js.map +1 -0
  271. package/dist/project/cloudflare-email.d.ts +8 -0
  272. package/dist/project/cloudflare-email.js +11 -0
  273. package/dist/project/cloudflare-email.js.map +1 -0
  274. package/dist/project/cloudflare-workers.d.ts +12 -0
  275. package/dist/project/cloudflare-workers.js +16 -0
  276. package/dist/project/cloudflare-workers.js.map +1 -0
  277. package/dist/project/host-modules.d.ts +4 -0
  278. package/dist/project/host-modules.js +40 -0
  279. package/dist/project/host-modules.js.map +1 -0
  280. package/dist/project/jsonc.d.ts +2 -0
  281. package/dist/project/jsonc.js +27 -0
  282. package/dist/project/jsonc.js.map +1 -0
  283. package/dist/project/lower-await.d.ts +2 -0
  284. package/dist/project/lower-await.js +151 -0
  285. package/dist/project/lower-await.js.map +1 -0
  286. package/dist/project/node-project.d.ts +38 -0
  287. package/dist/project/node-project.js +362 -0
  288. package/dist/project/node-project.js.map +1 -0
  289. package/dist/project/own-module.d.ts +6 -0
  290. package/dist/project/own-module.js +13 -0
  291. package/dist/project/own-module.js.map +1 -0
  292. package/dist/project/scheduler.d.ts +2 -0
  293. package/dist/project/scheduler.js +3 -0
  294. package/dist/project/scheduler.js.map +1 -0
  295. package/dist/project/site.d.ts +74 -0
  296. package/dist/project/site.js +206 -0
  297. package/dist/project/site.js.map +1 -0
  298. package/dist/project/virtual-modules.d.ts +3 -0
  299. package/dist/project/worker-scope.d.ts +27 -0
  300. package/dist/project/worker-scope.js +46 -0
  301. package/dist/project/worker-scope.js.map +1 -0
  302. package/dist/project/workerd-message-channel.d.ts +13 -0
  303. package/dist/project/workerd-message-channel.js +137 -0
  304. package/dist/project/workerd-message-channel.js.map +1 -0
  305. package/dist/project/workers-global-names.d.ts +6 -0
  306. package/dist/project/workers-global-names.js +15 -0
  307. package/dist/project/workers-global-names.js.map +1 -0
  308. package/dist/project/workers-globals-module.d.ts +8 -0
  309. package/dist/project/workers-globals-module.js +9 -0
  310. package/dist/project/workers-globals-module.js.map +1 -0
  311. package/dist/project/workers-globals.d.ts +9 -0
  312. package/dist/project/workers-globals.js +19 -0
  313. package/dist/project/workers-globals.js.map +1 -0
  314. package/dist/project/wrangler.d.ts +116 -0
  315. package/dist/project/wrangler.js +342 -0
  316. package/dist/project/wrangler.js.map +1 -0
  317. package/dist/router/cell-router.d.ts +72 -0
  318. package/dist/router/cell-router.js +247 -0
  319. package/dist/router/cell-router.js.map +1 -0
  320. package/dist/router/shard-worker.d.ts +44 -0
  321. package/dist/router/shard-worker.js +163 -0
  322. package/dist/router/shard-worker.js.map +1 -0
  323. package/dist/transport/cells-http.d.ts +25 -0
  324. package/dist/transport/cells-http.js +141 -0
  325. package/dist/transport/cells-http.js.map +1 -0
  326. package/dist/transport/cells-link.d.ts +27 -0
  327. package/dist/transport/cells-link.js +71 -0
  328. package/dist/transport/cells-link.js.map +1 -0
  329. package/dist/transport/port.d.ts +26 -0
  330. package/dist/transport/port.js +100 -0
  331. package/dist/transport/port.js.map +1 -0
  332. package/dist/v8/codec.d.ts +6 -0
  333. package/dist/v8/codec.js +9 -0
  334. package/dist/v8/codec.js.map +1 -0
  335. package/dist/v8/serialize.d.ts +10 -0
  336. package/dist/v8/serialize.js +601 -0
  337. package/dist/v8/serialize.js.map +1 -0
  338. package/dist/ws/client.d.ts +25 -0
  339. package/dist/ws/client.js +203 -0
  340. package/dist/ws/client.js.map +1 -0
  341. package/dist/ws/control.d.ts +48 -0
  342. package/dist/ws/control.js +44 -0
  343. package/dist/ws/control.js.map +1 -0
  344. package/dist/ws/frames.d.ts +38 -0
  345. package/dist/ws/frames.js +39 -0
  346. package/dist/ws/frames.js.map +1 -0
  347. package/dist/ws/server.d.ts +99 -0
  348. package/dist/ws/server.js +295 -0
  349. package/dist/ws/server.js.map +1 -0
  350. package/dist/ws/sw-connector.d.ts +10 -0
  351. package/dist/ws/sw-connector.js +25 -0
  352. package/dist/ws/sw-connector.js.map +1 -0
  353. package/dist/ws/upgrade.d.ts +28 -0
  354. package/dist/ws/upgrade.js +75 -0
  355. package/dist/ws/upgrade.js.map +1 -0
  356. package/package.json +111 -3
  357. package/vendor/celld/LICENSE +202 -0
  358. package/vendor/celld/kv.js +1131 -0
  359. package/vendor/celld/queues.js +1656 -0
  360. package/vendor/celld/workflows.js +1610 -0
  361. package/vendor/html-rewriter-wasm/html_rewriter.js +925 -0
  362. package/vendor/html-rewriter-wasm/html_rewriter_bg.wasm +0 -0
  363. package/vendor/miniflare/d1-api.js +738 -0
  364. package/vendor/miniflare/d1-database.js +6978 -0
  365. package/vendor/miniflare/kv-namespace.js +3061 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/core/id.ts"],"names":[],"mappings":"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","sourcesContent":["import { hmac } from \"@noble/hashes/hmac\";\nimport { sha256 } from \"@noble/hashes/sha256\";\nimport { bytesToHex, hexToBytes } from \"@noble/hashes/utils\";\n\n/** 64-hex-char object id. idFromName is SYNCHRONOUS (as on CF), hence noble instead of crypto.subtle. */\nexport class DurableObjectId {\n readonly #hex: string;\n readonly name?: string;\n constructor(hex: string, name?: string) {\n if (!/^[0-9a-f]{64}$/.test(hex))\n throw new TypeError(\"Invalid Durable Object ID: must be 64 hex digits\");\n this.#hex = hex;\n if (name !== undefined) this.name = name;\n }\n toString(): string {\n return this.#hex;\n }\n equals(other: DurableObjectId): boolean {\n return other.toString() === this.#hex;\n }\n}\n\n/**\n * Ids as celld derives them (engine_api.rs), so one name reaches the same object id on\n * celld and on cellb: namespace key `cells:v1:<len(script)>:<script>:<class>`;\n * key = SHA-256(namespace key); id = HMAC(key, name)[0..16] ‖ HMAC(key, first half)[0..16].\n * The second half authenticates the first, so idFromString() rejects ids of other namespaces.\n */\nexport function namespaceKey(scriptName: string, className: string): string {\n return `cells:v1:${scriptName.length}:${scriptName}:${className}`;\n}\n\nconst keys = new Map<string, Uint8Array>();\nconst keyOf = (ns: string) => {\n let k = keys.get(ns);\n if (!k) {\n k = sha256(new TextEncoder().encode(ns));\n keys.set(ns, k);\n }\n return k;\n};\nconst half = (key: Uint8Array, data: Uint8Array) => hmac(sha256, key, data).subarray(0, 16);\nconst withSuffix = (ns: string, first: Uint8Array) => {\n const id = new Uint8Array(32);\n id.set(first, 0);\n id.set(half(keyOf(ns), first), 16);\n return bytesToHex(id);\n};\n\nexport function idFromName(ns: string, name: string): DurableObjectId {\n const hex = withSuffix(ns, half(keyOf(ns), new TextEncoder().encode(name)));\n // ctx.id.name holds names up to 1024 UTF-8 bytes, as on Cloudflare and celld.\n return new DurableObjectId(\n hex,\n new TextEncoder().encode(name).byteLength <= 1024 ? name : undefined,\n );\n}\n\nexport function newUniqueId(ns: string): DurableObjectId {\n const first = new Uint8Array(16);\n crypto.getRandomValues(first);\n return new DurableObjectId(withSuffix(ns, first));\n}\n\n/** idFromString(): 64 hex digits whose second half authenticates the first for `ns`. */\nexport function validateId(ns: string, hex: string): DurableObjectId {\n const id = new DurableObjectId(hex);\n if (withSuffix(ns, hexToBytes(hex.slice(0, 32))) !== hex)\n throw new TypeError(\"Durable Object ID is not valid for this namespace\");\n return id;\n}\n"]}
@@ -0,0 +1,38 @@
1
+ import { type DurableObjectId } from "./id.js";
2
+ import type { ObjectHost } from "./object-host.js";
3
+ import type { DurableObjectState } from "./state.js";
4
+ /** What a stub talks to: a local ObjectHost or a remote cell host behind a port. */
5
+ export interface ObjectEndpoint {
6
+ fetch(req: Request): Promise<Response>;
7
+ call(method: string, args: unknown[]): Promise<unknown>;
8
+ /** Present only for in-process objects (enables runInDurableObject). */
9
+ local?: ObjectHost;
10
+ }
11
+ /**
12
+ * An in-process object. `ready` (for a cell not open yet): a promise its first events await
13
+ * before the host opens the cell's database (its store is making room), or undefined.
14
+ */
15
+ export declare function localEndpoint(host: () => ObjectHost, ready?: () => Promise<void> | undefined): () => ObjectEndpoint;
16
+ export declare class DurableObjectNamespace {
17
+ #private;
18
+ constructor(namespaceKey: string, endpoint: (id: DurableObjectId) => () => ObjectEndpoint);
19
+ idFromName(name: string): DurableObjectId;
20
+ newUniqueId(opts?: {
21
+ jurisdiction?: string;
22
+ }): DurableObjectId;
23
+ idFromString(hex: string): DurableObjectId;
24
+ /** The key ids of this namespace derive from (see id.ts). */
25
+ get namespaceKey(): string;
26
+ get(id: DurableObjectId): DurableObjectStub;
27
+ getByName(name: string): DurableObjectStub;
28
+ }
29
+ export type DurableObjectStub = {
30
+ readonly id: DurableObjectId;
31
+ readonly name?: string;
32
+ fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
33
+ } & Record<string, any>;
34
+ /**
35
+ * Test hook (same idea as vitest-pool-workers' runInDurableObject): runs `fn`
36
+ * inside a LOCAL object, through the input/output gates, without cloning `fn`.
37
+ */
38
+ export declare function runInDurableObject<T>(stub: DurableObjectStub, fn: (instance: any, state: DurableObjectState) => T | Promise<T>): Promise<T>;
@@ -0,0 +1,141 @@
1
+ import { carryWebSocketHeaders } from "../ws/upgrade.js";
2
+ import { cross, rpcCall, STUB } from "./handles.js";
3
+ import { idFromName, newUniqueId, validateId } from "./id.js";
4
+ /**
5
+ * An in-process object. `ready` (for a cell not open yet): a promise its first events await
6
+ * before the host opens the cell's database (its store is making room), or undefined.
7
+ */
8
+ export function localEndpoint(host, ready) {
9
+ return () => {
10
+ const wait = ready?.();
11
+ if (!wait)
12
+ return endpointOf(host());
13
+ return {
14
+ get local() {
15
+ return host();
16
+ },
17
+ fetch: async (req) => {
18
+ await wait;
19
+ return endpointOf(host()).fetch(req);
20
+ },
21
+ call: async (method, args) => {
22
+ const copied = cross(args); // the arguments as they are now, as for an open cell
23
+ await wait;
24
+ return deliverCall(host(), method, copied);
25
+ },
26
+ };
27
+ };
28
+ }
29
+ function endpointOf(h) {
30
+ return {
31
+ local: h,
32
+ fetch: (req) => h.deliver(async (obj) => {
33
+ if (typeof obj.fetch !== "function")
34
+ throw new Error("Handler does not export a fetch() function.");
35
+ let res;
36
+ try {
37
+ const r = await obj.fetch(req);
38
+ res = r instanceof Response ? r : new Response(String(r)); // a non-Response is sent as text (celld)
39
+ }
40
+ catch (e) {
41
+ // celld: the stub's fetch() rejects with "rejected: <name>: <message> [at …]".
42
+ const err = e;
43
+ throw new Error(`rejected: ${err?.name ?? "Error"}: ${err?.message ?? String(e)}`, {
44
+ cause: e,
45
+ });
46
+ }
47
+ // A WebSocket answer to a request that did not ask for one fails (workerd, celld):
48
+ // the stub rejects and the server end sees an abnormal close.
49
+ const ws = res.webSocket;
50
+ if (res.status === 101 && ws && req.headers.get("upgrade")?.toLowerCase() !== "websocket")
51
+ throw new Error("rejected: Error: a WebSocket response to a request without Upgrade: websocket");
52
+ return res;
53
+ }),
54
+ call: async (method, args) => deliverCall(h, method, cross(args)),
55
+ };
56
+ }
57
+ async function deliverCall(h, method, copied) {
58
+ const r = await h.deliver((obj) => {
59
+ const m = obj[method];
60
+ if (typeof m !== "function")
61
+ throw new TypeError(`${method} is not a function`); // celld's wording
62
+ return m.apply(obj, copied);
63
+ });
64
+ return cross(r);
65
+ }
66
+ export class DurableObjectNamespace {
67
+ #key;
68
+ #endpoint;
69
+ constructor(namespaceKey, endpoint) {
70
+ this.#key = namespaceKey;
71
+ this.#endpoint = endpoint;
72
+ }
73
+ idFromName(name) {
74
+ return idFromName(this.#key, name);
75
+ }
76
+ newUniqueId(opts) {
77
+ if (opts?.jurisdiction != null)
78
+ throw new Error("Jurisdiction restrictions are not implemented");
79
+ return newUniqueId(this.#key);
80
+ }
81
+ idFromString(hex) {
82
+ return validateId(this.#key, hex);
83
+ }
84
+ /** The key ids of this namespace derive from (see id.ts). */
85
+ get namespaceKey() {
86
+ return this.#key;
87
+ }
88
+ get(id) {
89
+ return createStub(id, this.#endpoint(id));
90
+ }
91
+ getByName(name) {
92
+ return this.get(this.idFromName(name));
93
+ }
94
+ }
95
+ const kEndpoint = Symbol("cellb.endpoint");
96
+ /**
97
+ * Test hook (same idea as vitest-pool-workers' runInDurableObject): runs `fn`
98
+ * inside a LOCAL object, through the input/output gates, without cloning `fn`.
99
+ */
100
+ export function runInDurableObject(stub, fn) {
101
+ const ep = stub[kEndpoint];
102
+ const local = ep?.().local;
103
+ if (!local)
104
+ throw new TypeError("runInDurableObject needs a stub of an in-process cellb object");
105
+ return local.deliver(fn);
106
+ }
107
+ /** Stub = Proxy: `fetch` → fetch handler, any other property → JS-RPC call (an RpcPromise). */
108
+ function createStub(id, endpoint) {
109
+ const target = { id, name: id.name };
110
+ // Only id and name are own enumerable keys, as in workerd and celld: Object.keys(stub) is
111
+ // [id, name], and two stubs of one object are deep-equal.
112
+ Object.defineProperty(target, kEndpoint, { value: endpoint });
113
+ Object.defineProperty(target, STUB, { value: true });
114
+ Object.defineProperty(target, "fetch", {
115
+ value(input, init) {
116
+ const req = new Request(input, init);
117
+ // Cloudflare's `cf` request property (RequestInit.cf or Request#cf) is not part of
118
+ // the Fetch standard: re-attach it so objects can read `request.cf`.
119
+ const cf = init?.cf ?? input.cf;
120
+ if (cf !== undefined)
121
+ Object.defineProperty(req, "cf", { value: cf, enumerable: true });
122
+ // Keep a WebSocket upgrade that browsers strip from new Request() (forbidden headers).
123
+ const source = init?.headers
124
+ ? new Headers(init.headers)
125
+ : input instanceof Request
126
+ ? input.headers
127
+ : undefined;
128
+ return endpoint().fetch(source ? carryWebSocketHeaders(source, req) : req);
129
+ },
130
+ });
131
+ return new Proxy(target, {
132
+ get(t, prop, recv) {
133
+ if (prop in t)
134
+ return Reflect.get(t, prop, recv);
135
+ if (prop === "then" || typeof prop === "symbol")
136
+ return undefined;
137
+ return (...args) => rpcCall(() => endpoint().call(String(prop), args));
138
+ },
139
+ });
140
+ }
141
+ //# sourceMappingURL=namespace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/core/namespace.ts"],"names":[],"mappings":"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","sourcesContent":["import { carryWebSocketHeaders } from \"../ws/upgrade.js\";\nimport { cross, rpcCall, STUB } from \"./handles.js\";\nimport { type DurableObjectId, idFromName, newUniqueId, validateId } from \"./id.js\";\nimport type { ObjectHost } from \"./object-host.js\";\nimport type { DurableObjectState } from \"./state.js\";\n\n/** What a stub talks to: a local ObjectHost or a remote cell host behind a port. */\nexport interface ObjectEndpoint {\n fetch(req: Request): Promise<Response>;\n call(method: string, args: unknown[]): Promise<unknown>;\n /** Present only for in-process objects (enables runInDurableObject). */\n local?: ObjectHost;\n}\n\n/**\n * An in-process object. `ready` (for a cell not open yet): a promise its first events await\n * before the host opens the cell's database (its store is making room), or undefined.\n */\nexport function localEndpoint(\n host: () => ObjectHost,\n ready?: () => Promise<void> | undefined,\n): () => ObjectEndpoint {\n return () => {\n const wait = ready?.();\n if (!wait) return endpointOf(host());\n return {\n get local() {\n return host();\n },\n fetch: async (req) => {\n await wait;\n return endpointOf(host()).fetch(req);\n },\n call: async (method, args) => {\n const copied = cross(args); // the arguments as they are now, as for an open cell\n await wait;\n return deliverCall(host(), method, copied);\n },\n };\n };\n}\n\nfunction endpointOf(h: ObjectHost): ObjectEndpoint {\n return {\n local: h,\n fetch: (req) =>\n h.deliver(async (obj) => {\n if (typeof obj.fetch !== \"function\")\n throw new Error(\"Handler does not export a fetch() function.\");\n let res: Response;\n try {\n const r = await obj.fetch(req);\n res = r instanceof Response ? r : new Response(String(r)); // a non-Response is sent as text (celld)\n } catch (e) {\n // celld: the stub's fetch() rejects with \"rejected: <name>: <message> [at …]\".\n const err = e as Error;\n throw new Error(`rejected: ${err?.name ?? \"Error\"}: ${err?.message ?? String(e)}`, {\n cause: e,\n });\n }\n // A WebSocket answer to a request that did not ask for one fails (workerd, celld):\n // the stub rejects and the server end sees an abnormal close.\n const ws = (res as { webSocket?: unknown }).webSocket;\n if (res.status === 101 && ws && req.headers.get(\"upgrade\")?.toLowerCase() !== \"websocket\")\n throw new Error(\n \"rejected: Error: a WebSocket response to a request without Upgrade: websocket\",\n );\n return res;\n }),\n call: async (method, args) => deliverCall(h, method, cross(args)),\n };\n}\n\nasync function deliverCall(h: ObjectHost, method: string, copied: unknown[]): Promise<unknown> {\n const r = await h.deliver((obj) => {\n const m = obj[method];\n if (typeof m !== \"function\") throw new TypeError(`${method} is not a function`); // celld's wording\n return m.apply(obj, copied);\n });\n return cross(r);\n}\n\nexport class DurableObjectNamespace {\n readonly #key: string;\n readonly #endpoint: (id: DurableObjectId) => () => ObjectEndpoint;\n\n constructor(namespaceKey: string, endpoint: (id: DurableObjectId) => () => ObjectEndpoint) {\n this.#key = namespaceKey;\n this.#endpoint = endpoint;\n }\n idFromName(name: string): DurableObjectId {\n return idFromName(this.#key, name);\n }\n newUniqueId(opts?: { jurisdiction?: string }): DurableObjectId {\n if (opts?.jurisdiction != null)\n throw new Error(\"Jurisdiction restrictions are not implemented\");\n return newUniqueId(this.#key);\n }\n idFromString(hex: string): DurableObjectId {\n return validateId(this.#key, hex);\n }\n /** The key ids of this namespace derive from (see id.ts). */\n get namespaceKey(): string {\n return this.#key;\n }\n get(id: DurableObjectId): DurableObjectStub {\n return createStub(id, this.#endpoint(id));\n }\n getByName(name: string): DurableObjectStub {\n return this.get(this.idFromName(name));\n }\n}\n\nexport type DurableObjectStub = {\n readonly id: DurableObjectId;\n readonly name?: string;\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;\n} & Record<string, any>;\n\nconst kEndpoint = Symbol(\"cellb.endpoint\");\n\n/**\n * Test hook (same idea as vitest-pool-workers' runInDurableObject): runs `fn`\n * inside a LOCAL object, through the input/output gates, without cloning `fn`.\n */\nexport function runInDurableObject<T>(\n stub: DurableObjectStub,\n fn: (instance: any, state: DurableObjectState) => T | Promise<T>,\n): Promise<T> {\n const ep = (stub as any)[kEndpoint] as (() => ObjectEndpoint) | undefined;\n const local = ep?.().local;\n if (!local) throw new TypeError(\"runInDurableObject needs a stub of an in-process cellb object\");\n return local.deliver(fn);\n}\n\n/** Stub = Proxy: `fetch` → fetch handler, any other property → JS-RPC call (an RpcPromise). */\nfunction createStub(id: DurableObjectId, endpoint: () => ObjectEndpoint): DurableObjectStub {\n const target = { id, name: id.name };\n // Only id and name are own enumerable keys, as in workerd and celld: Object.keys(stub) is\n // [id, name], and two stubs of one object are deep-equal.\n Object.defineProperty(target, kEndpoint, { value: endpoint });\n Object.defineProperty(target, STUB, { value: true });\n Object.defineProperty(target, \"fetch\", {\n value(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const req = new Request(input as any, init);\n // Cloudflare's `cf` request property (RequestInit.cf or Request#cf) is not part of\n // the Fetch standard: re-attach it so objects can read `request.cf`.\n const cf = (init as { cf?: unknown } | undefined)?.cf ?? (input as { cf?: unknown }).cf;\n if (cf !== undefined) Object.defineProperty(req, \"cf\", { value: cf, enumerable: true });\n // Keep a WebSocket upgrade that browsers strip from new Request() (forbidden headers).\n const source = init?.headers\n ? new Headers(init.headers)\n : input instanceof Request\n ? input.headers\n : undefined;\n return endpoint().fetch(source ? carryWebSocketHeaders(source, req) : req);\n },\n });\n return new Proxy(target, {\n get(t, prop, recv) {\n if (prop in t) return Reflect.get(t, prop, recv);\n if (prop === \"then\" || typeof prop === \"symbol\") return undefined;\n return (...args: unknown[]) => rpcCall(() => endpoint().call(String(prop), args));\n },\n }) as unknown as DurableObjectStub;\n}\n"]}
@@ -0,0 +1,91 @@
1
+ import type { BackupInfo, CellBackup, CellDurability, Lease, OpenCellSql, ValueCodec } from "../ports.js";
2
+ import type { AsyncRoot } from "./async-context.js";
3
+ import { type DurableObjectClass } from "./handles.js";
4
+ import { type DurableObjectId } from "./id.js";
5
+ import { DurableObjectState } from "./state.js";
6
+ export declare class BrokenObjectError extends Error {
7
+ constructor(cause: unknown, reason?: string);
8
+ }
9
+ /**
10
+ * One live instance of one Durable Object: its SQLite, gates and dispatcher.
11
+ * Everything that reaches the object (fetch, RPC, later alarms/WebSockets)
12
+ * goes through `deliver()`.
13
+ */
14
+ export declare class ObjectHost {
15
+ #private;
16
+ readonly cellKey: string;
17
+ readonly state: DurableObjectState;
18
+ broken: boolean;
19
+ constructor(opts: {
20
+ cellKey: string;
21
+ id: DurableObjectId;
22
+ cls: DurableObjectClass;
23
+ env: unknown;
24
+ openSql: OpenCellSql;
25
+ durability: CellDurability;
26
+ codec: ValueCodec;
27
+ waitUntil: (p: Promise<unknown>) => void;
28
+ backup?: CellBackup;
29
+ /** The stored alarm changed (null = cleared). */
30
+ onAlarmChange?: (at: number | null) => void;
31
+ /** `ctx.exports` (loopback handles of the Worker's exports). */
32
+ exports?: Record<string, unknown>;
33
+ /** `ctx.props` of a facet started from a class handle with `{ props }`. */
34
+ props?: unknown;
35
+ /** SQLite extensions to load into every cell database (e.g. "sqlite_vec"). */
36
+ sqlExtensions?: string[];
37
+ /** storage.deleteAll() keeps the alarm (`delete_all_preserves_alarm`). */
38
+ deleteAllPreservesAlarm?: boolean;
39
+ /**
40
+ * Ownership: acquire the cell's lease before restoring it. No lease → the cell is owned
41
+ * elsewhere (the host refuses events). The lease epoch fences the cell's log segments;
42
+ * losing the lease breaks the host so it stops serving.
43
+ */
44
+ /** Owner epoch when no lease is taken (facets inherit their root's). */
45
+ epoch?: number;
46
+ /** A facet: on open its rows move to this run's scope, as celld does. */
47
+ facet?: boolean;
48
+ acquire?: Lease["tryAcquire"];
49
+ /** The async context events start in (`asyncRoot()`): not the caller's, as on Cloudflare. */
50
+ asyncRoot?: AsyncRoot;
51
+ });
52
+ /**
53
+ * Takes an image if the cell changed since the last successful save and hands
54
+ * it to `backup.save`. Taken synchronously between events → a consistent image.
55
+ * Skipped while an async transaction() holds the database or a save is running.
56
+ */
57
+ backupIfDirty(reason: BackupInfo["reason"], now: number): Promise<void>;
58
+ /**
59
+ * Input gate → handler → commit → output gate (durability) → result.
60
+ *
61
+ * Events are queued and STARTED synchronously by a pump only while the gate
62
+ * is open: the first storage op of a handler closes the gate before the
63
+ * next event can start (checking the gate in an `await` continuation is too
64
+ * late — every queued continuation would see it open).
65
+ */
66
+ deliver<T>(fn: (instance: any, state: DurableObjectState) => T | Promise<T>): Promise<T>;
67
+ /** Settles once the cell lease is released (a store closed earlier would keep it held). */
68
+ close(): Promise<void>;
69
+ /** Time of the last event's completion (the runtime's idle sweep reads it). */
70
+ lastActive: number;
71
+ get hibernated(): boolean;
72
+ /**
73
+ * Drops the instance when nothing runs: no event in flight or queued, no open async
74
+ * transaction, no standard WebSocket. Storage, alarms and hibernatable sockets stay; the
75
+ * next event constructs the class again. Returns whether it hibernated.
76
+ */
77
+ hibernate(): boolean;
78
+ /**
79
+ * Closes the database of a hibernated cell (the cell lease stays); the next event reopens it.
80
+ * A cell with changes its backup has not taken yet stays open. Returns whether it closed.
81
+ */
82
+ closeDatabase(): boolean;
83
+ /** Replaces the instance with a fresh one on the SAME database (facet abort/delete). */
84
+ restart(): void;
85
+ }
86
+ /** The cell's lease is held by another owner (route the request there, or retry later). */
87
+ export declare class CellOwnedElsewhereError extends Error {
88
+ constructor(cellKey: string);
89
+ }
90
+ /** celld's path segment for a facet name: the first 16 bytes of SHA-256(name), hex. */
91
+ export declare function facetSegment(name: string): string;