denoland/celldPublic

self-hosted, distributed Durable Objects

v0.6.2

Upgrading from v0.6.1 can use a rolling update.

- A Durable Object `stub.fetch()` that a peer forwards now rejects when the handler fails on the owner, as it does locally, and the handler does not run again.
- A Worker that returns a WebSocket response to a request without `Upgrade: websocket` now fails with a `TypeError` and a 500.
- `celld dev` accepts `export NAME=value` lines and multi-line quoted values in `.env` files, and skips an entry that cannot be a binding with a warning.
- Epoch GC (`CELLD_LTX_RETENTION_SECS`) also runs on nodes with bucket durability.
- LTX capture recovers a torn WAL header when a database opens, so capture no longer skips commits after a crash.
- A failed or abandoned eviction no longer stops compaction for the rest of a cell's activation.

Issues fixed:

- #243: `celld dev` reads `.env` and `.env.local` when there is no `.dev.vars`, as `wrangler dev` does.
- #245: A fleet with one follower recruits a second one when a peer becomes available.
- #246: Follower disk use stays bounded after a snapshot eviction or a deleted facet.
- #247: `self` is defined in Worker, Durable Object, and Worker Loader isolates.
- #248: `getDurableObjectClass()` accepts a plain class that extends no runtime base.
- #252: WebSockets work in Durable Object facets, including outbound sockets that a facet opens.
- #255: A deploy no longer deadlocks a Durable Object handler.
- #257: A fetch to a loaded Worker honors the caller's `AbortSignal`, including `AbortSignal.timeout()`.

Co-authored-by: Ryan Dahl <ry@tinyclouds.org>
Co-authored-by: Yusuke "Taka" Tanaka <yusuktan@maguro.dev>
Co-authored-by: Josh Collinsworth <joshuajcollinsworth@gmail.com>
Co-authored-by: Bert Belder <bertbelder@gmail.com>
BBJCYTRDBIBartek Iwańczuk and 4 others authored
90b4301Patch
Parentf2bf648
63 files changed+4442-5225
StackedSplit
.github/workflows/release.yml+5 −3
Cargo.lock+1 −1
Dockerfile+1 −0
LICENSE.tokio+0 −21
NOTICE+28 −0
crates/celld/Cargo.toml+1 −1
crates/celld/actor.rs+40 −12
crates/celld/cell_cli.rs+8 −7
crates/celld/cell_dispatch.rs+67 −31
crates/celld/deploy.rs+54 −15
crates/celld/dev.rs+95 −24
crates/celld/facet_streams.rs+1 −1
crates/celld/js.rs+400 −112
crates/celld/js/bootstrap.rs+17 −2
crates/celld/js/harness.js+17 −2
crates/celld/js/websocket.rs+61 −2
crates/celld/lib.rs+2 −286
crates/celld/ltx_repl.rs+365 −73
crates/celld/main.rs+107 −23
crates/celld/main/peer_tunnel.rs+11 −4
crates/celld/main/websocket.rs+204 −61
crates/celld/node_log.rs+80 −28
crates/celld/pool.rs+18 −2
crates/celld/runtime.rs+164 −5
crates/celld/storage.rs+40 −0
crates/celld/tokio_select.rs+311 −0
crates/celld/ws_registry.rs+140 −5
crates/logic/lib.rs+81 −0
crates/logic/types.rs+9 −0
crates/ltx/src/db.rs+74 −7
crates/ltx/src/replica.rs+53 −24
docs/README.md+438 −916
docs/cloudflare-compat.md+37 −52
docs/guarantees.md+262 −423
docs/limitations.md+18 −22
docs/security.md+85 −150
docs/services/containers-flow.svg+0 −97
docs/services/containers.md+98 −153
docs/services/cron-triggers-flow.svg+0 −148
docs/services/cron-triggers.md+58 −116
docs/services/d1-flow.svg+0 −111
docs/services/d1.md+56 −115
docs/services/durable-object-facets-flow.svg+0 −126
docs/services/durable-object-facets.md+84 −74
docs/services/durable-objects-flow.svg+0 −127
docs/services/durable-objects.md+79 −120
docs/services/dynamic-workers-flow.svg+0 −106
docs/services/dynamic-workers.md+75 −115
docs/services/kv-flow.svg+0 −102
docs/services/kv.md+35 −79
docs/services/queues-flow.svg+0 −127
docs/services/queues.md+44 −93
docs/services/r2-flow.svg+0 −64
docs/services/r2.md+50 −107
docs/services/static-assets-flow.svg+109 −107
docs/services/static-assets.md+74 −115
docs/services/workers-flow.svg+57 −55
docs/services/workers.md+69 −120
docs/services/workflows-flow.svg+0 −125
docs/services/workflows.md+49 −92
docs/telemetry.md+61 −112
docs/testing.md+118 −160
docs/wasm.md+31 −44