12714c7527
improvise-1wft and the five beads it blocked were one failure: nothing
carried a boot failure's REASON from the worker to the page. The channel
is one rule -- a protocol frame crosses the port as a STRING, a shell
notice as an OBJECT -- so it needs no protocol change and the
discriminator is total.
A boot failure is a STATE, not a rejected promise. A document another
context holds the exclusive handle to now OPENS read-only: measured first
(harness probe, Chromium + Firefox), getFile() reads the bytes while the
handle is held, with the second-handle refusal asserted so the probe
cannot pass vacuously.
- improvise-1wft the channel: Notice/NoticeKind, boot_notice, take_notice
- improvise-i0v9 read-only boot over vfs::ReadOnly + OpfsFs::read_unattached
- improvise-86nw start() rejecting for any reason now posts BootFailed
- improvise-9cma boot::document_name -- and a/b/c.improv was ACCEPTED as
c.improv, not rejected, which is worse than the report
- improvise-iobc vfs::Origin: a seed error is a notice only when the
document really had to be created without it
- improvise-vep8 the watchdog arms BEFORE transport.ready; its message
stopped claiming the connection was accepted
- improvise-7gip DedicatedWorkerGlobalScope (needs a web-sys feature)
- improvise-zre1 a persist that fails raises a notice; the trigger is the
dirty flag surviving, observed rather than predicted
- improvise-7gf8 the render breaker trips once instead of retrying forever
- improvise-ociy non-OPEN sends are loud; a viewport announcement is not
- improvise-y01k the three ws-server drops are logged
- improvise-r4nf serde failures throw instead of reading as "nothing to send"
Every notice routes through shell.fail, so gotcha 48's disarm half is not
re-broken. Two comments in shell.spec.js stated the opposite of the new
arming order and were corrected rather than left.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FC2jVn8Au7E9JPkw6bwXXH
27 lines
728 B
JavaScript
27 lines
728 B
JavaScript
// The dedicated Web Worker the OPFS contract runs inside: `createSyncAccessHandle`
|
|
// exists only here. Every decision is in Rust; this moves strings.
|
|
|
|
import init, {
|
|
run_checks,
|
|
run_probes,
|
|
run_canary,
|
|
before_reload,
|
|
after_reload,
|
|
} from "./pkg/opfs_contract.js";
|
|
|
|
const ready = init();
|
|
|
|
const ENTRY = { run_checks, run_probes, run_canary, before_reload, after_reload };
|
|
|
|
self.onmessage = async (event) => {
|
|
const { id, cmd } = event.data;
|
|
try {
|
|
await ready;
|
|
const fn = ENTRY[cmd];
|
|
if (!fn) throw new Error(`no such entry point: ${cmd}`);
|
|
self.postMessage({ id, ok: true, value: await fn() });
|
|
} catch (err) {
|
|
self.postMessage({ id, ok: false, error: String(err?.message ?? err) });
|
|
}
|
|
};
|