InitOptions for a { storage } source: the fence wiring AND the reservation
wiring are mandatory, and both are widened to admit the opt-out. Written as
an intersection rather than an extends, because a subtype may not WIDEN an
inherited property's type — and the widening is the point: 'none' exists
only on this branch.
startIdempotency is required HERE and optional on InitOptions because the
two branches fail differently. A { DB } host cannot get this wrong: init
builds the store from the binding, and DurableObjectRunner.build refuses to
serve a runtime that lacks one while a DB binding is present. A { storage }
host has no binding to derive one from, and its failure is SILENT and split:
such a host can still wire a real store into its run router (the router takes
its own), so keys reserve and claim normally — and then nothing ever settles
them, because the runtime that sees every terminal transition was never given
the store. The reservation stays started forever, and the next retry of
that key is told UNRESOLVABLE instead of replaying a run that completed
perfectly well. Making the host WRITE 'none' turns that into a decision
someone made; nothing about an omission could have said it.
InitOptions for a
{ storage }source: the fence wiring AND the reservation wiring are mandatory, and both are widened to admit the opt-out. Written as an intersection rather than anextends, because a subtype may not WIDEN an inherited property's type — and the widening is the point:'none'exists only on this branch.startIdempotencyis required HERE and optional onInitOptionsbecause the two branches fail differently. A{ DB }host cannot get this wrong: init builds the store from the binding, andDurableObjectRunner.buildrefuses to serve a runtime that lacks one while a DB binding is present. A{ storage }host has no binding to derive one from, and its failure is SILENT and split: such a host can still wire a real store into its run router (the router takes its own), so keys reserve and claim normally — and then nothing ever settles them, because the runtime that sees every terminal transition was never given the store. The reservation staysstartedforever, and the next retry of that key is told UNRESOLVABLE instead of replaying a run that completed perfectly well. Making the host WRITE'none'turns that into a decision someone made; nothing about an omission could have said it.